#include<iostream.h>
#include<stdio.h>
using namespace std;
struct TIME
{
int h;
int m; //h代表小时,m代表分钟
};
struct JOB
//建类JOB
{
TIME R,RU,F,E;
//到达时间,开始运行时间,完成时间 ; 估计运行时间
float zt;
//周转时间
float dzt;
//带权周转时间
int number;
float r; //响应比
};
bool CompareTime (struct TIME time1,struct TIME time2)
//定义时间比较函数
如果time1<time2,返回ture
{
if(time1.h<time2.h)
return true;
if(time1.h=time2.h)
{if(time1.m<=time2.m)
return true;
else return false;
}
else return false;
}
TIME AddTime (TIME time1,TIME time2)
//定义时间的加法
{
time1.m=time1.m+time2.m;
time1.h=time1.h+time2.h;
if(time1.m>=60)
{do
{
time1.h+=1;
time1.m-=60;
}while(time1.m>=60);
}
return time1;
}
int SubTime (struct TIME time1,struct TIME time2) //定义时间的减法
{
return((time1.h-time2.h)*60+(time1.m-time2.m));
}
void out1(JOB job[],int n)
//定义输出函数out1
{
int i;
cout<<"你的输入如下:\n\n";
cout<< "作业名称
到达时间(hh:mm)
估计运行时间(M)"<<"\n\n";
for(i=1;i<=n;i++)
{
cout<<"JOB"<<job[i].number;
printf("
%-d:%-d\t
%-d\t ",job[i].R.h,job[i].R.m,job[i].E.m);
putchar('\n');}
}
void out2(struct JOB job[],int n)
//定义输出函数out2
{
int i;
cout<<"下面为结果:\n\n";
cout<< "顺序
reach time
estimate
run time
finish time
周转时间 带权周转时间\n";
for(i=1;i<=n;i++)
{
cout<<"JOB"<<job[i].number;
printf("
%-d:%-d\t
%d
%-d:%-d\t
%-d:%-d\t
%-.1f\t %-.3f\t\n",job[i].R.h,job[i].R.m,job[i].E.m,job[i].RU.h,job[i].RU.m,job[i].F.h,job[i].F.m,job[i].zt,job[i].dzt);
}
putchar('\n');
}
int main(void)
{
int num;//作业个数
int N;
int i,j;
int c=0;//用于SJF算法中,就绪状态作业的计数
int k;
struct JOB job[7];
cout<<"请选择调度算法:1.FIFO
2.JSF
3.HRN\n";
cin>>N;
cout<<"请输入作业个数:";
cin>>num;
cout<<"请按提示分别输入个作业到达时间,以及估计运行时间\n\n";
for(int i=1;i<=num;i++)
{
do
{
cout<<"请输入第"<<i<<"个作业的到达时间(先小时,后分钟):\n";
cin>>job[i].R.h;
cin>>job[i].R.m;
}
while((job[i].R.h<=0||job[i].R.h>23||job[i].R.m>=60||job[i].R.m<0)); //
cout<<"请输入第"<<i<<"个作业的估计运行时间(Min)\n";
cin>>job[i].E.m;
job[i].E.h=0;
job[i].number=i;
job[i].r=0;
}
putchar('\n');
out1(job,num);//输出用户输入数据
for(i=1;i<num;i++)
//按时间排序
{ for(j=i+1;j<=num;j++)
if(CompareTime(job[j].R,job[i].R))
{
job[0]=job[j];
job[j]=job[i];
job[i]=job[0];
}
}
job[1].F=AddTime(job[1].R,job[1].E);
job[1].RU=job[1].R;
job[1].zt=job[1].E.m;
job[1].dzt=job[1].zt/job[1].E.m;
switch(N)
{
case 1:
//FIFO
for(i=2;i<=num;i++)
{
{if(CompareTime(job[i-1].F,job[i].R))
//到达时间在前个作业的完成时间之前
job[i].RU=job[i].R;
else job[i].RU=job[i-1].F;
}
job[i].F=AddTime(job[i].RU,job[i].E);
job[i].zt=SubTime(job[i].F,job[i].R);
job[i].dzt=job[i].zt/job[i].E.m;
}
break;
......
}
out2(job,num);
//调用输出函数
return 1;
}
当作业超过3个时有时结果对有时错...郁闷,我估计是在“排序”或者“时间比较”这里出错,就是找不出来。快找一天了...
[[it] 本帖最后由 linsq 于 2008-6-23 20:33 编辑 [/it]]