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

news2025/4/6 16:05:45

在这里插入图片描述

第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,表示输入数字串是否是循环数。

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

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

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

相关文章

87-基于stm32单片机粮仓仓库环境温湿度烟雾监测报警系统Proteus仿真+源码

资料编号&#xff1a;087 一&#xff1a;功能介绍&#xff1a; 1、采用stm32单片机OLED显示屏烟雾浓度检测DHT11温湿度电机按键蜂鸣器&#xff0c;制作一个温湿度采集、烟雾浓度采集&#xff0c;OLED显示相关数据&#xff0c; 2、通过按键设置温度上限、烟雾浓度上限&#xff0…

逻辑漏洞合集

0x01 未授权 未授权问题为普通用户登录或没有登录后&#xff0c;拼接js接口&#xff0c;构造报文&#xff0c;越权实现管理员的权限操作。原因&#xff1a;后端没有校验Cookie/Session的身份信息&#xff0c;以至于普通用户的权限可以实现管理员权限的功能。 First webpack打…

dll修复精灵怎么下载,vcruntime140.dll丢失该如何修复

vcruntime140.dll是Microsoft Visual C Redistributable中的一个动态链接库&#xff08;DLL&#xff09;文件。它是一种运行时库&#xff08;Runtime Library&#xff09;&#xff0c;用于支持使用Microsoft Visual C编写的程序的正常运行。作为一个DLL文件&#xff0c;vcrunti…

ModStartCMS v7.0.0 多语言开发优化,多个常用组件升级

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议&#xff0c;免费且不限制商业使用。 功能特性 丰富的模块市…

超越传统测试方法:掌握最新的测试技术和工具

随着科技的不断进步和软件行业的快速发展&#xff0c;传统的测试方法已经无法满足现代软件开发的需求。为了提高测试的效率和准确性&#xff0c;测试人员需要及时掌握最新的测试技术和工具。本文将探讨一些创新的测试技术和工具&#xff0c;帮助测试人员超越传统的测试方法。 首…

Visual Studio 配置远程调试

1.在Visual Studio安装目录中找到远程调试工具(msvsmon.exe)。 2.将x64文件夹压缩成压缩包&#xff0c;然后拷贝到客户机 3.将pdb文件拷贝到客户机上版本对应的文件夹中。 4. 启动Visual Studio开始进行远程调试 选择“调试”> “附加到进程”

p-级数的上界(Upper bound of p-series)

积分判别法-The Integral Test https://math.stackexchange.com/questions/2858067/upper-bound-of-p-series https://courses.lumenlearning.com/calculus2/chapter/the-p-series-and-estimating-series-value/ 两个重要级数&#xff08;p级数和几何级数&#xff09; ht…

探索OLED透明屏方案的设计与应用

OLED透明屏作为一种新兴的显示技术&#xff0c;正逐渐在商业展示、新媒体互动和智能家居等领域展现出广阔的应用前景。 在这篇文章中&#xff0c;尼伽将深入探讨OLED透明屏方案的设计和应用&#xff0c;展示其在提升用户体验和创造商业价值方面的优势。 一、OLED透明屏方案的设…

web前端tips:js继承——组合继承

上篇文章给大家分享了 js继承中的借用构造函数继承 web前端tips&#xff1a;js继承——借用构造函数继承 在借用构造函数继承中&#xff0c;我提到了它的缺点 无法继承父类原型链上的方法和属性&#xff0c;只能继承父类构造函数中的属性和方法 父类的方法无法复用&#xff0…

UE Json Operate 解析嵌套数组

演示如何使用 DTJsonOperate 插件&#xff0c;在蓝图中解析嵌套数组。 比如这个Json {"name": [[[1, 2]],[3, 4],[5, 6]] } 操作演示 最后打印 本功能需要插件支持&#xff0c;插件下载地址。

2023牛客多校第二场 G Link with Centrally Symmetric String(类马拉车)

2023牛客多校第二场 G Link with Centrally Symmetric Strings(类马拉车 最长回文后缀) 题目链接 大意&#xff1a;定义对称回文的回文中心可以是 间隔(偶回文中心) 或者 o / x / s / z (奇回文中心) 五种 &#xff0c; 定义匹配为 b/q d/p n/u o/o x/x s/s z/z 之间相互匹…

nvm安装使用与常见问题

前言 nvm是一个用来进行nodejs多个版本管理和切换的工具。这个工具的使用相当简单和方便&#xff0c;但是没想到我使用的时候却遇到了好些问题&#xff0c;这里记录一下顺便分享。 安装nvm 先去下载地址Releases coreybutler/nvm-windows GitHub下载&#xff0c;建议选择下…

批量记录收支明细,轻松通过收支占比图表轻松分析支出项目占比!

您是否希望更加直观地了解个人或企业的支出项目占比情况&#xff1f;是否想通过图表分析&#xff0c;快速定位支出的主要项目&#xff0c;并做出相应的调整&#xff1f;现在&#xff0c;我们的智能收支分析大师为您提供了一种智能化的解决方案&#xff01;只需几步操作&#xf…

sliver C2 切换会话

使用中发现会话的切换直接输入sessions,显示会话 use 切换到新会话 在测试进程迁移的时候发现命令不好用 多次尝试,没有成功的

骨传导耳机戴久了头疼正常吗?骨传导耳机对健康有影响吗

骨传导耳机戴久了头疼正常吗&#xff1f;骨传导耳机对健康有影响吗 长时间佩戴骨传导耳机可能会引起一些人头疼的不适感&#xff0c;这可能是因为长时间的接触和震动影响了你的感知和舒适度。如果你遇到这样的问题&#xff0c;可以尝试以下几种解决方法&#xff1a; ⑴适当休…

第6章:支持向量机

间隔与支持向量 w为法向量&#xff0c;决定的是超平面的方向。b是偏移项&#xff0c;决定了超平面与原点之间的距离。 为什么最大化间隔&#xff0c;得到的就是最优平面呢&#xff1f; 当超平面没有正确划分正负样本时&#xff0c;几何间隔为负数。几何间隔&#xff0c;各个…

C++学习系列之DLL动态库使用

C学习系列之DLL动态库使用 啰嗦动态库的创建动态库的调用函数生成1.需要头文件函数定义&#xff08;头文件&#xff09;2.需要函数定义&#xff08;函数文件&#xff09;3.动态库中的头文件4.动态库中的主文件5.运行查看是否存在C#的调用的入口点6.C#调用 总结 啰嗦 项目需要&…

HSE是什么,好用的HSE系统推荐

阅读本文您将了解&#xff1a;1、HSE是什么&#xff1b;2、HSE在企业中的作用&#xff1b;3、好用的HSE系统推荐 一、HSE是什么 HSE是"Health, Safety, and Environment"&#xff08;健康、安全和环境&#xff09;的缩写。它指的是一个在工作场所、生产过程和社会活…

已解决:Module‘xxx’存在

1.问题如图&#xff0c;进入项目结构&#xff0c;找到模块检查是否仍有同名文件。 2.选中文件&#xff0c;点“—”号&#xff0c;应用&#xff0c;确定即可 3.重新新建即可成功。

【C语言程序设计】C语言基本数据类型与表达式(思考题)

思考题 1、C语言的主要特点有哪些&#xff1f; ①简单紧凑、灵活方便&#xff0c;②是结构化的语言&#xff0c;③运算符丰富&#xff0c;④是一种高效的语言&#xff0c;⑤可直接对硬件进行操作&#xff0c;⑥具有较好的可移植性。 高效性&#xff1a;C语言是一种高级编程语言…