#include <stdio.h> #include <string.h> #include <conio.h>/*conio.h是一个包含一些字符处理函数的头文件,如getch(), getch()是无显示的从键盘接收一个字符,有显示的接收是getchar()*/ typedef char string[10]; /* //定义string为含有10个字符元素的字符数组类型*/ struct task { string name; /*作业号*/ int arrTime; /* 作业到达时间*/ int serTime; /*作业要求服务时间*/ int waiTime; /*等待时间*/ int begTime; /*开始运行时间*/ int finTime; /*结束运行时间*/ int turTime; /*周转时间*/ int wTuTime; /*带权周转时间*/ int priority;/*优先权*/ int finish;/*是否已经完成*/ }JCB[5]; int num; void input() { int i; system("cls"); printf("\nPlease input task number: "); scanf("%d", &num); for(i=0;i<num;i++) { printf("\nPlease input task NO.%d:\n",i); printf(" The name of task: "); scanf("%s",JCB[i].name); printf(" The time arrive: "); scanf("%d",&JCB[i].arrTime); printf(" The time need: "); scanf("%d",&JCB[i].serTime); JCB[i].priority = 0; JCB[i].finish =0; } } int FCFS() { int current; int i,j; for(i=0; i<num; i++) { if(!JCB[i].finish) { current=i; /* 找到第一个还没完成的作业*/ break; } } for( j=i; j<num; j++) /* 和后面的作业比较*/ { if(!JCB[j].finish && JCB[j].arrTime<JCB[current].arrTime) { current=j; /*找出先来的未完成作业*/ } } return current; /* 返回当前作业*/ } int SJF(int pre) { int current,i,j; for(i=0; i<num; i++) { if(!JCB[i].finish) { current=i; /*找到第一个还没完成的作业*/ break; } } for(j=i; j<num; j++) /* 和后面的作业比较*/ { if( !JCB[j].finish) /* 还没完成(运行)*/ { if(JCB[current].arrTime<=JCB[pre].finTime)/*如果作业在上一个作业完成之前到达*/ { if(JCB[j].arrTime<=JCB[pre].finTime && JCB[j].serTime<JCB[current].serTime ) current=j; /* 找出到达时间在上一个作业完成之前,服务时间比较小的未完成作业*/ } else /*如果作业是在上一个作业完成之后到达*/ { if(JCB[j].arrTime<JCB[current].arrTime) current=j; /*找出比较早到达的一个*/ if(JCB[j].arrTime==JCB[current].arrTime) /*如果同时到达*/ if(JCB[j].serTime<JCB[current].serTime) current=j; /*找出服务时间比较短的一个*/ } } } return current; /*返回当前作业*/ } int HRN(int pre) { int current=1,i,j; /* 优先权 =(等待时间+服务时间)/服务时间*/ for(i=0; i<num; i++) { JCB[i].waiTime=JCB[pre].finTime-JCB[i].arrTime; /*等待时间 =上一个作业的完成时间-到达时间*/ JCB[i].priority=(JCB[i].waiTime+JCB[i].serTime)/JCB[i].serTime; } for(i=0; i<num; i++) { if(!JCB[i].finish) { current=i; /*找到第一个还没完成的作业*/ break; } } for( j=i; j<num; j++) /*和后面的作业比较*/ { if( !JCB[j].finish) /* 还没完成(运行)*/ { if(JCB[current].arrTime<=JCB[pre].finTime) /*如果作业在上一个作业完成之前到达*/ { if(JCB[j].arrTime<=JCB[pre].finTime && JCB[j].priority>JCB[current].priority ) current=j;/* 找出到达时间在上一个作业完成之前,优先权高的作业*/ } else /* 如果作业是在上一个作业完成之后到达*/ { if(JCB[j].arrTime<JCB[current].arrTime) current=j; /* 找出比较早到达的一个*/ if(JCB[j].arrTime==JCB[current].arrTime) /* 如果同时到达*/ if(JCB[j].priority>JCB[current].priority) current=j; /*找出服务时间比较短的一个*/ } } } return current;/*返回当前作业*/ } void runing(int i, int times, int pre, int staTime, int endTime) { if(times==0) { JCB[i].begTime=JCB[i].arrTime; JCB[i].finTime=JCB[i].begTime+JCB[i].serTime; JCB[i].turTime=JCB[i].serTime; JCB[i].wTuTime=1.0; staTime=JCB[i].begTime; } else { if(JCB[i].arrTime>JCB[pre].finTime) JCB[i].begTime=JCB[i].arrTime; else JCB[i].begTime=JCB[pre].finTime; JCB[i].finTime=JCB[i].begTime+JCB[i].serTime; JCB[i].turTime=JCB[i].finTime-JCB[i].arrTime; JCB[i].wTuTime=JCB[i].turTime/JCB[i].serTime; } if(times==num-1) endTime=JCB[i].finTime; JCB[i].finish=1; } void print(int i,int times) { if(times==0) { printf(" name arrTime serTime begTime finTime turTime wTuTime\n"); } printf("%9s%9d%9d%9d%9d%9df%9df\n", JCB[i].name,JCB[i].arrTime,JCB[i].serTime, JCB[i].begTime,JCB[i].finTime,JCB[i].turTime,JCB[i].wTuTime); } void check( ) { int i; int staTime, endTime, sumTurTime=0.0, sumWTuTime=0.0, aveTurTime, aveWTuTime; int current=0, times=0, pre=0; JCB[pre].finTime=0; printf("\n-- FCFS -----------------------------------------------------------------\n"); for(times=0; times<num; times++) { current=FCFS(); runing(current, times, pre, staTime, endTime); print(current, times); pre=current; } for(i=0; i<num; i++) { sumTurTime+=JCB[i].turTime; sumWTuTime+=JCB[i].wTuTime; } aveTurTime=sumTurTime/num; aveWTuTime=sumWTuTime/num; printf("(total) %9.2f%9.2f%9.2f%9.2f\n",staTime,endTime,aveTurTime,aveWTuTime); printf("-------------------------------------------------------------------------\n"); for(i=0; i<num; i++) { JCB[i].finish=0; } staTime, endTime, sumTurTime=0.0, sumWTuTime=0.0, aveTurTime, aveWTuTime; current=0; times=0; pre=0; JCB[pre].finTime=0; printf("\n-- SJF ------------------------------------------------------------------\n"); for(times=0; times<num; times++) { current=SJF(pre); runing(current, times, pre, staTime, endTime); print(current, times); pre=current; } for(i=0; i<num; i++) { sumTurTime+=JCB[i].turTime; sumWTuTime+=JCB[i].wTuTime; } aveTurTime=sumTurTime/num; aveWTuTime=sumWTuTime/num; printf("(total) %9d%9d%9d%9d\n",staTime,endTime,aveTurTime,aveWTuTime); printf("-------------------------------------------------------------------------\n"); for(i=0; i<num; i++) { JCB[i].finish=0; } staTime, endTime, sumTurTime=0.0, sumWTuTime=0.0, aveTurTime, aveWTuTime; current=0; times=0; pre=0; JCB[pre].finTime=0; printf("\n-- HRN ------------------------------------------------------------------\n"); for(times=0; times<num; times++) { current=HRN(pre); runing(current, times, pre, staTime, endTime); print(current, times); pre=current; } for(i=0; i<num; i++) { sumTurTime+=JCB[i].turTime; sumWTuTime+=JCB[i].wTuTime; } aveTurTime=sumTurTime/num; aveWTuTime=sumWTuTime/num; printf("(total) %9d%9d%9d f%9df\n",staTime,endTime,aveTurTime,aveWTuTime); printf("-------------------------------------------------------------------------\n"); } void main() { char again; do { system("cls"); /*清屏*/ printf("please input 4 groups of datas:\n"); input(); check(); printf("Continue...(Y/N): "); do{ again = getch(); }while(again!='Y' && again!='y' && again!='N' && again!='n'); }while(again=='Y' || again=='y'); }