【歌词】李皓天-胭脂醉

梧桐袅袅羞 一点芭蕉一点愁
爱还未退走 我已迷惘在其中
雨在江面停留 淋湿我无声的等候
散不了的情愁 飘荡了整整一个秋


花近了高楼 一声琵琶一声忧
梦已到尽头 我却不忍向前走
风吹断了扬柳 随着湘水一起北流
千里后再回首 你已在江南烟雨中
奏一曲琵琶泪我白头为了谁
拔银弦声还未起先湿梨花魅
弹不完嘈嘈思念空音无人回
琴头刻我爱无悔 挑出一声催人泪
花近了高楼 一声琵琶一声忧
梦已到尽头 我却不忍向前走
风吹断了扬柳 随着湘水一起北流
千里后再回首 你已在江南烟雨中
奏一曲琵琶泪我白头为了谁
拔银弦声还未起先湿梨花魅
弹不完嘈嘈思念空音无人回
琴头刻我爱无悔 挑出一声催人泪

奏一曲琵琶泪我白头为了谁
拔银弦声还未起先湿梨花魅
弹不完嘈嘈思念空音无人回
琴头刻我爱无悔 挑出一声催人泪
奏一曲琵琶泪我白头为了谁
怎奈是红颜未知却已心先碎
拾不尽萧萧残爱唯有独自悲
而你却与谁依偎 给着你无暇的美
#include <stdio.h> #include <stdlib.h> #include <string.h> // 定义时间结构体,精确到秒 typedef struct { int hour; int minute; int second; } Time; // 进程控制块PCB typedef struct PCB { char name[20]; // 进程名称 Time arrivalTime; // 到达时间 int burstTime; // 运行时间(秒) int remainingTime; // 剩余运行时间(秒),用于RR算法 int startTime; // 开始时间(秒) int completionTime; // 完成时间(秒) int turnaroundTime; // 周转时间 float weightedTurnaroundTime; // 带权周转时间 int waitingTime; // 等待时间 int hasStarted; // 标记进程是否已开始执行 } PCB; // PCB队列 typedef struct { PCB* processes; // 进程数组 int capacity; // 队列容量 int size; // 当前队列大小 } PCBQueue; // 初始化就绪队列 PCBQueue* initQueue(int capacity) { PCBQueue* queue = (PCBQueue*)malloc(sizeof(PCBQueue)); queue->processes = (PCB*)malloc(capacity * sizeof(PCB)); queue->capacity = capacity; queue->size = 0; return queue; } // 将时间转换为总秒数 int timeToSeconds(Time t) { return t.hour * 3600 + t.minute * 60 + t.second; } // 将总秒数转换为时间格式 Time secondsToTime(int seconds) { Time t; t.hour = seconds / 3600; t.minute = (seconds % 3600) / 60; t.second = seconds % 60; return t; } // 入队函数: void enqueue(PCBQueue* queue, PCB process) { if (queue->size >= queue->capacity) { printf("队列已满,无法插入进程\n"); return; } // 找到插入位置,保持到达时间有序 int i; for (i = queue->size; i > 0; i--) { if (timeToSeconds(process.arrivalTime) >= timeToSeconds(queue->processes[i - 1].arrivalTime)) { break;//找到插入位置,将到达时间晚的进程后移。 } queue->processes[i] = queue->processes[i - 1];//将进程插入到合适的位置。 } queue->processes[i] = process; queue->size++; } // 出队函数 PCB dequeue(PCBQueue* queue) //从队列中取出一个进程,按到达时间顺序。 { if (queue->size == 0) { printf("队列为空,无法取出进程\n"); exit(1); } PCB process = queue->processes[0]; // 取出队列的第一个进程。 for (int i = 0; i < queue->size - 1; i++)//将后面的进程前移。 { queue->processes[i] = queue->processes[i + 1]; } queue->size--;//队列大小减 1。 return process; } // 检查队列是否为空 int isQueueEmpty(PCBQueue* queue) //检查队列是否为空,如果为空则返回 1,否则返回 0。 { return queue->size == 0; } // 显示时间 void displayTime(Time t) { printf("%02d:%02d:%02d", t.hour, t.minute, t.second); } // 显示欢迎界面 void showWelcomeScreen() { system("cls"); printf("============================================\n"); printf("| FCFS算法&RR算法 |\n"); printf("| 第9组 |\n"); printf("| 成员1:202396104025 孙晴 |\n"); printf("| 成员2:202396104026 田舟柯 |\n"); printf("| 成员3:202396104027 拓皓 |\n"); printf("============================================\n\n"); } // 显示菜单 int showMenu() { int choice; printf("\n请选择操作:\n"); printf("1. 输入进程信息\n"); printf("2. 执行FCFS调度算法\n"); printf("3. 执行轮转(RR)调度算法\n"); printf("4. 退出\n"); printf("请输入选项:"); scanf("%d", &choice); return choice; } // 输入进程信息 PCBQueue* inputProcesses() //让用户输入进程信息,创建一个进程队列并返回。 { int n; printf("请输入进程数量(不少于4个):"); scanf("%d", &n); if (n < 4) { printf("进程数量不能少于4个!\n"); return NULL; } PCBQueue* queue = initQueue(n);//初始化一个大小为 n 的进程队列。 printf("请输入%d个进程的信息(进程名称、到达时间(时:分:秒)、运行时间(秒)):\n", n); for (int i = 0; i < n; i++)// 循环读取每个进程的信息。 { PCB process; printf("进程 %d:\n", i + 1); printf("名称: "); scanf("%s", process.name); printf("到达时间(时:分:秒): "); scanf("%d:%d:%d", &process.arrivalTime.hour, &process.arrivalTime.minute, &process.arrivalTime.second); printf("运行时间(秒): "); scanf("%d", &process.burstTime); process.remainingTime = process.burstTime; // 将剩余时间初始化为执行时间 process.startTime = 0; process.completionTime = 0; process.turnaroundTime = 0; process.weightedTurnaroundTime = 0.0; process.waitingTime = 0; process.hasStarted = 0; // 标记进程尚未开始执行 enqueue(queue, process);//将进程插入到队列中。 } return queue; } // 模拟FCFS调度算法 void fcfsScheduling(PCBQueue* processes) { if (processes == NULL || processes->size == 0)//检查是否有进程可供调度 { printf("没有进程可调度!\n"); return; } // 创建一个新的就绪队列 PCBQueue* readyQueue = initQueue(processes->size); // 循环变量,遍历原始进程队列 for (int i = 0; i < processes->size; i++) { enqueue(readyQueue, processes->processes[i]); } printf("\n=========================================\n"); printf(" FCFS调度结果 \n"); printf("=========================================\n"); int currentTime = 0;//模拟CPU时钟 float totalTurnaroundTime = 0;//进程的周转总和 float totalWeightedTurnaroundTime = 0;//带权周转时间总和 printf("\n调度顺序:\n"); printf("进程\t到达时间\t开始时间\t完成时间\t周转时间\t带权周转时间\n"); // 按FCFS顺序处理进程 while (!isQueueEmpty(readyQueue)) { PCB process = dequeue(readyQueue);//现出队操作,并返回队首进程的 PCB。 // 计算开始时间(取当前时间和到达时间的最大值) if (currentTime < timeToSeconds(process.arrivalTime)) { currentTime = timeToSeconds(process.arrivalTime); } process.startTime = currentTime; process.hasStarted = 1; // 标记进程已开始 // 计算完成时间 process.completionTime = currentTime + process.burstTime;//完成时间 = 开始时间 + 执行时间。 // 计算周转时间 process.turnaroundTime = process.completionTime - timeToSeconds(process.arrivalTime);//周转时间 = 完成时间 - 到达时间。 // 计算带权周转时间 process.weightedTurnaroundTime = (float)process.turnaroundTime / process.burstTime;//带权周转时间 = 周转时间 / 执行时间。 // 计算等待时间 process.waitingTime = process.startTime - timeToSeconds(process.arrivalTime);//等待时间 = 开始时间 - 到达时间。 // 更新当前时间 currentTime = process.completionTime; // 输出进程调度信息 printf("%s\t", process.name); displayTime(process.arrivalTime); printf("\t"); displayTime(secondsToTime(process.startTime)); printf("\t"); displayTime(secondsToTime(process.completionTime)); printf("\t%d\t\t%.2f\n", process.turnaroundTime, process.weightedTurnaroundTime); // 累加统计值 totalTurnaroundTime += process.turnaroundTime; totalWeightedTurnaroundTime += process.weightedTurnaroundTime; } // 计算并输出平均值 float avgTurnaroundTime = totalTurnaroundTime / processes->size; float avgWeightedTurnaroundTime = totalWeightedTurnaroundTime / processes->size; printf("\n统计信息:\n"); printf("平均周转时间:%.2f秒\n", avgTurnaroundTime); printf("平均带权周转时间:%.2f\n", avgWeightedTurnaroundTime); // 释放内存 free(readyQueue->processes); free(readyQueue); } // 模拟轮转(RR)调度算法 void rrScheduling(PCBQueue* processes, int quantum)//quantem时间片参数 { if (processes == NULL || processes->size == 0) { printf("没有进程可调度!\n"); return; } // 创建就绪队列和完成队列 PCBQueue* readyQueue = initQueue(processes->size); PCB* completedProcesses = (PCB*)malloc(processes->size * sizeof(PCB)); int completedCount = 0; // 复制原始进程信息到工作队列 PCBQueue* originalQueue = initQueue(processes->size); for (int i = 0; i < processes->size; i++) { enqueue(originalQueue, processes->processes[i]); }//保留原始进程信息,避免修改用户输入数据。 printf("\n=========================================================\n"); printf(" 轮转(RR)调度结果 (时间片=%d秒) \n", quantum); printf("===========================================================\n"); // 找到进程的最早到达时间 int earliestArrival = __INT_MAX__; for (int i = 0; i < originalQueue->size; i++) { int arrivalSec = timeToSeconds(originalQueue->processes[i].arrivalTime); if (arrivalSec < earliestArrival) { earliestArrival = arrivalSec; } } int currentTime = earliestArrival; // 使用最早到达时间初始化 currentTime float totalTurnaroundTime = 0; float totalWeightedTurnaroundTime = 0; printf("\n调度顺序:\n"); printf("进程\t到达时间\t开始时间\t完成时间\t周转时间\t带权周转时间\n"); // RR调度核心逻辑 while (completedCount < processes->size) { // 检查新到达的进程并加入就绪队列(入队) for (int i = 0; i < originalQueue->size; i++) { PCB originalProc = originalQueue->processes[i]; // 只处理未完成且未加入就绪队列的进程 if (timeToSeconds(originalProc.arrivalTime) <= currentTime && originalProc.remainingTime > 0) { // 检查是否已在就绪队列中(避免重复添加) int alreadyInQueue = 0; for (int j = 0; j < readyQueue->size; j++) { if (strcmp(readyQueue->processes[j].name, originalProc.name) == 0) { alreadyInQueue = 1; break; } } if (!alreadyInQueue) { enqueue(readyQueue, originalProc);//调用入队函数 } } } if (isQueueEmpty(readyQueue)) { // 没有可执行进程,时间推进到下一个进程到达时间 int nextArrivalTime = __INT_MAX__; for (int i = 0; i < originalQueue->size; i++) { PCB originalProc = originalQueue->processes[i]; if (originalProc.remainingTime > 0) { int arrivalSec = timeToSeconds(originalProc.arrivalTime); if (arrivalSec < nextArrivalTime) { nextArrivalTime = arrivalSec; } } } // 确保时间不会回退 if (nextArrivalTime > currentTime) { currentTime = nextArrivalTime; } continue; } // 取出一个进程执行 PCB process = dequeue(readyQueue);//调用出队函数 // 记录进程首次开始时间 if (process.hasStarted == 0) { process.startTime = currentTime; process.hasStarted = 1; } // 时间片限制,时间片为quantum int executionTime = (process.remainingTime < quantum)? process.remainingTime : quantum; currentTime += executionTime; process.remainingTime -= executionTime; // 更新原始队列中对应进程的剩余时间 for (int i = 0; i < originalQueue->size; i++) { if (strcmp(originalQueue->processes[i].name, process.name) == 0) { originalQueue->processes[i].remainingTime = process.remainingTime; break; } } // 检查进程是否完成 if (process.remainingTime <= 0) { process.completionTime = currentTime; process.turnaroundTime = process.completionTime - timeToSeconds(process.arrivalTime); process.weightedTurnaroundTime = (float)process.turnaroundTime / process.burstTime; process.waitingTime = process.turnaroundTime - process.burstTime; // 输出进程完成信息 printf("%s\t", process.name); displayTime(process.arrivalTime); printf("\t"); displayTime(secondsToTime(process.startTime)); printf("\t"); displayTime(secondsToTime(process.completionTime)); printf("\t%d\t\t%.2f\n", process.turnaroundTime, process.weightedTurnaroundTime); // 保存到完成队列 completedProcesses[completedCount++] = process; totalTurnaroundTime += process.turnaroundTime; totalWeightedTurnaroundTime += process.weightedTurnaroundTime; } else { // 时间片用完,重新入队 enqueue(readyQueue, process); } } // 计算并输出平均值 float avgTurnaroundTime = totalTurnaroundTime / processes->size; float avgWeightedTurnaroundTime = totalWeightedTurnaroundTime / processes->size; printf("\n统计信息:\n"); printf("平均周转时间:%.2f秒\n", avgTurnaroundTime); printf("平均带权周转时间:%.2f\n", avgWeightedTurnaroundTime); // 释放内存 free(readyQueue->processes); free(readyQueue); free(completedProcesses); free(originalQueue->processes); free(originalQueue); } int main() { PCBQueue* processes = NULL; int choice, quantum; int useDefaultQuantum = 1; // 是否使用默认时间片 showWelcomeScreen(); do { choice = showMenu(); switch (choice) { case 1: if (processes != NULL) { free(processes->processes); free(processes); } processes = inputProcesses(); useDefaultQuantum = 1; // 重置时间片标志 break; case 2: fcfsScheduling(processes); break; case 3: if (processes == NULL || processes->size == 0) { printf("没有进程可调度!请先输入进程信息或加载测试用例\n"); break; } // 询问时间片大小 printf("请输入时间片大小(秒) [默认5秒]: "); if (scanf("%d", &quantum) != 1) { quantum = 5; // 默认时间片 getchar(); // 清除输入缓冲区 printf("使用默认时间片: 5秒\n"); } rrScheduling(processes, quantum); break; case 4: printf("退出程序!\n"); break; default: printf("无效选项,请重新输入!\n"); } } while (choice != 4); // 释放内存 if (processes != NULL) { free(processes->processes); free(processes); } return 0; }这个是我用c语言实现的先来先服务调度算法和轮转调度算法,但是输出给我的先来先服务调度算法和轮转调度算法的结果一样,我的需求是帮我修改轮转调度算法,使其能正确使用时间片,并且修改后的代码只能使用队列,不要让先来先服务调度算法和轮转调度算法相互混淆,修改完成后给我修改后的全部代码
最新发布
06-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值