#include<stdio.h> #include<stdlib.h> #include<malloc.h> #define M 24 struct JCB{ char name[M]; //作业名 int rt; //到达时间 float r; //响应比 int ct; //需要CPU(运行)时间 int ft; //完成时的时间 int wt; //周转时间 float awt; //加权周转时间 }p[M]; //输出函数 void Output(int a) { int i; printf(" 作业名 到达系统时间 所需CPU时间 完成时间 周转时间 加权周转时间 "); for(i=0;i<a;i++) { printf("%s ",p[i].name); printf(" %d ",p[i].rt); printf(" %d ",p[i].ct); printf("%d ",p[i].ft); printf("%d ",p[i].wt); printf("%f ",p[i].awt); } } //输入函数 int Input() { int i,a,b=0; int init,k; int j=1; JCB f; do{ printf("请输入作业个数(2-20):"); scanf("%d",&a); if(a<2||a>20) j=0; else break; }while(j=1); for(i=0;i<a;i++) { printf("请输入作业名:"); scanf("%s",p[i].name); printf("请输入到达时间:"); scanf("%d",&p[i].rt); printf("请输入需要CPU(运行)时间:"); scanf("%d",&p[i].ct); printf(" "); p[i].ft=0; p[i].wt=0; p[i].awt=0; p[i].r=0; } //按到达系统时间先后排序 for(i=0;i<a;i++) { init=p[b].rt; f=p[b]; for(k=b;k<a;k++) { if(p[k].rt<init) { f=p[k]; p[k]=p[b]; p[b]=f; init=p[b].rt; } } b++; } Output(a); return a; } //SJF算法选择短作业 int Selectwork(int t,int n){ int i,l=0; int temp,m,k=0; JCB a[M]; JCB b; //寻找t到达系统还未完成的作业,用数组存储 for(i=1;i<n;i++) { if(p[i].rt<=t&&p[i].ft==0) { a[l]=p[i]; l++; k=l; } } //寻找未完成作业中最短的作业 temp=a[0].ct; b=a[0]; for(m=0;m<k;m++) { if(a[m].ct<temp) { b=a[m]; a[m]=a[0]; a[0]=b; temp=a[0].ct; } } return a[0].ct;//返回最短作业的所需CPU时间 } //HRRE算法选择响应比高的作业 int Choose(int t,int n) { int i,k,l=0; int m=0; float r,temp; JCB a[M]; JCB b; //寻找当前时间t到达系统还未完成的作业,用数组a[M]存储 for(i=1;i<n;i++) { if(p[i].rt<=t&&p[i].ft==0) { a[l]=p[i]; l++; k=l; } } //计算每个未完成作业的响应比 for(i=0;i<k;i++) { a[i].r=1+(float)(t-a[i].rt)/(float)a[i].ct; } //寻找未完成作业中响应比最高的作业 temp=a[0].r; b=a[0]; for(m=0;m<k;m++) { if(a[m].r>temp) { b=a[m]; a[m]=a[0]; a[0]=b; temp=a[0].r; } } return a[0].ct;//返回最高响应比的作业的所需CPU时间 } //先来先服务 void FCFS() { int i,j; int now=0;//当前时间 j=Input(); int sumwt=0;//周转时间的和 float sumawt=0;//带权周转时间的和 float avwt,avgwt;//avwt是平均周转时间,avgwt是平均带权周转时间 for(i=0;i<j;i++) { if(i==0) { now=p[i].rt; p[i].ft=now+p[i].ct; p[i].wt=p[i].ft-p[i].rt; p[i].awt=p[i].wt/p[i].ct; } else { if(p[i-1].ft>p[i].rt) { now=p[i-1].ft; p[i].ft=now+p[i].ct; } else { now=p[i].rt; p[i].ft=now+p[i].ct; } p[i].wt=p[i].ft-p[i].rt; p[i].awt=(float)p[i].wt/(float)p[i].ct; } sumwt+=p[i].wt; sumawt+=p[i].awt; } avgwt=(float)sumwt/j; avwt=sumawt/j; Output(j); printf("平均周转时间为:%f ",avgwt); printf("平均带权周转时间为:%f ",avwt); } //最短路径优先 void SJF() { int i=0,j=0,k=0; j=Input(); int l,m,now;//当前时间 int a=0; int sumwt=0;//周转时间总和 float sumawt=0;//带权周转时间总和 double avwt,avgwt;//avwt是平均周转时间,avgwt是平均带权周转时间 l=0; int n=0; for(i=0;i<j;i++) { if(i==0) { now=p[i].rt; p[i].ft=p[i].rt+p[i].ct; now=p[i].ft; } else { a=Selectwork(now,j); //寻找最短作业的位置 for(m=0;m<j;m++) if(p[m].ct==a&&p[m].ft==0) { k=m; break; } p[k].ft=now+p[k].ct;//计算时间 now=p[k].ft; } } for(i=0;i<j;i++) { p[i].wt=p[i].ft-p[i].rt; p[i].awt=(float)p[i].wt/(float)p[i].ct; sumwt+=p[i].wt; sumawt+=p[i].awt; } avgwt=(float)sumwt/j; avwt=sumawt/j; Output(j); printf("平均周转时间为:%f ",avgwt); printf("平均带权周转时间为:%f ",avwt); } //最高相应比 void HRRN() { int i=0,j=0,k=0; int b=0,now=0,m; float sumwt=0;//周转时间总和 float sumawt=0;//带权周转时间总和 double avwt,avgwt;//avwt是平均周转时间,avgwt是平均带权周转时间 j=Input(); for(i=0;i<j;i++) { if(i==0) { p[i].ft=p[i].rt+p[i].ct; now=p[i].ft; } else { b=Choose(now,j); //寻找最高响应比的作业的位置 for(m=0;m<j;m++) if(p[m].ct==b&&p[m].ft==0) { k=m; break; } p[k].ft=now+p[k].ct;//计算最高响应比的作业的完成时间 now=p[k].ft; } } for(i=0;i<j;i++) { p[i].wt=p[i].ft-p[i].rt; p[i].awt=(float)p[i].wt/(float)p[i].ct; sumwt+=p[i].wt; sumawt+=p[i].awt; } avgwt=(float)sumwt/j; avwt=sumawt/j; Output(j); printf("平均周转时间为:%f ",avgwt); printf("平均带权周转时间为:%f ",avwt); } void Start() { int d; int j=1; do{ printf(" 1.FCFS先来先服务调度算法。"); printf(" 2.SJF最短路径优先调度算法。"); printf(" 3.HRRN最高响应比优先调度算法。"); printf(" 请选择输入你需要的调度算法的序号: "); scanf("%d",&d); if(d<1||d>3) j=0; else break; }while(j=1); switch(d) { case 1: FCFS(); break; case 2: SJF(); break; case 3: HRRN(); break; } } int main() { int i=1; char a; do{ Start(); printf(" 你想要继续吗?(y or n):"); scanf(" %c",&a); if(a=='n') break; }while(i=1); printf("The end! "); return 0; }
实验心得:这次的实验比之前那个实验要复杂挺多的,要调用的函数很多,所以我在调用函数这方面用了比较多的时间,一开始的时候还一直出现错误,所以不能把两个写好的代码合在一起。可是之后经过同学帮忙调整,指出错误之后,再后面的调试之后就成功了,所以虽然完成的时间比较长,也没有做到真的很简洁,而且有些代码是参考网上的,但是我觉得收获还是很大的,希望下一次能做得更好。