修改代码,让他成为一个合理的FCFS进程调度算法,在修改的部分加上注释,注明用途或意义,最后将修改后的代码和增加的注释输出
时间: 2024-10-13 20:09:45 浏览: 23
```c
/* 修改后的FCFS(First-Come-First-Serve)进程调度算法 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 100 // 定义了进程数组的最大长度
// 定义一个表示单个进程的数据结构
typedef struct {
char ProcessId[20]; // 作业的名字
double CreationTime; // 创建时间
double StartTime; // 开始时间
double ExecutionTime; // 执行时间
double arrivalTime; // 到达时间
double CompletionTime; // 完成时间
} Process;
// 定义了一个用于存储多个进程的集合的数据结构
typedef struct {
Process m_ProcessArray[MAX]; // 可容纳100个进程的数组
int m_ProcessCount; // 当前进程的数量
} ProcessBook;
// 函数声明
void ShowMenu(); // 实现菜单功能
void initProcessBook(ProcessBook *); // 初始化进程集
void addProcess(ProcessBook *); // 添加新进程
void showProcess(ProcessBook *); // 显示当前所有进程的信息
void creationTimeSort(ProcessBook *); // 根据创建时间排序
void showResult(ProcessBook *); // 展示最终调度结果
void FCFS(ProcessBook *); // 先来先服务调度算法实现
// 主程序入口
int main(void){
ProcessBook pb; // 创建进程集对象
initProcessBook(&pb); // 对进程集进行初始化
while(1){
ShowMenu();
int select = 0;
printf("\n请输入您的选择:");
scanf("%d", &select);
switch(select){
case 0:
printf("您已退出进程调度模拟算法,欢迎下次使用!\n");
return 0;
case 1:
addProcess(&pb);
break;
case 2:
showProcess(&pb);
break;
case 3:
FCFS(&pb); // 调用FCFS调度算法
break;
default:
printf("请输入有效的命令!\n");
system("pause");
system("cls");
break;
}
}
system("pause");
return 0;
}
// 显示主菜单
void ShowMenu(){
printf("\t***************************\t\n");
printf("\t********** 进程调度 *********\t\n");
printf("\t******** 0、退出调度 ********\t\n");
printf("\t********** 1、添加进程 ********\t\n");
printf("\t********** 2、显示进程 ********\t\n");
printf("\t********* 3、先来先服务 ********\t\n");
printf("\t***************************\t\n");
}
// 初始化进程集
void initProcessBook(ProcessBook *pb){
pb->m_ProcessCount = 0; // 设置当前进程计数器为零
}
// 向进程集中添加一个新的进程
void addProcess(ProcessBook *pb){
printf("添加新的进程\n");
printf("请输入进程标识符:");
scanf("%s", pb->m_ProcessArray[pb->m_ProcessCount].ProcessId);
// 验证输入的时间值的有效性
double creationTime;
do{
printf("请输入进程的创建时间:");
scanf("%lf", &creationTime);
if (creationTime < 0)
printf("创建时间不能是负数,请重新输入!\n");
}while(creationTime < 0);
pb->m_ProcessArray[pb->m_ProcessCount].CreationTime = creationTime;
double arrivalTime;
do{
printf("请输入进程的到达时间:");
scanf("%lf", &arrivalTime);
if (arrivalTime < 0)
printf("到达时间不能是负数,请重新输入!\n");
}while(arrivalTime < 0);
pb->m_ProcessArray[pb->m_ProcessCount].arrivalTime = arrivalTime;
double executionTime;
do{
printf("请输入进程需要的执行时间:");
scanf("%lf", &executionTime);
if (executionTime <= 0)
printf("执行时间必须大于零,请重新输入!\n");
}while(executionTime <= 0);
pb->m_ProcessArray[pb->m_ProcessCount].ExecutionTime = executionTime;
pb->m_ProcessCount++;
printf("成功添加第%d个进程!\n", pb->m_ProcessCount);
system("pause");
system("cls");
}
// 显示进程集中的所有进程及其信息
void showProcess(ProcessBook *pb){
if (!pb->m_ProcessCount){
printf("目前没有添加任何进程。\n");
}else{
printf("现有进程列表如下:\n");
printf("进程编号\t创建时间\t执行时间\n");
for (int i = 0; i < pb->m_ProcessCount; ++i){
printf("%s\t%lf\t%lf\n", pb->m_ProcessArray[i].ProcessId,
pb->m_ProcessArray[i].CreationTime,
pb->m_ProcessArray[i].ExecutionTime);
}
}
printf("\n");
system("pause");
system("cls");
}
// 按照创建时间对进程进行排序
void creationTimeSort(ProcessBook *pb) {
for (int i = 0; i < pb->m_ProcessCount - 1; i++){
for (int j = 0; j < pb->m_ProcessCount - i - 1; j++){
if (pb->m_ProcessArray[j].CreationTime > pb->m_ProcessArray[j + 1].CreationTime){
Process temp = pb->m_ProcessArray[j];
pb->m_ProcessArray[j] = pb->m_ProcessArray[j + 1];
pb->m_ProcessArray[j + 1] = temp;
}
}
}
}
// 显示调度算法产生的结果
void showResult(ProcessBook *pb) {
// 打印出调度后各个进程的状态
printf("经过先来先服务调度后,各进程状态如下:\n");
printf("进程编号\t创建时间\t执行时间\t开始时间\t结束时间\n");
for (int i = 0; i < pb->m_ProcessCount; ++i){
printf("%s\t%lf\t%lf\t%lf\t%lf\n",
pb->m_ProcessArray[i].ProcessId,
pb->m_ProcessArray[i].CreationTime,
pb->m_ProcessArray[i].ExecutionTime,
pb->m_ProcessArray[i].StartTime,
pb->m_ProcessArray[i].CompletionTime);
}
}
// 先来先服务调度算法的核心部分
void FCFS(ProcessBook *pb){
// 将进程按到达时间先后排列;若同时到达,则依据创建时间早者优先原则处理
for (int i = 0; i < pb- 1; j++){
if (pb->m_ProcessArray[j].arrivalTime > pb->m_ProcessArray[j + 1].arrivalTime ||
(pb->m_ProcessArray[j].arrivalTime == pb->m_ProcessArray[j + 1].arrivalTime &&
pb->m_ProcessArray[j].CreationTime > pb->m_ProcessArray[j + 1].CreationTime)){
Process temp = pb->m_ProcessArray[j];
pb->m_ProcessArray[j] = pb->m_ProcessArray[j + 1];
pb->m_ProcessArray[j + 1] = temp;
}
}
}
// 根据FCFS规则确定每个进程的实际启动时刻与完成时刻
for (int i = 0; i < pb->m_ProcessCount; i++){
if (i == 0){
pb->m_ProcessArray[i].StartTime = pb->m_ProcessArray[i].arrivalTime;
}else{
if (pb->m_ProcessArray[i - 1].CompletionTime >= pb->m_ProcessArray[i].arrivalTime){
pb->m_ProcessArray[i].StartTime = pb->m_ProcessArray[i - 1].CompletionTime;
}else{
pb->m_ProcessArray[i].StartTime = pb->m_ProcessArray[i].arrivalTime;
}
}
// 更新该进程的完成时间
pb->m_ProcessArray[i].CompletionTime = pb->m_ProcessArray[i].StartTime + pb->m_ProcessArray[i].ExecutionTime;
}
// 最终显示结果
showResult(pb);
}
```
阅读全文