codear发表于 2006年04月11日 21:20:00 (http://blog.youkuaiyun.com/coDear)
#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[n].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[n].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[N];
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
*/