#include
using namespace std;
#define MAX 10
struct zuoye
{
char name[10]; /*进程名称*/
float atime; /*到达时间*/
float rbtime; /*开始运行时间*/
float rtime; /*运行时间*/
float rftime; /*运行结束时间*/
int order; /*运行次序*/
int run_flag; /*调度标志*/
}tasks[MAX];
int counter; /*实际进程个数*/
int fcfs(); /*先来先服务*/
int sjf(); /*短作业优先*/
int hrrn(); /*响应比高优先*/
int pinput(); /*进程参数输入*/
int poutput(); /*调度结果输出*/
void main()
{ int option;
pinput();
printf("请选择调度算法(0~3):\n");
printf("1.先来先服务\n");
printf("2.短作业优先\n");
printf("3.响应比高优先\n");
printf("0.退出\n");
scanf("%d",&option);
switch (option)
{
case 0:
printf("运行结束。\n");
break;
case 1:
printf("对进程按先来先服务调度。\n\n");
fcfs();
poutput();
break;
case 2:
printf("对进程按短作业优先调度。\n\n");
sjf();
poutput();
break;
case 3:
printf("对进程按响应比高优先调度。\n\n");
hrrn();
poutput();
break;
}
}
int fcfs() /*先来先服务*/
{
float time_temp=0;
int i,j,t;
int number_schedul;
time_temp=tasks[0].atime;
for(i=0;i
{
for(j=0;j
{
if(tasks[j].atime>tasks[j+1].atime)
{t=tasks[j].atime;
tasks[j].atime=tasks[j+1].atime;
tasks[j+1].atime=t;
}
}
tasks[i].rbtime=time_temp;
tasks[i].rftime=tasks[i].rbtime+tasks[i].rtime;
tasks[i].run_flag=1;
time_temp=tasks[i].rftime;
number_schedul=i;
tasks[number_schedul].order=i+1;
}
return 0;
}
int sjf() /*短作业优先*/
{
float temp_time=0;
int i=0,j;
int number_schedul,temp_counter;
float rtime;
rtime=tasks[i].rtime;
j=1;
while ((j
{
if (tasks[j].rtime
{
rtime=tasks[j].rtime;
i=j;
}
j++;
} /*查找第一个被调度的进程*/
/*对第一个被调度的进程求相应的参数*/
number_schedul=i;
tasks[number_schedul].rbtime=tasks[number_schedul].atime;
tasks[number_schedul].rftime=tasks[number_schedul].rbtime+tasks[number_schedul].rtime; tasks[number_schedul].run_flag=1;
temp_time=tasks[number_schedul].rftime;
tasks[number_schedul].order=1;
temp_counter=1;
while (temp_counter
{
for(j=0;j
{
if((tasks[j].atime
{
rtime=tasks[j].rtime;number_schedul=j;break;}
}
for(j=0;j
{
if((tasks[j].atime
if(tasks[j].rtime
{
rtime=tasks[j].rtime;
number_schedul=j;
}
}
/*查找下一个被调度的进程*/
/*对找到的下一个被调度的进程求相应的参数*/
tasks[number_schedul].rbtime=temp_time;
tasks[number_schedul].rftime=tasks[number_schedul].rbtime+tasks[number_schedul].rtime; tasks[number_schedul].run_flag=1;
temp_time=tasks[number_schedul].rftime;
temp_counter++;
tasks[number_schedul].order=temp_counter;
}return 0;
}
int hrrn() /*响应比高优先*/
{
int j,number_schedul,temp_counter;
float temp_time,respond_rate,max_respond_rate;
/*第一个进程被调度*/
tasks[0].rbtime=tasks[0].atime;
tasks[0].rftime=tasks[0].rbtime+tasks[0].rtime;
temp_time=tasks[0].rftime;
tasks[0].run_flag=1;
tasks[0].order=1;
temp_counter=1;
/*调度其他进程*/
while(temp_counter
{
max_respond_rate=0;
for(j=1;j
{
if((tasks[j].atime
{
respond_rate=(temp_time-tasks[j].atime)/tasks[j].rtime;
if (respond_rate>max_respond_rate)
{
max_respond_rate=respond_rate;
number_schedul=j;
}
}
}
/*找响应比高的进程*/
tasks[number_schedul].rbtime=temp_time;
tasks[number_schedul].rftime=tasks[number_schedul].rbtime+tasks[number_schedul].rtime; temp_time=tasks[number_schedul].rftime;
tasks[number_schedul].run_flag=1;
temp_counter+=1;
tasks[number_schedul].order=temp_counter;
}
return 0;
}
int pinput() /*进程参数输入*/
{
int i;
printf("please input the process counter:\n");
scanf("%d",&counter);
for(i=0;i
{ printf("******************************************\n");
printf("please input the process of %d th :\n",i+1);
printf("please input the name:\n");
scanf("%s",tasks[i].name);
printf("please input the atime:\n");
scanf("%f",&tasks[i].atime);
printf("please input the rtime:\n");
scanf("%f",&tasks[i].rtime);
tasks[i].rbtime=0;
tasks[i].rftime=0;
tasks[i].order=0;
tasks[i].run_flag=0;
}
return 0;
}
int poutput() /*调度结果输出*/
{
int i;
float turn_round_time=0,f1,w=0;
printf("name atime rtime rbtime rftime order turn_round_time\n");
for(i=0;i
{
f1=tasks[i].rftime-tasks[i].atime;
turn_round_time+=f1;
w+=(f1/tasks[i].rtime);
printf(" %s, %5.3f, %5.3f, %5.3f, %5.3f, %d, %5.3f\n",tasks[i].name,tasks[i].atime,tasks[i].rtime,tasks[i].rbtime,tasks[i].rftime,tasks[i].order,f1);
}
printf("average_turn_round_timer=%5.2f\n",turn_round_time/counter);
printf("weight_average_turn_round_timer=%5.2f\n",w/counter);
return 0;
}