程序排程演算法 —— 先來先服務
阿新 • • 發佈:2018-11-03
/* 先來先服務 */ #include<stdio.h> #define MAX 50 struct Gzuo{ int id; //程序名字 int dt; //到達時刻 int st; //服務時間 int wct; //完成時刻 float zt; //週轉時間 float dczt; //帶權週轉時間 }; Gzuo a[MAX]; void main(){ int i,j,min; int n,px; //n:程序個數 px:輸出方式選擇 float sum1=0,sum2=0; printf("\n************* 先來先服務(FCFS)排程演算法 *************\n"); printf("\n\t請輸入有n個程序(0<n<=50): "); scanf("%d",&n); while(n>50||n<=0) { printf("n\t請重新輸入:"); scanf("%d",&n); } for(i=0;i<n;i++) { printf("\n\t*************輸入第%d個程序資訊:\n",i+1); printf("\t程序名字: "); scanf("%d",&a[i].id); printf("\t到達時間: "); scanf("%d",&a[i].dt); printf("\t服務時間: "); scanf("%d",&a[i].st); } 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; } } } for(i=0;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]完成時刻=到達時刻+服務時間 } 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("\n"); printf("\t1、按id號依次輸出\n"); printf("\t2、按完成順序依次輸出\n"); printf("\n\t請選擇輸出順序:\t"); scanf("%d",&px); printf("\n程序名字\t到達時間\t服務時間\t完成時間\t週轉時間\t帶權週轉時間\n"); 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\t\t%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\t\t%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; } } /* 1 0 3 2 2 4 3 4 4 4 3 5 */