#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循环下来可以计算完成时间,然后再算周转时间和带权周转时间、平均周转时间和平均带权周转时间,(计算这些时间的时候的服务时间用的是备份的服务时间,因为服务时间在计算完成时间的时候被更改),最后屏幕输出。
原创不易,请大家多多支持呀!小白一枚,欢迎大家提出问题!