首页 > 编程知识 正文

c语言sjf算法,vsepr模型计算公式详细

时间:2023-05-06 06:03:59 阅读:174628 作者:850

此程序是模拟作业调度中的先进先出服务算法(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; voidFCFS(list*p,int count ); voidsjf(list*p,int count ); voidHRN(list*p,int count ); voidprint(list*p,int count ); voidAVG(list*p,int count ); voidFCFS(list*p,int count ) /先服务算法) { list temp; //临时结构变量int i; int j; for(I=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//每项工作的时间值{if(I==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 ); }voidsjf(list*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 ) if(temp(I ).arr_time ) temp=p ) I ).arr_time; //保存最初到达的工作的时间k=i; //最先到达的作业的下标默认为p[0]}for(I=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; //后一个作业的开始时刻是前一个作业的完成时刻 for(j = 0;j < count;j++) { if(p[j].Order != 0 || temp - p[j].Arr_time <= 0) //跳过不满足条件的(已设置优先级的 和 到达时刻要晚于前一个作业的完成时刻的) continue; if(min > p[j].Fun_time) { min = p[j].Fun_time; k = j; //求出满足条件最短运行时间的作业的下标 } } } for(i = 1;i < count;i++) //按优先级排序 { item = p[i]; j = i-1; while(item.Order < p[j].Order && j >= 0) { p[j+1] = p[j]; --j; } p[j+1] = item; } return;}void hrn(list *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; //先求出最先到达作业的时刻 for(i = 0;i < count;i++) { if(temp > p[i].Arr_time) { temp = p[i].Arr_time; k = i; //最先到达的作业的下标,默认为p[0] } } for(i = 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; for(j = 0;j < count;j++) { if(p[j].Order != 0 || temp - p[j].Arr_time <= 0) //排除优先级已设置 和 晚于作业完成时刻到达的 continue; //后一个判断可以不加,如果晚到的话,下面的if语句进不去 if(max < (temp - p[j].Arr_time) / p[j].Fun_time) { max = (temp - p[j].Arr_time) / p[j].Fun_time; k = j; //求出剩下响应比最高的作业的下标 } } } for(i = 1;i < count;i++) //按优先级排序 { item = p[i]; j = i-1; while(item.Order < p[j].Order && j >= 0) { p[j+1] = p[j]; --j; } p[j+1] = item; } return;}void print(list *p,int count) //输出各个作业的详细信息{ int i; printf("*****************************************************************n"); printf("IDt到达t运行t等待t开始t完成t周转t带权周转n"); for(i = 0;i < count;i++) { printf("%st%.3ft%.3ft%.3ft%.3ft%.3ft%.3ft%.3fn",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 avg(list *p,int count){ float AvgTur1; //平均周转 float AvgTur2; //平均带权周转 float t1 = 0; float t2 = 0; int i; for(i = 0;i < count;i++) { t1 += p[i].Tur_time; //周转时间和 t2 += p[i].WTur_time; //带权周转和 } AvgTur1 = t1/count; AvgTur2 = t2/count; printf("n平均周转时间为:%ft平均带权周转时间为:%fn",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); switch(flag) { case 1 : { fcfs(st,job_count); printf("n*******************************************nn"); printf("先来先服务算法n"); } break; case 2 : { sjf(st,job_count); printf("n*******************************************nn"); printf("最短作业优先算法n"); } break; case 3 : { hrn(st,job_count); printf("n*******************************************nn"); printf("最高响应比优先算法n"); } break; } print(st,job_count); avg(st,job_count); return 0;}


 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。