2022年06月 C/C++(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

news2024/11/16 1:58:34

在这里插入图片描述

第1题:小白鼠再排队

N只小白鼠(1 < N < 100),每只鼠头上戴着一顶有颜色的帽子。现在称出每只白鼠的重量,要求按照白鼠重量从小到大的顺序输出它们头上帽子的颜色。帽子的颜色用 “red”,“blue”等字符串来表示。不同的小白鼠可以戴相同颜色的帽子。白鼠的重量用整数表示。
时间限制:1000
内存限制:65536
输入
输入第一行为一个整数N,表示小白鼠的数目。 下面有N行,每行是一只白鼠的信息。第一个为正整数,表示白鼠的重量,不超过整型范围;第二个为字符串,表示白鼠的帽子颜色,字符串长度不超过10个字符。 注意:白鼠的重量各不相同。
输出
按照白鼠的重量从小到大的顺序输出白鼠的帽子颜色。
样例输入
3
30 red
50 blue
40 green
样例输出
red
green
blue

以下是解决该问题的C语言代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    int weight;
    char color[11];
} Mouse;

int compare(const void* a, const void* b) {
    Mouse* mouseA = (Mouse*)a;
    Mouse* mouseB = (Mouse*)b;
    return mouseA->weight - mouseB->weight;
}

int main() {
    int N;
    scanf("%d", &N);

    Mouse* mice = (Mouse*)malloc(N * sizeof(Mouse));

    for (int i = 0; i < N; i++) {
        scanf("%d %s", &mice[i].weight, mice[i].color);
    }

    qsort(mice, N, sizeof(Mouse), compare);

    for (int i = 0; i < N; i++) {
        printf("%s\n", mice[i].color);
    }

    free(mice);
    return 0;
}

你可以将上述代码保存为一个名为 “mouse_sort.c” 的文件,并使用C编译器进行编译和运行。在输入小白鼠的数目和每只白鼠的信息后,程序将按照白鼠的重量从小到大的顺序输出白鼠的帽子颜色。

代码中使用了一个结构体 Mouse 来表示每只小白鼠的信息,包括重量和帽子颜色。compare 函数用于作为 qsort 函数的比较函数,以便按照白鼠的重量进行排序。

在主函数中,我们首先读取小白鼠的数目 N,然后动态分配一个大小为 NMouse 数组。接下来,我们使用循环逐个读取每只小白鼠的信息,并将其保存在数组中。然后,我们使用 qsort 函数对数组进行排序,排序的依据是比较函数 compare。最后,我们使用循环按顺序输出排序后的小白鼠的帽子颜色。

请注意,这个解决方案假设输入是有效的,并且满足题目要求。如果输入超出限制范围或包含非法字符,可能会导致输出错误。

第2题:多余的数

小A同学在完成一个数学题:求给定的10个整数的和。小A同学在求完之后发现和参考答案对不上,检查后发现在求和过程中多计算了一个数,其他过程没有问题。现给出小A计算用的11个数,以及正确的参考答案,请算出小A同学多计算的那一个数。
时间限制:1000
内存限制:65536
输入
第一行11个正整数,每个数小于等于1000000 第二行一个整数,表示参考答案
输出
一个整数,表示多计算的那一个数。
样例输入
2 4 6 8 1 3 5 7 9 5 11
54
样例输出
7
提示
样例中原有的10个数为2 4 6 8 1 3 5 9 5 11,和为54,多余的数为7。

以下是解决该问题的C语言代码:

#include <stdio.h>

int main() {
    int nums[11];
    int reference;
    int sum = 0;

    for (int i = 0; i < 11; i++) {
        scanf("%d", &nums[i]);
        sum += nums[i];
    }

    scanf("%d", &reference);

    int extraNum = sum - reference;
    printf("%d\n", extraNum);

    return 0;
}

你可以将上述代码保存为一个名为 “extra_number.c” 的文件,并使用C编译器进行编译和运行。在输入11个正整数和参考答案后,程序将计算出小A同学多计算的那个数并输出。

