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。

其实不难看出,程序的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 题目要求

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. 后记

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

2个月搞定计算机二级C语言——真题(7)解析的更多相关文章

  1. 二级C语言真题笔记

    二级C语言真题笔记 1. 知识重点:数据类型.循环.数组.函数.指针.结构体与共同体 2. 求程序的运行结果 #include <stdio.h> main() {     short i ...

  2. 计算机二级-C语言-程序修改题-190108记录-字符串处理

    //程序修改题:给定程序MODI1.C中函数fun的功能是:先将字符串s中的字符按正序存放到t串中,然后把s中的字符按逆序连接到t串的后面.例如:当s中的字符串为:“ABCDE”时,则t中的字符串应为 ...

  3. 计算机二级-C语言-程序修改题-190113记录-对指定字符串的大小写变换处理。

    //给定程序中fun函数的功能是:将p所指的字符串中每个单词的最后一个字母改成大写.(这里的“单词”是指由空格隔开的字符串) //重难点:指针对数组的遍历.大小写转换的方法.第一种使用加减32 得到, ...

  4. 计算机二级-C语言-程序设计题-190112记录-结构体的遍历和结构体的数据的交换处理,文件的操作。

    //程序设计题:学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:把分数低的学生数据放在b所指的数组中,注意:分数最低的学生可能不止一个,函数返回 ...

  5. 计算机二级-C语言-程序设计题-190111记录-两种指针赋值的不同,普通输入输出函数和文件输入输出函数的使用

    //程序设计题:函数fun的功能是:将两位数的正整数a,b合并形成一个整数放在c中.合并的方式是:将a数的十位和个位数依次放在c数的个位和百位上,b数的十位和个位数依次放在c数的十位和千位上.例如:当 ...

  6. 计算机二级-C语言-程序修改题-190123记录-对整数进行取余和除以操作。

    //函数fun功能:将长整型数中每一位上为偶数的数依次取出,构成一个新数放在t中.高位仍在高位,低位仍在低位. //重难点:思路:因为不是字符串,所以可以把问题变成整数的操作,采用取余和除的操作.对整 ...

  7. 计算机二级-C语言-程序设计题-190119记录-求出一个二维数组每一列的最小值。

    //编写一个函数:tt指向一个M行N列的二维数组,求出二维数组每列中最小的元素,并依次放入pp所指的一维数组中.二维数组中的数在主函数中赋予. //重难点:求出的是每一列的最小值,这里要注意,学会简化 ...

  8. 计算机二级-C语言-程序设计题-190118记录-通过数组和指针两种方式对字符串进行处理。

    //编写一个函数fun,比较两个字符串的长度,(不使用C语言提供的求字符串长度的函数),函数返回较长的字符串.若两个字符长度相同,则返回第一个字符串. //重难点:通过数组处理和通过指针进行处理的不同 ...

  9. 计算机二级-C语言-程序修改题-190116记录-对数组进行排序的两种方法。

    //函数fun的功能是:将n个无序整数从小到大排序. //冒泡排序法:小数往下浮,大数往上浮.把数都存到一个数组,然后两两比较,大数往后交换.双层递减循环. //第二种方法:都放入一个数组中,然后记录 ...

  10. 计算机二级-C语言-程序修改题-190114记录-对整型变量进行取余操作可以取得各个位上的值。

    //给定程序中fun函数的功能是:从低位开始取出长整形变量s中奇数位上的数,依次构成一个新的数放在t中.高位仍在高位,低位仍在低位.例如:当s中的数为7654321时,t中的数为7531. //重难点 ...

随机推荐

  1. 线性dp:编辑距离

    编辑距离 本题与力扣72.编辑距离题意一样,阅读完本文可以尝试leetcode72. 力扣题目链接 题目叙述 输入两个字符串a,b.输出从字符串a修改到字符串b时的编辑距离 输入 NOTV LOVER ...

  2. Redis解读(5):Redis深入理解及生产高可用

    Redis单线程如何处理高并发 1.阻塞IO 与 非阻塞 IO Java 在 JDK1.4 中引入 NIO,但是也有很多人在使用阻塞 IO,这两种 IO 有什么区别? 在阻塞模式下,如果你从数据流中读 ...

  3. 推荐一个Python打造的开源自动驾驶平台:Donkeycar!

    1.引言 随着人工智能和自动驾驶技术的飞速发展,自动驾驶车辆的研究和开发成为了科技领域的热点.对于初学者.爱好者和学生而言,一款易于上手且功能强大的自动驾驶平台显得尤为重要.Donkeycar正是这样 ...

  4. 为什么MySQL 默认隔离级别是RR,又被阿里设置为RC

    我们知道,我们可以通过这个命令查看数据库当前的隔离级别,MySQL 默认隔离级别是RR. select @@tx_isolation; ANSI/ISO SQL定义的标准隔离级别有四种,从高到底依次为 ...

  5. ASP.NET Core – Try Preview

    前言 .NET 7 已经来到 RC 阶段了. 通常 RC 就是我们 (写库的人) 要入场的时候了. 有发现 Bug 要尽可能在这段期间提交. 不然后患无穷. 这篇主要就是来讲讲如果测试 RC 版本的 ...

  6. 如何用VMWARE创建一个Linux虚拟机

    序言 各位好啊,我是会编程的蜗牛,作为java开发者,我们都是需要接触Linux服务器的,一般部署应用都是部署在Linux服务器上的~ 但一般的服务器要么需要购买,要么只是公司里的,那么有没有免费的L ...

  7. Flutter Engage 活动精彩回顾 | 中文字幕视频

    在 Flutter Engage 预告之后,无数开发者充满期待并且在社区中积极讨论交流,分享见解.今天,我们正式发布 Flutter 2.0,并在 Flutter Engage 活动 中详细介绍了这一 ...

  8. SqlEs-像使用数据库一样使用Elasticsearch

    SqlEs SqlEs是Elasticsearch的客户端JDBC驱动程序,支持采用sql语法操作Elasticsearch.SqlEs构建在RestHighLevelClient,屏蔽了RestHi ...

  9. placement new --特殊的内存分配

    placement new 是 C++ 中的一种特殊的内存分配技术,用来在指定的内存地址上直接构造对象.与普通的 new 运算符不同,placement new 并不分配新的内存,而是在已经分配好的内 ...

  10. Android Qcom USB Driver学习(十一)

    基于TI的Firmware Update固件升级的流程分析usb appliction layers的数据 USB Protocol Package ①/② map to check password ...