2021 年 3 月青少年软编等考 C 语言二级真题解析

2024-05-26 17:44

本文主要是介绍2021 年 3 月青少年软编等考 C 语言二级真题解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • T1. 与指定数字相同的数的个数
    • 思路分析
  • T2. 合法 C 标识符
    • 思路分析
  • T3. 计算鞍点
    • 思路分析
  • T4. 谁考了第 k 名
    • 思路分析
  • T5. 石头剪刀布
    • 思路分析

T1. 与指定数字相同的数的个数

输出一个整数序列中与指定数字相同的数的个数。

时间限制:1 s
内存限制:64 MB

  • 输入
    输入包含三行:
    第一行为 n n n,表示整数序列的长度( n ≤ 100 n \le 100 n100)。
    第二行为 n n n 个整数,整数之间以一个空格分开。
    第三行包含一个整数,为指定的整数 m m m
  • 输出
    输出为 n n n 个数中与 m m m 相同的数的个数。
  • 样例输入
    3
    2 3 2
    2
    
  • 样例输出
    2
    

思路分析

此题考查一维数组的查询操作,属于入门题。

此题只需要将输入的 n n n 个整数存储到数组 a 中,然后在数组 a 中查询 m 出现的次数即可。这里可以设置一个计数器变量 tot 进行统计,注意 tot 需要初始化为 0 0 0。之所以需要用到数组,是因为此题将需要查询的数放在了最后进行输入。

/** Name: T1.cpp* Problem: 与指定数字相同的数的个数* Author: Teacher Gao.* Date&Time: 2024/03/26 02:33*/#include <iostream>using namespace std;int main()
{int n, m, a[105];cin >> n;for (int i = 1; i <= n; i++) cin >> a[i];cin >> m;int tot = 0;for (int i = 1; i <= n; i++) {if (a[i] == m) {tot++;}}cout << tot << endl;return 0;
}

T2. 合法 C 标识符

给定一个不包含空白符的字符串,请判断是否是 C 语言合法的标识符,题目保证这些字符串一定不是 C 语言的保留字。

C 语言标识符要求:

  1. 非保留字。
  2. 只包含字母、数字及下划线(_)。
  3. 不能以数字开头。

时间限制:1 s
内存限制:64 MB

  • 输入
    一行,包含一个字符串,字符串中不包含任何空白字符,且长度不大于 20 20 20
  • 输出
    一行,如果它是 C 语言的合法标识符,则输出 yes,否则输出 no
  • 样例输入
    RKPEGX9R;TWyYcp
    
  • 样例输出
    no
    

思路分析

此题考查字符串的遍历与字符检测,属于入门题。

此题只需要按照题意对输入的字符串进行遍历检测即可。注意,确定一个标识符合法需要将整个标识符字符串遍历结束,确定没有违反规定才可以。而确定一个标识符非法只需要在遍历过程中检测出一个不合法的字符即可。

/** Name: T2.cpp* Problem: 合法 C 标识符* Author: Teacher Gao.* Date&Time: 2024/03/26 02:36*/#include <iostream>
#include <string>using namespace std;int main()
{string str;cin >> str;int len = str.length();for (int i = 0; i < len; i++)str[i] = tolower(str[i]);if ((str[0] < 'a' || 'z' < str[0]) && str[0] != '_') {cout << "no" << endl;return 0;}for (int i = 1; i < len; i++) {if ('0' <= str[i] && str[i] <= '9')continue;if ('a' <= str[i] && str[i] <= 'z')continue;if ('_' == str[i])continue;cout << "no" << endl;return 0;}cout << "yes" << endl;return 0;
}

T3. 计算鞍点

给定一个 5 × 5 5×5 5×5 的矩阵,每行只有一个最大值,每列只有一个最小值,寻找这个矩阵的鞍点。鞍点指的是矩阵中的一个元素,它是所在行的最大值,并且是所在列的最小值。

例如:在下面的例子中,第 4 4 4 行第 1 1 1 列的元素就是鞍点,值为 8 8 8

