/* 短作业优先调度 */ #include <stdio.h> struct sjf{ char name[10]; float dt;//到达时间 float st;//服务时间 float begin_time;//开始运行时间 float wct;//运行完成时间 float zt;//周转时间 float dczt;//带权周转时间 }; sjf a[100]; void input(sjf *p,int n) { int i; for(i=0;i<=n-1;i++) { printf("\n\t*********请输入第 %d 个进程的信息:\n",i+1); printf("\t进程名称:"); scanf("%s",&p[i].name); printf("\t到达时间:"); scanf("%f",&p[i].dt); printf("\t服务时间:"); scanf("%f",&p[i].st); } } void Print(sjf *p,float dt,float st,float begin_time,float wct,float zt,float dczt,int n) { int k; float sum1=0,sum2=0; printf("\nrun order:"); printf("%s",p[0].name); for(k=1;k<n;k++) { printf("-->%s",p[k].name); } printf("\n\n进程信息如下:\n"); printf("\n进程名字 到达时间 服务时间 开始时间 完成时间 周转时间 带权周转时间\n"); for(k=0;k<n;k++) { printf("%3s\t %3.0f\t\t%.0f\t%.0f\t%3.0f\t\t%.0f\t %3.2f\n",p[k].name,p[k].dt,p[k].st,p[k].begin_time,p[k].wct,p[k].zt,p[k].dczt); sum1+=p[k].zt; sum2+=p[k].dczt; } printf("\n平均周转时间:%.2f\n",sum1/n); printf("\n平均带权周转时间:%.2f\n\n",sum2/n); } //排序 void sort(sjf *p,int n) { for(int i=0;i<=n-1;i++) for(int j=0;j<=i;j++) if(p[i].dt<p[j].dt) { sjf temp; temp=p[i]; p[i]=p[j]; p[j]=temp; } } //运行阶段 void deal(sjf *p, float dt,float st,float begin_time,float wct,float &zt,float &dczt,int n) { int k; for(k=0;k<=n-1;k++) { if(k==0) { p[k].begin_time=p[k].dt; p[k].wct=p[k].dt+p[k].st; } else { p[k].begin_time=p[k-1].wct; p[k].wct=p[k-1].wct+p[k].st; } } for(k=0;k<=n-1;k++) { p[k].zt=p[k].wct-p[k].dt; p[k].dczt=p[k].zt/p[k].st; } } void SJF(sjf *p,int n) { float dt=0,st=0,begin_time=0,wct=0,zt=0,dczt=0;//对结构进行初始化 sort(p,n); for(int m=0;m<n-1;m++) { if(m==0) p[m].wct=p[m].dt+p[m].st; else p[m].wct=p[m-1].wct+p[m].st; int i=0; for(int n=m+1;n<=n-1;n++) { if(p[n].dt<=p[m].wct)//判断内存中每次完成之后有多少到达的进程 i++; } float min=p[m+1].st; int next=m+1; //m+1=n for(int k=m+1;k<m+i;k++) //找出到达后的进程中最小的进程 { if(p[k+1].st<min) { min=p[k+1].st; next=k+1; } } sjf temp; temp=p[m+1]; p[m+1]=p[next]; p[next]=temp; } deal(p,dt,st,begin_time,wct,zt,dczt,n); Print(p,dt,st,begin_time,wct,zt,dczt,n); } void main() { int n; printf("\n--------------短作业优先调度算法-----------------\n"); printf("\n\t请输入进程的个数: "); scanf("%d",&n); input(a,n); sjf *b=a; sjf *c=a; SJF(b,n); }