此程序是模拟作业调度中的先进先出服务算法fcfs )、最短作业优先算法sjf )、最高响应比优先算法hrn )。
print ) )函数的功能是输出模拟后各作业的执行情况。
avg ) )函数的功能是计算并输出平均旋转时间和平均波段旋转时间。
源代码:
# include stdio.h # definemax 100 typedefstructjcb { char job _ id [ 10 ]; //工作ID float Arr_time; //到达时间float Fun_time; //估计运行时间float Wait_time; //等待时间float Start_time; //开始时刻float Fin_time; //完成时间float Tur_time; //周转时间float WTur_time; //权利回合时间int Order; //优先标记}list; voidFCFSlist*p,int count ); voidsjflist*p,int count ); voidHRNlist*p,int count ); voidprintlist*p,int count ); voidAVGlist*p,int count ); voidFCFSlist*p,int count ) /先服务算法) { list temp; //临时结构变量int i; int j; forI=1; i count; I )//按到达时间顺序直接插入排序{ temp=p[i]; j=i-1; while temp.arr _ timep [ j ].arr _ timej=0) { p[j 1]=p[j]; -j; } p[j 1]=temp; for ) I=0; i count; I//每项工作的时间值{ifI==0) } { p [ I ].start _ time=p [ I ].arr _ time; } else { p [ I ].start _ time=p [ I-1 ].fin _ time; //开始时间==上一项工作的完成时间} p [ I ].wait _ time=p [ I ].start _ time-p [ I ].arr _ time; //等待==开始- p [ I ].fin _ time=p [ I ].start _ timep [ I ].fun _ time; //完成==p [ I ].tur _ time=p [ I ].fin _ time-p [ I ].arr _ time; //转弯=完成- p [ I ].wtur _ time=p [ I ].tur _ time/p [ I ].fun _ time; //权利回转=回转/运行} return ); }voidsjflist*p,int count ) /最短工作优先算法) sjf ) { list item; //结构变量int i=0; int j=0; int k=0; //最短执行时间作业下标int flag=0; //优先顺序设定float min=0; //最短运行时float temp; //开始时刻temp=p[0].Arr_time; //求出最初到达作业的时刻for I=0; i count; I ) iftempI ).arr_time ) temp=p ) I ).arr_time; //保存最初到达的工作的时间k=i; //最先到达的作业的下标默认为p[0]}forI=0; i count; I ) { p[k].Order= flag; //将优先顺序设为1,
最高优先级 p[k].Start_time = temp; p[k].Wait_time = temp – p[k].Arr_time; //计算各个时间 p[k].Fin_time = temp + p[k].Fun_time; p[k].Tur_time = p[k].Fin_time – p[k].Arr_time; p[k].WTur_time = p[k].Tur_time / p[k].Fun_time; min = 100; temp = p[k].Fin_time; //后一个作业的开始时刻是前一个作业的完成时刻 forj = 0;j < count;j++) { ifp[j].Order != 0 || temp – p[j].Arr_time <= 0) //跳过不满足条件的(已设置优先级的 和 到达时刻要晚于前一个作业的完成时刻的) continue; ifmin > p[j].Fun_time) { min = p[j].Fun_time; k = j; //求出满足条件最短运行时间的作业的下标 } } } fori = 1;i < count;i++) //按优先级排序 { item = p[i]; j = i-1; whileitem.Order < p[j].Order && j >= 0) { p[j+1] = p[j]; –j; } p[j+1] = item; } return;}void hrnlist *p,int count) //最高响应比优先算法{ list item; //结构体变量 int i = 0; int j = 0; int k = 0; //最高响应比作业的下标 int flag = 0; //优先级设置 float max = 0; //最大响应比的值 float temp; //开始的时刻 temp = p[0].Arr_time; //先求出最先到达作业的时刻 fori = 0;i < count;i++) { iftemp > p[i].Arr_time) { temp = p[i].Arr_time; k = i; //最先到达的作业的下标,默认为p[0] } } fori = 0;i < count;i++) { p[k].Order = ++flag; //设置优先级 p[k].Start_time = temp; //计算各个作业的时间 p[k].Wait_time = temp – p[k].Arr_time; p[k].Fin_time = temp + p[k].Fun_time; p[k].Tur_time = p[k].Fin_time – p[k].Arr_time; p[k].WTur_time = p[k].Tur_time / p[k].Fun_time; max = 0; temp = p[k].Fin_time; forj = 0;j < count;j++) { ifp[j].Order != 0 || temp – p[j].Arr_time <= 0) //排除优先级已设置 和 晚于作业完成时刻到达的 continue; //后一个判断可以不加,如果晚到的话,下面的if语句进不去 ifmax < temp – p[j].Arr_time) / p[j].Fun_time) { max = temp – p[j].Arr_time) / p[j].Fun_time; k = j; //求出剩下响应比最高的作业的下标 } } } fori = 1;i < count;i++) //按优先级排序 { item = p[i]; j = i-1; whileitem.Order < p[j].Order && j >= 0) { p[j+1] = p[j]; –j; } p[j+1] = item; } return;}void printlist *p,int count) //输出各个作业的详细信息{ int i; printf”*****************************************************************\n”); printf”ID\t到达\t运行\t等待\t开始\t完成\t周转\t带权周转\n”); fori = 0;i < count;i++) { printf”%s\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\n”,p[i].job_id,p[i].Arr_time,p[i].Fun_time,p[i].Wait_time,p[i].Start_time,p[i].Fin_time,p[i].Tur_time,p[i].WTur_time); } return;}void avglist *p,int count){ float AvgTur1; //平均周转 float AvgTur2; //平均带权周转 float t1 = 0; float t2 = 0; int i; fori = 0;i < count;i++) { t1 += p[i].Tur_time; //周转时间和 t2 += p[i].WTur_time; //带权周转和 } AvgTur1 = t1/count; AvgTur2 = t2/count; printf”\n平均周转时间为:%f\t平均带权周转时间为:%f\n”,AvgTur1,AvgTur2); printf”\n*****************************************************************\n”); return;}int main){ list st[MAX]; //最多可以一百个作业 int job_count = 0; //作业数量 int flag = 1; //算法标记 int i = 0; printf”请输入作业数量:”); scanf”%d”,&job_count); printf”请输入作业ID,到达时刻,估计运行时间用空格隔开):\n”); do { scanf”%s %f %f”,st[i].job_id,&st[i].Arr_time,&st[i].Fun_time); st[i].Order = 0; //优先级初始化 }while++i < job_count); printf”请选择算法:\n1, 先来先服务算法!\n2, 最短作业优先算法!\n3, 最高响应比优先算法!\n”); scanf”%d”,&flag); switchflag) { case 1 : { fcfsst,job_count); printf”\n*******************************************\n\n”); printf”先来先服务算法\n”); } break; case 2 : { sjfst,job_count); printf”\n*******************************************\n\n”); printf”最短作业优先算法\n”); } break; case 3 : { hrnst,job_count); printf”\n*******************************************\n\n”); printf”最高响应比优先算法\n”); } break; } printst,job_count); avgst,job_count); return 0;}