程序排程演算法 (總)
阿新 • • 發佈:2018-11-03
// sun.cpp : 定義控制檯應用程式的入口點。 //本演算法包含四種排程:先到先服務,短作業優先,時間片輪轉,優先順序排程 #include<stdio.h> #define N 50 void main() { void fcfs(); //先來先服務 void sjf(); //短作業優先 void rr(); //時間片輪轉 void yxj(); //優先順序排程 int a; while(true) { printf("\n\n"); printf("\t/*************************/"); printf("\n\t/* 1、先到先服務 調 度 */"); printf("\n\t/* 2、短作業優先 調 度 */"); printf("\n\t/* 3、時間片輪轉 調 度 */"); printf("\n\t/* 4、優先順序優先 調 度 */"); printf("\n\t/* 0、 退 出 */\n"); printf("\t/*************************/"); printf("\n\n\t請選擇選單項:\t"); scanf("%d",&a); printf("\n"); switch(a){ case 1: fcfs();break; case 2: sjf();break; case 3: rr();break; case 4: yxj();break; default: break; } if(a<0&&a>4) break; } } /***********************先來先服務**************************/ /***********************************************************/ void fcfs() { int i,j,n,min,px; //n:程序個數 px:輸出方式選擇 float sum1,sum2; printf("\t請輸入有n個程序(0<n<=50):"); scanf("%d",&n); while(n>50||n<=0) { printf("n\t請重新輸入:"); scanf("%d",&n); } printf("\n\n"); struct Gzuo{ int id; //程序名字 int dt; //到達時刻 int st; //服務時間 int wct; //完成時刻 float zt; //週轉時間 float dczt; //帶權週轉時間 }; Gzuo a[N]; for(i=0;i<n;i++) { a[i].id=i+1; printf("\t程序%d 到達時間:",a[i].id); scanf("%d",&a[i].dt); printf("\t程序%d 服務時間:",a[i].id); scanf("%d",&a[i].st); printf("\n"); } for(j=n-1;j>=0;j--) { for(i=0;i<j;i++) { if(a[i].dt>a[i+1].dt) { min=a[i].id; a[i].id=a[i+1].id; a[i+1].id=min; min=a[i].dt; a[i].dt=a[i+1].dt; a[i+1].dt=min; min=a[i].st; a[i].st=a[i+1].st; a[i+1].st=min; } } } a[0].wct=a[0].dt+a[0].st; //完成時刻=到達時刻+服務時間 a[0].zt=(float)a[0].st; //第一個 週轉時間=服務時間 a[0].dczt=a[0].zt/a[0].st; //帶權週轉時間=週轉時間/服務時間 for(i=1;i<n;i++) { if(a[i].dt>a[i-1].wct) //當 a[i]到達時刻>a[i-1]完成時刻 { a[i].wct=a[i].dt+a[i].st; //a[i]完成時刻=到達時刻+服務時間 a[i].zt=(float)a[i].st; //此時,週轉時間=服務時間 a[i].dczt=a[i].zt/a[i].st; //帶權週轉時間=週轉時間/服務時間 } else { a[i].wct=a[i-1].wct+a[i].st; //a[i]完成時刻=a[i-1]完成時刻+a[i]服務時間 a[i].zt=(float)(a[i].wct-a[i].dt); //週轉時間=完成時刻-到達時刻 a[i].dczt=a[i].zt/a[i].st; //帶權週轉時間=週轉時間/服務時間 } } printf("\t1、按id號依次輸出\n"); printf("\t2、按完成順序依次輸出\n"); printf("\n\t請選擇輸出順序:\t"); scanf("%d",&px); printf("\nid:到達時間\t服務時間\t完成時間\t週轉時間\t帶權週轉時間\n"); sum1=0; sum2=0; switch(px) { case 1: //1.按id號依次輸出 { for(j=0;j<n;j++) { for(i=0;i<n;i++) if(a[i].id==j+1) { printf("%d: %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt,a[i].dczt); sum1+=a[i].zt; sum2+=a[i].dczt; } } printf("\n平均週轉時間:%.2f\n",sum1/n); printf("\n平均帶權週轉時間:%.2f\n\n",sum2/n); break; } case 2: //2.按完成順序依次輸出 { for(i=0;i<n;i++) { printf("%d: %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt,a[i].dczt); sum1+=a[i].zt; sum2+=a[i].dczt; } printf("\n平均週轉時間:%.2f\n",sum1/n); printf("\n平均帶權週轉時間:%.2f\n\n",sum2/n); break; } default: break; } } /**********************************短作業優先*******************************/ /***************************************************************************/ void sjf() { int i,j,n,min,px; //n:程序個數 px:輸出方式選擇 int b=0,z; float sum1,sum2; printf("\n\t請輸入有n個程序(0<n<=50): "); scanf("%d/n",&n); while(n>50||n<=0) { printf("n\t請重新輸入:"); scanf("%d",&n); } printf("\n"); struct Gzuo{ int id; //程序名字 int dt; //到達時刻 int st; //服務時間 int wct; //完成時刻 float zt; //週轉時間 float dczt; //帶權週轉時間 }; Gzuo a[N]; for(i=0;i<n;i++) { a[i].id=i+1; printf("\t程序%d 到達時間:",a[i].id); scanf("%d",&a[i].dt); printf("\t程序%d 服務時間:",a[i].id); scanf("%d",&a[i].st); printf("\n"); } min=a[0].dt; for(j=n-1;j>=0;j--) { for(i=0;i<j;i++) { if(a[i].dt>a[i+1].dt) //如果a[i]的到達時刻>a[i+1]的到達時刻 { min=a[i].id; a[i].id=a[i+1].id; a[i+1].id=min; min=a[i].dt; a[i].dt=a[i+1].dt; a[i+1].dt=min; min=a[i].st; a[i].st=a[i+1].st; a[i+1].st=min; } if(a[i].dt==a[i+1].dt&&a[i].st>a[i+1].st) //同時到達且a[i]更短 { min=a[i].id; a[i].id=a[i+1].id; a[i+1].id=min; min=a[i].dt; a[i].dt=a[i+1].dt; a[i+1].dt=min; min=a[i].st; a[i].st=a[i+1].st; a[i+1].st=min; } } } a[0].wct=a[0].st+a[0].dt; a[0].zt=(float)a[0].st; a[0].dczt=a[0].zt/a[0].st; for(i=1;i<n;i++) { if(a[i].dt>a[0].wct) ; else b=b+1; } for(j=b-1;j>=1;j--) { for(i=1;i<j;i++) { if(a[i].st>a[i+1].st) { min=a[i].dt; a[i].dt=a[i+1].dt; a[i+1].dt=min; min=a[i].st; a[i].st=a[i+1].st; a[i+1].st=min; min=a[i].id; a[i].id=a[i+1].id; a[i+1].id=min; } } } for(i=1;i<n;i++) { if(a[i].dt>a[i-1].wct) { a[i].wct=a[i].dt+a[i].st; a[i].zt=(float)a[i].st; a[i].dczt=a[i].zt/a[i].st; } else { a[i].wct=a[i-1].wct+a[i].st; a[i].zt=(float)(a[i].wct-a[i].dt); a[i].dczt=a[i].zt/a[i].st; } for(j=i+1,b=j;j<n;j++) { if(a[j].dt>a[i].wct) ; else b=b+1; } for(j=b-1;j>=i;j--) { for(z=i;z<j;z++) { if(a[z].st>a[z+1].st) { min=a[z].dt; a[z].dt=a[z+1].dt; a[z+1].dt=min; min=a[z].st; a[z].st=a[z+1].st; a[z+1].st=min; min=a[i].id; a[i].id=a[i+1].id; a[i+1].id=min; } } } } printf("\n\t請選擇輸出順序\n"); printf("\t1、按id號依次輸出\n"); printf("\t2、按完成順序依次輸出\n"); scanf("%d",&px); printf("\nid:到達時間\t服務時間\t完成時間\t週轉時間\t帶權週轉時間\n"); sum1=0; sum2=0; switch(px) { case 1: //1、按id號依次輸出 { for(j=0;j<n;j++) { for(i=0;i<n;i++) if(a[i].id==j+1) { printf("%d: %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt,a[i].dczt); sum1+=a[i].zt; sum2+=a[i].dczt; } } printf("\n平均週轉時間:%.2f\n",sum1/n); printf("\n平均帶權週轉時間:%.2f\n\n",sum2/n); break; } case 2: //2、按完成順序依次輸出 { for(i=0;i<n;i++) { printf("%d: %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt,a[i].dczt); sum1+=a[i].zt; sum2+=a[i].dczt; } printf("\n平均週轉時間:%.2f\n",sum1/n); printf("\n平均帶權週轉時間:%.2f\n\n",sum2/n); break; } default: break; } } /***************************時間片輪轉排程******************************/ /***********************************************************************/ void rr() { int i,j,n,min,px,rr,time; float sum1,sum2; bool flag=true; printf("\n\t請輸入有n個程序(0<n<=50): "); scanf("%d",&n); while(n>50||n<=0) { printf("n\t請重新輸入: "); scanf("%d",&n); } printf("\n\n"); printf("\t請輸入時間片大小(0<rr): "); scanf("%d",&rr); while(rr<=0) { printf("n\t請重新輸入: "); scanf("%d",&rr); } struct Gzuo{ int id; //程序名字 int dt; //到達時刻 int st; //服務時間 int wct; //完成時刻 int st2; //標誌是否完成 float zt; //週轉時間 float dczt; //帶權週轉時間 }; Gzuo a[N]; for(i=0;i<n;i++) { a[i].id=i+1; printf("\t程序%d 到達時間:",a[i].id); scanf("%d",&a[i].dt); printf("\t程序%d 服務時間:",a[i].id); scanf("%d",&a[i].st); a[i].st2 = a[i].st; printf("\n"); } for(j=n-1;j>=0;j--) { for(i=0;i<j;i++) { if(a[i].dt>a[i+1].dt) { min=a[i].dt; a[i].dt=a[i+1].dt; a[i+1].dt=min; min=a[i].st; a[i].st=a[i+1].st; a[i+1].st=min; min=a[i].st2; a[i].st2=a[i+1].st2; a[i+1].st2=min; min=a[i].id; a[i].id=a[i+1].id; a[i+1].id=min; } } } time = a[0].dt; //printf("賦值後TIME值為:%d\n",time); min = 0; while(min<n) { flag = true; for(i = 0;i<n;i++) { if(a[i].st2>0&&a[i].dt<=time) flag = false; } for(i=0;i<n;i++) { if(a[i].st2 > 0 ) { if(a[i].dt<=time) { //printf("當前a[%d].st2值為:%d\n",i,a[i].st2); a[i].st2 = a[i].st2 - rr; //printf("運算後當前a[%d].st2值為:%d\n",i,a[i].st2); //printf("當前TIME值為:%d\n",time); time = time + rr; //printf("增加之後TIME值為:%d\n",time); if(a[i].st2<=0) { a[i].wct = time + a[i].st2; a[i].zt=(float)(a[i].wct-a[i].dt); a[i].dczt=a[i].zt/a[i].st; min++; } }else if(flag) { for(i=0;i<n;i++) { if(a[i].st2>0&&a[i].dt>time) { time = a[i].dt; break; } } } } } } printf("\t1、按id號依次輸出\n"); printf("\t2、按完成順序依次輸出\n"); printf("\n\t請選擇輸出順序:\t"); scanf("%d",&px); printf("\nid:到達時間\t服務時間\t完成時間\t週轉時間\t帶權週轉時間\n"); sum1=0; sum2=0; switch(px) { case 2: { for(i=0;i<n;i++) { printf("%d: %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt,a[i].dczt); sum1+=a[i].zt; sum2+=a[i].dczt; } printf("\n平均週轉時間:%.2f\n",sum1/n); printf("\n平均帶權週轉時間:%.2f\n\n",sum2/n); break; } case 1: { for(j=0;j<n;j++) { for(i=0;i<n;i++) if(a[i].id==j+1) { printf("%d: %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt,a[i].dczt); sum1+=a[i].zt; sum2+=a[i].dczt; } } printf("\n平均週轉時間:%.2f\n",sum1/n); printf("\n平均帶權週轉時間:%.2f\n\n",sum2/n); break; } default: break; } } /***************************優先順序排程****************************/ /*****************************************************************/ void yxj() { int i,j,n,min,px; int b=0,z; float sum1,sum2; printf("\n\t\t請輸入有n個程序(0<n<=50):\t"); scanf("%d/n",&n); while(n>50||n<=0) { printf("n\t請重新輸入: "); scanf("%d",&n); } printf("\n"); struct Gzuo{ int id; //程序名字 int dt; //到達時刻 int st; //服務時間 int yxj; //優先順序 int wct; //完成時刻 float zt; //週轉時間 float dczt; //帶權週轉時間 }; Gzuo a[N]; for(i=0;i<n;i++) { a[i].id=i+1; printf("\t到達時間: "); scanf("%d",&a[i].dt); printf("\t服務時間: "); scanf("%d",&a[i].st); printf("\t優先順序: "); scanf("%d",&a[i].yxj); printf("\n"); } min=a[0].dt; for(j=n-1;j>=0;j--) { for(i=0;i<j;i++) { if(a[i].dt>a[i+1].dt) { min=a[i].dt; a[i].dt=a[i+1].dt; a[i+1].dt=min; min=a[i].st; a[i].st=a[i+1].st; a[i+1].st=min; min=a[i].id; a[i].id=a[i+1].id; a[i+1].id=min; min=a[i].yxj; a[i].yxj=a[i+1].yxj; a[i+1].yxj=min; } if(a[i].dt==a[i+1].dt&&a[i].yxj<a[i+1].yxj) { min=a[i].dt; a[i].dt=a[i+1].dt; a[i+1].dt=min; min=a[i].st; a[i].st=a[i+1].st; a[i+1].st=min; min=a[i].id; a[i].id=a[i+1].id; a[i+1].id=min; min=a[i].yxj; a[i].yxj=a[i+1].yxj; a[i+1].yxj=min; } } } a[0].wct=a[0].st+a[0].dt; a[0].zt=(float)a[0].st; a[0].dczt=a[0].zt/a[0].st; for(i=1;i<n;i++) { if(a[i].dt>a[0].wct) ; else b++; } for(j=b-1;j>=1;j--) { for(i=1;i<j;i++) { if(a[i].yxj<a[i+1].yxj) { min=a[i].dt; a[i].dt=a[i+1].dt; a[i+1].dt=min; min=a[i].st; a[i].st=a[i+1].st; a[i+1].st=min; min=a[i].id; a[i].id=a[i+1].id; a[i+1].id=min; min=a[i].yxj; a[i].yxj=a[i+1].yxj; a[i+1].yxj=min; } } } for(i=1;i<n;i++) { if(a[i].dt>a[i-1].wct) { a[i].wct=a[i].dt+a[i].st; a[i].zt=(float)a[i].st; a[i].dczt=a[i].zt/a[i].st; } else { a[i].wct=a[i-1].wct+a[i].st; a[i].zt=(float)(a[i].wct-a[i].dt); a[i].dczt=a[i].zt/a[i].st; } for(j=i+1,b=j;j<n;j++) { if(a[j].dt>a[i].wct) ; else b=b+1; } for(j=b-1;j>=i;j--) { for(z=i;z<j;z++) { if(a[z].yxj<a[z+1].yxj) { min=a[z].dt; a[z].dt=a[z+1].dt; a[z+1].dt=min; min=a[z].st; a[z].st=a[z+1].st; a[z+1].st=min; min=a[i].id; a[i].id=a[i+1].id; a[i+1].id=min; } } } } printf("\n\t請選擇輸出順序\n"); printf("\t1、按id號依次輸出\n"); printf("\t2、按完成順序依次輸出\n"); scanf("%d",&px); printf("\nid:到達時間\t服務時間\t優先順序\t完成時間\t週轉時間\t帶權週轉時間\n"); sum1=0; sum2=0; switch(px) { case 2: { for(i=0;i<n;i++) { printf("%d: %d\t\t%d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].yxj,a[i].st,a[i].wct,a[i].zt,a[i].dczt); sum1+=a[i].zt; sum2+=a[i].dczt; } printf("\n平均週轉時間:%.2f\n",sum1/n); printf("\n平均帶權週轉時間:%.2f\n\n",sum2/n); break; } case 1: { for(j=0;j<n;j++) { for(i=0;i<n;i++) if(a[i].id==j+1) { printf("%d: %d\t\t%d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].yxj,a[i].st,a[i].wct,a[i].zt,a[i].dczt); sum1+=a[i].zt; sum2+=a[i].dczt; } } printf("\n平均週轉時間:%.2f\n",sum1/n); printf("\n平均帶權週轉時間:%.2f\n\n",sum2/n); break; } default: break; } }