实验内容
输入
1 A 0 20
2 B 10 30
3 C 15 10
4 D 20 24
5 E 25 6
输出信息
作业编号 作业名称 提交时间 要求服务运行时间 开始时间 完成时间 等待时间 周转时间
统计信息包括: 平均周转时间、平均带权周转时间
算法实现
- 按先来先服务(FCFS)的原则进行调度,输出作业调度的顺序及相关信息
- 按最短作业优先(SJF)的原则进行调度,输出作业调度的顺序及相关信息
- 按最高响应比优先(HRRN)的原则进行调度,输出作业调度顺序及相关信息
代码
#include <iostream>
#include <string>
#include <algorithm>
#define MAX 10 // 设置最大的作业数为10
using namespace std;
struct JCB
{
int id; // 作业编号
string name; // 作业名称
double RP; // 响应比
int aTime; // 提交时间(到达时间)
int rTime; // 要求服务运行时间
double tTime; // 周转时间:完成时间 - 提交时间
double wtTime; //带权周转时间:周转时间 / 运行时间
bool flag = false; // 记录有没有被“删除”
};
typedef struct JCB JCB;
JCB JobArray[MAX];
JCB JobArrayFinal[MAX];// 结构体最终顺序
int fTime; // 完成时间
int nTime = 0; // 目前时间
int wTime; // 等待时间
int sTime; // 开始时间
double totaltTime = 0, totalwtTime = 0; // 总周转时间,总带权周转时间
int len = 0; // 总作业数
// 输入所有作业信息
void input(JCB* p) {
cout << "请输入作业数:";
cin >> len;
for (int i = 0; i < len; i++) {
cout << "\n请输入作业编号:";
cin >> (p + i)->id;
cout << "请输入作业名称:";
cin >> (p + i)->name;
cout << "请输入作业提交时间:";
cin >> (p + i)->aTime;
cout << "请输入作业运行时间:";
cin >> (p + i)->rTime;
}
}
// 先来先服务(按到达时间从小到大排序)
int FCFS(const JCB &s1,const JCB &s2) {
// 如果到达时间相同,就按运行时间从小到大排序
if (s1.aTime == s2.aTime) {
return s1.rTime < s2.rTime;
}
else {
return s1.aTime < s2.aTime;
}
}
// 最短作业优先(按执行时间从小到大排序)
void SJF(JCB* p) {
// 载入第一个到达的作业
JobArrayFinal[0] = JobArray[0];
JobArray[0].flag = true; // “删除”第一个作业
// 计算第一个作业完成时间
int finishTime = JobArrayFinal[0].aTime + JobArrayFinal[0].rTime;
int index = 0; // 记录正在等待的作业的结尾
int short_time = 999; // 正在等待的作业的最小执行时间
int short_index;// 记录正在等待的最小执行时间作业的位置
int start;