#include <iostream>
#include <stdio.h>
using namespace std;
typedef struct job{
int name;//作业编号
int arrivetime;//到达时间
int requesttime;//需要服务时间
int finishtime;//完成时间
int turnaroundtime;//周转时间
int starttime;//作业开始时间
}JOB;
JOB job[100];
int jobnum;
void definition(){
int num = 0;//定义系统总共的作业数
int need,arrive;//分别定义所需时间和到达时间
cout << "请输入作业的个数:" << endl;
cin >> num;
if(num < 0){
cout << "输入非法,请重新输入!" << endl;
}
jobnum = num;
for(int i = 0;i<jobnum;i++){
cout << "请输入第" << i << "个作业完成所需时间和到达时间" << endl;
cin >> need >> arrive;
job[i].name = i;
job[i].requesttime = need;
job[i].arrivetime = arrive;
job[i].finishtime = 0;
job[i].turnaroundtime = 0;
job[i].starttime = 0;
}
}
void FCFS(){
float avgturnaroundtime = 0;
float aqtt = 0;
cout << "此方法依据先来先服务原则" << endl;
cout << "作业号 完成时间 周转时间 带权周转时间" << endl;
for(int i = 0;i<jobnum;i++){
job[i].finishtime = job[i].starttime + job[i].requesttime;
job[i].turnaroundtime = job[i].finishtime - job[i].arrivetime;
cout << " " << i << " " << job[i].finishtime << " " << job[i].turnaroundtime << " " << job[i].turnaroundtime/job[i].requesttime << endl;
job[i+1].starttime = job[i].finishtime;
avgturnaroundtime = avgturnaroundtime + job[i].turnaroundtime;
aqtt = aqtt + job[i].turnaroundtime/job[i].requesttime;
}
cout << "作业调度次序:" << endl;
for(int j = 0;j<jobnum;j++){
cout << " " << j;
}
cout << endl;
cout << "平均周转时间:" << avgturnaroundtime/jobnum << endl;
cout << "平均带权周转时间:" << aqtt/jobnum << endl;
cout << endl;
}
void SJF(){
int nowtime = 0;
JOB temp;
float avgturnaroundtime = 0;
float aqtt = 0;
cout << "此方法依据短作业优先原则" << endl;
cout << "作业号 完成时间 周转时间 带权周转时间" << endl;
//首先判断第一个进程完成时是否有其他进程到达,并且比较他们所需运行的时间,选择其中最短的进行运行
job[0].finishtime = job[0].arrivetime + job[0].requesttime;
job[0].turnaroundtime = job[0].finishtime - job[0].arrivetime;
nowtime = job[0].finishtime;
for(int i = 1;i<jobnum;i++){
for(int j = i+1;j<jobnum;j++){
if(job[i].arrivetime <= nowtime && job[j].arrivetime <= nowtime){//当两个进程在这一时刻都已经到达,选取其中所需时间短的
if(job[j].requesttime < job[i].requesttime){//将时间短的排到前面
temp = job[j];
job[j] = job[i];
job[i] = temp;
}
}
}
job[i].finishtime = nowtime + job[i].requesttime;
nowtime = nowtime + job[i].requesttime;
}
for(int i = 0;i<jobnum;i++){
job[i].turnaroundtime = job[i].finishtime - job[i].arrivetime;//周转时间
avgturnaroundtime = avgturnaroundtime + job[i].turnaroundtime;//平均周转时间
aqtt = aqtt + job[i].turnaroundtime/job[i].requesttime;//平均带权周转时间
cout << " " << job[i].name << " " << job[i].finishtime << " " << job[i].turnaroundtime << " " << job[i].turnaroundtime/job[i].requesttime << endl;
}
cout << "平均周转时间" << avgturnaroundtime/jobnum << endl;
cout << "平均带权周转时间" << aqtt/jobnum << endl;
}
int main (void){
definition();
FCFS();
SJF();
return 0;
}