在主函数中,我们首先定义一个整型数组 nums 用于存储11个正整数,以及一个整数变量 reference 用于存储参考答案。然后,我们使用循环逐个读取这11个数,并将它们累加到变量 sum 中。接下来,我们读取参考答案。根据题目描述,多计算的那个数等于总和减去参考答案,因此我们计算出 extraNum。最后,我们输出 extraNum

请注意,这个解决方案假设输入是有效的,并且满足题目要求。如果输入超出限制范围,可能会导致输出错误。

第3题:打字员

有一个打字员,他打字的时候有个习惯,从来不用 Shift 来切换大小写,只用 Caps Lock。 现在给他一个地铁站的名字,你需要写一个程序来告诉他,他需要敲击多少下键盘才能打出 这个地铁站名。
时间限制:1000
内存限制:65536
输入
第一行输入一个数字 n (n<1000),表示共有多少个需要处理的车站名。从第 2 到第 n+1 行是这 n 个车站名。车站名由英文字母构成,名字的长度不会超过 100 个字符。已知开始时 键盘是输入小写字母的状态。
输出
这个打字员敲击键盘的次数。
样例输入
5
BeiJingDaXueDongMen
AAAaaaBBBbbbABAB
AmericanRAILWAY
AaAaAa
DFjfkdaB
样例输出
31
21
18
12
11

以下是解决该问题的C语言代码:

#include <stdio.h>
#include <string.h>

int main() {
    int n;
    scanf("%d", &n);

    char station[101];

    for (int i = 0; i < n; i++) {
        scanf("%s", station);
        int len = strlen(station);
        int count = 0;
        int capsLock = 0;

        for (int j = 0; j < len; j++) {
            if (station[j] >= 'A' && station[j] <= 'Z') {
                if (!capsLock) {
                    capsLock = 1;
                    count++;
                }
            } else {
                if (capsLock) {
                    capsLock = 0;
                    count++;
                }
            }
            count++;
        }

        printf("%d\n", count);
    }

    return 0;
}

你可以将上述代码保存为一个名为 “typist.c” 的文件,并使用C编译器进行编译和运行。在输入车站名的数量以及每个车站名后,程序将计算出打字员敲击键盘的次数并输出。

在主函数中,我们首先读取车站名的数量 n。然后,使用循环逐个读取每个车站名,并进行处理。对于每个车站名,我们首先获取其长度 len,然后定义一个计数变量 count 和一个表示 Caps Lock 是否开启的标志变量 capsLock,初始状态下 capsLock 为 0。

接下来,我们使用另一个循环遍历车站名的每个字符。如果字符是大写字母,且 capsLock 为 0(表示当前是小写状态),则表示需要切换到大写状态,此时将 capsLock 设为 1,并将计数 count 加1。如果字符是小写字母,且 capsLock 为 1(表示当前是大写状态),则表示需要切换到小写状态,此时将 capsLock 设为 0,并将计数 count 加1。无论字符是大写字母还是小写字母,每遇到一个字符,计数 count 都需要加1。

最后,我们输出计数 count

请注意,这个解决方案假设输入是有效的,并且满足题目要求。如果输入超出限制范围,可能会导致输出错误。

第4题:最好的草

奶牛Bessie计划好好享受柔软的春季新草。新草分布在R行C列的牧场里。它想计算一下牧场中的草丛数量。
在牧场地图中,每个草丛要么是单个“#”,要么是有公共边的相邻两个“#”。给定牧场地图,计算有多少个草丛。
例如,考虑如下5行6列的牧场地图
. # . . . .
. . # . . .
. . # . . #
. . . # # .
. # . . . .
这个牧场有5个草丛:一个在第一行,一个在第二列横跨了二、三行,一个在第三行,一个在第四行横跨了四、五列,最后一个在第五行。
时间限制:10000
内存限制:65536
输入
第一行包含两个整数R和C,中间用单个空格隔开。 接下来R行,每行C个字符,描述牧场地图。字符只有“#”或“.”两种。(1 <= R, C <= 100 )
输出
输出一个整数,表示草丛数。
样例输入
5 6
.#…
…#…
…#…#
…##.
.#…
样例输出
5

以下是解决该问题的C语言代码:

#include <stdio.h>

#define MAX_ROWS 100
#define MAX_COLS 100

