运行结果
实验代码
#include <stdio.h>
#define N 10
typedef struct {
int hour;
int min;
}time;
typedef struct sjf{
char sjf_id[20];
double sjf_run; //估计运行时间
time sjf_entertime; //到达时间
int enter;
time sjf_ksddtime; //开始调度时间
int ksddtime;
time sjf_endtime; //结束时间
int endtime;
int sjf_longtime; //周转时间
int sjf_waittime; //等待时间
float sjf_dqzztime;//带权周转时间
double sjf_pjlongtime; //平均周转时间
float sjf_pjdqzztime;//平均带权周转时间
struct sjf* next;
}SJF;
void input(SJF s[N],int k)
{
scanf("%s",&s[k].sjf_id);
scanf("%d:%d",&s[k].sjf_entertime.hour,&s[k].sjf_entertime.min);
scanf("%lf",&s[k].sjf_run);
s[k].enter=s[k].sjf_entertime.hour*60+s[k].sjf_entertime.min;
}
void runingtime(SJF s[N],int k,int m)
{
SJF temp;
int i,j;
for(i=k;i<m;i++)
{
for(j=i;j<m;j++)
if(s[j].sjf_run>s[j+1].sjf_run&&s[j+1].enter>s[j].endtime){
temp=s[j];
s[j]=s[j+1];
s[j+1]=temp;
}
}
}
void print(SJF s[N],int k)
{
printf("\n************************************************************作业调度********************************************************\n");
printf("\n");
printf("调度序号\t作业名称\t入井时间\t调度时间\t运行时间\t结束时间\t周转时间\t带权周转时间\n");
printf("\n");
int i,j;
for(i=0;i<k;i++)
printf("%d\t\t%s\t\t%d:%02d\t\t%d:%02d\t\t%.0f min\t\t%d:%02d\t\t%d min\t\t%.2f min\n",i+1,s[i].sjf_id,(s[i].enter/60),(s[i].enter%60),
(s[i].ksddtime/60),(s[i].ksddtime%60),s[i].sjf_run,(s[i].endtime/60),(s[i].endtime%60),s[i].sjf_longtime,s[i].sjf_dqzztime);
}
//短作业优先算法
void SJF_run(SJF s[N],int k)
{
int i,j=k,n;
double sum1,sum2;
SJF temp;
while(j>1)
{
for(i=0;i<j-1;i++)
{
if(s[i+1].enter<s[i].enter)
{
temp=s[i];
s[i]=s[i+1];
s[i+1]=temp;
}
}
j--;
}
j=0;
do{
if(j==0)
{
s[j].ksddtime=s[j].enter;
s[j].sjf_waittime=0;
s[j].endtime=s[j].enter+s[j].sjf_waittime+(int)(s[j].sjf_run);
s[j].sjf_longtime=s[j].endtime-s[j].enter;
s[j].sjf_dqzztime=s[j].sjf_longtime/s[j].sjf_run;
}
else
{
s[j].ksddtime=s[j-1].endtime;
s[j].sjf_waittime=s[j-1].endtime-s[j].enter;
s[j].endtime=s[j].ksddtime+(int)(s[j].sjf_run);
s[j].sjf_longtime=s[j].endtime-s[j].enter;
s[j].sjf_dqzztime=s[j].sjf_longtime/s[j].sjf_run;
}
j++;
n=j-1;
runingtime(s,j,k);
}while(j<k);
print(s,k);
for(i=0;i<k;i++)
{
sum1+=(double)(s[i].sjf_longtime);
sum2+=(float)(s[i].sjf_dqzztime);
}
printf("\n\t平均周转时间为:%.2f\n",sum1/k);
printf("\n\t平均带权周转时间为:%.3f\n",sum2/k);
}
int main()
{
SJF a[N]={0};
int i,j;
printf("请输入创建作业数:");
scanf("%d",&i);
printf("请依次输入:\n");
printf("作业名 到达时间 估计运行时间\n");
for(j=0;j<i;j++)
input(a,j);
SJF_run(a,j);
return 0;
}