南开二级C语言:纠正打印质因子程序及成绩处理函数

需积分: 0 0 下载量 67 浏览量 更新于2024-07-23 收藏 63KB DOC 举报
南开大学二级C语言上机改错100题之第1题涉及了一个质数因子查找的程序,该程序的目标是读入一个2到10000之间的整数,并打印出其所有的质因子。原始代码存在以下错误: 1. 在IsPrime函数定义后忘记添加函数体,应将"IsPrime(int n);"改为"IsPrime(int n) {",并在大括号内开始编写代码。 ```c IsPrime(int n) { int i, m; m = 1; for (i = 2; i < n; i++) { if (!(n % i)) { // 更正错误的条件判断,使用"!"运算符应为"!" m = 0; break; } } return m; } ``` 2. 在主函数`main()`中,当检查`j`是否为`k`的质因子时,原始代码中的条件判断有误,应使用`IsPrime(j)`来测试`j`是否为质数,而不是直接检查`!(k % j)`。更正后的代码如下: ```c main() { // ...其他代码... for (j = 2; j <= k; j++) { if (IsPrime(j) && !(k % j)) { printf("%4d", j); } } // ...其他代码... } ``` 接下来是第二个编程题,题目要求编写一个函数`fun`,计算并返回成绩数组中低于平均分的人数及其分数。原始代码给出了部分函数头和循环结构,但缺失了关键部分。首先,需要计算平均分`aver`,然后遍历数组,检查每个分数是否低于平均分,并累加计数。以下是修复后的`fun`函数: ```c int fun(int score[], int m, int below[]) { int i, k = 0; float aver = 0; for (i = 0; i < m; i++) { aver += score[i]; } aver /= m; for (i = 0; i < m; i++) { if (score[i] < aver) { // 检查是否低于平均分 below[k++] = score[i]; // 将分数放入below数组 } } return k; // 返回低于平均分的人数 } ``` 这两个问题都集中在理解C语言语法和逻辑条件上,特别是函数调用和质数检测。通过修正这些错误,程序将正确地找到输入整数的质因子,并根据成绩数组计算低于平均分的人数和分数。