#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define M 24
struct JCB{
char name[M];//作业名
int rt;//到达时间
float r;//响应比
int ct;//需要CPU(运行)时间
int ft;//完成时的时间
int wt;//周转时间
float awt;//加权周转时间
}p[M];
//输出函数
void Output(int a)
{
int i;
printf("
作业名 到达系统时间 所需CPU时间 完成时间 周转时间 加权周转时间
");
for(i=0;i<a;i++)
{
printf("%s ",p[i].name);
printf(" %d ",p[i].rt);
printf(" %d ",p[i].ct);
printf("%d ",p[i].ft);
printf("%d ",p[i].wt);
printf("%f
",p[i].awt);
}
}
//输入函数
int Input()
{
int i,a,b=0;
int init,k;
int j=1;
JCB f;
do{
printf("请输入作业个数(2-24):");
scanf("%d",&a);
if(a<2||a>24)
j=0;
else break;
}while(j=1);
for(i=0;i<a;i++)
{
printf("Please enter name:");
scanf("%s",p[i].name);
printf("Please enter rt:");
scanf("%d",&p[i].rt);
printf("Please enter ct:");
scanf("%d",&p[i].ct);
p[i].ft=0;
p[i].wt=0;
p[i].awt=0;
p[i].r=0;
}
for(i=0;i<a;i++)//按到达系统时间先后排序
{
init=p[b].rt;
f=p[b];
for(k=b;k<a;k++)
{
if(p[k].rt<init)
{
f=p[k];
p[k]=p[b];
p[b]=f;
init=p[b].rt;
}
}
b++;
}
Output(a);//按到达系统时间先后排序输出
return a;
}
//SJF算法选择短作业
int Selectwork(int t,int n){
int i,l=0;
int temp,m,k=0;
JCB a[M];
JCB b;
//寻找当前时间t到达系统还未完成的作业,用数组a[M]存储
for(i=1;i<n;i++)
{
if(p[i].rt<=t&&p[i].ft==0)
{
a[l]=p[i];
l++;
k=l;
}
}
//寻找未完成作业中最短的作业
temp=a[0].ct;
b=a[0];
for(m=0;m<k;m++)
{
if(a[m].ct<temp)
{
b=a[m];
a[m]=a[0];
a[0]=b;
temp=a[0].ct;
}
}
return a[0].ct;//返回最短作业的所需CPU时间
}
//HRRE算法选择响应比高的作业
int Choose(int t,int n)
{
int i,k,l=0;
int m=0;
float r,temp;
JCB a[M];
JCB b;
//寻找当前时间t到达系统还未完成的作业,用数组a[M]存储
for(i=1;i<n;i++)
{
if(p[i].rt<=t&&p[i].ft==0)
{
a[l]=p[i];
l++;
k=l;
}
}
//计算每个未完成作业的响应比
for(i=0;i<k;i++)
{
a[i].r=1+(float)(t-a[i].rt)/(float)a[i].ct;
}
//寻找未完成作业中响应比最高的作业
temp=a[0].r;
b=a[0];
for(m=0;m<k;m++)
{
if(a[m].r>temp)
{
b=a[m];
a[m]=a[0];
a[0]=b;
temp=a[0].r;
}
}
return a[0].ct;//返回最高响应比的作业的所需CPU时间
}
void FCFS()
{
int i,j;
int now=0;//当前时间
j=Input();
int sumwt=0;//周转时间总和
float sumawt=0;//带权周转时间总和
float avwt,avgwt;//avwt是平均周转时间,avgwt是平均带权周转时间
for(i=0;i<j;i++)
{
if(i==0)
{
now=p[i].rt;
p[i].ft=now+p[i].ct;
p[i].wt=p[i].ft-p[i].rt;
p[i].awt=p[i].wt/p[i].ct;
}
else
{
if(p[i-1].ft>p[i].rt)
{
now=p[i-1].ft;
p[i].ft=now+p[i].ct;
}
else
{
now=p[i].rt;
p[i].ft=now+p[i].ct;
}
p[i].wt=p[i].ft-p[i].rt;
p[i].awt=(float)p[i].wt/(float)p[i].ct;
}
sumwt+=p[i].wt;
sumawt+=p[i].awt;
}
avgwt=(float)sumwt/j;
avwt=sumawt/j;
Output(j);
printf("平均周转时间为:%f
",avgwt);
printf("平均带权周转时间为:%f
",avwt);
}
void SJF()
{
int i=0,j=0,k=0;
j=Input();
int l,m,now;//当前时间
int a=0;
int sumwt=0;//周转时间总和
float sumawt=0;//带权周转时间总和
double avwt,avgwt;//avwt是平均周转时间,avgwt是平均带权周转时间
l=0;
int n=0;
for(i=0;i<j;i++)
{
if(i==0)
{
now=p[i].rt;
p[i].ft=p[i].rt+p[i].ct;
now=p[i].ft;
}
else
{
a=Selectwork(now,j);
//寻找最短作业的位置
for(m=0;m<j;m++)
if(p[m].ct==a&&p[m].ft==0)
{
k=m;
break;
}
p[k].ft=now+p[k].ct;//计算最短作业的完成时间
now=p[k].ft;
}
}
for(i=0;i<j;i++)
{
p[i].wt=p[i].ft-p[i].rt;
p[i].awt=(float)p[i].wt/(float)p[i].ct;
sumwt+=p[i].wt;
sumawt+=p[i].awt;
}
avgwt=(float)sumwt/j;
avwt=sumawt/j;
Output(j);
printf("平均周转时间为:%f
",avgwt);
printf("平均带权周转时间为:%f
",avwt);
}
void HRRN()
{
int i=0,j=0,k=0;
int b=0,now=0,m;
float sumwt=0;//周转时间总和
float sumawt=0;//带权周转时间总和
double avwt,avgwt;//avwt是平均周转时间,avgwt是平均带权周转时间
j=Input();
for(i=0;i<j;i++)
{
if(i==0)
{
p[i].ft=p[i].rt+p[i].ct;
now=p[i].ft;
}
else
{
b=Choose(now,j);
//寻找最高响应比的作业的位置
for(m=0;m<j;m++)
if(p[m].ct==b&&p[m].ft==0)
{
k=m;
break;
}
p[k].ft=now+p[k].ct;//计算最高响应比的作业的完成时间
now=p[k].ft;
}
}
for(i=0;i<j;i++)
{
p[i].wt=p[i].ft-p[i].rt;
p[i].awt=(float)p[i].wt/(float)p[i].ct;
sumwt+=p[i].wt;
sumawt+=p[i].awt;
}
avgwt=(float)sumwt/j;
avwt=sumawt/j;
Output(j);
printf("平均周转时间为:%f
",avgwt);
printf("平均带权周转时间为:%f
",avwt);
}
void Start()
{
int d;
int j=1;
do{
printf("1.FCFS 2.SJF 3.HRRN
请输入你需要的调度算法的序号: ");
scanf("%d",&d);
if(d<1||d>3)
j=0;
else break;
}while(j=1);
switch(d)
{
case 1:
FCFS();
break;
case 2:
SJF();
break;
case 3:
HRRN();
break;
}
}
int main()
{
int i=1;
char a;
do{
Start();
printf("Do you want to continue?(y or n):");
scanf(" %c",&a);
if(a=='n')
break;
}while(i=1);
printf("The end!
");
return 0;
}
总结:在编程的过程中遇到了一些小问题,就是思路不够清晰,导致程序得不到想要的结果,所以花费了一段时间理清思路重新编写。经过一番修改,最终还是得到了想要的结果。完成后觉得小有成就,对FCFS,SJF,HRRE三个算法调度有了更深一步的理解,很享受这一次的编程。