#include<stdio.h> void readfile(void); void input(void); void output(void); void sort(void); void FCFS(void); void SJF(void); void HRRF(void); struct job{ char name[10];//作业名 char status;//作业状态 int arrtime;//到达时间 int reqtime;//所需时间 int startime;//开始时间 int finitime;//结束时间 float TAtime, TAWtime;//周转时间,带权周转时间 float prio;//优先级 } jobarr[24], jobfin[24], job[24], temp; int systime = 0; int intarr, intfin, intjob;//到达作业个数,完成作业个数,未到达作业个数 int main(void) { //input(); readfile(); sort(); output(); FCFS(); SJF(); HRRF(); return 0; } void readfile(void) { int count = 0; FILE *fp; if((fp=fopen("data.txt","a+"))!=NULL) { while(!feof(fp)&&fgetc(fp)!=EOF) { fseek(fp,-1L,SEEK_CUR); fscanf(fp,"%s%d%d",&job[count].name,&job[count].arrtime,&job[count].reqtime); count++; } }else printf("fail to open"); fclose(fp); intarr = count; } void input(void) { int i; printf("请输入作业个数:"); scanf("%d", &intarr); for(i = 0; i < intarr; i++) { printf(" 第%d个作业: ", i+1); printf("输入作业名:"); scanf("%s", job[i].name); printf("到达时间:"); scanf("%d", &job[i].arrtime); printf("要求服务时间:"); scanf("%d", &job[i].reqtime); } } void sort(void) { int i, j; for(i = 0; i < intarr; i++) { for(j = 0; j < intarr-1; j++) { if(job[j].arrtime > job[j+1].arrtime) { temp = job[j]; job[j] = job[j+1]; job[j+1] = temp; } } } } void output(void) { int i; printf("经按到达时间排序后 "); printf(" name arrtime rqtime "); for(i = 0; i < intarr; i++) { printf("N %d %s %d %d ", i, job[i].name, job[i].arrtime, job[i].reqtime); } printf(" 现在系统时间%d ", systime); } void FCFS(void) { int i; double sumTAtime = 0;//总周转时间 double sumTAWtime = 0;//总带权周转时间 double avgTAtime = 0;//平均周转时间 double avgTAWtime = 0;//平均带权周转时间 job[0].finitime = job[0].arrtime + job[0].reqtime; job[0].startime = job[0].arrtime; for(i = 1; i < intarr; i++) { job[i].startime = job[i-1].finitime; job[i].finitime = job[i-1].finitime + job[i].reqtime; } for(i = 0; i < intarr; i++) { job[i].TAtime = job[i].finitime - job[i].arrtime; sumTAtime += job[i].TAtime; job[i].TAWtime = job[i].TAtime / job[i].reqtime; sumTAWtime += job[i].TAWtime; } avgTAtime = sumTAtime / intarr; avgTAWtime = sumTAWtime / intarr; printf(" FCFS算法作业序列表 "); printf("----------------------------------------------- "); printf("作业名 到达系统时间 cpu所需时间 开始时间 结束时间 周转时间 "); for(i = 0; i < intarr; i++) { printf("%s %d %d %d %d %.2f ", job[i].name, job[i].arrtime, job[i].reqtime, job[i].startime, job[i].finitime, job[i].TAtime); } printf(" 平均周转时间=%.2f", avgTAtime); printf(" 平均带权周转时间=%.2f ", avgTAWtime); } void SJF(void) { int i = 1, j = 1; double sumTAtime = 0;//总周转时间 double sumTAWtime = 0;//总带权周转时间 double avgTAtime = 0;//平均周转时间 double avgTAWtime = 0;//平均带权周转时间 job[0].finitime = job[0].arrtime + job[0].reqtime; job[0].startime = job[0].arrtime; for(i = 1; i < intarr; i++) { for(j = 1; j < intarr-1; j++) { if(job[j].reqtime > job[j+1].reqtime) { temp = job[j]; job[j] = job[j+1]; job[j+1] = temp; } } } for(i = 1; i < intarr; i++) { job[i].startime = job[i-1].finitime; job[i].finitime = job[i-1].finitime + job[i].reqtime; } for(i = 0; i < intarr; i++) { job[i].TAtime = job[i].finitime - job[i].arrtime; sumTAtime += job[i].TAtime; job[i].TAWtime = job[i].TAtime / job[i].reqtime; sumTAWtime += job[i].TAWtime; } avgTAtime = sumTAtime / intarr; avgTAWtime = sumTAWtime / intarr; printf(" SJF算法作业序列表 "); printf("----------------------------------------------- "); printf("作业名 到达系统时间 cpu所需时间 开始时间 结束时间 周转时间 "); for(i = 0; i < intarr; i++) { printf("%s %d %d %d %d %.2f ", job[i].name, job[i].arrtime, job[i].reqtime, job[i].startime, job[i].finitime, job[i].TAtime); } printf(" 平均周转时间=%.2f", avgTAtime); printf(" 平均带权周转时间=%.2f ", avgTAWtime); } void HRRF(void) { int i = 1, j = 1; double sumTAtime = 0;//总周转时间 double sumTAWtime = 0;//总带权周转时间 double avgTAtime = 0;//平均周转时间 double avgTAWtime = 0;//平均带权周转时间 job[0].finitime = job[0].arrtime + job[0].reqtime; job[0].startime = job[0].arrtime; sort(); for(i = 1; i < intarr; i++) { for(j = 1; j < intarr-1; j++) { if(job[j].prio < job[j+1].prio) { if(job[j].arrtime == job[j+1].arrtime) { temp = job[j]; job[j] = job[j+1]; job[j+1] = temp; } } } } for(i = 1; i < intarr; i++) { job[i].prio = 1 + (job[i-1].finitime - job[i].arrtime) / job[i].reqtime; job[i].finitime = job[i-1].finitime + job[i].reqtime; } for(i = 0; i < intarr; i++) { job[i].TAtime = job[i].finitime - job[i].arrtime; sumTAtime += job[i].TAtime; job[i].TAWtime = job[i].TAtime / job[i].reqtime; sumTAWtime += job[i].TAWtime; } avgTAtime = sumTAtime / intarr; avgTAWtime = sumTAWtime / intarr; printf(" HRRF算法作业序列表 "); printf("----------------------------------------------- "); output(); printf("id 最高响应比 "); for(i = 1; i < intarr; i++) { printf("%s %.2f ", job[i].name, job[i].prio); } printf("----------------------------------------------- "); printf("作业名 到达系统时间 cpu所需时间 开始时间 结束时间 周转时间 "); for(i = 0; i < intarr; i++) { printf("%s %d %d %d %d %.2f ", job[i].name, job[i].arrtime, job[i].reqtime, job[i].startime, job[i].finitime, job[i].TAtime); } printf(" 平均周转时间=%.2f", avgTAtime); printf(" 平均带权周转时间=%.2f ", avgTAWtime); }