(操)先来先服务调度算法

代码(自行变通!)

#include <stdio.h>
struct sjf{
char name[10];
float dt;//到达时间
float st;//服务时间
float begin_time;//开始运行时间
float wct;//运行完成时间
float zt;//周转时间
float dczt;//带权周转时间
};
sjf a[100];
void input(sjf *p,int n)
{
int i;
for(i=0;i<=n-1;i++)
{
printf("\n\t*********请输入第 %d 个进程的信息:\n",i+1);
printf("\t进程名称:");
scanf("%s",&p[i].name);
printf("\t到达时间:");
scanf("%f",&p[i].dt);
printf("\t服务时间:");
scanf("%f",&p[i].st);
}
}
void Print(sjf *p,float dt,float st,float begin_time,float wct,float zt,float dczt,int n)
{
int k;
float sum1=0,sum2=0;
printf("\nrun order:");
printf("%s",p[0].name);
for(k=1;k<n;k++)
{
printf("-->%s",p[k].name);
}
printf("\n\n进程信息如下:\n");
printf("\n进程名字 到达时间 服务时间 开始时间 完成时间 周转时间 带权周转时间\n");
for(k=0;k<n;k++)
{
printf("%3s\t %3.0f\t\t%.0f\t%.0f\t%3.0f\t\t%.0f\t %3.2f\n",p[k].name,p[k].dt,p[k].st,p[k].begin_time,p[k].wct,p[k].zt,p[k].dczt);
sum1+=p[k].zt;
sum2+=p[k].dczt;
}
printf("\n平均周转时间:%.2f\n",sum1/n);
printf("\n平均带权周转时间:%.2f\n\n",sum2/n);
}
//排序
void sort(sjf *p,int n)
{
for(int i=0;i<=n-1;i++)
for(int j=0;j<=i;j++)
if(p[i].dt<p[j].dt)
{
sjf temp;
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
}
//运行阶段
void deal(sjf *p, float dt,float st,float begin_time,float wct,float &zt,float &dczt,int n)
{ int k;
for(k=0;k<=n-1;k++)
{
if(k==0)
{
p[k].begin_time=p[k].dt;
p[k].wct=p[k].dt+p[k].st;
}
else
{
p[k].begin_time=p[k-1].wct;
p[k].wct=p[k-1].wct+p[k].st;
}
}
for(k=0;k<=n-1;k++)
{
p[k].zt=p[k].wct-p[k].dt;
p[k].dczt=p[k].zt/p[k].st;
}
}
void SJF(sjf *p,int n)
{
float dt=0,st=0,begin_time=0,wct=0,zt=0,dczt=0;//对结构进行初始化
sort(p,n);
for(int m=0;m<n-1;m++)
{
if(m==0)
p[m].wct=p[m].dt+p[m].st;
else
p[m].wct=p[m-1].wct+p[m].st;
int i=0;
for(int n=m+1;n<=n-1;n++)
{
if(p[n].dt<=p[m].wct)//判断内存中每次完成之后有多少到达的进程
i++;
}
float min=p[m+1].st;
int next=m+1; //m+1=n
for(int k=m+1;k<m+i;k++) //找出到达后的进程中最小的进程
{
if(p[k+1].st<min)
{
min=p[k+1].st;
next=k+1;
}
}
sjf temp;
temp=p[m+1];
p[m+1]=p[next];
p[next]=temp;
}
deal(p,dt,st,begin_time,wct,zt,dczt,n);

Print(p,dt,st,begin_time,wct,zt,dczt,n);
}
int main()
{
int n;
printf("\n--------------先来先服务调度算法-----------------\n");
printf("\n\t请输入进程的个数: ");
scanf("%d",&n);
input(a,n);
sjf *b=a;
sjf *c=a;
SJF(b,n);
return 0;
}

猜你喜欢

转载自www.cnblogs.com/1314-520/p/12706996.html