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

1. 前言

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

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

2. 程序填空题

2.1 题目要求

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

2.2 提供的代码

#include <stdio.h> int fun(char* s, char* t) {     int n = 0;     while (*s) {         if (*s < 97) {     /**********found**********/             *(t + n) = __1__;             n++;         }     /**********found**********/         __2__;     }     *(t + n) = 0;     /**********found**********/     return __3__; } main() {     char s[81], t[81];     int  n;     printf("nEnter a string:n");     gets(s);     n = fun(s, t);     printf("nThere are %d letter which ASCII code is less than 97: %sn", n, t);     getchar(); } 

2.3 解题思路

题目要求判断形参s所指字符串的所有字符,所以我们需要遍历这个字符串,依次判断当前字符是否小于 97,是则存入形参t所指的字符数组中,同时计数变量n加一。

第(1)处填空:

这里在if的内部,说明*s是小于 97 的,所以我们要把当前*s中的元素赋值给*(t + n),从而形成新的字符串。

这里为什么是赋值给*(t + n)呢?

因为形参t只传入了它指向的字符串的首地址(即main函数中char t[81]的首地址-->t[0]),同时n作为计数的变量正好可以作为指针向后移动的单位。

// 第一次进入 n = 0,*(t + 0) = *s // 第二次进入 n = 1,*(t + 1) = *s // 第三次进入 n = 2,*(t + 2) = *s // 下同 *(t + n) = *s; 

第(2)处填空:

我们需要遍历形参s才能判断所有的字符,所以这里使用*s++;将指针s的地址后移一位,直到执行到*s中的元素为''时表示字符串结束,则循环结束。

*s++; 

第(3)处填空:

n作为计数的遍历,这里需要作为函数值返回。

return n; 

2.4 代码实现

填写完整的代码:

#include <stdio.h> int fun(char* s, char* t) {     int n = 0;     while (*s) {         if (*s < 97) {     /**********found**********/             *(t + n) = *s;             n++;         }     /**********found**********/         *s++;     }     *(t + n) = 0;     /**********found**********/     return n; } main() {     char s[81], t[81];     int  n;     printf("nEnter a string:n");     gets(s);     n = fun(s, t);     printf("nThere are %d letter which ASCII code is less than 97: %sn", n, t);     getchar(); } 

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

3. 程序修改题

3.1 题目要求

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

3.2 提供的代码

#include <conio.h> #include <stdio.h> #define M 10 int a[M][M] = {0};  /**************found**************/ void fun(int** a, int m) {     int j, k;     for (j = 0; j < m; j++)         for (k = 0; k < m; k++) /**************found**************/             a[j][k] = k * j; }  main() {     int i, j, n;      printf(" Enter n : ");     scanf("%d", &n);     fun(a, n);     for (i = 0; i < n; i++) {         for (j = 0; j < n; j++)             printf("%4d", a[i][j]);         printf("n");     }     getchar(); } 

3.3 解题思路

这个我们直接看修改的地方。

第(1)处修改:

我们在打开程序时可以看到main函数中fun(a,n);这条语句的a下面有条红色波浪线,把鼠标移上去会显示实参与形参不兼容,那么第一处修改应该从fun函数的形参a动手。

实参是全局变量的二维数组a[M][M],所以我们需要将形参改为a[][M],只需要指定二维数组列的大小即可。

int **a表示一个指向指针的指针,即它指向一个指针数组,其中每个指针又可以指向一个int类型的元素或其他一维数组,它不能保证二维数组的行和列是连续存储的,所以通常用于动态分配的二维数组,需要使用malloc为每一行分配独立的内存。

int [][M]表示一个二维数组的形参,其中列数必须固定(M为10),行数可以不固定,它在内存中是连续存储的。

