概述
#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("IDt到达t服务t完成t周转n");
for(i = 0; i < count; i++)
{
printf("%st%.0ft%.0ft%.0ft%.0fn",
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;
}
最后
以上就是包容小笼包为你收集整理的SJF的全部内容,希望文章能够帮你解决SJF所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复