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

在这里插入图片描述

第1题:数字字符求和

请编写一个程序实现以下功能:从一个字符串中,提取出所有的数字字符即0-9,并作为数求和。
时间限制:1000
内存限制:65536
输入
一行字符串,长度不超过100,字符串中不含空格。
输出
字符串中所有数字字符作为数的和
样例输入
Lsd2f02k3ja3sdf223
样例输出
17

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

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

int sumDigits(const char* str) {
    int sum = 0;
    int len = strlen(str);

    for (int i = 0; i < len; i++) {
        if (str[i] >= '0' && str[i] <= '9') {
            sum += str[i] - '0';
        }
    }

    return sum;
}

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

    int result = sumDigits(str);
    printf("%d\n", result);

    return 0;
}

你可以将上述代码保存为一个名为 “sum_digits.c” 的文件,并使用C编译器进行编译和运行。在输入字符串后,程序将提取出字符串中的数字字符,并计算它们的和。

在主函数中,我们首先读取输入的字符串,并将其存储在 str 字符数组中。

然后,我们调用 sumDigits 函数来计算字符串中数字字符的和。在该函数中,我们使用一个循环遍历字符串的每个字符。

对于每个字符,我们判断它是否是数字字符。如果是,则将其转换为对应的数字,并将其加到 sum 变量中。

最后,我们在主函数中输出计算得到的和。

请注意,这个解决方案假设输入是有效的,并且字符串中只包含数字字符和非数字字符。如果输入不符合要求,可能会导致输出错误。

第2题:简单密码

Julius Caesar曾经使用过一种很简单的密码。对于明文中的每个字符,将它用它字母表中后5位对应的字符来代替,这样就得到了密文。比如字符A用F来代替。如下是密文和明文中字符的对应关系。 密文 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 明文 V W X Y Z A B C D E F G H I J K L M N O P Q R S T U 你的任务是对给定的密文进行解密得到明文。 你需要注意的是,密文中出现的字母都是大写字母。密文中也包括非字母的字符,对这些字符不用进行解码。
时间限制:1000
内存限制:65536
输入
一行,给出密文,密文不为空,而且其中的字符数不超过200。
输出
输出一行,即密文对应的明文。
样例输入
NS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJX
样例输出
IN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL CAUSES

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

#include <stdio.h>
#include <ctype.h>

void decrypt(char *ciphertext) {
    while (*ciphertext != '\0') {
        if (isalpha(*ciphertext)) {
            if (*ciphertext >= 'F')
                *ciphertext -= 5;
            else
                *ciphertext += 21;
        }
        ciphertext++;
    }
}

int main() {
    char ciphertext[201];
    fgets(ciphertext, sizeof(ciphertext), stdin);

    decrypt(ciphertext);

    printf("%s\n", ciphertext);

    return 0;
}

你可以将上述代码保存为一个名为 “decrypt.c” 的文件,并使用C编译器进行编译和运行。在输入密文后,程序将解密得到明文并输出。

decrypt 函数中,我们使用了一个指针来遍历密文字符串。对于每个字符,我们首先检查它是否是字母。如果是字母,我们进行解密操作。

根据题目要求,我们将字母表中的字符向后移动5位来进行解密。如果字符大于等于 ‘F’,我们将其减去5来得到对应的明文字符。否则,我们将其加上21(26-5)来得到对应的明文字符。

最后,我们在主函数中读取输入的密文,并调用 decrypt 函数进行解密操作。然后,我们输出解密后的明文。

请注意,这个解决方案假设输入是有效的,并且密文中只包含大写字母和非字母字符。如果输入不符合要求,可能会导致输出错误。

第3题:进阶的卡莎

虚空之女·卡莎考入了战斗学院,她的父亲虚空行者·卡萨丁要检查她的考试成绩。已知卡莎一段时间内的成绩序列,请你帮卡萨丁计算卡莎在这段时间内最长的成绩连续上升(相等不算做连续上升)的长度。
例如,给出卡莎的成绩序列是85 90 80 85 90 95 95 80 75 75,其中连续上升序列包括“85 90”和“80 85 90 95”两组,后者是最长的连续上升成绩序列(相等不算做连续上升),应该输出后者的长度4。
时间限制:1000
内存限制:65536
输入
输入的第一行是序列的长度N(1 <= N <= 100)。 第二行给出序列中的N个整数,这些整数的取值范围都在0到100。
输出
最长的成绩连续上升的长度(相等不算做连续上升)。
样例输入
10
85 90 80 85 90 95 95 80 75 75
样例输出
4

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

