2个月搞定计算机二级C语言——真题(7)解析
1. 前言
本篇我们讲解2个月搞定计算机二级C语言——真题7
2. 程序填空题
2.1 题目要求
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: %s\n", 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
中的元素为'\0'
时表示字符串结束,则循环结束。
*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: %s\n", n, t);
getchar();
}
提示:为确保代码正常运行,请在题库编程环境的对应题目中进行测试和运行。
3. 程序修改题
3.1 题目要求
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。
其实不难看出,程序的for
中j、k
是从 0 开始的,其原因是为了将数据存储到a[0][0]
中,但下面的计算又将j
直接和k
相乘,从而导致好多数都是 0。
所以我们需要将程序修改为下面的表达式,这样a[j][k]
就会存储行索引+1
与列索引+1
的乘积,这里注意不要使用j++
或k++
,因为它们等价与j = j + 1
或k = 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 题目要求
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,%d\n", a, b, c, d);
fun(&a, &b, &c, &d);
printf("最大值:%d,最小值:%d\n", 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=%d\n", 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,%d\n", a, b, c, d);
fun(&a, &b, &c, &d);
printf("最大值:%d,最小值:%d\n", 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=%d\n", a, d);
}
fclose(fp);
fclose(wf);
}
提示:为确保代码正常运行,请在题库编程环境的对应题目中进行测试和运行。
5. 后记
本篇博客到这就结束了,如果您有疑问或建议欢迎您在留言区留言。
本文作者:main工作室
本文链接:https://www.cnblogs.com/main-studio/p/18523045
版权声明:本文为「main工作室」的原创文章,遵循 CC BY-NC-ND 4.0 版权协议,著作权归作者所有,转载请注明出处!
鼓励博主:如果您觉得文章对您有所帮助,可以点击文章右下角【推荐】一下。您的鼓励就是博主最大的动力!