//cpp文件#include "stdafx.h"void FCFS();//先到先服务调度算法
void SJF();//短进程优先算法
void printProc();//输出进程的计算结果struct process_type //进程结构
{int pid;int ArrivalTime;//到达时间int ServiceTime;//服务时间int StartTime;//开始时间int FinishTime;//完成时间int RoundTime;//周转时间double WeightRoundTime;//带权周转时间
};struct process_type proc[20];//申请20个进程控制块,内存中进程数最大值为20
int PNum, NowTime;//PNum表示进程数,NowTime表示当前的时刻int SumRT = 0; //总周转时间
double SumWRT = 0; //总带权周转时间
int AverageRT = 0; //平均周转时间
double AverageWRT = 0;//平均带权周转时间void main()
{int i, n;char a;n = 1;cout << "请输入进程个数:";cin >> PNum;for (i = 0;i<PNum;i++){cout << "请输入第" << i + 1 << "个进程的pid,到达时间和服务时间:" << endl;cin >> proc[i].pid;cin >> proc[i].ArrivalTime;cin >> proc[i].ServiceTime;}while (n == 1){cout << "\n********************************************";cout << "\n* CPU调度演示系统 *";cout << "\n********************************************";cout << "\n 1.FCFS 2.SJF 3.退出";cout << "\n********************************************";cout << "\n请选择(~)";cin >> a;// a=getchar();switch (a){case'1':FCFS();printProc();break;case'2':SJF();printProc();break;case'3':exit(0);default:n = 0;}}
}void printProc()//输出进程的计算结果
{cout << endl << "进程pid\t到达时间\t服务时间\t周转时间\t带权周转时间\n";//逐个输出每一个进程的相关数据for (int i = 0;i<PNum;i++){cout << endl << proc[i].pid << "\t" << proc[i].ArrivalTime << "\t\t" << proc[i].ServiceTime << "\t\t" << proc[i].RoundTime << "\t\t" << proc[i].WeightRoundTime;SumRT += proc[i].RoundTime;SumWRT += proc[i].WeightRoundTime;}/*计算平均周转时间*/AverageRT = SumRT / PNum;/*计算平均带权周转时间*/AverageWRT = SumWRT / PNum;cout << "\n平均周转时间:" << AverageRT << "\t" << "\t平均带权周转时间:" << AverageWRT << endl;//输出平均周转时间和平均带权周转时间
}void FCFS()
{int i, j;for (i = 0;i<PNum;i++)//按进程到达时间的先后排序{ for (j = 0;j<PNum - i - 1;j++){if (proc[j].ArrivalTime>proc[j + 1].ArrivalTime){/* 填写代码 */int a = proc[j + 1].ArrivalTime;int b = proc[j + 1].RoundTime;int c = proc[j + 1].pid;proc[j + 1].ArrivalTime = proc[j].ArrivalTime;proc[j + 1].RoundTime = proc[j].RoundTime;proc[j + 1].pid = proc[j].pid;proc[j].ArrivalTime = a;proc[j].RoundTime = b;proc[j].pid = c;}}}for (i = 0;i<PNum;i++){if (i == 0){/*计算开始时间*/proc[i].StartTime = 0;/*计算结束时间*/proc[i].FinishTime = proc[i].StartTime + proc[i].ServiceTime;}else{if (proc[i].ArrivalTime<proc[i - 1].FinishTime){/*计算结束时间*/proc[i].StartTime = proc[i - 1].FinishTime;//开始时间等于上一个进程的结束时间proc[i].FinishTime = proc[i].StartTime + proc[i].ServiceTime;//结束时间等于开始时间加上服务时间}else{/*计算结束时间*/proc[i].StartTime = proc[i].ArrivalTime;//如果在前一个进程结束之后到达,则开始时间等于到到达时间proc[i].FinishTime = proc[i].StartTime + proc[i].ServiceTime;//结束时间等于开始时间加上服务时间}}printf("进程%d从%d开始,在%d时刻结束\n", proc[i].pid, proc[i].StartTime, proc[i].FinishTime);proc[i].RoundTime = proc[i].FinishTime - proc[i].ArrivalTime;//周转时间proc[i].WeightRoundTime = proc[i].RoundTime / proc[i].ServiceTime;//带权周转时间proc[i + 1].StartTime = proc[i].FinishTime;}// printProc();
}void SJF()
{}
//头文件
// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件
//#pragma once#include "targetver.h"#include <stdio.h>
#include <tchar.h>// TODO: 在此处引用程序需要的其他头文件#include "stdafx.h"
#include <iostream>
#include "conio.h"
#include "stdio.h"
#include "stdlib.h"using namespace std;