#include <stdio.h>
#include <string.h>

#define MAX_PROCESS 5

// 进程控制块PCB
typedef struct {
    char name[20];
    int priority;
    int need_time;
    int run_time;
    char state[10];
} PCB;

PCB pcb[MAX_PROCESS];
int process_num;

// 按优先级从高到低排序
void sortByPriority() {
    int i, j;
    PCB temp;
    for (i = 0; i < process_num - 1; i++) {
        for (j = i + 1; j < process_num; j++) {
            if (pcb[i].priority < pcb[j].priority) {
                temp = pcb[i];
                pcb[i] = pcb[j];
                pcb[j] = temp;
            }
        }
    }
}

// 显示所有进程状态
void showProcessState() {
    printf("\n%-8s%-8s%-12s%-12s%-8s\n", 
           "进程名", "优先级", "需要时间", "已运行时间", "状态");
    for (int i = 0; i < process_num; i++) {
        printf("%-8s%-8d%-12d%-12d%-8s\n",
               pcb[i].name,
               pcb[i].priority,
               pcb[i].need_time,
               pcb[i].run_time,
               pcb[i].state);
    }
}

int main() {
    int i, finished_count = 0;

    printf("===== 进程调度实验：最高优先数优先算法 =====\n");
    printf("请输入进程数量（最多5个）：");
    scanf("%d", &process_num);
    if (process_num > 5) process_num = 5;

    // 输入进程信息
    for (i = 0; i < process_num; i++) {
        printf("\n输入第%d个进程信息（进程名 优先级 需要运行时间）：\n", i + 1);
        scanf("%s %d %d", pcb[i].name, &pcb[i].priority, &pcb[i].need_time);
        pcb[i].run_time = 0;
        strcpy(pcb[i].state, "就绪");
    }

    printf("\n===== 开始调度 =====\n");

    // 调度主循环
    while (finished_count < process_num) {
        sortByPriority();

        // 找到第一个未完成进程
        for (i = 0; i < process_num; i++) {
            if (strcmp(pcb[i].state, "完成") != 0) {
                break;
            }
        }

        // 运行当前进程
        strcpy(pcb[i].state, "运行");
        showProcessState();

        // 执行一个时间片
        pcb[i].run_time++;
        pcb[i].priority--;  // 动态优先级：运行一次优先级-1

        // 判断是否完成
        if (pcb[i].run_time >= pcb[i].need_time) {
            strcpy(pcb[i].state, "完成");
            finished_count++;
            printf("\n进程【%s】执行完毕！\n", pcb[i].name);
        } else {
            strcpy(pcb[i].state, "就绪");
        }
    }

    printf("\n===== 所有进程调度完成 =====\n");
    return 0;
}