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

在这里插入图片描述

第1题:数组逆序重放

将一个数组中的值按逆序重新存放。例如,原来的顺序为8,6,5,4,1。要求改为1,4,5,6,8。
输入
输入为两行:第一行数组中元素的个数n(1
输出
输出为一行:输出逆序后数组的整数,每两个整数之间用空格分隔。
样例输入
5
8 6 5 4 1
样例输出
1 4 5 6 8

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

#include <stdio.h>

void reverseArray(int arr[], int n) {
    int start = 0;
    int end = n - 1;

    while (start < end) {
        int temp = arr[start];
        arr[start] = arr[end];
        arr[end] = temp;

        start++;
        end--;
    }
}

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

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

    reverseArray(arr, n);

    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}

你可以将上述代码保存为一个名为 “reverse_array.c” 的文件,并使用C编译器进行编译和运行。在输入数组元素的个数n以及数组元素后,程序将对数组进行逆序重放,并输出结果。

在主函数中,我们首先读取数组元素的个数n,并定义一个整数数组 arr 来存储数组元素。

接下来,我们使用一个循环来读取数组的元素,并将它们存储在数组 arr 中。

然后,我们调用 reverseArray 函数来逆序重放数组。该函数使用两个指针 startend 来追踪数组的起始和结束位置。我们使用一个循环来交换 startend 指针所指向的元素,并将它们向中间移动,直到 start 不再小于 end

最后,我们使用一个循环来输出逆序后的数组元素,并在相邻元素之间添加空格。

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

第2题:最长最短单词

输入1行句子(不多于200个单词,每个单词长度不超过100),只包含字母、空格和逗号。单词由至少一个连续的字母构成,空格和逗号都是单词间的间隔。
试输出第1个最长的单词和第1个最短单词。
输入
一行句子。
输出
两行输出: 第1行,第一个最长的单词。 第2行,第一个最短的单词。
样例输入
I am studying Programming language C in Peking University
样例输出
Programming
I

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

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

void findLongestShortestWords(char sentence[]) {
    char longestWord[101];
    char shortestWord[101];

    char word[101];
    int wordLength = 0;

    int i = 0;
    while (sentence[i] != '\0') {
        if (sentence[i] != ' ' && sentence[i] != ',') {
            word[wordLength] = sentence[i];
            wordLength++;
        } else {
            word[wordLength] = '\0';

            if (strlen(longestWord) == 0) {
                strcpy(longestWord, word);
            }

            if (strlen(shortestWord) == 0 || strlen(word) < strlen(shortestWord)) {
                strcpy(shortestWord, word);
            }

            wordLength = 0;
        }

        i++;
    }

    word[wordLength] = '\0';

    if (strlen(longestWord) == 0) {
        strcpy(longestWord, word);
    }

    if (strlen(shortestWord) == 0 || strlen(word) < strlen(shortestWord)) {
        strcpy(shortestWord, word);
    }

    printf("%s\n", longestWord);
    printf("%s\n", shortestWord);
}

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

    // 去除末尾的换行符
    if (sentence[strlen(sentence) - 1] == '\n') {
        sentence[strlen(sentence) - 1] = '\0';
    }

    findLongestShortestWords(sentence);

    return 0;
}

你可以将上述代码保存为一个名为 “longest_shortest_words.c” 的文件,并使用C编译器进行编译和运行。在输入句子后,程序将找到第一个最长的单词和第一个最短的单词,并进行输出。

在主函数中,我们首先读取句子,并使用 fgets 函数来获取完整的输入行,包括空格和逗号。

接下来,我们定义两个字符数组 longestWordshortestWord 来存储最长和最短的单词。

然后,我们使用一个循环来遍历句子中的每个字符。如果字符不是空格或逗号,我们将其添加到 word 数组中,并增加 wordLength 的值。当遇到空格或逗号时,我们将 word 数组末尾添加一个空字符 ‘\0’,表示单词的结束。

然后,我们检查当前单词是否是最长的单词。如果 longestWord 数组为空,我们将当前单词复制到 longestWord 数组中。然后,我们检查当前单词是否比 shortestWord 更短。如果 shortestWord 数组为空,或者当前单词长度小于 shortestWord 的长度,我们将当前单词复制到 shortestWord 数组中。

