project environment
Development software: Visual Studio 2019
Programming language: C
Project source code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<conio.h>
#define N 5
struct JCB
{
char name[10]; //进程名
int atime; //到达时间
int runtime; //运行时间
int arun; //开始时间
int ftime; //完成时间
int total; //周转时间
float welght; //带权周转时间
}f[N];
int amount; //进程个数
int i, j, atime, runtime;
char name[10];
//输出结果
void ShowFruit() {
printf("进程执行顺序:");
printf("%s", f[0].name);
for (i = 1;i < amount;i++)
{
printf("-->%s", f[i].name);
}
printf("\n进程名 到达时间 运行时间 开始时间 结束时间 周转时间 带权周转时间\n");
for (i = 0;i < amount;i++)
{
f[i].ftime = f[i].arun + f[i].runtime; //结束时间=开始时间+运行时间
f[i].total = f[i].ftime - f[i].atime; //周转时间=完成时间-到达时间
f[i].welght = (float)f[i].total / (float)f[i].runtime; //带权周转时间=周转时间/运行时间
printf("%s\t%d\t %d\t %d\t %d\t\t%d\t%.2f\n", f[i].name, f[i].atime, f[i].runtime, f[i].arun, f[i].ftime, f[i].total, f[i].welght);
f[i + 1].arun = f[i].ftime; //下一个作业的开始时间=上一个作业的结束时间
}
}
void FCFS() {
if (f[0].atime != NULL) {
printf("\n------------------------------先来先服务(FCFS)调度算法------------------------\n");
for (i = 0;i < amount;i++) {
for (j = i + 1;j < amount;j++)
{
if (f[j].atime < f[i].atime )//如果后一个作业的到达时间比前一个作业的到达时间小
{
atime = f[j].atime;
runtime = f[j].runtime;
strcpy(name, f[j].name);
f[j].atime = f[i].atime;
f[j].runtime = f[i].runtime;
strcpy(f[j].name, f[i].name);
f[i].atime = atime;
f[i].runtime = runtime;
strcpy(f[i].name, name);
}
}
}
ShowFruit();//打印结果
}
}
void SJF() {
if (f[0].atime != NULL) {
printf("\n------------------------------短作业优先 (SJF) 调度算法-------------------------\n");
for (i = 0;i < amount;i++) {
for (j = i + 1;j < amount;j++)
{
//如果后一个作业的到达时间比前一个作业的到达时间小
//或者二者的到达时间相同,后一个作业的运行时间比其前一个作业的运行时间小
if (f[j].atime < f[i].atime || f[j].atime == f[i].atime && f[j].runtime < f[i].runtime)
{
atime = f[j].atime;
runtime = f[j].runtime;
strcpy(name, f[j].name);
f[j].atime = f[i].atime;
f[j].runtime = f[i].runtime;
strcpy(f[j].name, f[i].name);
f[i].atime = atime;
f[i].runtime = runtime;
strcpy(f[i].name, name);
}
}
}
for (i = 0;i < amount;i++)
{
f[i].ftime = f[i].arun + f[i].runtime; //结束时间=开始时间+运行时间
f[i + 1].arun = f[i].ftime; //下一个作业的开始时间=上一个作业的结束时间
}
for (i = 0;i < amount;i++) {
for (j = i + 1;j < amount-1;j++)
{
//如果下一个作业(A)和下下个作业(B)的到达时间小于正在运行作业的结束时间
//并且B的运行时间比A的运行时间小
if (f[j].atime < f[i].ftime && f[j + 1].atime < f[i].ftime && f[j + 1].runtime < f[j].runtime)
{
atime = f[j + 1].atime;
runtime = f[j + 1].runtime;
strcpy(name, f[j + 1].name);
f[j + 1].atime = f[j].atime;
f[j + 1].runtime = f[j].runtime;
strcpy(f[j + 1].name, f[j].name);
f[j].atime = atime;
f[j].runtime = runtime;
strcpy(f[j].name, name);
}
}
}
ShowFruit();//打印结果
}
}
int ShowMenu() {
int x;
printf("\n\n===========================================\n");
printf("(1)输入数据 \n");
printf("(2)先来先服务算法(FCFS)\n");
printf("(3)最短作业优先算法(SJF)\n");
printf("(0)退出\n");
printf("===========================================\n");
printf("请选择:");
scanf("%d", &x);
if (x!=1 && f[0].atime == NULL) {
printf("请先录入数据");
system("pause");
system("cls");
}
return x;
}
void INIT() {
printf("请输入进程个数:");
scanf("%d", &amount);
printf("请依次输入%d个进程的名称,进程到达时间,进程运行时间:\n", amount);
for (i = 0;i < amount;i++)
{
scanf("%s", &f[i].name);
scanf("%d", &f[i].atime);
scanf("%d", &f[i].runtime);
}
printf("\n数据如下:");
printf("\n进程名\t到达时间\t运行时间\n");
for (i = 0;i < amount;i++)
{
printf("%s\t%d\t\t%d\t\n", f[i].name, f[i].atime, f[i].runtime);
}
}
void main()
{
bool flag = true;
while (flag)
{
switch (ShowMenu())
{
case 1:
INIT();
break;
case 2:
FCFS();
break;
case 3:
SJF();
break;
case 0:
flag = false;
break
}
}
}
result
Remark:
Change the menu option (4) back to (0) exit, because I am too lazy to run it again, so the picture will not be changed.