int countGrasslands(char field[MAX_ROWS][MAX_COLS], int rows, int cols) {
    int count = 0;
    int visited[MAX_ROWS][MAX_COLS] = {0};

    // 遍历牧场地图
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            // 如果当前位置是草丛且未被访问过
            if (field[i][j] == '#' && !visited[i][j]) {
                count++; // 增加草丛计数
                visited[i][j] = 1; // 标记当前位置为已访问

                // 标记与当前位置相邻的草丛为已访问
                // 向右搜索
                int k = j + 1;
                while (k < cols && field[i][k] == '#') {
                    visited[i][k] = 1;
                    k++;
                }

                // 向下搜索
                k = i + 1;
                while (k < rows && field[k][j] == '#') {
                    visited[k][j] = 1;
                    k++;
                }
            }
        }
    }

    return count;
}

int main() {
    int rows, cols;
    scanf("%d %d", &rows, &cols);
    char field[MAX_ROWS][MAX_COLS];

    // 读取牧场地图
    for (int i = 0; i < rows; i++) {
        scanf("%s", field[i]);
    }

    int result = countGrasslands(field, rows, cols);
    printf("%d\n", result);

    return 0;
}

你可以将上述代码保存为一个名为 “grass.c” 的文件,并使用C编译器进行编译和运行。在输入牧场地图的行数、列数以及每个位置的字符后,程序将计算出草丛的数量并输出。

在主函数中,我们首先读取牧场地图的行数 rows 和列数 cols。然后,定义一个字符数组 field 用于存储牧场地图的每个位置的字符。

接下来,我们使用两个嵌套的循环来读取每个位置的字符,并将其存储在 field 数组中。

然后,我们调用 countGrasslands 函数来计算草丛的数量。该函数使用一个二维数组 visited 来记录位置是否被访问过。在遍历地图的过程中,如果遇到一个未被访问过的草丛位置,我们将计数增加,并将与该位置相邻的草丛位置标记为已访问。

最后,我们输出计数结果。

请注意,这个解决方案假设输入是有效的,并且满足题目要求。如果输入超出限制范围,可能会导致输出错误。

第5题:字符串中最长的连续出现的字符

求一个字符串中最长的连续出现的字符,输出该字符及其出现次数。字符串中无空白字符(空格、回车和tab),如果这样的字符不止一个,则输出出现最早的字符。
时间限制:1000
内存限制:65536
输入
一行,一个不包含空白字符的字符串,字符串长度小于200。
输出
一行,输出最长的连续出现的字符及其最长的连续出现次数,中间以一个空格分开。
样例输入
aaaaadbbbbbcccccccdddddddddd
样例输出
d 10

以下是解决该问题的C语言代码:

#include <stdio.h>
#include <string.h>

void findLongestConsecutiveChar(char str[]) {
    int len = strlen(str);
    int maxCount = 0;
    char maxChar = str[0];
    int currentCount = 1;

    for (int i = 1; i < len; i++) {
        if (str[i] == str[i-1]) {
            currentCount++;
        } else {
            if (currentCount > maxCount) {
                maxCount = currentCount;
                maxChar = str[i-1];
            }
            currentCount = 1;
        }
    }

    if (currentCount > maxCount) {
        maxCount = currentCount;
        maxChar = str[len-1];
    }

    printf("%c %d\n", maxChar, maxCount);
}

int main() {
    char str[201];
    scanf("%s", str);

    findLongestConsecutiveChar(str);

    return 0;
}

你可以将上述代码保存为一个名为 “longest.c” 的文件,并使用C编译器进行编译和运行。在输入字符串后,程序将计算出最长的连续出现的字符及其出现次数,并进行输出。

在主函数中,我们首先定义一个字符数组 str,用于存储输入的字符串。

接下来,我们调用 findLongestConsecutiveChar 函数来查找最长的连续出现的字符。该函数使用一个循环遍历字符串中的字符,并维护两个变量:maxCount 表示目前找到的最长连续出现次数,maxChar 表示对应的字符。我们还使用一个变量 currentCount 来记录当前字符的连续出现次数。

