操作系统hw-2

实验要求

 

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();
	
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chococolate

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值