#include <stdio.h>

int longestIncreasingSequence(int grades[], int length) {
    int maxLen = 0;
    int currentLen = 1;

    for (int i = 1; i < length; i++) {
        if (grades[i] > grades[i - 1]) {
            currentLen++;
        } else {
            if (currentLen > maxLen) {
                maxLen = currentLen;
            }
            currentLen = 1;
        }
    }

    if (currentLen > maxLen) {
        maxLen = currentLen;
    }

    return maxLen;
}

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

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

    int result = longestIncreasingSequence(grades, length);
    printf("%d\n", result);

    return 0;
}

你可以将上述代码保存为一个名为 “longest_sequence.c” 的文件,并使用C编译器进行编译和运行。在输入成绩序列后,程序将计算最长的连续上升成绩序列的长度,并输出结果。

longestIncreasingSequence 函数中,我们使用一个循环遍历成绩数组。对于每个成绩,我们检查它是否大于前一个成绩。如果是,则当前连续上升序列的长度加1;否则,我们将当前连续上升序列的长度与最大长度进行比较,并更新最大长度为较大的值,然后将当前连续上升序列的长度重置为1。

最后,我们在主函数中首先读取输入的序列长度,并使用一个循环读取序列中的整数。

然后,我们调用 longestIncreasingSequence 函数来计算最长的连续上升成绩序列的长度。在该函数中,我们传入成绩数组和数组长度作为参数。

最后,我们在主函数中输出计算得到的最长连续上升序列的长度。

请注意,这个解决方案假设输入是有效的,并且成绩序列中的整数取值范围在0到100之间。如果输入不符合要求,可能会导致输出错误。

第4题:合影效果

小云和朋友们去爬香山,为美丽的景色所陶醉,想合影留念。如果他们站成一排,男生全部在左(从拍照者的角度),并按照从矮到高的顺序从左到右排,女生全部在右,并按照从高到矮的顺序从左到右排,请问他们合影的效果是什么样的(所有人的身高都不同)?
时间限制:1000
内存限制:65536
输入
第一行是人数n(2 <= n <= 40,且至少有1个男生和1个女生)。 后面紧跟n行,每行输入一个人的性别(男male或女female)和身高(浮点数,单位米),两个数据之间以空格分隔。
输出
n个浮点数,模拟站好队后,拍照者眼中从左到右每个人的身高。每个浮点数需保留到小数点后2位,相邻两个数之间用单个空格隔开。
样例输入
6
male 1.72
male 1.78
female 1.61
male 1.65
female 1.70
female 1.56
样例输出
1.65 1.72 1.78 1.70 1.61 1.56

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

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

// 定义一个人的结构体
typedef struct {
    char gender[10];
    float height;
} Person;

// 比较函数,用于排序
int compare(const void *a, const void *b) {
    const Person *person1 = (const Person *)a;
    const Person *person2 = (const Person *)b;

    // 如果是男生,按身高从矮到高排序
    if (strcmp(person1->gender, "male") == 0) {
        if (strcmp(person2->gender, "male") == 0) {
            return person1->height - person2->height;
        } else {
            return -1;  // 男生排在前面
        }
    }
    // 如果是女生,按身高从高到矮排序
    else {
        if (strcmp(person2->gender, "female") == 0) {
            return person2->height - person1->height;
        } else {
            return 1;  // 女生排在后面
        }
    }
}

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

    Person *people = (Person *)malloc(n * sizeof(Person));

    // 读取每个人的性别和身高
    for (int i = 0; i < n; i++) {
        char gender[10];
        float height;
        scanf("%s%f", gender, &height);

        strcpy(people[i].gender, gender);
        people[i].height = height;
    }

    // 排序
    qsort(people, n, sizeof(Person), compare);

    // 输出排序后的身高
    for (int i = 0; i < n; i++) {
        printf("%.2f ", people[i].height);
    }
    printf("\n");

    free(people);

    return 0;
}

