#include<stdio.h> #include<string.h> struct job{ char name[10]; int starttime; //作业到达系统时间 int needtime; //作业运行时间 int runtime; //作业周转时间 int endtime; //作业结束时间 double dqzztime; //带权周转时间 double xiangyingbi; }; void fcfs(struct job jobs[50],int n); void sjf(struct job jobs[50],int n); void hrrf(struct job jobs[50],int n); void result(struct job jobs[50],int n); void main() { struct job jobs[50]; int n,i; //n个作业 printf("输入作业个数:",n); scanf("%d",&n); printf("输入每个作业的作业名,到达时间,运行时间:\n"); for(i=0;i<n;i++) { scanf("%s",jobs[i].name); scanf("%d",&jobs[i].starttime); scanf("%d",&jobs[i].needtime); } printf("\n"); printf("作业名\t到达系统时间\t运行时间\n"); for(i=0;i<n;i++) { printf("%s\t %d\t %d\n",jobs[i].name,jobs[i].starttime,jobs[i].needtime); } fcfs(jobs,n); printf("先来先服务算法运行结果:\n"); result(jobs,n); sjf(jobs,n); printf("最短作业优先算法运行结果:\n"); // hrrf(jobs,n); // printf("最高响应比优先算法运行结果:\n"); result(jobs,n); } void fcfs(struct job jobs[50],int n) { int i; for(i=0;i<n;i++) { if(i==0) { //第一个进程 jobs[i].runtime=jobs[i].needtime; jobs[i].endtime=jobs[i].starttime+jobs[i].needtime; } else if(jobs[i].starttime>jobs[i-1].endtime){ //第i个进程到达系统时,第i-1个进程已运行完毕 jobs[i].runtime=jobs[i].needtime; jobs[i].endtime=jobs[i].starttime+jobs[i].needtime; } else{ //第i个进程到达系统时,第i-1个进程未运行完毕 jobs[i].runtime=jobs[i].needtime+jobs[i-1].endtime-jobs[i].starttime; jobs[i].endtime=jobs[i].starttime+jobs[i].runtime; } jobs[i].dqzztime=jobs[i].runtime*1.0/jobs[i].needtime; } } void result(struct job jobs[50],int n) { int i; double averruntime; double averdqzztime; int sum_runtime=0; double sum_dqzztime=0.00; printf("作业名\t到达系统时间\t运行时间\t完成时间\t周转时间 带权周转时间\n"); for(i=0;i<n;i++) { printf("%s\t %d\t %d\t %d\t %d %.2f\n",jobs[i].name,jobs[i].starttime,jobs[i].needtime,jobs[i].endtime,jobs[i].runtime,jobs[i].dqzztime); sum_runtime=sum_runtime+jobs[i].runtime; sum_dqzztime=sum_dqzztime+jobs[i].dqzztime; } averruntime=sum_runtime*1.0/n; averdqzztime=sum_dqzztime*1.000/n; printf("平均周转时间:%.2f \n",averruntime); printf("平均带权周转时间:%.3f \n",averdqzztime); printf("\n"); } void sjf(struct job jobs[50],int n) { int i=0,b=0; char temp[10]; int min; for(i=0;i<n-1;i++) { if(jobs[i].starttime>jobs[i+1].starttime) { min=jobs[i].starttime; jobs[i].starttime=jobs[i+1].starttime; jobs[i+1].starttime=min; min=jobs[i].needtime; jobs[i].needtime=jobs[i+1].needtime; jobs[i+1].needtime=min; strcpy(temp,jobs[i].name); strcpy(jobs[i].name,jobs[i+1].name); strcpy(jobs[i+1].name,temp); } } //按作业到达系统时间进行排序,最早到达的排在最前面 jobs[0].endtime=jobs[0].starttime+jobs[0].needtime; jobs[0].runtime=jobs[0].needtime; jobs[0].dqzztime=jobs[0].runtime*1.0/jobs[0].needtime; for(i=1;i<n;i++) { if(jobs[i].starttime>jobs[0].endtime) ; else b=b+1; //作业到达系统时,第0个作业还在运行 用b统计需等待作业0运行的作业个数 } for(i=1;i<=b-1;i++) { if(jobs[i].needtime>jobs[i+1].needtime) { min=jobs[i].starttime; jobs[i].starttime=jobs[i+1].starttime; jobs[i+1].starttime=min; min=jobs[i].needtime; jobs[i].needtime=jobs[i+1].needtime; jobs[i+1].needtime=min; strcpy(temp,jobs[i].name); //将第二个参数的值复制给第一个参数,返回第一个参数 strcpy(jobs[i].name,jobs[i+1].name); strcpy(jobs[i+1].name,temp); } //按最短运行时间排序 } for(i=1;i<n;i++) { if(jobs[i].starttime>jobs[i-1].endtime) { //第i个进程到达系统时,第i-1个进程已运行完毕 jobs[i].endtime=jobs[i].starttime+jobs[i].needtime; jobs[i].runtime=jobs[i].needtime; } else { jobs[i].endtime=jobs[i-1].endtime+jobs[i].needtime; jobs[i].runtime=jobs[i].endtime-jobs[i].starttime; } jobs[i].dqzztime=jobs[i].runtime*1.0/jobs[i].needtime; } }
这是FCFS SJF 算法代码和运行结果,HRRF算法还在完成中。
时间: 2024-10-27 17:46:08