#include<stdio.h>
#define MAX 100
typedef struct PCB
{
char ProName[10]; //作业ID
float ArriveTime; //到达时刻
float Fun_time; //运行时间
float EndTime; //完成时间
float revolveTime; //周转时间
int Order; //优先标记
} list,*linklist;
void sjf(linklist p,int count)
{
list item; //结构体变量
int i = 0;
int j = 0;
int k = 0; //最短运行时间作业的下标
int flag = 0; //优先级设置
float min = 0; //最短运行时间
float temp; //开始的时刻
temp = p[0].ArriveTime;//开始的时刻为第一个到达的时间
//先求出最先到达作业的时刻
for(i = 0; i < count; i++)
{
if(temp > p[i].ArriveTime)
{
temp = p[i].ArriveTime; //保存最先到达的作业的时刻
k = i; //最先到达的作业的下标,默认为p[0]
}
}
for(i = 0; i < count; i++)
{
p[k].Order = ++flag; //设置优先级为1,最高优先级
p[k].EndTime = temp + p[k].Fun_time;
p[k].revolveTime = p[k].EndTime - p[k].ArriveTime;
min = 100;
temp = p[k].EndTime; //后一个作业的开始时刻是前一个作业的完成时刻
for(j = 0; j < count; j++)
{
if(p[j].Order != 0 || temp - p[j].ArriveTime <= 0) //跳过不满足条件的(已设置优先级的 和 到达时刻要晚于前一个作业的完成时刻的)
continue;
if(min > p[j].Fun_time)
{
min = p[j].Fun_time;
k = j; //求出满足条件最短运行时间的作业的下标
}
}
}
for(i = 1; i < count; i++) //按优先级排序
{
item = p[i];
j = i-1;
while(item.Order < p[j].Order && j >= 0)
{
p[j+1] = p[j]; //order越小优先级越高,小的往前移
--j;
}
p[j+1] = item;
}
return;
}
//输出各个作业的详细信息
void print(linklist p,int count)
{
int i;
printf("ID\t到达\t服务\t完成\t周转\n");
for(i = 0; i < count; i++)
{
printf("%s\t%.0f\t%.0f\t%.0f\t%.0f\n",
p[i].ProName,p[i].ArriveTime,p[i].Fun_time, p[i].EndTime,p[i].revolveTime);
}
return;
}
int main()
{
list st[MAX]; //最多可以一百个作业
int num = 0; //作业数量
int i = 0;
printf("请输入作业数量:");
scanf("%d",&num);
printf("请输入作业ID,到达时间,运行时间:\n");
for(i=0; i<num; i++)
{
scanf("%s %f %f",st[i].ProName,&st[i].ArriveTime,&st[i].Fun_time);
st[i].Order = 0; //优先级初始化
}
sjf(st,num);
print(st,num);
return 0;
}