#include <iostream>
using namespace std
;
typedef struct work
{
int num
;
float grade
;
float JB
;
float uptime
;
float costtime
;
float starttime
;
float endtime
;
float time
;
float averagetime
;
}PCB
;
void FCFS(PCB
*WORK
,int worknum
);
void SJF(PCB
*WORK
,int worknum
);
void JT(PCB
*WORK
,int worknum
);
void HRRN(PCB
*WORK
,int worknum
);
void shuru(PCB
*WORK
,int worknum
);
void shuchu(PCB
*WORK
,int worknum
);
void JS(PCB
*WORK
,int worknum
);
int main()
{
int worknum
;
printf("=========================================================================\n");
printf("1.输入数据 2.先入先出算法 3.短作业优先算法\n");
printf("4.静态优先级 5.高响应比 6.周转时间及带权周转时间 -1.退出\n");
printf("=========================================================================\n");
printf("请输入作业的数目以完成初始化:");
cin
>>worknum
;
printf("初始化成功\n");
PCB
*WORK
=new PCB
[worknum
];
int i
;
printf("请输入操作数:");
cin
>>i
;
while(1)
{
switch(i
)
{
case 1:
shuru(WORK
,worknum
);
printf("请输入操作数:");
cin
>>i
;
break;
case 2:
FCFS(WORK
,worknum
);
shuchu(WORK
,worknum
);
printf("请输入操作数:");
cin
>>i
;
break;
case 3:
SJF(WORK
,worknum
);
shuchu(WORK
,worknum
);
printf("请输入操作数:");
cin
>>i
;
break;
case 4:
JT(WORK
,worknum
);
shuchu(WORK
,worknum
);
printf("请输入操作数:");
cin
>>i
;
break;
case 5:
HRRN(WORK
,worknum
);
shuchu(WORK
,worknum
);
printf("请输入操作数:");
cin
>>i
;
break;
case 6:
JS(WORK
,worknum
);
printf("请输入操作数:");
cin
>>i
;
break;
default:
if(i
=-1)
return 0;
else
{
printf("输入数字非法,请重新输入操作数:");
cin
>>i
;
}
break;
}
}
}
void shuru(PCB
*WORK
,int worknum
)
{
printf("请依次输入需要被调度的作业(输入格式:作业序号 作业优先级 作业提交时间(用数字表示) 执行时间):\n");
for (int n
=0;n
<worknum
;n
++)
{
cin
>>WORK
[n
].num
>>WORK
[n
].grade
>>WORK
[n
].uptime
>>WORK
[n
].costtime
;
WORK
[n
].JB
=WORK
[n
].costtime
/WORK
[n
].costtime
;
}
printf("作业序号 作业优先级 作业提交时间 执行时间:\n");
for(int i
=0;i
<worknum
;i
++)
printf("%-9d%-11f%-13f%f\n",WORK
[i
].num
,WORK
[i
].grade
,WORK
[i
].uptime
,WORK
[i
].costtime
);
}
void shuchu(PCB
*WORK
,int worknum
)
{
WORK
[0].starttime
=WORK
[0].uptime
;
WORK
[0].endtime
=WORK
[0].costtime
+WORK
[0].uptime
;;
for(int i
=1;i
<worknum
;i
++)
{
if(WORK
[i
-1].endtime
<WORK
[i
].uptime
)
WORK
[i
].starttime
=WORK
[i
].uptime
;
else
WORK
[i
].starttime
=WORK
[i
-1].endtime
;
WORK
[i
].endtime
=WORK
[i
].starttime
+WORK
[i
].costtime
;
}
printf("作业序号 作业优先级 作业提交时间 执行时间 开始时间 结束时间:\n");
for(int i
=0;i
<worknum
;i
++)
printf("%-9d%-11f%-13f%-9f%-9f%f\n",WORK
[i
].num
,WORK
[i
].grade
,WORK
[i
].uptime
,WORK
[i
].costtime
,WORK
[i
].starttime
,WORK
[i
].endtime
);
}
void FCFS(PCB
*WORK
,int worknum
)
{
for(int i
=0;i
<worknum
-1;i
++)
for(int j
=0;j
<worknum
-1;j
++)
if(WORK
[j
].uptime
>WORK
[j
+1].uptime
)
{
PCB temp
;
temp
=WORK
[j
+1];
WORK
[j
+1]=WORK
[j
];
WORK
[j
]=temp
;
}
}
void SJF(PCB
*WORK
,int worknum
)
{
float MinUptime
=0;
for(int i
=0;i
<worknum
-1;i
++)
{
for(int j
=0;j
<worknum
-1;j
++)
{
if(WORK
[j
].uptime
>WORK
[j
+1].uptime
)
{
PCB temp
;
temp
=WORK
[j
+1];
WORK
[j
+1]=WORK
[j
];
WORK
[j
]=temp
;
}
}
}
MinUptime
=WORK
[0].uptime
+WORK
[0].costtime
;
for(int i
=1;i
<worknum
-1;i
++)
{
if(i
!=1)
MinUptime
+=WORK
[i
-1].costtime
;
for(int j
=i
+1;j
<worknum
;j
++)
{
if(WORK
[i
].uptime
<MinUptime
&&WORK
[j
].uptime
<MinUptime
)
{
if(WORK
[i
].costtime
>WORK
[j
].costtime
)
{
PCB temp
;
temp
=WORK
[j
];
WORK
[j
]=WORK
[i
];
WORK
[i
]=temp
;
}
}
}
}
}
void JT(PCB
*WORK
,int worknum
)
{
float MinUptime
=0;
for(int i
=0;i
<worknum
-1;i
++)
{
for(int j
=0;j
<worknum
-1;j
++)
{
if(WORK
[j
].uptime
>WORK
[j
+1].uptime
)
{
PCB temp
;
temp
=WORK
[j
+1];
WORK
[j
+1]=WORK
[j
];
WORK
[j
]=temp
;
}
}
}
MinUptime
=WORK
[0].uptime
+WORK
[0].costtime
;
for(int i
=1;i
<worknum
-1;i
++)
{
if(i
!=1)
MinUptime
+=WORK
[i
-1].costtime
;
for(int j
=i
+1;j
<worknum
;j
++)
{
if(WORK
[i
].uptime
<MinUptime
&&WORK
[j
].uptime
<MinUptime
)
{
if(WORK
[i
].grade
<WORK
[j
].grade
)
{
PCB temp
;
temp
=WORK
[j
];
WORK
[j
]=WORK
[i
];
WORK
[i
]=temp
;
}
}
}
}
}
void HRRN(PCB
*WORK
,int worknum
)
{
float MinUptime
=0;
for(int i
=0;i
<worknum
-1;i
++)
{
for(int j
=0;j
<worknum
-1;j
++)
{
if(WORK
[j
].uptime
>WORK
[j
+1].uptime
)
{
PCB temp
;
temp
=WORK
[j
+1];
WORK
[j
+1]=WORK
[j
];
WORK
[j
]=temp
;
}
}
}
MinUptime
=WORK
[0].uptime
+WORK
[0].costtime
;
for(int i
=1;i
<worknum
-1;i
++)
{
if(i
!=1)
MinUptime
+=WORK
[i
-1].costtime
;
for(int h
=i
;h
<worknum
;h
++)
{
if(WORK
[h
].uptime
<=MinUptime
)
WORK
[h
].JB
=(WORK
[h
].costtime
+MinUptime
-WORK
[h
].uptime
)/WORK
[h
].costtime
;
}
for(int j
=i
+1;j
<worknum
;j
++)
{
if(WORK
[i
].uptime
<MinUptime
&&WORK
[j
].uptime
<MinUptime
)
{
if(WORK
[i
].JB
<WORK
[j
].JB
)
{
PCB temp
;
temp
=WORK
[j
];
WORK
[j
]=WORK
[i
];
WORK
[i
]=temp
;
}
}
}
}
}
void JS(PCB
*WORK
,int worknum
)
{
int i
=0;
float T
=0,W
=0,a
,b
;
while(i
<worknum
)
{
WORK
[i
].time
=WORK
[i
].endtime
-WORK
[i
].uptime
;
WORK
[i
].averagetime
=WORK
[i
].time
/WORK
[i
].costtime
;
T
=T
+WORK
[i
].time
;
W
=W
+WORK
[i
].averagetime
;
i
++;
}
a
=T
/worknum
;
b
=W
/worknum
;
printf("平均周转时间:%f\n平均带权周转时间:%f\n",a
,b
);
}
转载请注明原文地址: https://lol.8miu.com/read-38427.html