#include <stdio.h>
#include <string.h>
#define MAX_PROCESS 5
typedef struct PCB {
char name[10];
int priority; // 优先级(动态变化)
int need_time; // 需要运行时间(固定)
int run_time; // 已运行时间(动态变化)
char state; // 'W'就绪 / 'R'运行 / 'F'完成
int finish_time; // 完成时刻
int turn_time; // 周转时间
float wturn_time; // 带权周转时间
} PCB;
PCB pcb[MAX_PROCESS];
int process_num = 0;
int current_time = 0; // 全局时间轴
// 1. 初始化进程(你截图里的输入:aa 0 5, bb 0 8, cc 1 10)
void initProcess() {
// 进程aa
pcb[0].priority = 0;
pcb[0].need_time = 5;
pcb[0].run_time = 0;
pcb[0].state = 'W';
// 进程bb
pcb[1].priority = 0;
pcb[1].need_time = 8;
pcb[1].run_time = 0;
pcb[1].state = 'W';
// 进程cc
pcb[2].priority = 1;
pcb[2].need_time = 10;
pcb[2].run_time = 0;
pcb[2].state = 'W';
process_num = 3;
current_time = 0;
}
// 2. 查找当前优先级最高的就绪进程
int findMaxPriority() {
int max_prio = -1;
int idx = -1;
for (int i = 0; i < process_num; i++) {
if (pcb[i].state == 'W' && pcb[i].priority > max_prio) {
max_prio = pcb[i].priority;
idx = i;
}
}
return idx;
}
// 3. 显示当前所有进程状态
void showProcess() {
printf("进程名\t优先级\t需运行时间\t已运行时间\t状态\n"); for (int i = 0; i < process_num; i++) {
printf("%s\t%d\t%d\t\t%d\t\t%c\n", pcb[i].name, pcb[i].priority,
pcb[i].need_time, pcb[i].run_time, pcb[i].state);
}
}
// 4. 调度主逻辑
void schedule() {
int finished = 0;
int current;
printf("===== 最高优先数优先调度开始 =====\n"); showProcess();
while (finished < process_num) {
current = findMaxPriority();
if (current == -1) break; // 理论上不会发生
// 进程开始运行
pcb[current].state = 'R';
printf("\n运行进程:%s\n", pcb
[current
].
name);
// 运行1个时间片
pcb[current].run_time++;
current_time++;
// 判断是否运行完成
if (pcb[current].run_time == pcb[current].need_time) {
pcb[current].state = 'F';
pcb[current].finish_time = current_time; // ✅ 关键:只有完成时才赋值
finished++;
printf("进程 %s 运行完毕!完成时刻:%d\n", pcb
[current
].
name, current_time
); } else {
// 未完成:优先级减1,回到就绪队列
pcb[current].priority--;
pcb[current].state = 'W';
}
showProcess();
}
printf("\n===== 所有进程调度完成 =====\n"); }
// 5. 计算并输出周转时间
void calcTurnaround() {
float total_turn = 0;
float total_wturn = 0;
printf("\n===== 周转时间统计 =====\n"); printf("进程名\t完成时刻\t周转时间\t带权周转时间\n"); for (int i = 0; i < process_num; i++) {
// 所有进程同时到达,到达时刻为0
pcb[i].turn_time = pcb[i].finish_time - 0;
pcb[i].wturn_time = (float)pcb[i].turn_time / pcb[i].need_time;
total_turn += pcb[i].turn_time;
total_wturn += pcb[i].wturn_time;
printf("%s\t%d\t\t%d\t\t%.2f\n", pcb[i].name, pcb[i].finish_time,
pcb[i].turn_time, pcb[i].wturn_time);
}
printf("平均周转时间:%.2f\n", total_turn
/ process_num
); printf("平均带权周转时间:%.2f\n", total_wturn
/ process_num
); }
int main() {
initProcess();
schedule();
calcTurnaround();
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCiNkZWZpbmUgTUFYX1BST0NFU1MgNQoKdHlwZWRlZiBzdHJ1Y3QgUENCIHsKICAgIGNoYXIgbmFtZVsxMF07CiAgICBpbnQgcHJpb3JpdHk7ICAgICAgLy8g5LyY5YWI57qn77yI5Yqo5oCB5Y+Y5YyW77yJCiAgICBpbnQgbmVlZF90aW1lOyAgICAgLy8g6ZyA6KaB6L+Q6KGM5pe26Ze077yI5Zu65a6a77yJCiAgICBpbnQgcnVuX3RpbWU7ICAgICAgLy8g5bey6L+Q6KGM5pe26Ze077yI5Yqo5oCB5Y+Y5YyW77yJCiAgICBjaGFyIHN0YXRlOyAgICAgICAgLy8gJ1cn5bCx57uqIC8gJ1In6L+Q6KGMIC8gJ0Yn5a6M5oiQCiAgICBpbnQgZmluaXNoX3RpbWU7ICAgLy8g5a6M5oiQ5pe25Yi7CiAgICBpbnQgdHVybl90aW1lOyAgICAgLy8g5ZGo6L2s5pe26Ze0CiAgICBmbG9hdCB3dHVybl90aW1lOyAgLy8g5bim5p2D5ZGo6L2s5pe26Ze0Cn0gUENCOwoKUENCIHBjYltNQVhfUFJPQ0VTU107CmludCBwcm9jZXNzX251bSA9IDA7CmludCBjdXJyZW50X3RpbWUgPSAwOyAgLy8g5YWo5bGA5pe26Ze06L20CgovLyAxLiDliJ3lp4vljJbov5vnqIvvvIjkvaDmiKrlm77ph4znmoTovpPlhaXvvJphYSAwIDUsIGJiIDAgOCwgY2MgMSAxMO+8iQp2b2lkIGluaXRQcm9jZXNzKCkgewogICAgLy8g6L+b56iLYWEKICAgIHN0cmNweShwY2JbMF0ubmFtZSwgImFhIik7CiAgICBwY2JbMF0ucHJpb3JpdHkgPSAwOwogICAgcGNiWzBdLm5lZWRfdGltZSA9IDU7CiAgICBwY2JbMF0ucnVuX3RpbWUgPSAwOwogICAgcGNiWzBdLnN0YXRlID0gJ1cnOwogICAgLy8g6L+b56iLYmIKICAgIHN0cmNweShwY2JbMV0ubmFtZSwgImJiIik7CiAgICBwY2JbMV0ucHJpb3JpdHkgPSAwOwogICAgcGNiWzFdLm5lZWRfdGltZSA9IDg7CiAgICBwY2JbMV0ucnVuX3RpbWUgPSAwOwogICAgcGNiWzFdLnN0YXRlID0gJ1cnOwogICAgLy8g6L+b56iLY2MKICAgIHN0cmNweShwY2JbMl0ubmFtZSwgImNjIik7CiAgICBwY2JbMl0ucHJpb3JpdHkgPSAxOwogICAgcGNiWzJdLm5lZWRfdGltZSA9IDEwOwogICAgcGNiWzJdLnJ1bl90aW1lID0gMDsKICAgIHBjYlsyXS5zdGF0ZSA9ICdXJzsKCiAgICBwcm9jZXNzX251bSA9IDM7CiAgICBjdXJyZW50X3RpbWUgPSAwOwp9CgovLyAyLiDmn6Xmib7lvZPliY3kvJjlhYjnuqfmnIDpq5jnmoTlsLHnu6rov5vnqIsKaW50IGZpbmRNYXhQcmlvcml0eSgpIHsKICAgIGludCBtYXhfcHJpbyA9IC0xOwogICAgaW50IGlkeCA9IC0xOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9jZXNzX251bTsgaSsrKSB7CiAgICAgICAgaWYgKHBjYltpXS5zdGF0ZSA9PSAnVycgJiYgcGNiW2ldLnByaW9yaXR5ID4gbWF4X3ByaW8pIHsKICAgICAgICAgICAgbWF4X3ByaW8gPSBwY2JbaV0ucHJpb3JpdHk7CiAgICAgICAgICAgIGlkeCA9IGk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGlkeDsKfQoKLy8gMy4g5pi+56S65b2T5YmN5omA5pyJ6L+b56iL54q25oCBCnZvaWQgc2hvd1Byb2Nlc3MoKSB7CiAgICBwcmludGYoIlxu5b2T5YmN6L+b56iL54q25oCB77yaXG4iKTsKICAgIHByaW50Zigi6L+b56iL5ZCNXHTkvJjlhYjnuqdcdOmcgOi/kOihjOaXtumXtFx05bey6L+Q6KGM5pe26Ze0XHTnirbmgIFcbiIpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9jZXNzX251bTsgaSsrKSB7CiAgICAgICAgcHJpbnRmKCIlc1x0JWRcdCVkXHRcdCVkXHRcdCVjXG4iLAogICAgICAgICAgICAgICBwY2JbaV0ubmFtZSwgcGNiW2ldLnByaW9yaXR5LAogICAgICAgICAgICAgICBwY2JbaV0ubmVlZF90aW1lLCBwY2JbaV0ucnVuX3RpbWUsIHBjYltpXS5zdGF0ZSk7CiAgICB9Cn0KCi8vIDQuIOiwg+W6puS4u+mAu+i+kQp2b2lkIHNjaGVkdWxlKCkgewogICAgaW50IGZpbmlzaGVkID0gMDsKICAgIGludCBjdXJyZW50OwoKICAgIHByaW50ZigiPT09PT0g5pyA6auY5LyY5YWI5pWw5LyY5YWI6LCD5bqm5byA5aeLID09PT09XG4iKTsKICAgIHNob3dQcm9jZXNzKCk7CgogICAgd2hpbGUgKGZpbmlzaGVkIDwgcHJvY2Vzc19udW0pIHsKICAgICAgICBjdXJyZW50ID0gZmluZE1heFByaW9yaXR5KCk7CiAgICAgICAgaWYgKGN1cnJlbnQgPT0gLTEpIGJyZWFrOyAvLyDnkIborrrkuIrkuI3kvJrlj5HnlJ8KCiAgICAgICAgLy8g6L+b56iL5byA5aeL6L+Q6KGMCiAgICAgICAgcGNiW2N1cnJlbnRdLnN0YXRlID0gJ1InOwogICAgICAgIHByaW50ZigiXG7ov5DooYzov5vnqIvvvJolc1xuIiwgcGNiW2N1cnJlbnRdLm5hbWUpOwoKICAgICAgICAvLyDov5DooYwx5Liq5pe26Ze054mHCiAgICAgICAgcGNiW2N1cnJlbnRdLnJ1bl90aW1lKys7CiAgICAgICAgY3VycmVudF90aW1lKys7CgogICAgICAgIC8vIOWIpOaWreaYr+WQpui/kOihjOWujOaIkAogICAgICAgIGlmIChwY2JbY3VycmVudF0ucnVuX3RpbWUgPT0gcGNiW2N1cnJlbnRdLm5lZWRfdGltZSkgewogICAgICAgICAgICBwY2JbY3VycmVudF0uc3RhdGUgPSAnRic7CiAgICAgICAgICAgIHBjYltjdXJyZW50XS5maW5pc2hfdGltZSA9IGN1cnJlbnRfdGltZTsgLy8g4pyFIOWFs+mUru+8muWPquacieWujOaIkOaXtuaJjei1i+WAvAogICAgICAgICAgICBmaW5pc2hlZCsrOwogICAgICAgICAgICBwcmludGYoIui/m+eoiyAlcyDov5DooYzlrozmr5XvvIHlrozmiJDml7bliLvvvJolZFxuIiwgcGNiW2N1cnJlbnRdLm5hbWUsIGN1cnJlbnRfdGltZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8g5pyq5a6M5oiQ77ya5LyY5YWI57qn5YePMe+8jOWbnuWIsOWwsee7qumYn+WIlwogICAgICAgICAgICBwY2JbY3VycmVudF0ucHJpb3JpdHktLTsKICAgICAgICAgICAgcGNiW2N1cnJlbnRdLnN0YXRlID0gJ1cnOwogICAgICAgIH0KCiAgICAgICAgc2hvd1Byb2Nlc3MoKTsKICAgIH0KICAgIHByaW50ZigiXG49PT09PSDmiYDmnInov5vnqIvosIPluqblrozmiJAgPT09PT1cbiIpOwp9CgovLyA1LiDorqHnrpflubbovpPlh7rlkajovazml7bpl7QKdm9pZCBjYWxjVHVybmFyb3VuZCgpIHsKICAgIGZsb2F0IHRvdGFsX3R1cm4gPSAwOwogICAgZmxvYXQgdG90YWxfd3R1cm4gPSAwOwoKICAgIHByaW50ZigiXG49PT09PSDlkajovazml7bpl7Tnu5/orqEgPT09PT1cbiIpOwogICAgcHJpbnRmKCLov5vnqIvlkI1cdOWujOaIkOaXtuWIu1x05ZGo6L2s5pe26Ze0XHTluKbmnYPlkajovazml7bpl7RcbiIpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9jZXNzX251bTsgaSsrKSB7CiAgICAgICAgLy8g5omA5pyJ6L+b56iL5ZCM5pe25Yiw6L6+77yM5Yiw6L6+5pe25Yi75Li6MAogICAgICAgIHBjYltpXS50dXJuX3RpbWUgPSBwY2JbaV0uZmluaXNoX3RpbWUgLSAwOwogICAgICAgIHBjYltpXS53dHVybl90aW1lID0gKGZsb2F0KXBjYltpXS50dXJuX3RpbWUgLyBwY2JbaV0ubmVlZF90aW1lOwoKICAgICAgICB0b3RhbF90dXJuICs9IHBjYltpXS50dXJuX3RpbWU7CiAgICAgICAgdG90YWxfd3R1cm4gKz0gcGNiW2ldLnd0dXJuX3RpbWU7CgogICAgICAgIHByaW50ZigiJXNcdCVkXHRcdCVkXHRcdCUuMmZcbiIsCiAgICAgICAgICAgICAgIHBjYltpXS5uYW1lLCBwY2JbaV0uZmluaXNoX3RpbWUsCiAgICAgICAgICAgICAgIHBjYltpXS50dXJuX3RpbWUsIHBjYltpXS53dHVybl90aW1lKTsKICAgIH0KCiAgICBwcmludGYoIuW5s+Wdh+WRqOi9rOaXtumXtO+8miUuMmZcbiIsIHRvdGFsX3R1cm4gLyBwcm9jZXNzX251bSk7CiAgICBwcmludGYoIuW5s+Wdh+W4puadg+WRqOi9rOaXtumXtO+8miUuMmZcbiIsIHRvdGFsX3d0dXJuIC8gcHJvY2Vzc19udW0pOwp9CgppbnQgbWFpbigpIHsKICAgIGluaXRQcm9jZXNzKCk7CiAgICBzY2hlZHVsZSgpOwogICAgY2FsY1R1cm5hcm91bmQoKTsKICAgIHJldHVybiAwOwp9