作业调度实验c语言,C语言面向过程用FCFS和SJF算法模拟作业调度

本文通过C语言实现FCFS和SJF两种作业调度算法,详细介绍了如何获取用户输入的进程信息,利用冒泡排序确定调度顺序,并计算完成时间、周转时间和带权周转时间等关键指标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下意识还是想用面向对象去编程,但是二维数组传参数想着有些麻烦,于是就写成这样了,有些冗余。这次是真的体会到面向对象编程思想的好处了。

也发先了一个以前没发现的坑:

C语言scanf函数在连续输入字符型变量时需要注意:

比如代码是这样的:char a,b;

scanf("%c",a);

scanf("%c",b);

运行的话发现只能给输入a

原因是scanf是从标准输入缓存区读你想要输入的参数

你想给char a输入A,在scanf函数运行时你肯定是从键盘输入“A”

然后呢,输入“enter”回车这下就完了,

第二行的scanf就从缓存区读走了“enter”给了char b。

解决方法:char a,b;

scanf(" %c",a);//%号前加一个空格

scanf(" %c",b);//

(1)scanf函数“%”号前加一个空格  就可以抵消“enter”了。

(2)可以在第一个scanf后,调用清除缓存区的函数fflush(stdin);

下面是本文章的真正内容:

C语言面向过程用FCFS和SJF算法模拟作业调度://实验一: 作业调度的模拟

//要求:

//3)根据作业调度算法(先来先服务和短作业优先都要做),编写程序,模拟作业调度。

//4)保存调度结果(作业调度次序,每个作业的完成时间、周转时间、带权周转时间,

//所有作业的平均周转时间、平均带权周转时间)、提交实验结论。

//-----------------------

//我们模拟比较简单的非抢占是进程调度方式

//本题的精髓是根据作业调度算法求出不同算法下的作业调度次序

//次序算出来了剩下就是简单的计算了

//-----------------------

#include

typedef struct fcfs{

char pname;

int cometime;

int servicetime;

}fcfs;

//而SJF算法需要添加状态行,来标志那些进程需要调度

typedef struct sjf{

char pname;

int cometime;

int servicetime;

int stuta;

}sjf;

int main(void)

