SJF

#include#defineMAX100typedef struct PCB { charProName[10]; //作业ID floatArriveTime; //到达时刻 floatFun_time; //运行时间 floatEndTime; //完成时间 floatrevolveTime; //周转时间 intOrder; //优先标记 } list,*linklist; void sjf(linklist p,int count) { list item; //结构体变量 int i = 0; int j = 0; int k = 0; //最短运行时间作业的下标 int flag = 0; //优先级设置 float min = 0; //最短运行时间 float temp; //开始的时刻temp = p[0].ArriveTime; //开始的时刻为第一个到达的时间//先求出最先到达作业的时刻 for(i = 0; i < count; i++) { if(temp > p[i].ArriveTime) { temp = p[i].ArriveTime; //保存最先到达的作业的时刻 k = i; //最先到达的作业的下标,默认为p[0] } }for(i = 0; i < count; i++) { p[k].Order = ++flag; //设置优先级为1,最高优先级 p[k].EndTime= temp + p[k].Fun_time; p[k].revolveTime= p[k].EndTime - p[k].ArriveTime; min = 100; temp = p[k].EndTime; //后一个作业的开始时刻是前一个作业的完成时刻for(j = 0; j < count; j++) { if(p[j].Order != 0 || temp - p[j].ArriveTime <= 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]; //order越小优先级越高,小的往前移 --j; } p[j+1] = item; }return; }//输出各个作业的详细信息 void print(linklist p,int count) { int i; printf("ID\t到达\t服务\t完成\t周转\n"); for(i = 0; i < count; i++) { printf("%s\t%.0f\t%.0f\t%.0f\t%.0f\n", p[i].ProName,p[i].ArriveTime,p[i].Fun_time, p[i].EndTime,p[i].revolveTime); }return; }int main() { list st[MAX]; //最多可以一百个作业 int num = 0; //作业数量int i = 0; printf("请输入作业数量:"); scanf("%d",&num); printf("请输入作业ID,到达时间,运行时间:\n"); for(i=0; i

【SJF】

    推荐阅读