最后,我们再次检查最后一个单词,并输出最长和最短的单词。

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

第3题:计算鞍点

给定一个5*5的矩阵,每行只有一个最大值,每列只有一个最小值,寻找这个矩阵的鞍点。 鞍点指的是矩阵中的一个元素,它是所在行的最大值,并且是所在列的最小值。 例如:在下面的例子中(第4行第1列的元素就是鞍点,值为8 )。
11 3 5 6 9
12 4 7 8 10
10 5 6 9 11
8 6 4 7 2
15 10 11 20 25
输入
输入包含一个5行5列的矩阵
输出
如果存在鞍点,输出鞍点所在的行、列及其值,如果不存在,输出"not found"
样例输入
11 3 5 6 9
12 4 7 8 10
10 5 6 9 11
8 6 4 7 2
15 10 11 20 25
样例输出
4 1 8

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

#include <stdio.h>

#define ROWS 5
#define COLS 5

void findSaddlePoint(int matrix[ROWS][COLS]) {
    for (int i = 0; i < ROWS; i++) {
        int maxVal = matrix[i][0];
        int maxCol = 0;
        for (int j = 1; j < COLS; j++) {
            if (matrix[i][j] > maxVal) {
                maxVal = matrix[i][j];
                maxCol = j;
            }
        }

        int minVal = matrix[0][maxCol];
        int minRow = 0;
        for (int k = 1; k < ROWS; k++) {
            if (matrix[k][maxCol] < minVal) {
                minVal = matrix[k][maxCol];
                minRow = k;
            }
        }

        if (minRow == i) {
            printf("%d %d %d\n", i + 1, maxCol + 1, maxVal);
            return;
        }
    }

    printf("not found\n");
}

int main() {
    int matrix[ROWS][COLS];

    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            scanf("%d", &matrix[i][j]);
        }
    }

    findSaddlePoint(matrix);

    return 0;
}

你可以将上述代码保存为一个名为 “saddle_point.c” 的文件,并使用C编译器进行编译和运行。在输入矩阵后,程序将查找矩阵中的鞍点,并进行输出。

在主函数中,我们首先定义一个5x5的整数矩阵 matrix 来存储输入数据。

然后,我们使用两个嵌套的循环来读取矩阵的每个元素,并将其存储在 matrix 中。

接下来,我们调用 findSaddlePoint 函数来查找鞍点。在该函数中,我们使用两个循环来遍历矩阵的每一行。对于每一行,我们找到最大值及其所在列 maxValmaxCol

然后,我们在该列上查找最小值及其所在行 minValminRow。如果 minRow 等于当前行 i,则说明找到了鞍点,我们将其行号、列号和值进行输出,并使用 return 终止函数。

如果没有找到鞍点,则在循环结束后输出 “not found”。

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

第4题:病人排队

病人登记看病,编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:
1.老年人(年龄 >= 60岁)比非老年人优先看病。
2.老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。
3.非老年人按登记的先后顺序看病。
输入
第1行,输入一个小于100的正整数,表示病人的个数; 后面按照病人登记的先后顺序,每行输入一个病人的信息,包括:一个长度小于10的字符串表示病人的ID(每个病人的ID各不相同且只含数字和字母),一个整数表示病人的年龄,中间用单个空格隔开。
输出
按排好的看病顺序输出病人的ID,每行一个。
样例输入
5
021075 40
004003 15
010158 67
021033 75
102012 30
样例输出
021033
010158
021075
004003
102012

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

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

typedef struct {
    char id[11];
    int age;
} Patient;

int comparePatient(const void* a, const void* b) {
    const Patient* patientA = (const Patient*)a;
    const Patient* patientB = (const Patient*)b;

    // 老年人优先
    if (patientA->age >= 60 && patientB->age < 60) {
        return -1;
    } else if (patientA->age < 60 && patientB->age >= 60) {
        return 1;
    }

    // 年龄相同,按照登记的先后顺序排序
    if (patientA->age == patientB->age) {
        return strcmp(patientA->id, patientB->id);
    }

    // 老年人按年龄从大到小排序
    return patientB->age - patientA->age;
}

