2个月搞定计算机二级C语言——真题(6)解析

1. 前言

本篇我们讲解2个月搞定计算机二级C语言——真题 6

2个月搞定计算机二级C语言——真题(6)解析

2. 程序填空题

2.1 题目要求

2个月搞定计算机二级C语言——真题(6)解析

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: %ldn", 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: %ldn", fun(n));     getchar();     getchar(); } 

提示:为确保代码正常运行,请在题库编程环境的对应题目中进行测试和运行。

3. 程序修改题

3.1 题目要求

2个月搞定计算机二级C语言——真题(6)解析

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("nn");     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("nn");     getchar(); } 

提示:为确保代码正常运行,请在题库编程环境的对应题目中进行测试和运行。

4. 程序设计题

4.1 题目要求

2个月搞定计算机二级C语言——真题(6)解析

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=%dn", 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, %dn", 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) {    // 判断是否能整除 e             count++;            // 计数         } 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=%dn", 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, %dn", n, sum);     }     fclose(rf);     fclose(wf); } 

提示:为确保代码正常运行,请在题库编程环境的对应题目中进行测试和运行。

5. 后记

本篇博客到这就结束了,如果您有疑问或建议欢迎您在留言区留言。

发表评论

相关文章