在遍历字符串的过程中,我们比较当前字符与前一个字符是否相同。如果相同,说明当前字符与前一个字符连续出现,将 currentCount 加1。如果不相同,说明当前字符打破了连续出现的序列,我们将比较当前的 currentCountmaxCount 的大小,如果 currentCount 大于 maxCount,则更新 maxCountmaxChar。然后,将 currentCount 重新置为1,以便开始计算下一个字符的连续出现次数。

最后,我们还需要在循环结束后再次比较 currentCountmaxCount,以处理最后一个字符连续出现的情况。

最终,我们输出 maxCharmaxCount

请注意,这个解决方案假设输入是有效的,并且满足题目要求。如果输入超出限制范围,可能会导致输出错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/887684.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实现简单纯Canvas文本输入框,新手适用

文章目录 概要效果技术细节代码 概要 Canvas上面提供输入&#xff1a; 一、最简单可能是用dom渲染一个input,覆盖在图形上面进行文本编辑&#xff0c;编辑完再把内容更新到图形.这样简单&#xff0c;但是缺点也明显&#xff0c;就是它不是真正绘制在canvas上面&#xff0c;没…

爬虫逆向实战(三)--天某云登录

一、数据接口分析 主页地址&#xff1a;天某云 1、抓包 通过抓包可以发现登录接口是account/login 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过“载荷”模块可以发现password、comParam_signature、comParam_seqCode是加密的 请求头是否加密&#xff1f; 无…

嵌入式学习之字符串

通过今天的学习&#xff0c;我主要提高了对sizeof 和 strlen、puts()、gets()、strcmp 、strncmp、strstr、strtok的理解。重点对sizeof的使用有了更加深刻的理解

【会议征稿信息】第二届信息学,网络与计算技术国际学术会议(ICINC2023)

2023年第二届信息学&#xff0c;网络与计算技术国际学术会议(ICINC2023) 2023 2nd International Conference on Informatics,Networking and Computing (ICINC 2023) 2023年第二届信息学&#xff0c;网络与计算技术国际学术会议(ICINC2023)将于2023年10月27-29日于中国武汉召…

MongoDB:数据库初步应用

一.连接MongoDB 1.MongoDBCompass连接数据库 连接路径:mongodb://用户名:密码localhost:27017/ 2.创建数据库(集合) MongoDB中数据库被称为集合. MongoDBCompass连接后,点击红色框加号创建集合,点击蓝色框加号创建文档(数据表) 文档中的数据结构(相当于表中的列)设计不用管…

mqtt学习记录

目录 1 匿名登录2 ⽤户名密码登录&#xff0c;配置接收的主题mosquitto 配置文件修改添加⽤户信息添加topic和⽤户的关系登录演示 1 匿名登录 ⾸先打开三个终端&#xff0c; 启动代理服务&#xff1a;mosquitto -v -v 详细模式 打印调试信息 默认占⽤&#xff1a;1883端⼝订阅…

机器学习笔记:线性链条件随机场(CRF)

0 引入&#xff1a;以词性标注为例 比如我们要对如下句子进行标注&#xff1a; “小明一把把把把住了”那么我么可能有很多种词性标注的方法&#xff0c;中间四个“把”&#xff0c;可以是“名词名词动词名词”&#xff0c;可以是“名词动词动词名词”等多种形式。 那么&#…

安装chromedriver 115,对应chrome版本115(经检验,116也可以使用)

目录 1. 查看Chrome浏览器的版本2. 找到对应的chromedriver3. 安装ChromeDriver 1. 查看Chrome浏览器的版本 点进这个网站查看&#xff1a;chrome://settings/help &#xff08;真是的&#xff0c;上一秒还是115版本&#xff0c;更新后就是116版本了&#xff0c;好在chromedi…

Python程序设计——列表

一、引言 关键点&#xff1a;一个列表可以存储任意大小的数据集合。 程序一般都需要存储大量的数值。假设&#xff0c;举个例子&#xff0c;需要读取100个数字&#xff0c;计算出它们的平均值&#xff0c;然后找出多少个数字是高于这个平均值的。程序首先读取100个数字并计算它…

基于 matplotlib module 的物理示意图绘制

