南开大学二级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语言语法和逻辑条件上,特别是函数调用和质数检测。通过修正这些错误,程序将正确地找到输入整数的质因子,并根据成绩数组计算低于平均分的人数和分数。