void fun(int a[][M], int m) { 

第(2)处修改:

修改完 1 处后,程序可以运行了,但结果是不正确的,会输出好多 0。

其实不难看出,程序的forj、k是从 0 开始的,其原因是为了将数据存储到a[0][0]中,但下面的计算又将j直接和k相乘,从而导致好多数都是 0。

所以我们需要将程序修改为下面的表达式,这样a[j][k]就会存储行索引+1列索引+1的乘积,这里注意不要使用j++k++,因为它们等价与j = j + 1k = k + 1,同意也会导致输出错误。

a[j][k] = (j + 1) * (k + 1); 

3.4 代码实现

修改后的代码:

#include <conio.h> #include <stdio.h> #define M 10 int a[M][M] = {0};  /**************found**************/ void fun(int a[][M], int m) {     int j, k;     for (j = 0; j < m; j++)         for (k = 0; k < m; k++) /**************found**************/             a[j][k] = (j + 1) * (k + 1); }  main() {     int i, j, n;      printf(" Enter n : ");     scanf("%d", &n);     fun(a, n);     for (i = 0; i < n; i++) {         for (j = 0; j < n; j++)             printf("%4d", a[i][j]);         printf("n");     }     getchar(); } 

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

4. 程序设计题

4.1 题目要求

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

4.2 提供的代码

#include <stdio.h> void NONO(); void fun(int* a, int* b, int* c, int* d) { } main() {     int a, b, c, d;     printf("请输入4个整数:    ");     scanf("%d%d%d%d", &a, &b, &c, &d);     printf("输入数据:    %d,%d,%d,%dn", a, b, c, d);     fun(&a, &b, &c, &d);     printf("最大值:%d,最小值:%dn", a, d);     NONO();     getchar(); }  void NONO() { /* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */     FILE *fp, *wf;     int   i, a, b, c, d;      fp = fopen("in.dat", "r");     wf = fopen("out.dat", "w");     for (i = 0; i < 5; i++) {         fscanf(fp, "%d %d %d %d", &a, &b, &c, &d);         fun(&a, &b, &c, &d);         fprintf(wf, "a=%d,d=%dn", a, d);     }     fclose(fp);     fclose(wf); } 

4.3 解题思路

题目要求在形参指针所指的 4 个整数中找出最大值和最小值。

首先想到的方法可能是用形参指针一个一个去比较,最后得出要的结果,这种方法是行得通的,但程序编写并不简洁。

我们可以将形参中的值存储到数组中,分别定义最大值max和最小值min变量,通过循环的方式遍历数组找到最大值和最小值,最后存储到形参指针所指的地址中即可。

下面我们看代码实现:

4.4 代码实现

填写完整的代码:

#include <stdio.h> void NONO(); void fun(int* a, int* b, int* c, int* d) {     int buff[4] = {*a, *b, *c, *d};  // 用数组存储形参的 4 个整数,便于后续的判断     int max = buff[0], min = buff[0], i = 0;      for (i = 0; i < 4; i++) {  // 四个整数,故遍历 4 次         if (buff[i] > max) {   // 最大值判断             max = buff[i];         }          if (buff[i] < min) {  // 最小值判断             min = buff[i];         }     }     *a = max;  // 将最大值存储到指针 a 指向的地址中     *d = min;  // 同上 } main() {     int a, b, c, d;     printf("请输入4个整数:    ");     scanf("%d%d%d%d", &a, &b, &c, &d);     printf("输入数据:    %d,%d,%d,%dn", a, b, c, d);     fun(&a, &b, &c, &d);     printf("最大值:%d,最小值:%dn", a, d);     NONO();     getchar();     getchar(); }  void NONO() { /* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */     FILE *fp, *wf;     int   i, a, b, c, d;      fp = fopen("in.dat", "r");     wf = fopen("out.dat", "w");     for (i = 0; i < 5; i++) {         fscanf(fp, "%d %d %d %d", &a, &b, &c, &d);         fun(&a, &b, &c, &d);         fprintf(wf, "a=%d,d=%dn", a, d);     }     fclose(fp);     fclose(wf); } 

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

5. 后记

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

发表评论

评论已关闭。

相关文章