基于 matplotlib module 的物理示意图绘制 # 创建画布和子图 fig, ax plt.subplots()# 去除 x 轴和 y 轴的边框线 ax.spines[bottom].set_visible(False) ax.spines[top].set_visible(False) ax.spines[left].set_visible(False) ax.spines[right].set_visible(False)# 隐藏 …

Azure如何调整虚拟机的大小

参考 https://blog.csdn.net/m0_48468018/article/details/132267096 创建虚拟机进入资源&#xff0c;点击大小选项&#xff0c;并对大小进行调整 点击如下图的cloud shell,进入Azure CLI,使用az vm resize 进行大小调整 命令中的g对应资源组&#xff0c;n对应虚拟机名称&am…

巧妙使用js IntersectionObserver实现dom懒加载

效果 源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>IntersectionObserver</title></head><body style"text-align: center"><div id"container">…

数据库高性能架构模式

互联网业务兴起之后&#xff0c;海量用户加上海量数据的特点&#xff0c;单个数据库服务器已经难以满足业务需要&#xff0c;必须考虑数据库集群的方式来提升性能。高性能数据库集群的第一种方式是“读写分离”&#xff0c;第二种方式是“数据库分片”。 1、读写分离架构 **读…

Vue父子组件数据双向绑定

今天写一个功能时&#xff0c;遇到一些问题&#xff1a; 为什么子组件的contentList改变&#xff0c;也会将form中的trContentVOList的值改变&#xff1f; 吓的我立马去补充知识&#xff08;小白一枚&#xff09;,也借鉴了别的大佬的一些文章&#xff0c;这里自己整理一下&…

时序预测 | MATLAB实现基于CNN-GRU卷积门控循环单元的时间序列预测-递归预测未来(多指标评价)

时序预测 | MATLAB实现基于CNN-GRU卷积门控循环单元的时间序列预测-递归预测未来(多指标评价) 目录 时序预测 | MATLAB实现基于CNN-GRU卷积门控循环单元的时间序列预测-递归预测未来(多指标评价)预测结果基本介绍程序设计参考资料 预测结果 基本介绍 MATLAB实现基于CNN-GRU卷积…

华为网络篇 RIP的默认路由-30

难度2复杂度2 目录 一、实验原理 二、实验拓扑 三、实验步骤 四、实验过程 总结 一、实验原理 使用RIP搭建内部网络后&#xff0c;我们还需要在边界路由器进行相应的配置&#xff0c;否则无法与Internet通信。默认情况&#xff0c;内部的RIP路由器是不知道Internet的路由条…

Linux驱动开发之点亮三盏小灯

头文件 #ifndef __HEAD_H__ #define __HEAD_H__//LED1和LED3的硬件地址 #define PHY_LED1_MODER 0x50006000 #define PHY_LED1_ODR 0x50006014 #define PHY_LED1_RCC 0x50000A28 //LED2的硬件地址 #define PHY_LED2_MODER 0x50007000 #define PHY_LED2_ODR 0x50007014 #define…

人工智能驱动的视频分析技术:实时洞察与关键信息提供者

引言&#xff1a;人工智能在视频分析领域的应用为监控视频提供了更加智能化和高效的处理方式。通过实时分析监控视频&#xff0c;人工智能可以自动识别特定的对象、运动模式、区域异常等&#xff0c;并生成相关的报告和统计数据&#xff0c;为用户提供关键信息和洞察。本文将详…

时序预测 | MATLAB实现基于CNN-BiGRU卷积双向门控循环单元的时间序列预测-递归预测未来(多指标评价)

时序预测 | MATLAB实现基于CNN-BiGRU卷积双向门控循环单元的时间序列预测-递归预测未来(多指标评价) 目录 时序预测 | MATLAB实现基于CNN-BiGRU卷积双向门控循环单元的时间序列预测-递归预测未来(多指标评价)预测结果基本介绍程序设计参考资料 预测结果 基本介绍 MATLAB实现基于…

UVM学习知识点

UVM构建 include 和 import pkg区别.sv .svhhdl_top.sv和hvl_top.sv回顾uvm_config&#xff0c;以及自定义uvm_configverilog:parameter、defparam与 localparamtest_basebuild_phaseend_of_elaboration_phasefunction void configure_agentset_seqsend_of_elaboration_phaseuv…