int main() {
    int numPatients;
    scanf("%d", &numPatients);
    getchar();  // 读取换行符

    Patient* patients = (Patient*)malloc(numPatients * sizeof(Patient));

    for (int i = 0; i < numPatients; i++) {
        scanf("%s %d", patients[i].id, &patients[i].age);
        getchar();  // 读取换行符
    }

    // 使用标准库函数qsort进行排序
    qsort(patients, numPatients, sizeof(Patient), comparePatient);

    for (int i = 0; i < numPatients; i++) {
        printf("%s\n", patients[i].id);
    }

    free(patients);

    return 0;
}

你可以将上述代码保存为一个名为 “patient_queue.c” 的文件,并使用C编译器进行编译和运行。在输入病人信息后,程序将按照题目要求对病人进行排序,并按顺序输出病人的ID。

在主函数中,我们首先读取病人的个数,并根据个数动态分配内存来存储病人信息。

然后,使用一个循环读取每个病人的ID和年龄,并存储在 patients 数组中。

接下来,我们使用标准库函数 qsortpatients 数组进行排序。排序时,我们使用自定义的比较函数 comparePatient 进行比较。

comparePatient 函数中,我们首先根据老年人和非老年人的优先级进行比较。如果一个病人是老年人而另一个不是,我们将老年人排在前面。

对于年龄相同的病人,我们按照他们的ID进行字典序比较,并返回比较结果。

对于老年人,我们按照年龄从大到小排序。对于非老年人,我们保留它们的原始顺序。

最后,我们按顺序输出排序后的病人ID。

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

第5题:循环数

若一个n位的数字串满足下述条件,则称其是循环数(cyclic):将这个数字串视为整数(可能带有前导0),并用任意一个 1 到 n 之间(包含1和n)的整数去乘它时, 会得到一个将原数字串首尾相接后,再在某处断开而得到的新数字串所对应的整数。例如,数字 142857 是循环数,因为:
142857 *1 = 142857
142857 *2 = 285714
142857 *3 = 428571
142857 *4 = 571428
142857 *5 = 714285
142857 *6 = 857142。
请写一个程序判断给定的数是否是循环数。
注意:在此题中,输入数字串允许带前导0,且前导0不能被忽略,例如“01”是两位数字串,而“1”是一位数字串。但将数字串转化为整数做乘法运算或比较运算时,可以忽略前导0。
时间限制:10000
内存限制:65536
输入
一行,一个长度在 2 到 60 位之间的数字串。
输出
一个整数,若输入的数字串是循环数,输出1,否则输出0。
样例输入
142857
样例输出
1

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

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

int isCyclicNumber(const char* number) {
    int len = strlen(number);

    for (int i = 1; i <= len; i++) {
        int multiplier = 1;
        int position = 0;
        int isCyclic = 1;

        while (position < len) {
            int digit = number[position] - '0';
            int product = digit * multiplier;

            char productStr[61];
            sprintf(productStr, "%d", product);

            int productLen = strlen(productStr);
            if (position + productLen > len) {
                isCyclic = 0;
                break;
            }

            if (strncmp(number + position, productStr, productLen) != 0) {
                isCyclic = 0;
                break;
            }

            position += productLen;
            multiplier++;
        }

        if (isCyclic) {
            return 1;
        }
    }

    return 0;
}

int main() {
    char number[61];
    scanf("%s", number);

    int result = isCyclicNumber(number);
    printf("%d\n", result);

    return 0;
}

你可以将上述代码保存为一个名为 “cyclic_number.c” 的文件,并使用C编译器进行编译和运行。在输入数字串后,程序将判断该数字串是否是循环数,并输出结果。

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

然后,我们调用 isCyclicNumber 函数来判断该数字串是否是循环数。在该函数中,我们使用一个循环来遍历可能的乘数。对于每个乘数,我们从数字串的第一个位置开始,依次计算乘积并与原数字串进行比较。

首先,我们将当前位置的字符转换为数字,并将其乘以当前乘数。然后,我们将乘积转换为字符串 productStr

如果当前位置加上乘积的长度超过了数字串的总长度,或者当前位置开始的子串与乘积不匹配,那么该数字串不是循环数,我们将 isCyclic 设置为0并跳出循环。

