操作系统先来先服务FSFC算法以及短作业优先SJF算法C++
完整代码如下
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<iomanip>
#include<cstring>
using namespace std;
class FSFC
{
public:
FSFC(int nn, char* jobname, int* jobarrivetime, int* jobneededtime, int* flagi)
: n(nn), JobArriveTime(jobarrivetime), JobNeededTime(jobneededtime), flag(flagi)
{
JobName = new char[strlen(jobname) + 1];
strcpy(JobName, jobname);
}
void Rank()
{
for (int i = 0; i < n; ++i)
{
for (int j = i; j < n; ++j)
{
if (JobArriveTime[i] > JobArriveTime[j])
{
int temp = flag[i];
flag[i] = flag[j];
flag[j] = temp;
}
}
}
}
int* JobArriveTime; //作业到达时间
int n; //作业数
char* JobName; //作业名
int* JobNeededTime; //作业运行时间
int* flag; //运行次序
};
class SJF
{
public:
SJF(int nn, char* jobname, int* jobarrivetime, int* jobneededtime, int* flagi)
: n(nn), JobArriveTime(jobarrivetime), JobNeededTime(jobneededtime), flag(flagi)
{
JobName = new char[strlen(jobname) + 1];
strcpy(JobName, jobname);
exchange = new int[nn];
}
void Rank(int nowtime,int m)
{
bool* NeedCompare = new bool[n - m];
if (JobArriveTime[m] < nowtime )
{
for (int j = 0; j < n; ++j)
{
if (flag[j] >= m)
NeedCompare[j] = true;
else NeedCompare[j] = false;
}
for (int j = 0; j < n; ++j)
{
if (JobNeededTime[j] < JobNeededTime[m] && NeedCompare[m] && NeedCompare[j])
{
int temp = flag[m];
flag[m] = flag[j];
flag[j] = temp;
}
}
}
}
int* exchange;
int* JobArriveTime; //作业到达时间
int n; //作业数
char* JobName; //作业名
int* JobNeededTime; //作业运行时间
int* flag; //运行次序
};
int main()
{
int ChooseWay;
cout << "请选择算法(1:FSFC,2:SJF):";
cin >> ChooseWay;
int n;
cout << "作业数目:";
cin >> n;
char* JobName = new char[n];
cout << "作业名(空格分隔):";
for (int i = 0; i < n; ++i)cin >> JobName[i];
int* JobArriveTime = new int[n]; //作业到达时间
cout << "作业到达时间(mmss格式):";
for (int i = 0; i < n; ++i)cin >> JobArriveTime[i];
int* JobNeededTime = new int[n]; //作业运行时间
cout << "作业运行时间(默认分钟为单位):";
for (int i = 0; i < n; ++i)cin >> JobNeededTime[i];
int* flag = new int[n]; //运行次序
for (int i = 0; i < n; ++i) flag[i] = i;
cout << setw(15) << "作业名" << setw(15)
<< "到达时间" << setw(15)
<< "估计运行时间" << setw(15)
<< "开始时间" << setw(15)
<< "完成时间" << setw(15)
<< "周转时间" << setw(15)
<< "带权周转时间" << setw(15) << endl;
if (ChooseWay == 1)
{
int NowTime;
FSFC job_fsfc(n, JobName, JobArriveTime, JobNeededTime, flag);
job_fsfc.Rank();
for (int i = 0; i < n; ++i)
{
if (flag[i] == 0)
{
NowTime = JobArriveTime[i];
}
}
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
if (flag[j] == i)
{
double CyclingTime = NowTime + JobNeededTime[j] - JobArriveTime[j];
cout << JobName[j] << setw(15)
<< JobArriveTime[j] << setw(15)
<< JobNeededTime[j] << setw(15)
<< NowTime << setw(15)
<< NowTime + JobNeededTime[j] << setw(15)
<< CyclingTime << setw(15)
<< CyclingTime / JobNeededTime[j] << setw(15) << endl;
NowTime += JobNeededTime[j];
}
}
}
}
if (ChooseWay == 2)
{
SJF job_sjf(n, JobName, JobArriveTime, JobNeededTime, flag);
int NowTime = 0;
for (int i = 0; i < n; ++i)
{
job_sjf.Rank(NowTime,i);
for (int j = 0; j < n; ++j)
{
if (flag[j] == i&&i==0)
NowTime += JobArriveTime[j] + JobNeededTime[j];
if (flag[j] == i && i != 0)
NowTime += JobNeededTime[j];
}
}
for (int i = 0; i < n; ++i)
{
if (flag[i] == 0) NowTime = JobArriveTime[i];
}
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
double CyclingTime = NowTime + JobNeededTime[j] - JobArriveTime[j];
if (flag[j] == i)
{
cout << JobName[j] << setw(15)
<< JobArriveTime[j] << setw(15)
<< JobNeededTime[j] << setw(15)
<< NowTime << setw(15)
<< NowTime + JobNeededTime[j] << setw(15)
<< CyclingTime << setw(15)
<< CyclingTime / JobNeededTime[j] << setw(15) << endl;
NowTime += JobNeededTime[j];
}
}
}
}
return 0;
}