你可以将上述代码保存为一个名为 “photo_effect.c” 的文件,并使用C编译器进行编译和运行。在输入人数以及每个人的性别和身高后,程序将模拟站好队后,以拍照者眼中从左到右的顺序输出每个人的身高。

首先,我们定义了一个名为 Person 的结构体,用于表示每个人的性别和身高。

然后,我们使用 malloc 动态分配了一个 Person 数组,大小为输入的人数 n

接下来,我们使用一个循环读取每个人的性别和身高,并将其存储在 people 数组中。

然后,我们使用 qsort 函数对 people 数组进行排序,使用自定义的 compare 函数作为比较函数。在比较函数中,我们根据性别和身高进行排序,男生按身高从矮到高排序,女生按身高从高到矮排序。

最后,我们使用一个循环输出排序后的身高。

请注意,这个解决方案假设输入是有效的,并且至少有一个男生和一个女生。如果输入不符合要求,可能会导致输出错误。

第5题:割圆

本题将实现一个简化版的“割圆”游戏。成功点亮所有灯时,联结第一个和最后一个灯称之为“割线”。
n盏灯环形分布,顺序编号为1到n。灯的初始状态为关闭不亮。假设n为7,则第1号灯与第2、7号灯相邻,第2号灯与第1、3号灯相邻,以此类推。
灯的点亮规则如下:
1、输入m个数,每个数为某个灯的编号,可能重复或只是部分编号;
2、m个数中的第1个数所对应的灯,默认点亮;
3、 如果输入数对应灯的左侧或右侧已被点亮,则点亮自身。否则啥也不做;
4、如果所有的灯都已被点亮,则程序结束,m个数中尚未被处理的数将不再处理;
5、输出第1次和最后一次点亮灯的编号;
6、如果m个数处理完毕尚未点亮所有灯,则输出No。
时间限制:1000
内存限制:131072
输入
第一行2个整数n,m,保证3<=n<=1000,1<=m<=10000。 第二行m个数,每个数都在1到n之间,表示输入序列。
输出
如果完成了“割圆”,则输出两个整数,之间用一个空格隔开,否则输出No。
样例输入
7 10
2 3 1 7 5 6 5 4 4 2
样例输出
2 4
提示
第1个数2,直接被点亮; 第2个数3,3与已亮的2相邻,被点亮; 第3个数1,1与已亮的2相邻,被点亮; 第4个数7,7与已亮的1相邻,被点亮; 第5个数5,5与4和6相邻,但4和6都没亮,什么都不做; 第6个数6,6与已亮的7相邻,被点亮; 第7个数5,5与已亮的6相邻,被点亮; 第8个数4,4与已亮的5相邻,被点亮; 此时,所有的数都被点亮,第1个点亮的是2,最后点亮的是4。

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

#include <stdio.h>
#include <stdbool.h>

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

    bool lights[n + 1];
    for (int i = 1; i <= n; i++) {
        lights[i] = false;
    }

    int firstLit = 0;
    int lastLit = 0;

    for (int i = 0; i < m; i++) {
        int num;
        scanf("%d", &num);

        if (!lights[num]) {
            lights[num] = true;
            if (firstLit == 0) {
                firstLit = num;
            }
            lastLit = num;
        }

        if (i == m - 1 && lastLit != num) {
            printf("No\n");
            return 0;
        }

        if (lights[num % n + 1] || lights[(num - 2 + n) % n + 1]) {
            continue;
        }
    }

    if (firstLit != 0 && lastLit != 0) {
        printf("%d %d\n", firstLit, lastLit);
    } else {
        printf("No\n");
    }

    return 0;
}

你可以将上述代码保存为一个名为 “circle_cut.c” 的文件,并使用C编译器进行编译和运行。在输入灯的数量 n、输入序列长度 m 和每个数对应的灯的编号后,程序将模拟点亮灯的过程,并输出第一次和最后一次点亮的灯的编号。

首先,我们定义了一个布尔数组 lights,用于表示每个灯的状态,初始状态都为关闭。

