此算法没有用到数据结构中的队列,只用了一个结构体数组来储存进程,后边流程图与代码略有出入,见谅。
# include <stdio.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 fcfs(pcb*a,int n);
int main(){
int n;
printf("输入要创建的进程数\n");
scanf("%d",&n);
printf("请初始化进程\n");
pcb a[n];
initPCB(a,n);
fcfs(a,n);
}
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 fcfs(pcb*a,int n){ //先来先服务
int i;
double time=a[0].ArriveTime; //时间直接定位到第一个进程开始的时间
double arrayTotalTime=0; //平均周转时间初始化
double arrayWeightTime=0; //平均带权周转时间初始化
for(i=0;i<n;i++){
a[i].StartTime=time; //进程开始
time=time+a[i].ServiceTime; //进程运行完,时间改变
a[i].FinishTime=time; //进程结束时间定位
a[i].TotalTime=a[i].FinishTime-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);
}
流程图