# include <stdio.h>
# include <stdlib.h>
typedef struct PCB{
char name; //进程名字
double ArriveTime; //进程到达时间
double StartTime; //进程开始时间
double ServiceTime; //进程运行时间
double FinishTime; //进程完成时间
double TotalTime; //进程周转时间
double WeightTime;//进程带权周转时间
bool x; //进程是否完成
}pcb;
void initPCB(pcb*a,int n);
void sjf(pcb*a,int n);
void sortService(pcb*a,int l,int r);
int wait(pcb*a,int n,double time);
int main(){
int n;
printf("输入要创建的进程数\n");
scanf("%d",&n);
printf("请初始化进程\n");
pcb a[n];
initPCB(a,n);
sjf(a,n);
return 0;
}
void initPCB(pcb*a,int n){ //初始化进程池
int i;
char name;
double ArriveTime;
double ServiceTime;
for(i=0;i<n;i++){
fflush(stdin);
printf("请输入进程的名字,到达时间,所需运行时间\n");
scanf("%c%lf%lf",&a[i].name,&a[i].ArriveTime,&a[i].ServiceTime);
}
}
void sjf(pcb*a,int n){ //短作业优先
int i=0;
double time=0;
double arrayTotalTime=0; //平均周转时间初始化
double arrayWeightTime=0; //平均带权周转时间初始化
int j;
for(i=0;i<n;i++){
j=wait(a,n,time); //查看等待队列的最后一个
sortService(a,i,j); //根据等待队列中的运行时间排序
a[i].StartTime=time; //开始执行进程
time=time+a[i].ServiceTime;
a[i].FinishTime=time;
a[i].TotalTime=time-a[i].ArriveTime;//计算周转时间
arrayTotalTime=arrayTotalTime+a[i].TotalTime/n;
a[i].WeightTime=a[i].TotalTime/a[i].ServiceTime;//计算带权周转时间
arrayWeightTime=arrayWeightTime+a[i].WeightTime/n;
printf("完成进程%c 进程开始时间%.2f 进程结束时间%.2f 进程周转时间%.2f 进程带权周转时间%.2f\n",a[i].name,a[i].StartTime,a[i].FinishTime,a[i].TotalTime,a[i].WeightTime);
}
printf("\n\n平均周转时间%.2f 平均带权周转时间%.2f\n\n\n",arrayTotalTime,arrayWeightTime);
}
void sortService(pcb*a,int l,int r){ //当前准备在等待队列中按照运行时间排序
int i,j;
pcb t;
for(i=l;i<r;i++){
for(j=l;j<r;j++){
if(a[j].ServiceTime>a[j+1].ServiceTime){
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
}
int wait(pcb*a,int n,double time){ //查看等待队列最后一个进程的位置
int i;
for(i=0;i<n;i++){
if(a[i].ArriveTime>time)
break;
}
return i-1;
}
流程图