然后,我们使用一个循环读取输入序列中的每个数 num

如果 num 对应的灯还没有被点亮,我们将其点亮,并更新 firstLitlastLit 的值。

如果 lastLit 与当前的 num 不相等,并且已经处理完输入序列但最后一个数没有被点亮,那么输出 “No”。

如果 num 对应的灯的左侧或右侧已经被点亮,我们继续处理下一个数。

最后,如果 firstLitlastLit 的值都不为0,那么输出第一次和最后一次点亮的灯的编号;否则,输出 “No”。

请注意,这个解决方案假设输入是有效的,并且输入序列中的数都在1到n之间。如果输入不符合要求,可能会导致输出错误。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法通关村第十关 | 数组中第k个最大元素

1.数组中第k大的数字 题目&#xff1a; LeetCode&#xff1a;数组中的第k个最大元素&#xff0c;给定整数数组nums和整数k&#xff0c;请返回数组中第k个最大的元素&#xff0c;请注意&#xff0c;你需要找的是数组排序后第k个最大的元素&#xff0c;而不是第k个不同的元素。 运…

springBoot是如何实现自动装配的

目录 1 什么是自动装配 2 Spring自动装配原理 2.1 SpringBootConfiguration ​编辑 2.2 EnableAutoConfiguration 2.2.1 AutoConfigurationPackage 2.2.2 Import({AutoConfigurationImportSelector.class}) 2.3 ComponentScan 1 什么是自动装配 自动装配就是将官方写好的的…

企业数据库遭到360后缀勒索病毒攻击,360勒索病毒解密

在当今数字化时代&#xff0c;企业的数据安全变得尤为重要。随着数字化办公的推进&#xff0c;企业的生产运行效率得到了很大提升&#xff0c;然而针对网络安全威胁&#xff0c;企业也开始慢慢引起重视。近期&#xff0c;我们收到很多企业的求助&#xff0c;企业的服务器遭到了…

Node.js学习笔记-04

这第九章也是个大重点 九、玩转进程 Node在选型时决定在V8引擎之上构建&#xff0c;也就意味着它的模型与浏览器类似。 本章关于进程的介绍和讨论将会解决如下两个问题&#xff1a; 单进程单线程并非完美&#xff0c;如今CPU基本均是多核的&#xff0c;真正的服务器&#xf…

如何使用CSS实现一个平滑过渡效果?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用CSS实现平滑过渡效果⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚…

如遭遇DDoS等攻击会对企业和个人造成严重影响,包括以下

1. 服务不可用&#xff1a;正常用户无法访问目标服务器&#xff0c;导致业务中断&#xff0c;影响用户体验。 2. 数据泄露&#xff1a;攻击者可能会在攻击过程中窃取用户数据&#xff0c;导致隐私泄露和财产损失。 3. 经济损失&#xff1a;由于服务中断&#xff0c;企业可能遭受…

期权就是股指期货吗,哪个好做一点?

近年来&#xff0c;场内ETF期权产品不断扩大&#xff0c;越来越多的投资者有投资期权的想法。当我们看到期权时&#xff0c;我们会不知不觉地想到期货&#xff0c;虽然期货与期权只有一个字的区别&#xff0c;但实际上有很大的不同&#xff0c;那么期权就是股指期货吗&#xff…

关于小程序收集用户手机号行为的规范

手机号在日常生活中被广泛使用&#xff0c;是重要的用户个人信息&#xff0c;小程序开发者应在用户明确同意的前提下&#xff0c;依法合规地处理用户的手机号信息。 而部分开发者在处理用户手机号过程中&#xff0c;存在不规范收集行为&#xff0c;影响了用户的正常使用体验&a…

ElasticSearch-安装部署全过程

本文已收录于专栏 《中间件合集》 目录 概念说明什么是ElasticSearch什么是Kibana什么是RESTful API 提供服务安装过程安装ElasticSearch1.下载ElasticSearch 安装包2.解压安装包3.进入解压之后的文件夹4.创建一个data文件夹用来存储数据5.进入config文件夹编辑elasticsearch.y…

算法通关村第八关——轻松搞定翻转二叉树

