实验要求
1 、按先来先服务(FCFS)的原则进行调度,输出作业调度的顺序及相关信息。
2、 按最短作业优先(SJF)的原则进行调度,输出作业调度的顺序及相关信息。
3、 按最高响应比优先的原则进行调度,输出作业调度顺序及相关信息。
#include<bits/stdc++.h>
#include <fstream>
using namespace std;
const int maxx=105;
struct JCB
{
string job_num;
string job_name;
string arrive_time;
int arr_hour;
int arr_min;
int run_time;
int already_wait;
};
int sum;
JCB Job_Array[maxx];
void init(char *file)
{
int cnt=0;
ifstream inFile;
inFile.open(file);
while(inFile)
{
inFile >> Job_Array[cnt].job_num;
inFile >> Job_Array[cnt].job_name;
inFile >> Job_Array[cnt].arrive_time;
inFile >> Job_Array[cnt].run_time;
Job_Array[cnt].arr_hour=(Job_Array[cnt].arrive_time[0]-'0')*10+ (Job_Array[cnt].arrive_time[1]-'0');
Job_Array[cnt].arr_min=(Job_Array[cnt].arrive_time[3]-'0')*10+ (Job_Array[cnt].arrive_time[4]-'0');
cnt++;
inFile.get();
}
sum=cnt-1;
}
bool cmp(JCB a,JCB b)
{
if(a.arr_hour==b.arr_hour)return a.arr_min<b.arr_min;
return a.arr_hour<b.arr_hour;
}
void sub(int x,int m, int n)
{
int start_hour=x;
int start_min=m+n;
if(start_min>=60){
start_min-=60;
start_hour+=1;
}
printf("%02d:%02d ",start_hour,start_min);
}
int wait(int x,int y,int z)
{
bool flag=0;
if(x>0)flag==1;
if(y<0&&flag)
{
x-=1;
y+=60;
}
if(z==1)printf("%d ", x*60+y);
return x*60+y;
}
bool cmp2(JCB a,JCB b)
{
return a.run_time<b.run_time;
}
bool cmp3(JCB a,JCB b)
{
double x=double(a.already_wait+a.run_time)/double(a.run_time);
double y=double(b.already_wait+b.run_time)/double(b.run_time);
return x>y;
}
void SFG()
{
double turn_time=0;
double vturn_time=0;
sort(Job_Array,Job_Array+sum,cmp);
int ddl_hour=Job_Array[0].arr_hour;
int ddl_min=Job_Array[0].arr_min;
for(int i=0;i<sum;i++)
{
ddl_min+=Job_Array[i].run_time;
if(ddl_min>=60){
ddl_min-=60;
ddl_hour+=1;
}
int g;
for(int j=i+1;j<sum+1;j++)
{
if(Job_Array[j].arr_hour<ddl_hour||(Job_Array[j].arr_hour==ddl_hour&&Job_Array[j].arr_min<=ddl_min))g=j;
else break;
}
if(g-i>1)
{
sort(Job_Array+i+1,Job_Array+g,cmp2);
}
}
cout<<"作业编号 作业名称 提交时间 要求服务运行时间 开始时间 完成时间 等待时间 周转时间"<<endl;
int curr_hour=Job_Array[0].arr_hour;
int curr_min=Job_Array[0].arr_min;
for(int i=0;i<sum;i++)
{
cout<<Job_Array[i].job_num<<" "<<Job_Array[i].job_name<<" "<<Job_Array[i].arrive_time<<" "<<Job_Array[i].run_time<<" ";
printf("%02d:%02d ",curr_hour,curr_min);//start
sub(curr_hour,curr_min,Job_Array[i].run_time);//finish
int waitt;
waitt=wait(curr_hour-Job_Array[i].arr_hour,curr_min-Job_Array[i].arr_min,1);
printf("%d ",waitt+Job_Array[i].run_time);
turn_time+=waitt+Job_Array[i].run_time;
vturn_time+=double(waitt+Job_Array[i].run_time)/double(Job_Array[i].run_time);
curr_min+=Job_Array[i].run_time;
if(curr_min>=60){
curr_min-=60;
curr_hour+=1;
}
cout<<endl;
}
printf("平均周转时间: %0.4lf\n",turn_time/double(sum));
printf("平均加权周转时间: %0.4lf\n",vturn_time/double(sum));
}
void FCFG()
{
double turn_time=0;
double vturn_time=0;
sort(Job_Array,Job_Array+sum,cmp);
cout<<"作业编号 作业名称 提交时间 要求服务运行时间 开始时间 完成时间 等待时间 周转时间"<<endl;
int curr_hour=Job_Array[0].arr_hour;
int curr_min=Job_Array[0].arr_min;
for(int i=0;i<sum;i++)
{
cout<<Job_Array[i].job_num<<" "<<Job_Array[i].job_name<<" "<<Job_Array[i].arrive_time<<" "<<Job_Array[i].run_time<<" ";
printf("%02d:%02d ",curr_hour,curr_min);//start
sub(curr_hour,curr_min,Job_Array[i].run_time);//finish
int waitt;
waitt=wait(curr_hour-Job_Array[i].arr_hour,curr_min-Job_Array[i].arr_min,1);
printf("%d ",waitt+Job_Array[i].run_time);
turn_time+=waitt+Job_Array[i].run_time;
vturn_time+=double(waitt+Job_Array[i].run_time)/double(Job_Array[i].run_time);
curr_min+=Job_Array[i].run_time;
if(curr_min>=60){
curr_min-=60;
curr_hour+=1;
}
cout<<endl;
}
printf("平均周转时间: %0.4lf\n",turn_time/double(sum));
printf("平均加权周转时间: %0.4lf\n",vturn_time/double(sum));
}
void HRRN()
{
double turn_time=0;
double vturn_time=0;
sort(Job_Array,Job_Array+sum,cmp);
int ddl_hour=Job_Array[0].arr_hour;
int ddl_min=Job_Array[0].arr_min;
for(int i=0;i<sum;i++)
{
ddl_min+=Job_Array[i].run_time;
if(ddl_min>=60){
ddl_min-=60;
ddl_hour+=1;
} //上一次的结束时间
int g;
for(int j=i+1;j<sum+1;j++)
{
if(Job_Array[j].arr_hour<ddl_hour||(Job_Array[j].arr_hour==ddl_hour&&Job_Array[j].arr_min<=ddl_min))
{
Job_Array[j].already_wait=wait(ddl_hour-Job_Array[j].arr_hour,ddl_min-Job_Array[j].arr_min,0);
g=j;
}
else break;
}
if(g-i>=1)
{
sort(Job_Array+i+1,Job_Array+g,cmp3);
}
}
//排序之后的输出
cout<<"作业编号 作业名称 提交时间 要求服务运行时间 开始时间 完成时间 等待时间 周转时间"<<endl;
int curr_hour=Job_Array[0].arr_hour;
int curr_min=Job_Array[0].arr_min;
for(int i=0;i<sum;i++)
{
cout<<Job_Array[i].job_num<<" "<<Job_Array[i].job_name<<" "<<Job_Array[i].arrive_time<<" "<<Job_Array[i].run_time<<" ";
printf("%02d:%02d ",curr_hour,curr_min);//start
sub(curr_hour,curr_min,Job_Array[i].run_time);//finish
int waitt;
waitt=wait(curr_hour-Job_Array[i].arr_hour,curr_min-Job_Array[i].arr_min,1);
printf("%d ",waitt+Job_Array[i].run_time);
turn_time+=waitt+Job_Array[i].run_time;
vturn_time+=double(waitt+Job_Array[i].run_time)/double(Job_Array[i].run_time);
curr_min+=Job_Array[i].run_time;
if(curr_min>=60){
curr_min-=60;
curr_hour+=1;
}
cout<<endl;
}
printf("平均周转时间: %0.4lf\n",turn_time/double(sum));
printf("平均加权周转时间: %0.4lf\n",vturn_time/double(sum));
}
int main()
{
init("data.txt");
cout<<"先来先服务算法:"<<endl;
FCFG();
init("data.txt");
cout<<"短进程优先算法:"<<endl;
SFG();
init("data.txt");
cout<<"最高响应比优先算法:"<<endl;
HRRN();
}