最短作业优先算法:是以进入系统的作业所提出的“执行时间”为标准,总是优先选取执行时间最短的作业。
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
typedef struct JCB{
int num;
char State;
int ArrivalTime; //到达时间
int ServeTime; //运行时间
int StartTime; //开始时间
int FinshTime; //结束时间
float CycleTime; //周转时间
float ClTime; //带权周转时间
struct JCB *next;
}JCB;
JCB Queue[MAX] = {0};
int times=0; //时间量
int n; //进程数
void CreateQueue(){
//从d盘读取信息
FILE *fw=fopen("D:\\data.txt","r");
fscanf(fw,"%d",&n);
for(int i=0;i<n;i++){
//进程初始化
Queue[i].State = 'f';
Queue[i].StartTime = 0;
Queue[i].FinshTime = 0;
Queue[i].ClTime = 0;
Queue[i].CycleTime = 0;
fscanf(fw,"%d",&Queue[i].num);
fscanf(fw,"%d",&Queue[i].ArrivalTime);
fscanf(fw,"%d",&Queue[i].ServeTime);
}
fclose(fw);
}
void Run(JCB jcb){
jcb.State = 't';
jcb.StartTime = times;
jcb.FinshTime = jcb.ServeTime+jcb.StartTime;//完成时间
times = jcb.FinshTime;
jcb.CycleTime = jcb.FinshTime - jcb.ArrivalTime;//周转时间
jcb.ClTime = jcb.CycleTime/jcb.ServeTime;
printf("%d %d %d %.2f %.2f\n",jcb.num,jcb.StartTime,jcb.FinshTime,jcb.CycleTime,jcb.ClTime);
}
void sort(){
//按到达时间排序
for(int j=0;j<n;j++){
for(int i=0;i<n-j-1;i++){
if(Queue[i].ArrivalTime>Queue[i+1].ArrivalTime){
JCB temp = Queue[i];
Queue[i] = Queue[i+1];
Queue[i+1] = temp;
}
}
}
}
void SJF(){
sort();
times = Queue[0].ArrivalTime;
for(int i=0;i<n;i++){
if(Queue[i].State = 'f'){
if(i ==0){
Run(Queue[i]);
}else if(Queue[i].ArrivalTime<times){
int num = i;
while(Queue[num].ArrivalTime<times && num<n){
num++;
}
for(int x=i;x<num;x++){
for(int t=i;t<num-x;t++){
if(Queue[t].ServeTime>Queue[t+1].ServeTime){
JCB temp = Queue[t];
Queue[t] = Queue[t+1];
Queue[t+1] = temp;
}
}
}
Run(Queue[i]);
}else{
Run(Queue[i]);
}
}
}
}
int main(){
CreateQueue();
printf("进程编号 开始时间 结束时间 周转时间 带权周转时间\n");
SJF();
return 0;
}