1.先来先到服务——FCFS
2.短作业优先——SJF(非抢占式)一般默认为非抢占式
3.最高响应比——HRRF
废话不多说直接上代码:
#include<stdio.h>
#define n 100
struct work
{
int id;
float submit_time;
float run_time;
float start_time;
float finish_time;
float zz_time;
float dq_time;
float hrrf_rate;
};
void print(work w[], int len)
{
int i;
for (i = 0; i < len; i++)
{
printf("请依次输入作业%d的提交时间,执行时间:", i + 1);
scanf("%f%f", &w[i].submit_time, &w[i].run_time);
w[i].id = i + 1;
printf("\n");
}
printf("1.先来先到服务算法\n2.短作业优先算法\n3.最高响应算法\n0.退出\n");
}
void headprint()
{
printf("作业序号\t提交时间\t执行时间\t开始时间\t完成时间\t周转时间\t权周转时间\n");
}
void FCFS(work w[], int len)
{
int i, j;
float sumzz_time = 0, sumdq_time = 0;
work temp;
for (i = 0; i < len; i++)
{
for (j = i + 1; j < len; j++)
if (w[i].submit_time > w[j].submit_time)
{
temp = w[i];
w[i] = w[j];
w[j] = temp;
}
}
for (i = 0; i < len; i++)
{
if (i == 0)
{
w[i].zz_time = w[i].run_time;
w[i].start_time = w[i].submit_time;
w[i].finish_time = w[i].submit_time + w[i].run_time;
w[i].dq_time = w[i].zz_time / w[i].run_time;
}
else
{
w[i].start_time = w[i - 1].finish_time;
w[i].finish_time = w[i].start_time + w[i].run_time;
w[i].zz_time = w[i].finish_time - w[i].submit_time;
w[i].dq_time = w[i].zz_time / w[i].run_time;
}
printf(" %d\t\t% .2f\t\t% .2f\t\t% .2f\t\t% .2f\t\t% .2f\t\t% .2f\n", w[i].id, w[i].submit_time, w[i].run_time, w[i].start_time, w[i].finish_time, w[i].zz_time, w[i].dq_time);
}
for (i = 0; i < len; i++)
{
sumzz_time += w[i].zz_time;
sumdq_time += w[i].dq_time;
}
printf("平均周转时间为:%.2f\n平均周转系数:%.2f\n", sumzz_time / len, sumdq_time / len);
}
void SJF(work w[], int len)
{
work temp;
int i, j;
float sumzz_time = 0, sumdq_time = 0;
for (i = 0; i < len; i++)
{
for (j = i + 1; j < len; j++)
if (w[i].submit_time > w[j].submit_time)
{
temp = w[i];
w[i] = w[j];
w[j] = temp;
}
}
for (i = 1; i < len; i++)
{
for (j = i + 1; j < len; j++)
if (w[i].run_time > w[j].run_time)
{
temp = w[i];
w[i] = w[j];
w[j] = temp;
}
}
for (i = 0; i < len; i++)
{
if (i == 0)
{
w[i].zz_time = w[i].run_time;
w[i].start_time = w[i].submit_time;
w[i].finish_time = w[i].submit_time + w[i].run_time;
w[i].dq_time = w[i].zz_time / w[i].run_time;
}
else
{
w[i].start_time = w[i - 1].finish_time;
w[i].finish_time = w[i].start_time + w[i].run_time;
w[i].zz_time = w[i].finish_time - w[i].submit_time;
w[i].dq_time = w[i].zz_time / w[i].run_time;
}
printf(" %d\t\t% .2f\t\t% .2f\t\t% .2f\t\t% .2f\t\t% .2f\t\t% .2f\n", w[i].id, w[i].submit_time, w[i].run_time, w[i].start_time, w[i].finish_time, w[i].zz_time, w[i].dq_time);
}
for (i = 0; i < len; i++)
{
sumzz_time += w[i].zz_time;
sumdq_time += w[i].dq_time;
}
printf("平均周转时间为:%.2f\n平均周转系数:%.2f\n", sumzz_time / len, sumdq_time / len);
}
void HRRF(work w[], int len)
{
int i, j = len;
work temp;
for (i = 0; i < len; i++)
{
if (i == 0)
w[i].finish_time = w[i].submit_time + w[i].run_time;
else
w[i].hrrf_rate = (w[i].run_time + (w[i - 1].finish_time - w[i].submit_time)) / w[i].run_time;
}
for (i = 0; i < len; i++)
{
for (j = i + 1; j < len; j++)
{
if (w[i].hrrf_rate < w[j].hrrf_rate)
{
temp = w[i];
w[i] = w[j];
w[j] = temp;
}
}
}
int m = 1;
do
{
for (i = m; i < len; i++)
{
if (i == m)
w[i].finish_time = w[i - 1].finish_time + w[i].run_time;
else
w[i].hrrf_rate = (w[i].run_time + (w[i - 1].finish_time - w[i].submit_time)) / w[i].run_time;
}
for (i = m + 1; i < len; i++)
{
for (j = i + 1; j < len; j++)
{
if (w[i].hrrf_rate < w[j].hrrf_rate)
{
temp = w[i];
w[i] = w[j];
w[j] = temp;
}
}
}
m++;
} while (m <= len - 2);
for (i = 0; i < len; i++)
{
if (i == 0)
{
w[i].zz_time = w[i].run_time;
w[i].start_time = w[i].submit_time;
w[i].finish_time = w[i].submit_time + w[i].run_time;
w[i].dq_time = w[i].zz_time / w[i].run_time;
}
else
{
w[i].start_time = w[i - 1].finish_time;
w[i].finish_time = w[i].start_time + w[i].run_time;
w[i].zz_time = w[i].finish_time - w[i].submit_time;
w[i].dq_time = w[i].zz_time / w[i].run_time;
}
printf(" %d\t\t% .2f\t\t% .2f\t\t% .2f\t\t% .2f\t\t% .2f\t\t% .2f\n", w[i].id, w[i].submit_time, w[i].run_time, w[i].start_time, w[i].finish_time, w[i].zz_time, w[i].dq_time);
}
}
int main()
{
work w[n] = { 0 };
int len, command;
int running = 1;
printf("please input the numbers of work:");
scanf("%d", &len);
print(w, len);
while (running)
{
printf("请选择算法:");
scanf("%d", &command);
switch (command)
{
case 1:
headprint();
FCFS(w, len);
break;
case 2:
headprint();
SJF(w, len);
break;
case 3:
headprint();
HRRF(w, len);
break;
case 0:
running = 0;
break;
default:
printf("请输入正确序号指令!");
break;
}
}
return 0;
}
运行结果:
最后,如果本文有不足或错误的地方,欢迎各位C友在评论区留言指正。如果觉得不错的话,顺便点个赞哈。[爱心][爱心]