全国计算机等级考试二级C语言上机考试涉及到的知识点主要包括C语言的基本语法、逻辑判断、字符串处理和数组操作。下面将分别对题目中的填空题、改错题和编程题进行详细解析。
一、填空题
题目要求实现一个功能,即输入一个长整数,如果是负数则取其绝对值并输出。这主要涉及到C语言的输入输出、变量声明以及条件判断。
1. `scanf` 用于从键盘接收用户输入,这里需要输入一个长整数,所以填入 `%ld`,完整的语句是 `scanf("%ld", &a);`,其中 `&` 表示取变量a的地址,因为`scanf`需要知道存储输入数据的内存位置。
2. 当判断条件 `if(a<0)` 成立,即输入的数是负数时,我们需要取其绝对值。在C语言中,可以用 `abs()` 函数来取得一个整数的绝对值,但这里要求的是长整数,所以应该使用 `labs()` 函数,完整语句是 `a = labs(a);`
3. 输出取绝对值后的数,格式与之前相同,因此填入 `%ld` 和 `a`,完整的语句是 `printf("The result is %ld\n", a);`
二、改错题
题目中提供的函数`fun`用于查找字符串中最后一次出现的子字符串。问题在于程序没有正确地初始化指针`s`和进行比较。
1. 错误一:`s=NULL;` 应改为 `s=str;`,因为`s`需要从头开始遍历字符串。
2. 错误二:`if(r==p)` 这里的判断条件有误,应该是逐位比较字符是否相等,而不是比较指针是否相等。应该修改为 `if(*r==*p)`。
三、编程题
题目要求编写一个函数 `fun`,找出小于或等于给定数 `mm` 的所有素数,并存入数组 `b` 中。最后返回素数的个数。
在 `fun` 函数中,可以采用以下步骤:
1. 初始化数组 `b` 的计数器 `sum` 为0,表示尚未找到素数。
2. 使用一个循环,从2开始到 `mm` 结束,检查每个数是否为素数。
3. 对于每个数 `i`,从2到 `sqrt(i)`(包括 `sqrt(i)`),判断是否有因子,若有则不是素数,跳过。
4. 如果 `i` 未被任何数整除,那么它是一个素数,将 `i` 存入数组 `b` 并增加计数器 `sum`。
5. 返回 `sum`,即找到的素数个数。
完整的 `fun` 函数如下:
```c
int fun(int mm, int b[MAX]) {
int i, j, sum = 0;
for (i = 2; i <= mm; i++) {
int isPrime = 1;
for (j = 2; j <= sqrt(i); j++) {
if (i % j == 0) {
isPrime = 0;
break;
}
}
if (isPrime) {
b[sum] = i;
sum++;
}
}
return sum;
}
```
总结来说,这三道题主要涵盖了C语言的基本输入输出、条件判断、字符串处理、数组操作以及素数的判定方法。通过解决这些问题,考生可以加深对C语言基本语法和逻辑控制的理解。