PTA题目
注:在PTA上面提交时务必把scanf_s改成scanf,(编译器用的是vs2019).
主函数
int main()
{
int n; //进程数量
scanf_s("%d", &n);
struct pcb p[100];
input(p,n);
sort(p,n);
sjf(p, n);
output(p,n);
return 0;
}
核心算法
void sjf(struct pcb* p, int n) {
int finishedcount = 0; //记录已经完成的进程数
int unfinishedposition = 0; // 记录未完成的进程的位置
double nowtime = 0; //现在时间
for (int i = 0; i < n; i++) {
p[i].state = 0;
}
while (finishedcount < n) {
//当已完成的进程数小于5时,一直循环
double minrtime = 1000000; // 中间量比较最短运行时间
int next = 0; //下一个要运行的进程位置
if (nowtime < p[unfinishedposition].atime * 1.0){
nowtime = p[unfinishedposition].atime * 1.0;
next = unfinishedposition;
}
//扫描出有最短rtime的进程下标
for (int i = unfinishedposition; (i < n && nowtime >= p[i].atime&&i!=0); i++) {
if (p[i].state == 1) {
continue; //已经完成的退出本次执行
}
if (p[i].rtime < minrtime) {
minrtime = p[i].rtime;
next = i; //记录下一个要执行的进程
}
}
//运行阶段
{
nowtime =nowtime+p[next].rtime;
p[next].state = 1; //记录完成运行
p[next].ftime = nowtime; //完成时间=现在时间
p[next