二叉树有很多经典算法题&#xff0c;今天我们就来看一下二叉树里的翻转问题。 力扣226,给了一棵二叉树&#xff0c;要将二叉树整体翻转。 分析&#xff1a;观察图中翻转前后的二叉树&#xff0c;我们不难发现&#xff0c;翻转过程中&#xff0c;只需要把每一个节点的左右子节点…

【Unity细节】Unity中的层级LayerMask

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 &#x1f636;‍&#x1f32b;️收录于专栏&#xff1a;unity细节和bug &#x1f636;‍&#x1f32b;️优质专栏 ⭐【…

1849. 将字符串拆分为递减的连续值;1024. 视频拼接;1530. 好叶子节点对的数量

1849. 将字符串拆分为递减的连续值 核心思想:递归回溯题。和842. 将数组拆分成斐波那契序列的代码是差不多的&#xff0c;遇到拆分题首先想的就是dfs(index)表示从index开始拆分是否可以&#xff0c;然后去枚举拆分的end即可&#xff0c;我把这种题目归纳为拆分题&#xff0c;…

leetcode 518. 零钱兑换 II

本题是背包问题系列的完全背包问题&#xff0c;和0-1背包唯一的区别就在于&#xff1a;物品是可以重复选取的。 经过之前背包问题的拷打&#xff0c;本题也是一遍AC了。 接下来将给出二维和一维两种做法。 二维dp数组做法&#xff1a; 本题的背包大小即为题中给出的总金额&am…

“一日之际在于晨”,欢迎莅临WAVE SUMMIT上午场:Arm 虚拟硬件早餐交流会

8月16日&#xff0c;盛夏的北京将迎来第九届WAVE SUMMIT深度学习开发者大会。在峰会主论坛正式开启前&#xff0c;让我们先用一份精美的元气早餐&#xff0c;和一场“Arm虚拟硬件交流会”&#xff0c;唤醒各位开发小伙伴的开发魂&#xff01; 8月16日&#xff0c;WAVE SUMMIT大…

【力扣每日一题】2023.8.18 3n块披萨

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们一个披萨&#xff0c;分成了3n块&#xff0c;每次我们可以选择一块&#xff0c;而我们的两个小伙伴会拿走我们选的披萨的相邻的…

1x1 卷积:解释器

一、说明 在这篇博客中&#xff0c;我们将尝试深入探讨 1x1 卷积操作的概念&#xff0c;该概念出现在 Lin等人 &#xff08;2013&#xff09; 的论文“网络中的网络”和 Szegedy 等人 &#xff08;2014&#xff09; 的论文“Go Deep with Convolutions” 中&#xff0c;该论文提…

工作流自动化:提升效率、节约成本的重要工具

在现代社会中&#xff0c;软件和技术的运用使得我们的日常活动变得更加简单和高效。然而&#xff0c;这些技术也有自身的特点和独特之处。尽管我们使用这些工具来简化工作&#xff0c;但有时仍需要一些人工干预&#xff0c;比如手动数据录入。在工作场所中&#xff0c;手动数据…

Dockerfile概念、镜像原理、制作及案例讲解

1.Docker镜像原理 Linux文件操作系统讲解 2.镜像如何制作 3.Dockerfile概念 Docker网址&#xff1a;https://hub.docker.com 3.1 Dockerfile关键字 4.案例

pytest数据驱动 pandas

pytest数据驱动 pandas 主要过程&#xff1a;用pandas读取excel里面的数据&#xff0c;然后进行百度查询&#xff0c;并断言 pf pd.read_excel(data_py.xlsx, usecols[1,2])print(pf.values)输出&#xff1a;[[‘听妈妈的话’ ‘周杰伦’] [‘遇见’ ‘孙燕姿’] [‘伤心太平…

Linux 修改信号的响应方式

修改信号的响应方式 1.signal()方法介绍&#xff1a; 修改信号的响应方式要用到方法signal()。需要引用头文件signal.h。signal()的原型&#xff1a; typedef重命名了一个函数指针的类型&#xff0c;这个指针的类型为指向一个参数为int返回值为void的函数的指针。这个函数指针…