** 用C语言编程实现“先来先服务(FCFS)”算法模拟作业调度,输出平均周转时间、平均带权周转时间**
要求:按作业的到达顺序输入各作业需要的运行时间,按算法调度输出平均周转时间。
例如(FCFS),输入:8(到达时间0), 5(到达时间2),7(到达时间3),1(到达时间6)
作业 | 到达时间 | 开始时间 | 运行时间 | 结束时间 | 周转时间 |
---|---|---|---|---|---|
J1 | 0 | 0 | 8 | 8 | 8 |
J2 | 2 | 8 | 5 | 13 | 11 |
J3 | 3 | 13 | 7 | 20 | 17 |
J4 | 6 | 20 | 1 | 21 | 15 |
提示:
带权周转时间(Wi)=周转时间/运行时间
平均带权周转时间=累计带权周转时间和/作业个数
输出:
平均周转时间=(8+(13-2)+(20-3)+(21-6))/4=51/4
平均带权周转时间=(8/8+11/5+17/7+15/1)/4=5.157(大约)
#include <stdio.h>
int zhouzhuan(int ch[],int sh[],int num);
int main()
{
int ch[4]={0,2,3,6}; //到达时间的实参数组,可自己给出
int sh[4]={8,5,7,1}; //运行时间的实参数组,可自己给出
int num=sizeof(ch)/sizeof(ch[0]); //求出数组中的元素个数,即作业个数
zhouzhuan(ch,sh,num);
}
int zhouzhuan(int ch[] ,int sh[],int num)
{
int i;
int rt[100]; //运行时间
int at[100]; //到达时间
int et[100]; //结束时间
int ct[100]; //周转时间
float dq[100]; //带权周转时间=作业周转时间/作业执行时间
float totaltime; //周转时间
float avgtime; //平均周转时间
float totaldaiquan;//所有作业的带权周转时间累计和
float avgdaiquan; //平均带权周转时间
for(i=0;i<num;i++)
{
at[i]=ch[i]; //初始化到达时间数组
rt[i]=sh[i]; //初始化运行时间数组
printf("p%d:rt=%d,at=%d\n",i+1,rt[i],at[i]);
}
printf("FCFS:\n");
for(i=0;i<num;i++)
{
if(i==0) //i=0时是第一个到达
{
et[i]=rt[i]+at[i]; //第一个到达的,其结束时间就等于运行时间+到达时间
}
else if(at[i]<=et[i-1]) //当目前到达的作业在上一个作业结束前或刚好结束的时候就到达了,此时上一个作业的结束时间就是目前这个作业的开始时间
{
et[i]=et[i-1]+rt[i]; //结束时间=开始时间+运行时间 ,又因为这里的开始时间是上一个作业的结束时间,所以 结束时间=上一个作业的结束时间+这个作业的运行时间
}
//可能前一个已经运行结束,但是后一个还没有到达(也可能)
else
{
et[i]=at[i]+rt[i]; //结束时间=开始时间+运行时间。因为这个作业,在它上一个作业完成之后都没有到达,所以她的开始时间就是自己的开始时间
}
ct[i]=et[i]-at[i]; //周转时间=结束时间-到达时间
dq[i]=(float)ct[i]/(float)rt[i]; //带权周转时间=作业周转时间/作业执行时间
printf("p%d:到达时间=%d,运行时间=%d,结束时间=%d,周转时间=%d,带权周转时间=%.2f \n",i+1,at[i],rt[i],et[i],ct[i],dq[i]);
}
totaltime=0; //先设置一个初始值,不然计算会出错,赋垃圾值
totaldaiquan=0; //先设置一个初始值,不然计算会出错,赋垃圾值
for(i=0;i<num;i++)
{
totaltime+=(float)ct[i]; //累计周转时间
totaldaiquan+=(float)dq[i]; //累计带权周转时间
}
avgtime=totaltime/num; //平均周转时间
avgdaiquan=totaldaiquan/num; //累计平均周转时间
printf("Total cycling time of FCFS is:%.2f\n",totaltime);
printf("Average cycling time of FCFS is:%.2f.\n",avgtime);
printf("Total daiquan time of FCFS is:%.2f\n",totaldaiquan);
printf("Average daiquan time of FCFS is:%.2f\n",avgdaiquan);
return 0;
}