{

//我们采用面向过程编程

//进程名: A B C D E

//到达时间:0 1 2 3 4

//服务时间:4 3 4 2 4

//FCFS

fcfs f[5];

//输入

for(int i=0;i<5;i++)

{

printf("请输入第%d个进程的进程名\n",i+1);

scanf(" %c",&(f[i].pname));

printf("请输入第%d个进程的到达时间\n",i+1);

scanf("%d",&(f[i].cometime));

printf("请输入第%d个进程的服务时间\n",i+1);

scanf("%d",&(f[i].servicetime));

}

for(int i=0;i<5;i++)

{

printf("第%d个进程的进程名:%c\n",i+1,f[i].pname);

printf("第%d个进程的到达时间:%d\n",i+1,f[i].cometime);

printf("第%d个进程的服务时间:%d\n",i+1,f[i].servicetime);

}

//根据达到时间,用冒泡排序给进程排好调度次序

for(int i=0;i<4;i++)

{

for(int j=0;j<4-i;j++)

{

if(f[j].cometime>f[j+1].cometime)

{

fcfs temp;

temp=f[j];

f[j]=f[j+1];

f[j+1]=temp;

}

}

}

//输出调度次序

printf("调度次序为:\n");

for(int i=0;i<5;i++)

{

printf("%3c",f[i].pname);

}

//计算完成时间

int finishtime[5];//存储各个进程的完成时间

int sum=0;//存储总的服务时间

for(int i=0;i<5;i++)

{

sum+=f[i].servicetime;

finishtime[i]=sum;

}

printf("\n");

//输出完成时间

printf("进程及其完成时间为:\n");

for(int i=0;i<5;i++)

{

printf("%3c",f[i].pname);

}

printf("\n");

for(int i=0;i<5;i++)

{

printf("%3d",finishtime[i]);

}

//计算周转时间:周转时间=完成时间-到达时间

int cyclingtime[5];

for(int i=0;i<5;i++)

{

cyclingtime[i]=finishtime[i]-f[i].cometime;

}

printf("\n");

//输出周转时间

printf("进程及其周转时间为:\n");

for(int i=0;i<5;i++)

{

printf("%3c",f[i].pname);

}

printf("\n");

for(int i=0;i<5;i++)

{

printf("%3d",cyclingtime[i]);

}

//计算带权周转时间floatWI=周转时间/服务时间

float floatWi[5];

for(int i=0;i<5;i++)

{

floatWi[i]=(cyclingtime[i]*0.1)/(f[i].servicetime*0.1);

}

printf("\n");

//输出带全周转时间

printf("进程及其平均周转时间为:\n");

for(int i=0;i<5;i++)

{

printf("%5c",f[i].pname);

}

printf("\n");

for(int i=0;i<5;i++)

{

printf("%1.2f ",floatWi[i]);

}

printf("\n");

//计算平均周转时间:总周转时间/5

for(int i=0;i<5;i++)

{

sum+=cyclingtime[i];

}

float avgcycling;

avgcycling=(float)sum/5;

printf("平均周转时间为:%1.2f\n",avgcycling);

//计算平均带权周转时间:总带全周转时间/5

float SUM=0;

for(int i=0;i<5;i++)

{

SUM+=floatWi[i];

}

float avgWi;

avgWi=SUM/5;

printf("平均带权周转时间为:%1.2f\n",avgWi);

//---------------------------------------------------------------

//FCFS算法完成,记下来写SJF

sjf s[5];

//输入

for(int i=0;i<5;i++)

{

printf("请输入第%d个进程的进程名\n",i+1);

scanf(" %c",&(s[i].pname));

printf("请输入第%d个进程的到达时间\n",i+1);

scanf("%d",&(s[i].cometime));

printf("请输入第%d个进程的服务时间\n",i+1);

scanf("%d",&(s[i].servicetime));

//状态号初始化都是0表示为进栈,不考虑调度

s[i].stuta=0;

}

//根据到达时间和服务时间排序

//为了辅助我们引出时间t来判断进程时候参与调度,int SJForder[5]来存储顺序

int t=0;

int SJForder[5]={0};

//t时刻那些进程需要调度,stuta=1来标记

int m;

for(m=0;m<5;m++)

{

for(int i=0;i<5;i++)

{

if(s[i].cometime<=t && s[i].stuta==0)

{

s[i].stuta=5-m;

}

}

//找出第一个被标记的,并且假设他是最短的任务

int Short=0;

for(int i=0;i<5;i++)

{

if(s[i].stuta==5-m)

{

Short=i;

break;

}

}

//挨着比较找出真的最短任务

for(int i=0;i<5;i++)

{

if(s[i].stuta==5-m)

{

if(s[i].servicetime

{

Short=i;

}

}

}

SJForder[m]=Short;

t+=s[Short].servicetime;

s[Short].stuta++;

//状态位重置为0

for(int i=0;i<5;i++)

{

if(s[i].stuta<=5-m)

{

s[i].stuta=0;

}

}

}

//输出调度次序

printf("调度次序为:\n");

for(int i=0;i<5;i++)

{

printf("%3c",s[SJForder[i]].pname);

}

//计算完成时间

sum=0;

for(int i=0;i<5;i++)

{

sum+=s[SJForder[i]].servicetime;

finishtime[i]=sum;

}

printf("\n");

//输出完成时间

printf("进程及其完成时间为:\n");

for(int i=0;i<5;i++)

{

printf("%3c",s[SJForder[i]].pname);

}

printf("\n");

for(int i=0;i<5;i++)

{

printf("%3d",finishtime[i]);

}

//计算周转时间:周转时间=完成时间-到达时间

for(int i=0;i<5;i++)

{

cyclingtime[i]=finishtime[i]-s[SJForder[i]].cometime;

}

printf("\n");

//输出周转时间

printf("进程及其周转时间为:\n");

for(int i=0;i<5;i++)

{

printf("%3c",s[SJForder[i]].pname);

}

printf("\n");

for(int i=0;i<5;i++)

{

printf("%3d",cyclingtime[i]);

}

//计算带权周转时间floatWI=周转时间/服务时间

for(int i=0;i<5;i++)

{

floatWi[i]=(cyclingtime[i]*0.1)/(s[SJForder[i]].servicetime*0.1);

}

printf("\n");

//输出带全周转时间

printf("进程及其平均周转时间为:\n");

for(int i=0;i<5;i++)

{

printf("%5c",s[SJForder[i]].pname);

}

printf("\n");

for(int i=0;i<5;i++)

{

printf("%1.2f ",floatWi[i]);

}

printf("\n");

//计算平均周转时间:总周转时间/5

for(int i=0;i<5;i++)

{

sum+=cyclingtime[i];

}

avgcycling=(float)sum/5;

printf("平均周转时间为:%1.2f\n",avgcycling);

//计算平均带权周转时间:总带全周转时间/5

for(int i=0;i<5;i++)

{

SUM+=floatWi[i];

}

avgWi=SUM/5;

printf("平均带权周转时间为:%1.2f\n",avgWi);

return 0;

}

谢谢观看,欢迎指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值