时间片轮转算法(RR算法)c++ 数组

#include<iostream>
using namespace std;
const int N=10;
double daoda[N];//存储到达时间的数组 
double fuwu[N]; //存储服务时间的数组 
double fuwu_[N];//服务时间的副本 
double wancheng[N]={0};//存储完成时间的数组 ,完成时间先都赋值为0 
double zhouzhuan[N];//存储周转时间的数组 
double daiquanz[N];//存储带权周转时间的数组 
string name[N];//每个进程的名字 
int main()
{
	//RR 时间片轮转算法 
	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]>>fuwu[i];//初始条件 存入到达时间和运行时间 
    	fuwu_[i]=fuwu[i];//备份 
	}
	double q;
	cout<<"请输入时间片q:"<<endl;
	cin>>q;
	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(fuwu[i],fuwu[j]);//当到达时间交换了,对应的其他时间也应该交换 
				swap(fuwu_[i],fuwu_[j]); 
				swap(zhouzhuan[i],zhouzhuan[j]);
				swap(daiquanz[i],daiquanz[i]);
				swap(name[i],name[j]);//进程的名字也要跟着作业排序的变化而变化 
			}
		}
	}
	//下面计算完成时间
    //----------------------
    double addfuwu=0;//累计服务时间,初始值设为0 
    int count=n;//为了不改变进程总数n的值,令count=n 
    int count1=0;//在某一轮轮转中完成的进程 
    while(count!=0)//当进程数不为0的时候 
	{
		count=count-count1;//还剩下没有完成的进程数目 
    	for(int i=0;i<n;i++)
    	{
    		if(fuwu[i]<=q)//如果还剩下的服务时间小于时间片 
    		{
    			if(wancheng[i]!=0)//这里是防止在进行新一轮的轮转时,会重复把已经完成的进程算进去 
				{
					addfuwu=addfuwu+0;//算进去累计时间加0 
				}
				else
				{
					addfuwu=addfuwu+fuwu[i];//累计时间就等于之前的累计时间+最后这一轮的真正服务服务时间(反正小于q) 
    			    wancheng[i]=addfuwu;//则完成时间=目前累计服务时间 
    			    count1++;//计算这一次轮转结束的进程数目 
				}
			}
			else
			{
				fuwu[i]=fuwu[i]-q;//剩余的服务时间就是服务时间-时间片q 
				addfuwu=addfuwu+q;//累计服务时间=之前服务时间+时间片q(这一轮这个进程的服务时间) 
			}
		}
	}
	// ----------------------
    //计算周转时间和带权周转时间
	for(int i=0;i<n;i++)
	{
	    zhouzhuan[i]=wancheng[i]-daoda[i];//周转时间=完成时间-到达时间 
	    daiquanz[i]=zhouzhuan[i]/fuwu_[i];//带权周转时间=周转时间/服务时间 
	} 
	
	for(int i=0;i<n;i++)
	{
	    cout<<"进程"<<name[i]<<":";
		cout<<"到达时间:"<<daoda[i]<<"\t"<<"服务时间:"<<fuwu_[i]<<"\t";
		cout<<"完成时间:"<<wancheng[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;
}

测试结果:

 

 设计思路:一开始定义了七个数组用来存储到达时间、服务时间、服务时间副本、完成时间、周转时间、带权周转时间和进程名字,完成时间初始化赋值为0,然后屏幕输入例如进程名字、到达时间和服务时间(运行时间),然后屏幕输入时间片,根据到达时间的先后对进程进行排序,然后时计算完成时间,先是count存入进程总数(不直接用n是防止改变n值影响后面的计算),count1存入每一轮完成的进程数,addfuwu存入累计服务时间,然后设立while循环,当进程数为0的时候结束循环,每一次循环开始先计算剩余进程数赋值给总进程数,然后设立for循环,表示对n个进程调度一轮的调度,在for循环中设立if语句,用来判断这一轮的剩余服务时间和时间片大小的比较,如果剩余服务时间小于等于时间片,先判断这是不是已经结束了的进程,(根据完成时间是不是0来判断),如果是累计服务时间+0,如果不是累计服务时间+这一轮的剩余服务时间,完成时间=累计服务时间,count1++存入完成进程数;如果剩余服务时间大于时间片,剩余服务时间-时间片q,累计服务时间+q;这样while循环下来可以计算完成时间,然后再算周转时间和带权周转时间、平均周转时间和平均带权周转时间,(计算这些时间的时候的服务时间用的是备份的服务时间,因为服务时间在计算完成时间的时候被更改),最后屏幕输出。

 

 原创不易,请大家多多支持呀!小白一枚,欢迎大家提出问题!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

cwn_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值