11  3  5  6  9
12  4  7  8 10
10  5  6  9 118  6  4  7  2
15 10 11 20 25

时间限制:1 s
内存限制:64 MB

  • 输入
    输入包含一个 5 5 5 5 5 5 列的矩阵。
  • 输出
    如果存在鞍点,输出鞍点所在的行、列及其值,如果不存在,输出 not found
  • 样例输入
    11  3  5  6  9
    12  4  7  8 10
    10  5  6  9 118  6  4  7  2
    15 10 11 20 25
    
  • 样例输出
    4 1 8
    

思路分析

此题考察二维数组的应用,难度一般。

可以采用标记法,先将每行的最大值进行标记,然后将每列的最小值进行标记。然后检测标记数组,若某个位置被标记了两次,则该位置就是鞍点。

/** Name: T3.cpp* Problem: 计算鞍点* Author: Teacher Gao.* Date&Time: 2024/03/26 02:51*/#include <iostream>using namespace std;int main()
{int n, m;int a[10][10], b[10][10] = {0};for (int i = 1; i <= 5; i++)for (int j = 1; j <= 5; j++)cin >> a[i][j];for (int i = 1; i <= 5; i++) {int tmp = 0, tmpj = 0;for (int j = 1; j <= 5; j++) {if (tmp < a[i][j]) {tmp = a[i][j];tmpj = j;}}b[i][tmpj]++;}for (int j = 1; j <= 5; j++) {int tmp = 1e9, tmpi = 0;for (int i = 1; i <= 5; i++) {if (tmp > a[i][j]) {tmp = a[i][j];tmpi = i;}}b[tmpi][j]++;}for (int i = 1; i <= 5; i++) {for (int j = 1; j <= 5; j++) {if (2 == b[i][j]) {cout << i << " " << j << " " << a[i][j] << endl;return 0;}}}cout << "not found";return 0;
}

T4. 谁考了第 k 名

在一次考试中,每个学生的成绩都不相同,现知道了每个学生的学号和成绩,求考第 k k k 名学生的学号和成绩。

时间限制:1 s
内存限制:64 MB

  • 输入
    第一行有两个整数,分别是学生的人数 n n n,所求的目标名次 k k k 1 ≤ k ≤ n ≤ 100 1 \le k \le n \le 100 1kn100
    其后有 n n n 行数据,每行包括一个学号(整数)和一个成绩(浮点数),中间用一个空格分隔。
  • 输出
    输出第 k k k 名学生的学号和成绩,中间用空格分隔。请用 %g 输出成绩。
  • 样例输入
    5 3
    90788001 67.8
    90788002 90.3
    90788003 61
    90788004 68.4
    90788005 73.9
    
  • 样例输出
    90788004 68.4
    

思路分析

此题考察排序算法,难度一般。

由于数据量不大,可以采用任意 O ( n 2 ) O(n^2) O(n2) 的排序算法,更好的方法是采用结构体排序,结合 sort 函数来使用。由于大纲描述较为模糊,并未明确表示二级考察结构体,在六级中提到 “掌握数据结构及结构的概念”,因此这里并没有采用结构体排序的写法,而是采用了冒泡排序。

/** Name: T4.cpp* Problem: 谁考了第 k 名* Author: Teacher Gao.* Date&Time: 2024/03/26 03:11*/#include <cstdio>
#include <algorithm>using namespace std;int main()
{int n, k, a[105];double b[105];scanf("%d%d", &n, &k);for (int i = 1; i <= n; i++)scanf("%d%lf", &a[i], &b[i]);for (int i = 1; i < n; i++) {bool flag = true;for (int j = 1; j <= n - i; j++) {if (b[j] < b[j + 1]) {swap(b[j], b[j + 1]);swap(a[j], a[j + 1]);flag = false;}}if (flag) break;}printf("%d %g", a[k], b[k]);return 0;
}

T5. 石头剪刀布

石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。

