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

#define N 3

struct PCB {
    char name[10];
    int priority;
    int needtime;
    int runtime;
    char state;
    int finishtime;  // 完成时间
    int turntime;    // 周转时间
} pcb[N];

int current_time = 0;

// 输出进程状态（和你实验截图完全一样）
void output() {
    printf("\n当前进程状态：\n");
    printf("进程名\t优先级\t需运行时间\t已运行时间\t状态\n");
    for(int i = 0; i < N; i++) {
        printf("%s\t%d\t%d\t\t%d\t\t%c\n",
            pcb[i].name,
            pcb[i].priority,
            pcb[i].needtime,
            pcb[i].runtime,
            pcb[i].state);
    }
}

// 输出周转时间统计
void print_turn() {
    float total = 0;
    printf("\n===== 周转时间统计 =====\n");
    printf("进程名\t完成时间\t周转时间\n");
    for(int i = 0; i < N; i++) {
        pcb[i].turntime = pcb[i].finishtime;
        total += pcb[i].turntime;
        printf("%s\t%d\t\t%d\n", pcb[i].name, pcb[i].finishtime, pcb[i].turntime);
    }
    printf("平均周转时间：%.2f\n", total / N);
}

int main() {
    // 初始化：aa、bb、cc（和你实验完全一样）
    strcpy(pcb[0].name, "aa");
    pcb[0].priority = 0;
    pcb[0].needtime = 5;
    pcb[0].runtime = 0;
    pcb[0].state = 'W';
    pcb[0].finishtime = 0;

    strcpy(pcb[1].name, "bb");
    pcb[1].priority = 0;
    pcb[1].needtime = 8;
    pcb[1].runtime = 0;
    pcb[1].state = 'W';
    pcb[1].finishtime = 0;

    strcpy(pcb[2].name, "cc");
    pcb[2].priority = 1;
    pcb[2].needtime = 10;
    pcb[2].runtime = 0;
    pcb[2].state = 'W';
    pcb[2].finishtime = 0;

    printf("===== 最高优先数调度算法 =====\n");
    output();

    int finish = 0;
    while(finish < N) {
        // 找优先级最高的进程
        int max = -1, run = -1;
        for(int i = 0; i < N; i++) {
            if(pcb[i].state == 'W' && pcb[i].priority > max) {
                max = pcb[i].priority;
                run = i;
            }
        }

        if(run == -1) break;

        // 运行
        pcb[run].state = 'R';
        printf("\n运行进程：%s\n", pcb[run].name);

        current_time++;
        pcb[run].runtime++;

        // 运行完成
        if(pcb[run].runtime == pcb[run].needtime) {
            pcb[run].state = 'F';
            pcb[run].finishtime = current_time;  // ✅ 赋值完成时间
            finish++;
            printf("进程 %s 运行完毕\n", pcb[run].name);
        } else {
            pcb[run].priority--;  // 动态优先级-1
            pcb[run].state = 'W';
        }

        output();
    }

    printf("\n===== 所有进程调度完成 =====\n");
    print_turn();  // 输出周转时间

    return 0;
}