#include <stdio.h>
#include <stdlib.h>
typedef struct {
int id; //id执行顺序
float ready; //ready到达时间
float run; //run运行时间
float finish; //finish完成时间
float around; //around周转时间
} Process;
int compare(const void *a, const void *b) {
const Process *p1 = (const Process *)a;
const Process *p2 = (const Process *)b;
return p1->run - p2->run;
}
int main() {
int i, j, n;
float sum = 0;//总周转时间
printf("输入进程的个数: ");
scanf("%d", &n);
//动态分配内存以存储进程
Process *processes = (Process *)malloc(n * sizeof(Process));
for (i = 0; i < n; i++) {
printf("请输入第%d个进程的到达时间和执行时间:\n", i + 1);
printf("到达时间: ");
scanf("%f", &processes[i].ready);
printf("执行时间: ");
scanf("%f", &processes[i].run);
processes[i].id = i + 1;
}
// 执行第一个到达的进程
processes[0].finish = processes[0].ready + processes[0].run;
processes[0].around = processes[0].finish - processes[0].ready;
sum += processes[0].around;
// 用qsort函数按照执行时间进行排序
qsort(processes + 1, n - 1, sizeof(Process), compare);
// 继续执行剩余进程
for (i = 1; i < n; i++) {
if (processes[i].ready > processes[i - 1].finish) {
processes[i].finish = processes[i].ready + processes[i].run;
} else {
processes[i].finish = processes[i - 1].finish +
processes[i].run;
}
processes[i].around = processes[i].finish - processes[i].ready;
sum += processes[i].around;
}
printf("进程\t到达时间\t执行时间\t完成时间\t周转时间\n");
for (i = 0; i < n; i++) {
printf("%d\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\n", processes[i].id,
processes[i].ready, processes[i].run, processes[i].finish,
processes[i].around);
}
printf("平均周转时间为: %.2f\n", sum / n);
free(processes);
return 0;
}
到达时间 | 执行时间 | 开始时间 | 结束时间 | 周转时间 |
0 | 3 | 0 | 3 | 3 |
1 | 5 | 7 | 12 | 11 |
2 | 4 | 3 | 7 | 5 |
周转时间 = 结束时间 - 到达时间
等待时间 = 周转时间 - 执行时间
执行时间 = 周转时间 - 等待时间
响应时间 = 开始时间 - 到达时间
响应比 = 1 +等待时间/执行时间
带权周转时间 = 周转时间 / 执行时间
到达时间 | 执行时间 | 开始时间 | 结束时间 | 周转时间 |
0 | 9 | 0 | 9 | 9 |
0.4 | 4 | 12 | 16 | 15.6 |
1 | 1 | 9 | 10 | 9 |
5.5 | 4 | 16 | 20 | 14.5 |
7 | 2 | 10 | 12 | 5 |