[操作系统] 利用C语言实现先来先服务(FCFS)与最短作业优先(SJF)调度算法

项目环境

开发软件: Visual Studio 2019

编程语言:C

项目源码

#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
        }
    }   
}

结果

备注:

菜单选项(4)返回改为(0)退出,因为懒得再运行一次,所以图就不改了。

猜你喜欢

转载自blog.csdn.net/zhou_ge1/article/details/128646274