如果所有乘数都能使原数字串首尾相接地生成循环数,那么该数字串是循环数,我们返回1。

最后,我们在主函数中根据返回的结果输出1或0,表示输入数字串是否是循环数。

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

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

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

相关文章

升级STM32电机PID速度闭环编程:从F1到F4的移植技巧与实例解析

引言&#xff1a; 在嵌入式系统开发中&#xff0c;STM32系列微控制器广泛应用于各种应用领域。而对于直流有刷电机的控制&#xff0c;PID速度闭环是一种常用的控制方式。本文将以此为例&#xff0c;探讨如何从STM32F1系列移植到STM32F4系列&#xff0c;并详细介绍HAL库在不同型…

APSIM模型参数优化 批量模拟丨气象数据准备、物候发育和光合生产、物质分配与产量模拟、土壤水分平衡算法、土壤碳氮平衡模块、农田管理模块等

随着数字农业和智慧农业的发展&#xff0c;基于过程的农业生产系统模型在模拟作物对气候变化的响应与适应、农田管理优化、作物品种和株型筛选、农田固碳和温室气体排放等领域扮演着越来越重要的作用。APSIM (Agricultural Production Systems sIMulator)模型是世界知名的作物生…

分类预测 | MATLAB实现GAPSO-LSSVM多输入分类预测

分类预测 | MATLAB实现GAPSO-LSSVM多输入分类预测 目录 分类预测 | MATLAB实现GAPSO-LSSVM多输入分类预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.分类预测 | MATLAB实现GAPSO-LSSVM多输入分类预测 2.代码说明&#xff1a;要求于Matlab 2021版及以上版本。 程序…

使用 Jython 在 Java 中运行 Python

文章目录 使用 Jython 在 Java 中运行 Python创建 Python 代码 安装 Jython 库将 Jython 库与 IDE 链接用 Java 编写 Python 代码并编译它用 Java 编译的用于添加两个数字的 Python 代码用 Java 编译的用于查找月份最后一天的 Python 代码一些用 Java 编译时不运行的 Python 库…

步入React正殿 - React组件设计模式

目录 扩展学习资料 高阶组件 /src/components/hoc/withTooltip.js /src/components/hoc/itemA.jsx /src/components/hoc/itemB.jsx /src/App.js 函数作为子组件【Render pprops】 函数作为子组件 /src/components/rp/itemC.jsx【父组件】 /src/components/rp/withToo…

Java版电子招投标管理系统源码-电子招投标认证服务平台-权威认证 tbms

​ 功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;…

Java进阶篇--数据结构

目录 一.数组&#xff08;Array&#xff09;&#xff1a; 1.1 特点&#xff1a; 1.2 基本操作&#xff1a; 1.3 使用数组的好处包括&#xff1a; 1.4 数组也有一些限制&#xff1a; 二.集合框架&#xff08;Collections Framework&#xff09;&#xff1a; 2.1 列表…

【TA 挖坑02】RayMarching SDF 物体黏合

写在前面 由于实习和忙着论文很久没经营博客了&#xff0c;最近以各种方式收集到了一些想实现的效果&#xff0c;其中一个就是卡通云融合、变大变小、聚散收拢的效果如何实现的问题&#xff0c;这就不得不提搁置了很久的RayMarching... 挖坑&#xff01;整理一下有帮助的文章…

Octree八叉树python

原理 简单示例&#xff1a; 假设我们有以下一组三维点云数据&#xff1a; points [[0.1, 0.1, 0.1],[0.4, 0.1, 0.1],[0.1, 0.4, 0.1],[0.4, 0.4, 0.1],[0.1, 0.1, 0.4],[0.4, 0.1, 0.4],[0.1, 0.4, 0.4],[0.4, 0.4, 0.4], ] 我们可以使用八叉树将这些点云数据存储在三维空…

MATLAB高分辨率图片

把背景调黑&#xff0c;把曲线调黄&#xff0c;把grid调白&#xff0c;调调字体字号的操作 close all a0:0.1:10; noise2*rand(1,length(a)); bsin(a)sin(3*a)noise;plot(a,b,y,linewidth,2); ylim([-3 4]) %y轴范围 set(gca,xgrid,on,ygrid,on,gridlinestyle,-,Grid…

