2024年6月电子学会C++二级真题解析:考点与实战代码

发布时间:2026/10/18 9:12:10
2024年6月电子学会C++二级真题解析:考点与实战代码 前几天有家长找我说孩子准备考电子学会的C二级6月那场考试已经结束了网上搜到的真题解析要么付费、要么拉群、要么讲得云里雾里。我正好这段时间在用C写一个“英语老师小助手”功能很朴素随机点名、统计默写成绩、给单词表去重排序。每天和数组、字符串、结构体这些打交道回头翻二级真题的时候发现好几道题本质上就是这类小需求的简化版。所以这篇就把2024年6月电子学会C二级的真题过一遍。要说明一下题目是根据考生回忆整理的回忆版个别题目的数据范围和描述我做了合理归并但考察的知识点和解题代码是实打实的。全文会把每道题的题目描述、解题思路、参考代码、易错点全部拆开适合正在备考二级的中小学生也适合带编程课的老师以及想在家辅导孩子又不知道从哪下手的家长。1. 二级到底考什么和“英语老师小助手”有什么关系1.1 先搞清楚考点地图再刷题电子学会的青少年等级考试C部分一级考的几乎全是顺序、分支、循环这些最基础的语法能把程序写出来、能跑通就差不多了。但二级明显不一样它默认你已经熟悉了基本语法开始考察你用代码解决实际问题的能力。我梳理了一下二级的核心考点基本是这几块输入输出cin、cout的基本用法包含头文件、格式控制。分支结构if-else、switch嵌套多条件判断。循环结构for、while、do-while循环嵌套。数组一维数组、二维数组的存储和遍历下标越界的坑。字符串string类型的基本操作getline读入字符串分割。结构体用struct组织多条数据数组存对象。简单算法枚举、模拟、计数、求最值、统计。一级只要会写“顺序往下走”的程序二级就要求“按条件跳”“反复循环”“批量处理”。一句话概括一级学语法二级练思维。很多孩子从一级到二级突然觉得难就是因为还停留在“照着样例敲代码”的阶段没有形成“先分析问题、再选数据结构、最后写算法”的思路。1.2 一个英语老师小助手几乎覆盖二级全部考点我为什么强调“英语老师小助手”这件事因为这个小程序本质上就是二级考题的“成年版”。它大概做这几件事用结构体数组存学生姓名和三科默写成绩。按平均分从高到低排序。统计全班平均分、最高分。从名单里随机抽人提问。你看这不就是结构体、数组、循环、字符串处理的全套组合吗2024年6月的二级真题里有好几道题几乎就是把这些需求“简化一下”再出出来。我甚至觉得如果你能独立写出一个这样的“英语老师小助手”二级的编程题基本就稳了。先把这个小需求记在心里下面看真题的时候你会发现题目很眼熟。2. 2024年6月二级真题回忆版与逐题解析2.1 真题1偶数统计与最大偶数题目描述回忆版 第一行输入一个整数n第二行输入n个整数统计其中偶数的个数并输出这些偶数中的最大值。如果这n个数里没有偶数第二行输出-1。样例输入5 1 2 3 4 6样例输出3 6这道题是典型的“循环分支求最值”三件套属于二级考试里的送分题。应对这种题我建议养成一个习惯能边读边处理就不要把数据先存进数组。因为统计偶数个数和求最大值根本不需要回头访问数据读一个处理一个既省空间又省时间。参考代码#include bits/stdc.h using namespace std; int main() { int n, x; cin n; int cnt 0, mx -1; for (int i 0; i n; i) { cin x; if (x % 2 0) { cnt; if (x mx) mx x; } } cout cnt \n; cout mx \n; return 0; }这里有几个细节要注意。第一判断偶数用x % 2 0。有同学习惯写成x % 2 0这是对的但如果写成x % 2 1判断奇数遇到负数就容易出错因为C中负数取模的结果可能是负数比如-3 % 2在多数编译器里结果是-1。所以考试时如果输入可能出现负数判断偶数一定要写x % 2 0。第二mx的初始值设置为-1很关键。因为偶数最小可能是0或者2用-1作为“尚未找到偶数”的标记最后直接输出初始值就是-1完美满足题意。第三输出格式要求两行不要图省事写成cout cnt mx endl;虽然样例看不出问题但评测是按行比对的格式不对就是零分。2.2 真题2统计单词数量与最长单词长度题目描述回忆版 输入一行英文字符串只包含大小写字母和空格单词之间用一个或多个空格分隔。统计这段字符串里有多少个单词并输出最长单词的长度。样例输入I love programming样例输出3 11这道题和英语老师小助手“统计默写单词数量”的需求几乎一模一样。拿到这种题第一反应应该是用getline整行读入再想办法分割单词。参考代码#include bits/stdc.h using namespace std; int main() { string s; getline(cin, s); stringstream ss(s); string word; int cnt 0, maxLen 0; while (ss word) { cnt; int len word.size(); if (len maxLen) maxLen len; } cout cnt maxLen \n; return 0; }这道题最大的坑不是算法而是getline和cin混用的问题。我见过太多考生前面已经有cin n了后面又写getline(cin, s)结果第一行字符串读进来永远是空的。原因很简单cin n读到换行符会停但换行符还残留在输入流里紧接着的getline读到的就是一个空行。解决办法有两个在getline之前调用一次getchar()吃掉残留的换行符或者在读取n之后立刻cin.ignore()。我个人更推荐后者因为getchar()遇到多平台编译环境时行为可能略有差异。另外stringstream的方式对“多个空格分隔”的情况特别友好。哪怕两个单词之间有十个空格ss word也能自动跳过不用自己写复杂的循环去判断空格。头文件方面#include bits/stdc.h已经包含了sstream所以不用担心。2.3 真题3学生成绩统计与最高平均分题目描述回忆版 第一行输入一个整数n表示学生人数。接下来n行每行包含一个学生姓名不含空格以及语文、数学、英语三科成绩。要求输出全班三科成绩的总平均分保留两位小数再输出平均分最高的学生姓名。如果平均分相同输出先出现的那一个。样例输入3 Alice 90 85 92 Bob 88 95 80 Cindy 89 91 94样例输出89.33 Cindy这道题是“结构体数组求最值”的经典组合。二级考试非常喜欢出这类“学生成绩类”题目因为它既贴近校园场景又能把结构体、数组、浮点数处理一次全考到。参考代码#include bits/stdc.h using namespace std; struct Student { string name; int score[3]; }; int main() { Student stu[105]; int n; cin n; double totalScore 0; double bestAvg -1; string bestName; for (int i 0; i n; i) { cin stu[i].name stu[i].score[0] stu[i].score[1] stu[i].score[2]; int sum stu[i].score[0] stu[i].score[1] stu[i].score[2]; totalScore sum; double avg sum / 3.0; if (avg bestAvg) { bestAvg avg; bestName stu[i].name; } } cout fixed setprecision(2) totalScore / (n * 3) \n; cout bestName \n; return 0; }这道题有几个高频丢分点我挨个说一下。最经典的是整数除法精度丢失。求平均分必须写成sum / 3.0如果写成sum / 3两个整数相除会直接截断小数部分结果就不是真正的平均分了。考场上很多人代码逻辑全对就是因为少写了一个小数点平均值算出来差一大截。然后是输出格式。保留两位小数必须用fixed setprecision(2)顺序不能反。setprecision(2)单独用是保留两位有效数字不是两位小数加上fixed才是固定小数位。这个点考试几乎年年有人在这翻车。再说平均分相同的情况。题目要求输出最先出现的那个我们的判断条件用的是if (avg bestAvg)而不是所以后出现的同名平均分不会覆盖之前的结果天然满足题意。如果你写成了遇到并列就会输出最后一个直接丢分。最后说一下数组空间。二级考试的数据范围一般不会太刁钻但保险起见数组尽量开大一点比如Student stu[10005]并且尽量放在全局区。局部数组开太大在Windows环境下可能直接爆栈程序还没跑就崩溃了。2.4 真题4矩阵转置题目描述回忆版 输入两个整数n和m然后输入n行m列的整数矩阵。输出该矩阵的转置矩阵也就是m行n列原矩阵第i行第j列的元素在新矩阵中位于第j行第i列。样例输入2 3 1 2 3 4 5 6样例输出1 4 2 5 3 6矩阵转置这道题考的不是算法而是对二维数组下标关系的理解。二级考试中出现二维数组题几乎必考下标转换所以这道题很有代表性。参考代码#include bits/stdc.h using namespace std; int a[105][105]; int main() { int n, m; cin n m; for (int i 0; i n; i) { for (int j 0; j m; j) { cin a[i][j]; } } for (int j 0; j m; j) { for (int i 0; i n; i) { cout a[i][j] ; } cout \n; } return 0; }这道题的核心就一句话转置就是交换行列下标。原矩阵是n行m列存的时候外层循环i走n、内层j走m输出转置矩阵时要把j放到外层循环i放到内层循环输出a[i][j]而不是a[j][i]。我最想提醒的是不要一上来就想“原地转置”。如果矩阵是方阵原地转置确实可以省一个数组但交换下标时稍不留神就会把已经交换过的元素再换一次结果整个矩阵乱掉。考试就老老实实开一个二维数组存原矩阵然后按列输出既直观又不容易错。还有就是二维数组的声明位置。把int a[105][105]放到main外面、全局变量的位置这是考场上的习惯动作。因为局部数组在栈上分配稍微大一点就容易出问题全局变量则安全得多。另外遍历顺序不要搞反读入一定是行优先输出转置时才改成列优先很多同学代码写反了样例还过不了就是因为自己把行和列搞混了。2.5 真题5文具购买方案数枚举题目描述回忆版 老师手上有S元钱要去买三种文具A、B、C单价分别为a元、b元、c元。三种文具每种至少要买1件要求恰好花完S元。问一共有多少种购买方案。样例输入10 2 3 5样例输出1样例解释S10a2b3c5时只有“A买1件、B买1件、C买1件”这一种方案235刚好等于10。这道题是典型的枚举法二级里最常考的算法就是枚举和模拟。枚举的核心思想很简单把所有可能的情况都试一遍符合条件就计数。听起来笨但它在考试里非常好用。参考代码#include bits/stdc.h using namespace std; int main() { int S, a, b, c; cin S a b c; int ans 0; for (int x 1; x * a S; x) { for (int y 1; x * a y * b S; y) { int rest S - x * a - y * b; if (rest c rest % c 0) { ans; } } } cout ans \n; return 0; }很多人第一次写这题会把条件写成if (rest % c 0)忘了检查rest / c 1也就是rest c。题目要求每种至少买一件如果剩余钱数根本不够买一件C虽然整除但方案不成立就会多算。所以以后凡遇到“至少一件”“不为零”这类字眼一定要警惕边界条件。枚举循环的上界也可以优化一下。比如x的循环条件是x * a S因为要给B和C至少各留一件钱如果写成x * a S最后还要在循环体里做很多无用判断。虽然这道题数据范围小暴力也能过但好的习惯能让你在数据范围突然变大时不至于卡死。如果S和单价数据范围特别大比如S达到一万甚至十万两层枚举可能就超时了。那时候可以考虑只枚举x然后对y的个数或者对剩余钱数做数学推导。但二级考试数据范围一般不会这么大重点还是先把暴力枚举写对写稳。3. 考场实战从审题到调试的时间分配与避坑3.1 拿到试卷先干三件事很多同学拿到题就开始唰唰敲键盘这是考场大忌。我的建议是拿到试卷后先花三五分钟把所有题都读一遍然后做三个判断哪道题最简单先拿分哪道题代码量最大放中间哪道题完全没思路最后再啃。这个策略在考试里非常实用。二级一般就是5道编程题时间不算宽裕如果一上来死磕某道难题后面简单题的分数全丢了那就太亏了。我认识一个A同学平时水平很好就是考试时非要按顺序做结果第二题卡了半小时后面三道简单题时间不够最后只做出来一道半。考试比的不是谁解难题快而是谁总分高。我的顺序一般是先把“统计类”题目做掉因为逻辑简单、代码量小再做“字符串处理”类题目这类题坑多在细节需要耐心最后做“枚举/模拟”类题目这类题需要一点推导放中间或后面都行。3.2 高频易错点速查表有些错误真的年年有人犯。我整理了一个表格备考的时候建议自己对着检查一遍。错误类型典型表现后果解决方案整数除法精度丢失用sum / 3算平均分小数部分被截断结果错至少有一个操作数是小数如sum / 3.0输出格式不符该换行没换行多输出了空格评测机显示格式错误零分严格对照样例行尾空格一般没关系但换行必须有数组越界循环写到i n写成了i n可能读到脏数据或者直接RE下标从0开始上界是n-1getline被跳过cin n后立刻getline字符串读空逻辑错误加cin.ignore()或getchar()吃掉换行结构体数组没开够开了stu[100]输入却有1000人越界访问程序崩溃数据范围不确定时尽量开大并放全局区判断条件漏边界枚举时只判断整除没判断至少1件方案数多算多读题把“至少”“最多”这些字眼划出来忘写return 0;程序末尾没有return 0标准不严的编译器不报错但可能扣分每次写完代码最后补上这份表格建议备考学生考前看一遍比临时翻教材管用得多。3.3 测试样例的“歪招”程序写完、样例也通过了并不代表真的没问题。我强烈建议大家养成三个测试习惯。第一个习惯是“边界值测试”。题目说n不超过10000那就测n1和n10000题目说只有一个小写字母那就测输入是单个字符的情况。很多隐藏问题都是边界条件引起的。第二个习惯是“自己手算额外样例”。不要只满足于题目的样例。比如做统计题你多写一组包含“没有偶数”“单词之间多个空格”“所有学生成绩相同”的数据能提前发现很多逻辑漏洞。第三个习惯是“注释法排查”。如果程序结果不对不要盯着屏幕发呆先在关键位置加cout 中间结果把每一步的变量值打印出来跑一遍就能定位是循环边界错了、判断条件错了还是某个变量被意外覆盖了。排除完再删掉这些调试输出。这个方法听起来土但真的比靠眼睛盯代码高效十倍。4. 从真题回归实战英语老师小助手的完整代码与备考建议4.1 把真题需求缝进真实工具前面我说过英语老师小助手这个工具和二级真题的考点高度重合。这一节我把它的核心骨架写出来大家会发现它就是真题3的“加强版”。参考代码#include bits/stdc.h using namespace std; struct Student { string name; int scores[5]; double avg; }; int main() { Student stu[10005]; int n, m; cin n m; // n个学生m次默写 for (int i 0; i n; i) { cin stu[i].name; int sum 0; for (int j 0; j m; j) { cin stu[i].scores[j]; sum stu[i].scores[j]; } stu[i].avg double(sum) / m; } // 按平均分从高到低排序选择排序 for (int i 0; i n - 1; i) { for (int j i 1; j n; j) { if (stu[j].avg stu[i].avg) { swap(stu[i], stu[j]); } } } for (int i 0; i n; i) { cout stu[i].name fixed setprecision(2) stu[i].avg \n; } return 0; }这个程序用到的结构体、二维数组、双重循环、排序、格式化输出全部都是二级考点。如果你能看懂这段代码甚至可以自己扩展一个“随机点名”功能用rand() % n随机选一个下标输出对应的名字。这就是我常说的“以练代学”。只刷题容易忘但如果你脑子里有一个真实项目每做一个功能就对应一个知识点知识就不容易丢。比如单词统计题对应小助手的“输入默写内容”成绩排序题对应小助手的“排名榜”矩阵转置对应小助手的“表格行列转换”。4.2 备考二级的三条实在建议第一条建议每道题先写伪代码再写C。很多孩子喜欢直接开写写一半发现思路不对全部删掉重来浪费时间还打击信心。正确做法是先拿纸笔列出“输入什么、要算什么、输出什么”用中文把逻辑顺序写清楚再翻译成C。二级题目普遍不长这一步花不了三分钟但能让代码一次写对。第二条建议不要盲目追求“高端写法”。二级考试改卷看的是结果和基础代码能力不是看你用了多高级的STL。有的同学非要用map、set、vector结果自己还没掌握写出来一堆编译错误。稳定用数组、结构体、字符串、循环把基础写法练扎实比什么都强。当然如果你对vector很熟练用也没问题关键是选自己最熟悉的方式。第三条建议刷题之后一定要复盘。做完一道题对照标准答案看看自己的代码有哪些可以简化的地方。比如矩阵转置你是不是读入之后就立刻输出了如果这样能行当然可以但很多时候题目会要求先存起来再做二次处理这时候不读入存储直接输出就会出问题。复盘不是浪费时间是让你把一道题的思路变成一类题的思路。最后再说几句我写英语老师小助手的时候最深的体会是编程题目看着五花八门其实翻来覆去就是“存储数据、遍历数据、处理数据、输出数据”这几板斧。二级真题里那一堆统计、排序、枚举的题目本质都是这么一回事。最后再分享一个小技巧考试的时候可以用注释先写框架。// 1. 读入 // 2. 处理 // 3. 输出先把三大块写出来再往里面填代码思路永远不会乱。这个方法我自己用了很多年写任何程序都好使。希望这份真题解析能帮你少走点弯路祝备考二级的同学都能一次通过。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询