(哈)先来先服务(FCFS)调度算法 --升级版

代码 (只支持在环境中用数字来输入,用数字以为则会显示错误!)

/* 先来先服务 */
#include<stdio.h>
#define MAX 50
struct Gzuo{
int id; //进程名字
int dt; //到达时刻
int st; //服务时间
int wct; //完成时刻
float zt; //周转时间
float dczt; //带权周转时间
};
Gzuo a[MAX];

int main(){
int i,j,min;
int n,px; //n:进程个数 px:输出方式选择
float sum1=0,sum2=0;
printf("\n************* 先来先服务(FCFS)调度算法 *************\n");
printf("\n\t请输入有n个进程(0<n<=50): ");
scanf("%d",&n);
while(n>50||n<=0)
{
printf("n\t请重新输入:");
scanf("%d",&n);
}
for(i=0;i<n;i++)
{
printf("\n\t*************输入第%d个进程信息:\n",i+1);
printf("\t进程名字: ");
scanf("%d",&a[i].id);
printf("\t到达时间: ");
scanf("%d",&a[i].dt);
printf("\t服务时间: ");
scanf("%d",&a[i].st);
}

for(j=n-1;j>=0;j--)
{
for(i=0;i<j;i++)
{
if(a[i].dt>a[i+1].dt)
{
min=a[i].id;
a[i].id=a[i+1].id;
a[i+1].id=min;

min=a[i].dt;
a[i].dt=a[i+1].dt;
a[i+1].dt=min;

min=a[i].st;
a[i].st=a[i+1].st;
a[i+1].st=min;
}
}
}

for(i=0;i<n;i++)
{
if(a[i].dt>a[i-1].wct) //当 a[i]到达时刻>a[i-1]完成时刻
{
a[i].wct=a[i].dt+a[i].st; //a[i]完成时刻=到达时刻+服务时间
}
else
{
a[i].wct=a[i-1].wct+a[i].st; //a[i]完成时刻=a[i-1]完成时刻+a[i]服务时间
}
a[i].zt=(float)(a[i].wct-a[i].dt); //周转时间=完成时刻-到达时刻
a[i].dczt=a[i].zt/a[i].st; //带权周转时间=周转时间/服务时间
}
printf("\n");
printf("\t1、按id号依次输出\n");
printf("\t2、按完成顺序依次输出\n");
printf("\n\t请选择输出顺序:\t");
scanf("%d",&px);
printf("\n进程名字\t到达时间\t服务时间\t完成时间\t周转时间\t带权周转时间\n");
switch(px)

{
case 1: //1.按id号依次输出
{
for(j=0;j<n;j++)
{
for(i=0;i<n;i++)
if(a[i].id==j+1)
{
printf("%d\t\t%d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt,a[i].dczt);
sum1+=a[i].zt;
sum2+=a[i].dczt;
}
}
printf("\n平均周转时间:%.2f\n",sum1/n);
printf("\n平均带权周转时间:%.2f\n\n",sum2/n);
break;
}
case 2: //2.按完成顺序依次输出
{
for(i=0;i<n;i++)
{
printf("%d\t\t%d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt,a[i].dczt);
sum1+=a[i].zt;
sum2+=a[i].dczt;
}
printf("\n平均周转时间:%.2f\n",sum1/n);
printf("\n平均带权周转时间:%.2f\n\n",sum2/n);
break;
}
default: break;
}
}

猜你喜欢

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