8.13黄金是否进入下行通道?下周开盘如何布局

近期有哪些消息面影响黄金走势&#xff1f;黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周五(8月11日)现货黄金小幅收低&#xff0c;受累于美元走强和美国国债收益率上升&#xff0c;本周录得6月底以来最差单周表现。投资者在评估最新一批通胀报告和消费者信…

【hive】简单介绍hive的几种join

文章目录 前言1. Common Join2. Map Join介绍&#xff1a;使用方法&#xff1a;限制&#xff1a; 3. Bucket Map Join介绍&#xff1a;好处&#xff1a;使用条件&#xff1a;使用方法&#xff1a; 4. Sort Merge Bucket Map Join介绍&#xff1a;如何使用&#xff1a; 5. Skew …

使用 HTML、CSS 和 JavaScript 创建多步骤表单

使用 HTML、CSS 和 JavaScript 创建多步骤表单 为了处理又长又复杂的表单&#xff0c;我们需要将它们分成多个步骤。通过一次只在屏幕上显示一些输入&#xff0c;表单会感觉更容易理解&#xff0c;并防止用户感到被大量的表单字段淹没。 在本文中&#xff0c;我将逐步指导如何…

OSI七层模型及TCP/IP四层模型

目录 OSI七层模型 TCP/IP四层模型 OIS七层模型和TCP/IP模型图 七层详解 两种模型比较 为什么OSI七层体系结构不常用 四层详解 网络为什么要分层&#xff1f; 说说 OSI 七层模型和 TCP/IP 四层模型的关系和区别 OSI七层模型 OSI&#xff08;Open System Interconnect&a…

编译redis-5.0.9报错zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录问题解决

上图 解决&#xff1a; make && make install MALLOClibc原因: 原因是jemalloc重载了Linux下的ANSI C的malloc和free函数。

【Spring Boot】构建RESTful服务 — 实战:实现Web API版本控制

实战&#xff1a;实现Web API版本控制 前面介绍了Spring Boot如何构建RESTful风格的Web应用接口以及使用Swagger生成API的接口文档。如果业务需求变更&#xff0c;Web API功能发生变化时应该如何处理呢&#xff1f;可以通过Web API的版本控制来处理。 1.为什么进行版本控制 …

JVM中对象和GC Root之间的四种引用关系

1. 强引用 只有所有 GC Roots 对象都不通过【强引用】引用该对象&#xff0c;该对象才能被垃圾回收 由GC Root直接new出来的对象是强引用&#xff0c;只有当GC Root不再引用该对象的时候&#xff0c;才会被回收 例子&#xff1a; List<String> list new ArrayList<&…

【STM32】FreeRTOS事件组学习

事件组&#xff08;Event Group&#xff09; 一个任务执行之前需要经过多个条件进行判断&#xff0c;当条件全部满足或多个条件中的某一个条件满足才执行。 实验&#xff1a;创建两个任务&#xff0c;一个事件组&#xff0c;当按键一二三都按过一遍才打印。 实现&#xff1a…

STM32 CubeMX (Freertos任务通信:队列、信号量、互斥量,事件组,任务通知)第二步

STM32 CubeMX STM32 CubeMX ____Freertos任务通信&#xff1a;队列、信号量、互斥量&#xff0c;事件组&#xff0c;任务通知 STM32 CubeMX一、STM32 CubeMX设置时钟配置HAL时基选择TIM1&#xff08;不要选择滴答定时器&#xff1b;滴答定时器留给OS系统做时基&#xff09;使用…

【STM32+ESP8266上云连载①】给ESP8266烧录AT固件

文章目录 一、给NodeMCU烧录固件1.1硬件准备1.2软件准备1.3AT固件下载1.4配置设置1.5开始烧录 二、给ESP8266-01S烧录固件2.1硬件准备2.2AT固件下载2.3连线2.4烧录配置 三、给ESP-12E/F/S单片烧录固件四、指令测试4.1HTTP测试4.2MQTT测试 我在使用ESP8266的时候遇到了一些问题&…