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操作结构体,该结构体就是一个普通结构体变量。