#include <cstdio>
#include <cstdlib>
#include <iostream>
#define MAX_DURANCE 1e6
using namespace std;
int processCounts;
int *comingTimes;
int *serveTimes;
int *finishedTimes;
int *turnoverTimes;
int *waitingTimes;
float *turnoverTimesWeight;
int methodChoosen;
void InitProcessCount();
void InitComingTime();
void InitServeTime();
void PrintInformation();
void ChooseMethod();
void Initialize();
void SJF();
void FCFS();
void PrintSchedule();
int main() {
InitProcessCount();
InitComingTime();
InitServeTime();
PrintInformation();
Initialize();
ChooseMethod();
switch (methodChoosen) {
case 1:
FCFS();
break;
default:
SJF();
break;
}
PrintSchedule();
system("pause");
return 0;
}
void InitProcessCount() {
cout << "==>请输入进程个数:";
cin >> processCounts;
}
void InitComingTime() {
comingTimes = new int[processCounts];
cout << "==>请输入各个进程的到达时间:";
for (int i = 0; i < processCounts; i++) {
cin >> comingTimes[i];
}
}
void InitServeTime() {
serveTimes = new int[processCounts];
cout << "==>请输入各个进程的要求服务时间:";
for (int i = 0; i < processCounts; i++) {
cin >> serveTimes[i];
}
}
void PrintInformation() {
cout << "==>被进程输入的进程数量: [ " << processCounts << " ] " << endl;
cout << "==>进程到来的时间展示: ";
for (int i = 0; i < processCounts; i++) {
cout << comingTimes[i] << " ";
}
cout << endl;
cout << "==>进程服务的时间展示: ";
for (int i = 0; i < processCounts; i++) {
cout << serveTimes[i] << " ";
}
cout << endl;
}
void ChooseMethod() {
cout << "请选择一种调度方式[ 1-FCFS, 2-SJF]: ";
cin >> methodChoosen;
}
void FCFS() {
int current = 0;
int copy_comingTimes[processCounts];
for (int i = 0; i < processCounts; i++) {
copy_comingTimes[i] = comingTimes[i];
}
for (int j = 0; j < processCounts; j++) {
int earliestProcess = 0, min = copy_comingTimes[0];
for (int i = 1; i < processCounts; i++) {
if (copy_comingTimes[i] < min) {
min = copy_comingTimes[i];
earliestProcess = i;
}
}
copy_comingTimes[earliestProcess] = MAX_DURANCE;
if (comingTimes[earliestProcess] > current) {
current = comingTimes[earliestProcess];
}
finishedTimes[earliestProcess] = current + serveTimes[earliestProcess];
waitingTimes[earliestProcess] = current - comingTimes[earliestProcess];
current += serveTimes[earliestProcess];
turnoverTimes[earliestProcess] = serveTimes[earliestProcess] + waitingTimes[earliestProcess];
turnoverTimesWeight[earliestProcess] =
(float) turnoverTimes[earliestProcess] / (float) serveTimes[earliestProcess];
}
}
void SJF() {
int current = 0;
int copy_serveTimes[processCounts], copy_comingTimes[processCounts];
for (int i = 0; i < processCounts; i++) {
copy_serveTimes[i] = serveTimes[i];
}
for (int i = 0; i < processCounts; i++) {
copy_comingTimes[i] = comingTimes[i];
}
int flag = 0;
for (int i = 0; i < processCounts; i++) {
int min_p = 0, min = copy_serveTimes[0], early = copy_comingTimes[0];
for (int j = 1; j < processCounts; j++) {
if (copy_comingTimes[j] <= current && copy_serveTimes[j] < min) {
flag = 1;
min = copy_serveTimes[j];
min_p = j;
}
}
if (flag == 0) {
for (int m = 1; m < processCounts; m++) {
if (copy_comingTimes[m] < early) {
early = copy_comingTimes[m];
min_p = m;
current = early;
}
}
}
copy_comingTimes[min_p] = MAX_DURANCE;
copy_serveTimes[min_p] = MAX_DURANCE;
finishedTimes[min_p] = current + serveTimes[min_p];
waitingTimes[min_p] = current - comingTimes[min_p];
current = finishedTimes[min_p];
turnoverTimes[min_p] = waitingTimes[min_p] + serveTimes[min_p];
turnoverTimesWeight[min_p] = (float) turnoverTimes[min_p] / (float) serveTimes[min_p];
}
}
void PrintSchedule() {
cout << "==>进程调度信息打印:" << endl;
cout << "P_name(ID) arrived_time served_time finished_time turnover_time turnover_time_weight"
<< endl;
for (int i = 0; i < processCounts; i++) {
printf("%10d %12d %11d %14d %13d %20f\n", i, comingTimes[i], serveTimes[i], finishedTimes[i],
turnoverTimes[i], turnoverTimesWeight[i]);
}
float average_turnover_time, sum_turnover_time = 0;
float average_turnover_time_weight, sum_turnover_time_weight = 0;
for (int i = 0; i < processCounts; i++) {
sum_turnover_time += turnoverTimes[i];
sum_turnover_time_weight += turnoverTimesWeight[i];
}
average_turnover_time = sum_turnover_time / processCounts;
average_turnover_time_weight = sum_turnover_time_weight / processCounts;
cout << "==>平均周转时间为:" << average_turnover_time << endl;
cout << "==>带权平均周转时间为:" << average_turnover_time_weight << endl;
}
void Initialize() {
finishedTimes = new int[processCounts];
turnoverTimes = new int[processCounts];
waitingTimes = new int[processCounts];
turnoverTimesWeight = new float[processCounts];
}