#include<stdio.h> #include<string.h> #include<stdlib.h> struct jcb{ char name[10]; char status; int arrtime;//到达时间 int id; int reqtime;//作业运行所需时间 int startime;//开始时间 int finitime;//完成时间 int ti;//周转时间 float TAtime,TAWtime;//等待时间,带权周转时间 float prio; }job[24],jcb[24],jobarr[24]; int systime=0; int m=0; int intarr,intfin,intjob;//到达的作业个数,完成作业个数、未到达作业个数 int ReadFile() { int i=0; FILE *fp; //定义文件指针 fp=fopen("F:/3.txt","r"); //打开文件 if(fp==NULL) { printf("File open error ! "); exit(0); } printf(" id 作业到达时间 作业运行所需要时间 "); while(!feof(fp)) { fscanf(fp,"%d%d%d",&jcb[i].id,&jcb[i].arrtime,&jcb[i].reqtime); //fscanf()函数将数据读入 printf(" %3d%12d%15d ",jcb[i].id,jcb[i].arrtime,jcb[i].reqtime); //输出到屏幕 i++; } if(fclose(fp)) //关闭文件 { printf("Can not close the file ! "); exit(0); } m=i; return m; } //调用伪随机数的产生数据 int Pseudo_random_number() { int i; srand((unsigned)time(0)); //参数seed是rand()的种子,用来初始化rand()的起始值。 //输入作业数 m=rand()%23+5; for(i=1; i<=m; i++) { jcb[i].id=i; //作业到达时间 jcb[i].arrtime=rand()%29+1; //作业运行时间 jcb[i].reqtime=rand()%7+1; } printf(" id 作业到达时间 作业运行所需要时间 "); for(i=1; i<=m; i++) { printf(" %3d%12d%15d ",jcb[i].id,jcb[i].arrtime,jcb[i].reqtime); } return m; } //先到先服务 void TheFCFS() { int i,j; float sum=0.0,acount=0.0; struct jcb temp; printf("**********先来先服务算法FCFS************* "); //ReadFile(); for(i=0;i<m;i++) { for(j=i+1;j<m;j++) { if(jcb[i].arrtime>jcb[j].arrtime) { temp=jcb[i]; jcb[i]=jcb[j]; jcb[j]=temp; } } } printf(" id 作业到达时间 作业运行所需要时间 "); for(i=0;i<m;i++) { printf(" %3d%12d%15d ",jcb[i].id,jcb[i].arrtime,jcb[i].reqtime); } for(i=0;i<m;i++){ jcb[i].finitime=systime+jcb[i].reqtime; jcb[i].ti=jcb[i].finitime-jcb[i].arrtime; jcb[i].TAWtime=(float)jcb[i].ti/jcb[i].reqtime; systime=jcb[i].finitime; } for(i=0;i<m;i++) { sum=sum+jcb[i].ti; acount=acount+jcb[i].TAWtime; } //jcb[0].ti=jcb[0].finitime-systime; printf(" id 到达时间 运行时间 完成时间 周转时间 带权周转时间 "); for(i=0;i<m;i++) printf("%d %d %d %d %d %.2f ",jcb[i].id,jcb[i].arrtime,jcb[i].reqtime,jcb[i].finitime,jcb[i].ti,jcb[i].TAWtime); printf("平均作业周转时间=%.2f ",sum/m); printf("平均作业周转时间=%.2f ",acount/m); printf(" "); printf(" "); } //计算周转时间,带权周转时间,平均周转时间 void jisuan(int i,int j){ float sum=0.0,acount=0.0; for(i=0;i<m;i++){ jcb[i].finitime=systime+jcb[i].reqtime; jcb[i].ti=jcb[i].finitime-jcb[i].arrtime; jcb[i].TAWtime=(float)jcb[i].ti/jcb[i].reqtime; systime=jcb[i].finitime; } for(i=0;i<m;i++) { sum=sum+jcb[i].ti; acount=acount+jcb[i].TAWtime; } //jcb[0].ti=jcb[0].finitime-systime; printf(" id 到达时间 运行时间 完成时间 周转时间 带权周转时间 "); for(i=0;i<m;i++) printf("%d %d %d %d %d %.2f ",jcb[i].id,jcb[i].arrtime,jcb[i].reqtime,jcb[i].finitime,jcb[i].ti,jcb[i].TAWtime); printf("平均作业周转时间=%.2f ",sum/m); printf("平均作业周转时间=%.2f ",acount/m); printf(" "); printf(" "); } //短作业优先 void TheSJF() { int i,j; float sum=0.0,acount=0.0; struct jcb temp; printf("**********先来先服务算法SJF************* "); //ReadFile(); for(i=0;i<m;i++) { for(j=i+1;j<m;j++) { if(jcb[i].arrtime>jcb[j].arrtime) { temp=jcb[i]; jcb[i]=jcb[j]; jcb[j]=temp; } } } printf(" id 作业到达时间 作业运行所需要时间 "); for(i=0;i<m;i++) { printf(" %3d%12d%15d ",jcb[i].id,jcb[i].arrtime,jcb[i].reqtime); } for(i=1;i<m;i++){ for(j=i+1;j<m;j++){ if(jcb[i].reqtime>jcb[j].reqtime){ temp=jcb[i]; jcb[i]=jcb[j]; jcb[j]=temp; } } } jisuan(i,j); } //HRRF(最高响应比)算法调度 void TheHRRF(){ int i,j; float sum=0.0,acount=0.0; struct jcb temp; printf("**********最高响应比算法HRRF************* "); //ReadFile(); for(i=0;i<m;i++) { for(j=i+1;j<m;j++) { if(jcb[i].arrtime>jcb[j].arrtime) { temp=jcb[i]; jcb[i]=jcb[j]; jcb[j]=temp; } } } for(i=1;i<m;i++){ for(j=i+1;j<m;j++){ if(jcb[i].reqtime>jcb[j].reqtime){ temp=jcb[i]; jcb[i]=jcb[j]; jcb[j]=temp; } } } printf(" id 作业到达时间 作业运行所需要时间 "); for(i=0;i<m;i++) { printf(" %3d%12d%15d ",jcb[i].id,jcb[i].arrtime,jcb[i].reqtime); } printf(" id 最高响应比 "); for(j=1;j<m;j++) { jcb[j].TAtime=(float)(jcb[0].reqtime-jcb[j].arrtime); jcb[j].prio=1+jcb[j].TAtime/jcb[j].reqtime; printf("%d %.2f ",jcb[j].id,jcb[j].prio); } for(i=1;i<m-1;i++){ printf(" id 最高响应比 "); for(j=i+1;j<m;j++){ jcb[j].TAtime=jcb[j].TAtime+jcb[i].reqtime; jcb[j].prio=1+jcb[j].TAtime/jcb[j].reqtime; printf("%d %.2f ",jcb[j].id,jcb[j].prio); }} jisuan(i,j); } void menu2() { printf(" **************************************** "); printf(" 1、调用键盘输入数据 "); printf(" 2、调用文本写入数据 "); printf(" 3、调用伪随机数的产生数据 "); printf(" 0、退出系统 "); printf(" **************************************** "); printf(" 请选择菜单项:"); } void menu(){ printf(" ***************************************************** "); printf(" * welcome * "); printf(" ***************************************************** "); printf(" * 1、FCFS(先到先服务)算法调度 * "); printf(" * 2、SJF(短作业优先)算法调度 * "); printf(" * 3、HRRF(最高响应比)算法调度 * "); printf(" * 0、后退到上一级菜单 * "); printf(" ***************************************************** "); printf("请选择功能<0~5>:"); } void insert(int n) { int i,j; char name[10]; int arrtime1; int reqtime1; printf("what? "); printf("输入作业名:"); scanf("%s",name); printf("到达时间:"); scanf("%d",&arrtime1); printf("要求服务时间:"); scanf("%d",&reqtime1); printf(" "); for(i=0;i<=n;i++) { if(arrtime1<job[i].arrtime) { for(j=n-1;j>=i;j--) { job[j+1].arrtime=job[j].arrtime; strcpy(job[j+1].name,job[j].name); job[j+1].reqtime=job[j].reqtime; } job[i].arrtime=arrtime1; strcpy(job[i].name,name); job[i].reqtime=reqtime1; //n=n+1; break; } if((i=n)&&(arrtime1>=job[i].arrtime)) { job[i].arrtime=arrtime1; job[i].reqtime=reqtime1; strcpy(job[i].name,name); } } for(i=0;i<=n;i++) { printf("N %d %s %d %d ",i+1,job[i].name,job[i].arrtime,job[i].reqtime); } } void Delete(int n) { int i,j; int arrtime1; printf("what? "); printf("input the data to delete:"); scanf("%d",&arrtime1); for(i=0;i<n;i++) { if(arrtime1==job[i].arrtime) { for(j=i+1;j<n;j++) { job[j-1].arrtime=job[j].arrtime; job[j-1].reqtime=job[j].reqtime; strcpy(job[j-1].name,job[j].name); } } } printf(" name arrtime reqtime "); for(i=0;i<n-1;i++) { printf("N %d %s %d %d ",i+1,job[i].name,job[i].arrtime,job[i].reqtime); } } void all(int n) { //int i,j; char ch; //int arrtime1; //int reqtime1; printf("Insert or Delete or Exit?"); scanf("%s",&ch); if(ch=='I' || ch=='i') { insert(n); } else if(ch=='D' || ch=='d') { Delete(n); } else if(ch=='E' || ch=='e') { exit(0); } } //调用键盘输入数据 void input() { int i,j,n; //char ch[10]; struct jcb temp; printf(" 作业个数:"); scanf("%d",&n); printf(" "); for(i=0;i<n;i++){ printf("第%d个作业: ",i+1); printf("输入作业名:"); scanf("%s",job[i].name); printf("到达时间:"); scanf("%d",&job[i].arrtime); printf("要求服务时间:"); scanf("%d",&job[i].reqtime); printf(" "); } for(i=0;i<n;i++){ for(j=i+1;j<n;j++){ if(job[i].arrtime>job[j].arrtime){ temp=job[i]; job[i]=job[j]; job[j]=temp; } } } printf("经按到达时间排序后,未达到队列是 "); printf(" name artime rqtime "); for(i=0;i<n;i++){ printf("N %d %s %d %d ",i+1,job[i].name,job[i].arrtime,job[i].reqtime); } all(n); printf(" 现在系统时间 0: "); } main(){ int n,p; while(1){ menu2(); scanf("%d",&n); if(n==0) break; switch(n){ case 1:input(); while(1){ menu(); scanf("%d",&p); if(p==0) break; switch(p){ case 1:TheFCFS();break; case 2:TheSJF();break; case 3:TheHRRF();break; case 0:p=0;break;}} break; case 2:ReadFile(); while(1){ menu(); scanf("%d",&p); if(p==0) break; switch(p){ case 1:TheFCFS();break; case 2:TheSJF();break; case 3:TheHRRF();break; case 0:p=0;break;}} break; case 3:Pseudo_random_number(); while(1){ menu(); scanf("%d",&p); if(p==0) break; switch(p){ case 1:TheFCFS();break; case 2:TheSJF();break; case 3:TheHRRF();break; case 0:p=0;break;}} break; case 0:n=0;break; } } printf("please any key to continue......"); getch(); }