修改GFG非抢占式SJF调度代码(替换为二维数组)后无输出求助
非抢占式SJF代码无输出问题排查与修复
问题1:变量n未初始化
代码里定义了int n但没赋值,C语言局部未初始化变量会是随机垃圾值,大概率为0或负数,导致所有依赖i < n的循环直接跳过,计算和输出逻辑完全不执行,自然没任何输出。必须给n赋值为进程总数,比如这里是5个进程,要加n = 5;。
问题2:二维数组初始化逻辑错误
你当前的数组把所有进程的运行时间堆在第一行,完全不符合SJF算法的数据结构。算法需要每个进程对应一行数据,存储进程ID、运行时间(BT)、等待时间(WT)、周转时间(TAT)等信息,修正后应该每个进程占一行,前两列分别填进程ID和运行时间,后续列自动初始化为0。
问题3:字符串换行符错误
代码里printf的字符串直接跨行写(比如"P BT WT TAT "),这在C语言中是非法的,必须用\n表示换行,否则编译会报错。
修正后的完整代码
#include <stdio.h> #include <stdlib.h> int main() { // 每个进程一行:[进程ID, 运行时间, 等待时间, 周转时间, 预留位] int A[5][5] = { {1, 8}, {2, 3}, {3, 7}, {4, 5}, {5, 2} }; int i, j, n = 5, total = 0, index, temp; // 初始化进程数n=5 float avg_wt, avg_tat; // 按运行时间升序排序(SJF核心逻辑) for (i = 0; i < n; i++) { index = i; for (j = i + 1; j < n; j++) if (A[j][1] < A[index][1]) index = j; // 交换运行时间 temp = A[i][1]; A[i][1] = A[index][1]; A[index][1] = temp; // 交换对应进程ID temp = A[i][0]; A[i][0] = A[index][0]; A[index][0] = temp; } // 计算等待时间 A[0][2] = 0; // 第一个进程无需等待 for (i = 1; i < n; i++) { A[i][2] = 0; for (j = 0; j < i; j++) A[i][2] += A[j][1]; total += A[i][2]; } avg_wt = (float)total / n; total = 0; // 输出调度结果 printf("P BT WT TAT\n"); for (i = 0; i < n; i++) { A[i][3] = A[i][1] + A[i][2]; // 计算周转时间 total += A[i][3]; printf("P%d %d %d %d\n", A[i][0], A[i][1], A[i][2], A[i][3]); } // 输出平均值 avg_tat = (float)total / n; printf("Average Waiting Time= %f\n", avg_wt); printf("Average Turnaround Time= %f\n", avg_tat); return 0; }
运行修正后的代码会输出正确的SJF调度结果,包括每个进程的运行时间、等待时间、周转时间,以及对应的平均值。
内容的提问来源于stack exchange,提问作者max1eee -
相关产品推荐
相关产品推荐