一天,小 A A A 和小 B B B 正好在玩石头剪刀布。已知他们的出拳都是有周期性规律的,比如:“石头 - 布 - 石头 - 剪刀 - 石头 - 布 - 石头 - 剪刀 . . . ... ...”,就是以 “石头 - 布 - 石头 - 剪刀” 为周期不断循环的。请问,小 A A A 和小 B B B 比了 n n n 轮之后,谁赢的轮数多?

时间限制:1 s
内存限制:64 MB

  • 输入
    输入包含三行。
    第一行包含三个整数: n , n a , n b n, na, nb n,na,nb,分别表示比了 n n n 轮,小 A A A 出拳的周期长度,小 B B B 出拳的周期长度。 0 < n , n a , n b < 100 0 < n, na, nb < 100 0<n,na,nb<100
    第二行包含 n a na na 个整数,表示小 A A A 出拳的规律。
    第三行包含 n b nb nb 个整数,表示小 B B B 出拳的规律。
    其中, 0 0 0 表示 “石头”, 2 2 2 表示 “剪刀”, 5 5 5 表示 “布”。相邻两个整数之间用单个空格隔开。
  • 输出
    输出一行,如果小 A A A 赢的轮数多,输出 A;如果小 B B B 赢的轮数多,输出 B;如果两人打平,输出 draw
  • 样例输入
    10 3 4
    0 2 5
    0 5 0 2
    
  • 样例输出
    A
    
  • 提示
    对于样例数据,猜拳过程为:
    A: 0 2 5 0 2 5 0 2 5 0
    B: 0 5 0 2 0 5 0 2 0 5
    

A A A 赢了 4 4 4 轮, B B B 赢了 2 2 2 轮,双方打平 4 4 4 轮,所以 A A A 赢的轮数多。

思路分析

此题考察数组的灵活应用,难度一般。

可以在输入结束后分别将 a[]b[] 按照给定出拳规律重复存储,直到存储够 n n n 项为止,然后依次对比每一次出拳,进而统计出获胜者。

也可以不进行重复存储,直接用下标对出拳周期 n a na na n b nb nb 分别取余,得到对应的出拳结果。需要注意的是,这种方法需要将出拳规律存储在下标 0 ∼ n a − 1 0 \sim na-1 0na1 0 ∼ n b − 1 0 \sim nb-1 0nb1 范围内。

至于比较出拳结果,可以封装成函数,使得逻辑结构更清晰。当函数返回 0 0 0 时表示平局; − 1 -1 1 表示小 A A A 负; 1 1 1 表示小 A A A 胜。在主函数内将该函数的返回值进行累加,若总数为正,则小 A A A 胜;总数为负,表示小 B B B 胜;否则表示平局。

/** Name: T5.cpp* Problem: 石头剪刀布* Author: Teacher Gao.* Date&Time: 2024/05/26 15:42*/#include <iostream>using namespace std;int check(int a, int b)
{if (a == b) return 0;if (a == 2 && b == 0) return -1;if (a == 5 && b == 2) return -1;if (a == 0 && b == 5) return -1;return 1;
}int main()
{int n, na, nb, tot = 0;int a[105], b[105];cin >> n >> na >> nb;for (int i = 0; i < na; i++) cin >> a[i];for (int i = 0; i < nb; i++) cin >> b[i];for (int i = 0; i < n; i++)tot += check(a[i%na], b[i%nb]);if (tot > 0) cout << 'A' << endl;else if (tot < 0) cout << 'B' << endl;else cout << "draw" << endl;return 0;
}

这篇关于2021 年 3 月青少年软编等考 C 语言二级真题解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1005151

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Java Scanner类解析与实战教程

《JavaScanner类解析与实战教程》JavaScanner类(java.util包)是文本输入解析工具,支持基本类型和字符串读取,基于Readable接口与正则分隔符实现,适用于控制台、文件输... 目录一、核心设计与工作原理1.底层依赖2.解析机制A.核心逻辑基于分隔符(delimiter)和模式匹