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

相关文章

C语言中联合体union的使用

本文编辑整理自: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=179471 一、前言 “联合体”(union)与“结构体”(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量

解析 XML 和 INI

XML 1.TinyXML库 TinyXML是一个C++的XML解析库  使用介绍: https://www.cnblogs.com/mythou/archive/2011/11/27/2265169.html    使用的时候,只要把 tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.

大语言模型(LLMs)能够进行推理和规划吗?

大语言模型(LLMs),基本上是经过强化训练的 n-gram 模型,它们在网络规模的语言语料库(实际上,可以说是我们文明的知识库)上进行了训练,展现出了一种超乎预期的语言行为,引发了我们的广泛关注。从训练和操作的角度来看,LLMs 可以被认为是一种巨大的、非真实的记忆库,相当于为我们所有人提供了一个外部的系统 1(见图 1)。然而,它们表面上的多功能性让许多研究者好奇,这些模型是否也能在通常需要系

js+css二级导航

效果 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Con

人工和AI大语言模型成本对比 ai语音模型

这里既有AI,又有生活大道理,无数渺小的思考填满了一生。 上一专题搭建了一套GMM-HMM系统,来识别连续0123456789的英文语音。 但若不是仅针对数字,而是所有普通词汇,可能达到十几万个词,解码过程将非常复杂,识别结果组合太多,识别结果不会理想。因此只有声学模型是完全不够的,需要引入语言模型来约束识别结果。让“今天天气很好”的概率高于“今天天汽很好”的概率,得到声学模型概率高,又符合表达

C语言 将“China”译成密码

将“China”译成密码,密码规律是:用原来的字母后面的第4个字母代替原来的字母。例如,字母“A”后面的第4个字母是“E”,用“E”代替“A”。因此,“China”应译为“Glmre”。编译程序用付赋初值的方法使c1,c2,c3,c4,c5这五个变量的值分别为“C”,“h”,“i”,“n”,“a”,经过运算,使c1,c2,c3,c4,c5分别变成“G”,“l”,“m”,“r”,“e”。分别用put

tf.split()函数解析

API原型(TensorFlow 1.8.0): tf.split(     value,     num_or_size_splits,     axis=0,     num=None,     name='split' ) 这个函数是用来切割张量的。输入切割的张量和参数,返回切割的结果。  value传入的就是需要切割的张量。  这个函数有两种切割的方式: 以三个维度的张量为例,比如说一

C语言入门系列:探秘二级指针与多级指针的奇妙世界

文章目录 一,指针的回忆杀1,指针的概念2,指针的声明和赋值3,指针的使用3.1 直接给指针变量赋值3.2 通过*运算符读写指针指向的内存3.2.1 读3.2.2 写 二,二级指针详解1,定义2,示例说明3,二级指针与一级指针、普通变量的关系3.1,与一级指针的关系3.2,与普通变量的关系,示例说明 4,二级指针的常见用途5,二级指针扩展到多级指针 小结 C语言的学习之旅中,二级

3月份目标——刷完乙级真题

https://www.patest.cn/contests/pat-b-practisePAT (Basic Level) Practice (中文) 标号标题通过提交通过率1001害死人不偿命的(3n+1)猜想 (15)31858792260.41002写出这个数 (20)21702664840.331003我要通过!(20)11071447060.251004成绩排名 (20)159644

【LinuxC语言】select轮询

文章目录 前言select函数详解selectfd_set类型一个小问题select函数使用步骤改进服务器代码select服务器示例代码 总结 前言 在Linux C语言编程中,我们经常需要处理多个I/O操作。然而,如果我们为每个I/O操作创建一个线程,那么当I/O操作数量增加时,线程管理将变得复杂且效率低下。这就是我们需要select轮询的地方。select是一种高效的I/