#include<stdio.h>
#include<string.h>#include<stdlib.h>#include<time.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("E:/zydd.txt","r"); //打开文件 if(fp==NULL) { printf("File open error !\n"); exit(0); } printf("\n id 作业到达时间 作业运行所需要时间\n"); while(!feof(fp)) { fscanf(fp,"%d%d%d",&jcb[i].id,&jcb[i].arrtime,&jcb[i].reqtime); //fscanf()函数将数据读入 printf("\n%3d%12d%15d\n",jcb[i].id,jcb[i].arrtime,jcb[i].reqtime); //输出到屏幕 i++; }if(fclose(fp)) //关闭文件
{ printf("Can not close the file !\n"); 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("\n id 作业到达时间 作业运行所需要时间\n"); for(i=1; i<=m; i++) { printf("\n%3d%12d%15d\n",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*************\n"); //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("\n id 作业到达时间 作业运行所需要时间\n"); for(i=0;i<m;i++) { printf("\n%3d%12d%15d\n",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("\nid 到达时间 运行时间 完成时间 周转时间 带权周转时间\n"); for(i=0;i<m;i++) printf("%d %d\t\t%d\t %d\t %d\t %.2f\n",jcb[i].id,jcb[i].arrtime,jcb[i].reqtime,jcb[i].finitime,jcb[i].ti,jcb[i].TAWtime);
printf("平均作业周转时间=%.2f\n",sum/m); printf("平均作业周转时间=%.2f\n",acount/m); printf("\n"); printf("\n");
}
//计算周转时间,带权周转时间,平均周转时间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("\nid 到达时间 运行时间 完成时间 周转时间 带权周转时间\n");for(i=0;i<m;i++) printf("%d %d\t\t%d\t %d\t %d\t %.2f\n",jcb[i].id,jcb[i].arrtime,jcb[i].reqtime,jcb[i].finitime,jcb[i].ti,jcb[i].TAWtime);printf("平均作业周转时间=%.2f\n",sum/m); printf("平均作业周转时间=%.2f\n",acount/m); printf("\n"); printf("\n");}//短作业优先void TheSJF(){ int i,j;
float sum=0.0,acount=0.0;
struct jcb temp; printf("**********先来先服务算法SJF*************\n"); //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("\n id 作业到达时间 作业运行所需要时间\n");
for(i=0;i<m;i++) { printf("\n%3d%12d%15d\n",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*************\n"); //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("\n id 作业到达时间 作业运行所需要时间\n"); for(i=0;i<m;i++) { printf("\n%3d%12d%15d\n",jcb[i].id,jcb[i].arrtime,jcb[i].reqtime); } printf("\nid 最高响应比\n"); 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\n",jcb[j].id,jcb[j].prio); } for(i=1;i<m-1;i++){ printf("\nid 最高响应比\n"); 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\n",jcb[j].id,jcb[j].prio); }} jisuan(i,j);}
void menu2()
{ printf("\t****************************************\n"); printf("\t 1、调用键盘输入数据 \n"); printf("\t 2、调用文本写入数据 \n"); printf("\t 3、调用伪随机数的产生数据 \n"); printf("\t 0、退出系统 \n"); printf("\t****************************************\n"); printf("\t请选择菜单项:");}void menu(){
printf("\t*****************************************************\n"); printf("\t* welcome *\n"); printf("\t*****************************************************\n"); printf("\t* 1、FCFS(先到先服务)算法调度 *\n"); printf("\t* 2、SJF(短作业优先)算法调度 *\n"); printf("\t* 3、HRRF(最高响应比)算法调度 *\n"); printf("\t* 0、后退到上一级菜单 *\n"); printf("\t*****************************************************\n"); printf("请选择功能<0~3>:");}void insert(int n)
{ int i,j; char name[10]; int arrtime1; int reqtime1; printf("what?\n"); printf("输入作业名:"); scanf("%s",name); printf("到达时间:"); scanf("%d",&arrtime1); printf("要求服务时间:"); scanf("%d",&reqtime1); printf("\n"); 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\t%s\t%d\t%d\n",i+1,job[i].name,job[i].arrtime,job[i].reqtime); }}void Delete(int n)
{int i,j;
int arrtime1; printf("what?\n"); 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("\tname\tarrtime\treqtime\n"); for(i=0;i<n-1;i++) { printf("N %d\t%s\t%d\t%d\n",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("\t作业个数:"); scanf("%d",&n); printf("\n"); for(i=0;i<n;i++){ printf("第%d个作业:\n",i+1); printf("输入作业名:"); scanf("%s",job[i].name); printf("到达时间:"); scanf("%d",&job[i].arrtime); printf("要求服务时间:"); scanf("%d",&job[i].reqtime); printf("\n"); } 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("经按到达时间排序后,未达到队列是\n"); printf("\tname\tartime\trqtime\n"); for(i=0;i<n;i++){ printf("N %d\t%s\t%d\t%d\n",i+1,job[i].name,job[i].arrtime,job[i].reqtime); } all(n); printf("\n\t现在系统时间 0:\n");}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......"); getchar();}