先来先服务调度算法

1.完整代码

以下代码是借鉴长缨小仙博主的源代码,由于使用她的代码存在报错为此在该博主的代码上经行修正,如有侵权,请联系我,立删!

#include <stdio.h>
#include <stdlib.h> 
typedef struct    /* 定义进程控制块PCB */ {
    char name[10];//进程名
    int Atime;  //到达时间 
    int Stime;  //服务时间 
    int Ftime;  //完成时间 
    int size;  //进程的大小; 
}PCB;
int ram;
int Max = 100;
void creat(PCB* pcb, int num)
{

    PCB* temp = malloc(num * sizeof(PCB));     //创建一个零时动态结构体数组

    
    int numpcb = 0;         //记录创建成功的PCB个数

    /*printf("请输入进程数:");
    while (num > Max)
    {
        printf("进程数太大,请重新输入:");
        scanf("%d", &num);
    };*/

    // 输入pcb的值
    for (int i = 0; i < num; i++)
    {
        printf("\n 请输入进程名:");
        scanf("%s", &temp[i].name);
        printf("\n 请输入进程到达时间:");
        scanf("%d", &temp[i].Atime);
        printf("\n 请输入进程服务时间:");
        scanf("%d", &temp[i].Stime);
        printf("\n 请输入进程的大小:");
        scanf("%d", &temp[i].size);
        if (temp[i].size > ram)
        {
            printf("内存不足,创建失败!");
            break;
        }
        else
        {
            pcb[i] = temp[i];   //判断成功后传参 
            ram = ram - pcb[i].size;  //创建成功,为这个进程分配内存,总内存减少 
            printf("%s创建成功!", pcb[i].name);
            numpcb += 1;
        }
        printf("\n");
    }
    
    num = numpcb;    //将PCB的个数传给num。 
    printf("\n共成功创建了%d个进程", num);
    printf("\n还剩%d内存", ram);
    printf("\n还剩%d个PCB", Max - num);
    printf("\n-----------------------------------");
    
}
///按到达时间排序 
void sort(PCB* s, int num)          //对进程经行排序
{
    for (int i = 0;i<num-1;i++) 
    {
        PCB temp;           //创建了一个中间量结构体
        for (int j = i + 1; j < num; j++)
        {
            if (s[i].Atime > s[j].Atime)        //到达时间前一个大于下一个着经行交换
            {
                temp = s[i];
                s[i] = s[j];
                s[j] = temp;
            }
        }
    }
}
void Finishtime(PCB* s, int num)        //计算完成时间
{
    for (int i = 0; i < num; i++) 
    {
        if (i == 0) 
        {
            s[0].Ftime = s[0].Atime + s[0].Stime;
        }

        else 
        {
            if (s[i].Atime > s[i - 1].Ftime)
                s[i].Ftime = s[i].Atime + s[i].Stime;
            else
                s[i].Ftime = s[i - 1].Ftime + s[i].Stime;
        }
        ram = ram + s[i].size;
        
    }
}

void display(PCB* s, int num)           
{
    printf("\n 进程名  到达时间  服务时间  完成时间\n");
    for (int i = 0; i < num; i++) 
    {
        
        printf("%5s ", s[i].name);
        printf("%8d ", s[i].Atime);
        printf("%8d ", s[i].Stime);
        printf("%9d ", s[i].Ftime);
        printf("\n");
        
    }
    printf("\n进程运行完毕,现有内存:%d", ram);
    printf(" 归还PCB个数:%d\n", num);
    printf("-----------------------------------");
}
int main()
{
    int num;
    printf("请输入可用内存的大小:");
    scanf("%d", &ram);
    printf("请输入进程数:");
    scanf("%d", &num);
    while (num > Max)
    {
        printf("进程数太大,请重新输入:");
        scanf("%d", &num);
    };
    
    PCB*p=malloc(num * sizeof(PCB));
    creat(p,num);
    sort(p, num);
    Finishtime(p, num);
    display(p, num);
    free(p);
    return 0;

}

2.本人对该代码遇到的问题

  • 对于PCB的创建数量num无法自定义(表达式必须为常量值):

错误代码:PCB p[num];

由于我们需要num为变量,为此我们需要使用malloc函数来分配所需要大小的内存,然后把返回的指针赋值给数组。

修正代码:PCB*p=malloc(num * sizeof(PCB));

  • 对于PCB* temp = malloc(num * sizeof(PCB));以及PCB temp;的理解:

第一个是结构体数组后者为结构体,这个错误位于create()函数当中。

错误代码:pcb = temp[i];

修正代码pcb[i] = temp[i];

  • 对于void creat(PCB* pcb, int num){}以及void creat(PCB &pcb, int num){}的理解:

这个问题其实还是第二个问题,一下是对这两行代码去别的解释。在第一个函数中,我们通过指针pcb操作结构体数组中的每个元素,为每个结构体的经行操作和修改。第二个函数中,我们直接通过引用pcb操作结构体,该结构体就是一个普通结构体变量。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值