您的位置:首页 > 其它

先来先服务,短作业优先,最高响应比三种算法下求平均周转和带权周转时间的实现

2007-12-06 19:48 501 查看
codear发表于 2006年04月11日 21:20:00 (http://blog.csdn.net/coDear)
function hide(){showComment();}

#include<iostream.h>
#define N 6
struct time{
float arriveTime;
float runTime;
float finishTime;
float totalTime;
float weightTotalTime;
char name;
};

void InputTime(time *p)
{
int i;//counter
cout<<"input name & arrive time & run time:"<<endl;
for(i=0;i<=N-1;i++){
float temp1,temp2;
char name;
cout<<"作业名:"<<endl;
cin>>name;
p[i].name=name;
cout<<"到达时:"<<endl;
cin>>temp1;
p[i].arriveTime=temp1;
cout<<"运行时间:"<<endl;
cin>>temp2;
p[i].runTime=temp2;

}

}
void Print(time *p,float totalTimeSum,float weightTotalTimeSum){

cout<<"运行次序:"<<endl;
for(int k=0;k<=N-1;k++)
{
cout<<p[k].name<<" ";

}
cout<<endl;
cout<<"平均周转时间:"<<totalTimeSum/N<<endl;
cout<<"平均带权周转时间:"<<weightTotalTimeSum/N<<endl;
}
void sort(time *p)
{
for(int i=0;i<=N-1;i++)
for(int j=0;j<=i;j++)
if(p[i].arriveTime<p[j].arriveTime)
{
time temp;
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
}

void deal(time *p,float &totalTimeSum,float &weightTotalTimeSum)
{

int k;//counter
for(k=0;k<=N-1;k++)
{
if(k==0)
p[k].finishTime=p[k].arriveTime+p[k].runTime;
else
p[k].finishTime=p[k-1].finishTime+p[k].runTime;
}

for(k=0;k<=N-1;k++)
{
p[k].totalTime=p[k].finishTime-p[k].arriveTime;
p[k].weightTotalTime=p[k].totalTime/p[k].runTime;

totalTimeSum+=p[k].totalTime;
weightTotalTimeSum+=p[k].weightTotalTime;
}
}

void FCFS(time *p)
{
float totalTimeSum=0,weightTotalTimeSum=0;

sort(p);

deal(p,totalTimeSum,weightTotalTimeSum);

cout<<"先来先服务:"<<endl;

Print(p,totalTimeSum,weightTotalTimeSum);

}

void SWF(time *p)
{

float totalTimeSum=0,weightTotalTimeSum=0;

sort(p);

for(int m=0;m<N-1;m++)
{

if(m==0)
p[m].finishTime=p[m].arriveTime+p[m].runTime;
else
p[m].finishTime=p[m-1].finishTime+p[m].runTime;

int i=0;
for(int n=m+1;n<=N-1;n++)
{

if(p
.arriveTime<=p[m].finishTime)
i++;
}
float min=p[m+1].runTime;
int follow=m+1;
for(int k=m+1;k<m+i;k++)
{

if(p[k+1].runTime<min)
{min=p[k+1].runTime;
follow=k+1;}

}
time temp;
temp=p[m+1];
p[m+1]=p[follow];
p[follow]=temp;
}

deal(p,totalTimeSum,weightTotalTimeSum);

cout<<"短作业优先:"<<endl;

Print(p,totalTimeSum,weightTotalTimeSum);
}

void TRRF(time *p){
float totalTimeSum=0,weightTotalTimeSum=0;

sort(p);

for(int m=0;m<N-1;m++)
{

if(m==0)
p[m].finishTime=p[m].arriveTime+p[m].runTime;
else
p[m].finishTime=p[m-1].finishTime+p[m].runTime;

int i=0;
for(int n=m+1;n<=N-1;n++)
{

if(p
.arriveTime<=p[m].finishTime)
i++;
}
float max=(p[m].finishTime-p[m+1].arriveTime)/p[m+1].runTime;
int follow=m+1;
for(int k=m+1;k<m+i;k++)
{

if(max<=(p[m].finishTime-p[k+1].arriveTime)/p[k+1].runTime){
max=(p[m].finishTime-p[k+1].arriveTime)/p[k+1].runTime;
follow=k+1;
}

}
time temp;
temp=p[m+1];
p[m+1]=p[follow];
p[follow]=temp;
}

deal(p,totalTimeSum,weightTotalTimeSum);

cout<<"最高响应比优先:"<<endl;

Print(p,totalTimeSum,weightTotalTimeSum);
}

void main(){

time a
;
InputTime(a);
time *b=a;time *c=a;
FCFS(a);
SWF(b);
TRRF(c);

}

/*
input name & arrive time & run time:
作业名:
a
到达时:
0
运行时间:
6
作业名:
b
到达时:
2
运行时间:
50
作业名:
c
到达时:
5
运行时间:
20
作业名:
d
到达时:
5
运行时间:
10
作业名:
e
到达时:
12
运行时间:
40
作业名:
f
到达时:
15
运行时间:
8
先来先服务:
运行次序:
a b c d e f
平均周转时间:74.1667
平均带权周转时间:5.2425
短作业优先:
运行次序:
a d f c e b
平均周转时间:44.8333
平均带权周转时间:1.6025
最高响应比优先:
运行次序:
a d c f b e
平均周转时间:48.5
平均带权周转时间:2.0275
Press any key to continue
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