先到先服务算法的模拟-作业调度算法-c++ 数组

326 阅读3分钟

一开始定义了七个double类型的数组,用来分别存储到达时间、运行时间、开始时间、完成时间、等待时间、周转时间、带权周转时间,定义一个string类型的数组,用来存储每个作业的进程名;然后在主函数中用户输入作业数目和进程名、到达时间和运行时间;利用选择排序算法根据到达时间从小到大进行排序,顺便在这个算法中交换到达时间的顺序的时候,其余的七个数组的顺序也交换,保证每个进程的每个时间一一对应;然后开始根据公式计算每个时间(公式已在程序注释中写明),注意判断到达时间和上一个进程的完成时间的比较,最后输出相应的信息。

using namespace std;
const int N=10;
double daoda[N];//存储到达时间的数组 
double yunxing[N]; //存储运行时间的数组 
double kaishi[N];//存储开始时间的数组 
double wancheng[N];//存储完成时间的数组 
double dengdai[N];//存储等待时间的数组 
double zhouzhuan[N];//存储周转时间的数组 
double daiquanz[N];//存储带权周转时间的数组 
string name[N];//每个作业的名字 
int main()
{
	//先来先服务调度算法 
	cout<<"请输入作业数:"<<endl; 
	int n;//作业数
	cin>>n;
	cout<<"请按照顺序分别输入n个作业的名字、到达时间和运行时间(h):"<<endl;
    for(int i=0;i<n;i++)
    {
    	cin>>name[i];//作业的名字 比如A B C 之类的 
    	cin>>daoda[i]>>yunxing[i];//初始条件 存入到达时间和运行时间 
	}
	for(int i=0;i<n;i++)//选择排序法 根据到达时间从小到大进行排序 
	{
		for(int j=0;j<n;j++)
		{
			if(daoda[i]<daoda[j])
			{
				swap(daoda[i],daoda[j]);//这下面这几步是为了同一个作业的这些时间对应的保持一致 
				swap(yunxing[i],yunxing[j]);//当到达时间交换了,对应的其他时间也应该交换 
				swap(kaishi[i],kaishi[j]);
				swap(dengdai[i],dengdai[j]);
				swap(zhouzhuan[i],zhouzhuan[j]);
				swap(daiquanz[i],daiquanz[i]);
				swap(name[i],name[j]);//作业的名字也要跟着作业排序的变化而变化 
			}
		}
	}
	kaishi[0]=daoda[0];//最先到达的作业的开始时间为到达时间 
	dengdai[0]=kaishi[0]-daoda[0];
	wancheng[0]=yunxing[0]+kaishi[0];//第一个进程的完成时间 就是运行时间+开始时间
	zhouzhuan[0]=wancheng[0]-daoda[0];	//周转时间就是完成时间-到达时间 
	daiquanz[0]=zhouzhuan[0]/yunxing[0];//带权周转时间=周转时间/运行时间 
	for(int i=1;i<n;i++)
	{
		if(daoda[i]<wancheng[i-1])//当这个进程的到达时间小于上一个进程的完成时间时 
		{
			kaishi[i]=kaishi[i-1]+yunxing[i-1];//开始时间=上一个作业的运行时间+开始时间	 也就是上一个的完成时间 
		}
	    else// 当这个进程的到达时间不小于上一个进程的完成时间时
	    {
	    	kaishi[i]=daoda[i];//开始时间=这个进程的到达时间 
		}
		wancheng[i]=yunxing[i]+kaishi[i];//完成时间就是运行时间+开始时间 
		dengdai[i]=kaishi[i]-daoda[i];//等待时间就是开始时间-到达时间 
		zhouzhuan[i]=wancheng[i]-daoda[i];	//周转时间就是完成时间-到达时间 
		daiquanz[i]=zhouzhuan[i]/yunxing[i];//带权周转时间=周转时间/运行时间 
	}
	for(int i=0;i<n;i++)
	{
	    cout<<"作业"<<name[i]<<":";
		cout<<"到达时间:"<<daoda[i]<<"\t"<<"运行时间:"<<yunxing[i]<<"\t";
		cout<<"开始时间:"<<kaishi[i]<<"\t"<<"完成时间:"<<wancheng[i]<<"\t"<<"等待时间:"<<dengdai[i]<<"\t";
		cout<<"周转时间:"<<zhouzhuan[i]<<"\t"<<"带权周转时间:"<<daiquanz[i]<<endl; 
	} 
	double sum1=0;
	double sum2=0;
	for(int i=0;i<n;i++)
	{
		sum1+=zhouzhuan[i];//计算周转时间的和  
		sum2+=daiquanz[i]; //计算带权周转时间的和 
	}
	cout<<"平均周转时间:"<<sum1/n<<endl;//平均周转时间=周转时间/作业数量 
	cout<<"平均带权周转时间:"<<sum2/n<<endl;//平均带权周转时间=带权周转时间/作业数量 
	return 0;
}

图片1.png