1. 前言
本篇我们讲解2个月搞定计算机二级C语言——真题 6
2. 程序填空题
2.1 题目要求
2.2 提供的代码
#include <stdio.h>
unsigned long fun(unsigned long n) {unsigned long x = 0;int t;while (n) {t = n % 10;/**********found**********/if (t % 2 == __1__)/**********found**********/x = __2__ + t;/**********found**********/n = __3__;}return x;
}
main() {unsigned long n = -1;while (n > 99999999 || n < 0) {printf("Please input(0<n<100000000): ");scanf("%ld", &n);}printf("\nThe result is: %ld\n", fun(n));getchar();
}
2.3 解题思路
题目要求将各位上的偶数取出,需要将各位的数取出后再判断该数是否为偶数,偶数可以通过该数除 2 取余的结果来判断,如果结果为 0 则是偶数,为 1 则是奇数。
第(1)处填空:
此处是用来判断取出的一位数字是否为偶数,上面说过如何判断是否为偶数,所以这里我们需要让它判断是否等于 0。
if (t % 2 == 0)
第(2)处填空:
这里我们要实现的功能是重组一个新的数,题目要求是相反的顺序,所以我们需要每次让x * 10
,下面程序的代码中演示:
// t = 6 时符合条件,x = 0 * 10 + 6,则 x 为 6
// t = 9 时不符合条件,则执行 n = n / 10;
// t = 4 时符合条件,x = 6 * 10 + 4,则 x 为 64
// t = 8 时符合条件,x = 64 * 10 + 8,则 x 为 648
// 下同
x = x * 10 + t;
第(3)处填空:
这里我们要实现的是将前面取出的个位数除去,原本的十位变为个位,以便下次循环进入时t = n % 10;
取出的是一个新数值。
n = n / 10;
2.4 代码实现
填写完整的代码:
#include <stdio.h>
unsigned long fun(unsigned long n) {unsigned long x = 0;int t;while (n) {t = n % 10;/**********found**********/if (t % 2 == 0) // 除 2 取余等于 0,则为整数/**********found**********/x = x * 10 + t; // 将 t 的值加到 x 的个位/**********found**********/n = n / 10; // 逐次除去 n 的个位}return x;
}
main() {unsigned long n = -1;while (n > 99999999 || n < 0) {printf("Please input(0<n<100000000): ");scanf("%ld", &n);}printf("\nThe result is: %ld\n", fun(n));getchar();getchar();
}
提示:为确保代码正常运行,请在题库编程环境的对应题目中进行测试和运行。
3. 程序修改题
3.1 题目要求
3.2 提供的代码
#include <stdio.h>
void fun(char* p) {char max, *q;int i = 0;max = p[i];q = p;while (p[i] != 0) {if (max < p[i]) {max = p[i];/**********found**********/q = p + i}i++;}/**********found**********/wihle(q > p) {*q = *(q - 1);q--;}p[0] = max;
}
main() {char str[80];printf("Enter a string: ");gets(str);printf("\nThe original string: ");puts(str);fun(str);printf("\nThe string after moving: ");puts(str);printf("\n\n");getchar();
}
3.3 解题思路
本题只有两处错误,一个语法错误,一个关键字写错了,都是初学者经常犯的错误,在编程时需要注意一下。
第(1)处修改:
这里是因为语句后面没有加;
,加上就好。
q = p + i;
第(2)处修改:
这句是因为while
写错了。对于这种错误,更有可能出错的是main
,会有人写成mian
导致程序出错,也要注意。
while(q > p) {
3.4 代码实现
修改后的代码:
#include <stdio.h>
void fun(char* p) {char max, *q;int i = 0;max = p[i];q = p;while (p[i] != 0) {if (max < p[i]) {max = p[i];/**********found**********/q = p + i;}i++;}/**********found**********/while(q > p) {*q = *(q - 1);q--;}p[0] = max;
}
main() {char str[80];printf("Enter a string: ");gets(str);printf("\nThe original string: ");puts(str);fun(str);printf("\nThe string after moving: ");puts(str);printf("\n\n");getchar();
}
提示:为确保代码正常运行,请在题库编程环境的对应题目中进行测试和运行。
4. 程序设计题
4.1 题目要求
4.2 提供的代码
#include <stdio.h>
#pragma warning(disable : 4996)
#define N 10
int fun(int x[], int e, int* sum) {
}
main() {void NONO();int x[N] = {1, 7, 8, 6, 10, 15, 11, 13, 29, 31}, e = 3, n, sum;n = fun(x, e, &sum);printf("n=%d,sum=%d\n", n, sum);NONO();
}void NONO() {/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */int i, j, x[10], n, e, sum;FILE *rf, *wf;rf = fopen("in.dat", "r");wf = fopen("out.dat", "w");for (i = 0; i < 5; i++) {for (j = 0; j < 10; j++)fscanf(rf, "%d ", &x[j]);fscanf(rf, "%d", &e);n = fun(x, e, &sum);fprintf(wf, "%d, %d\n", n, sum);}fclose(rf);fclose(wf);
}
4.3 解题思路
根据题目提供的数组x
、整数e
和输出结果可以看出是要求数组中能整除e
的,也就是整除e
的倍数,所以本题的题目描述错了。
那么我们只需要遍历数组x
,判断元素是否能整除e
,是则计数加 1,否则求和加该元素存储的数。
4.4 代码实现
填写完整的代码:
#include <stdio.h>
#pragma warning(disable : 4996)
#define N 10
int fun(int x[], int e, int* sum) {int count = 0, i = 0;*sum = 0; // 将 sum 存储的数据清空,防止出现垃圾值for (i = 0; i < N; i++) { // 遍历数组 X,范围取 0 ~ (N-1)if (x[i] % e == 0) { // 判断是否能整除 ecount++; // 计数} else {*sum += x[i]; // 求和}}return count;
}
main() {void NONO();int x[N] = {1, 7, 8, 6, 10, 15, 11, 13, 29, 31}, e = 3, n, sum;n = fun(x, e, &sum);printf("n=%d,sum=%d\n", n, sum);NONO();getchar();getchar();
}void NONO() {/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */int i, j, x[10], n, e, sum;FILE *rf, *wf;rf = fopen("in.dat", "r");wf = fopen("out.dat", "w");for (i = 0; i < 5; i++) {for (j = 0; j < 10; j++)fscanf(rf, "%d ", &x[j]);fscanf(rf, "%d", &e);n = fun(x, e, &sum);fprintf(wf, "%d, %d\n", n, sum);}fclose(rf);fclose(wf);
}
提示:为确保代码正常运行,请在题库编程环境的对应题目中进行测试和运行。
5. 后记
本篇博客到这就结束了,如果您有疑问或建议欢迎您在留言区留言。