📌一、单选题(每题2分,共30分)
第 1 题 答案:B
考点 :计算机硬件核心功能辨析
解析 :飞行控制系统的 “判断” 本质是逻辑运算与决策执行,核心硬件功能分工如下:
- A. 辐射传感器:仅负责采集太阳辐射信号,无运算和判断能力,仅为数据输入源;
- B. 处理器(CPU):作为硬件核心,承担逻辑判断、数据处理和指令执行功能,符合 “执行判断” 的核心需求;
- C. 内存单元:仅用于临时存储数据和指令,不具备运算或判断逻辑;
- D. 输出设备:用于呈现处理结果(如控制指令、告警信息),不参与判断过程。
结论 :只有处理器能执行判断操作,故选 B。
第 2 题 答案:A
考点 :C++ 语法规范(字符有效性)
解析 :“Invalid Character” 错误的核心是代码中存在编译器无法识别的字符,逐一分析选项:
- A. C++ 语法要求所有标点符号必须为英文半角,中文逗号(,)属于无效字符,会直接触发该错误,是最常见原因;
- B. C++ 支持逗号表达式,允许一行内多个赋值语句(如
a=3,b=4),无需拆分,该选项错误; - C. 未保存文件会导致 “文件未找到” 类错误,而非 “无效字符” 错误,逻辑无关;
- D.
cout语句的分行与否不影响编译,C++ 编译器会忽略空格和换行符(语法允许的范围内),该选项错误。
结论 :错误原因是中文逗号,故选 A。
第 3 题 答案:A
考点 :C++ 变量命名规则(核心规则:关键字不可用、首字符规则、字符组成规则)
解析 :逐一验证选项:
- A.
for是 C++ 循环关键字(保留字),关键字的作用是定义语言语法结构,禁止作为变量名,该选项正确; - B. C++ 变量名首字符允许是英文字母或下划线(
_),_tnt首字符为下划线,符合命名规则,可作为变量名,该选项错误; - C. 变量名末尾允许是下划线,
_tnt_的组成字符均为合法字符(下划线、字母),不存在 “与减号混淆” 的语法限制,该选项错误; - D.
printf是 C/C++ 标准库函数名(非关键字),虽语法允许作为变量名,但违反编程规范(会导致函数调用冲突),且选项中 “printf 是关键字” 的表述错误,故该选项错误。
结论 :只有 A 选项符合命名规则,故选 A。
第 4 题 答案:C
考点 :逗号表达式的执行规则(从左到右执行,结果为最后一个表达式的值)
解析 :分步拆解表达式(X=3, X++, ++X):
- 第一步
X=3:赋值操作,X 的值变为 3; - 第二步
X++:后置自增,先使用当前值(3),再自增,执行后 X 的值变为 4; - 第三步
++X:前置自增,先自增(X 变为 5),再使用,该表达式结果为 5;
逗号表达式的最终结果取最后一个表达式的值(5),故cout输出 5。
结论 :选 C。
第 4 题 答案:B
考点 :算术运算符优先级(%、*优先级高于+,同级运算符从左到右执行)
解析 :按优先级分步计算:
- 先执行乘法和取余(同级,左到右):
3*4=12,再计算12%5(取余运算:12 除以 5 商 2 余 2),结果为 2; - 再执行加法:
2+2=4。
结论 :表达式结果为 4,故选 B。
第 6 题 答案:A
考点 :赋值语句的右结合性(赋值运算符=从右到左执行)
解析 :拆解代码b = a = 4:
- 赋值语句右结合,先执行右侧
a=4,此时变量a的值变为 4; - 再执行左侧
b=a,将a的当前值(4)赋给b,此时b的值为 4;
最终a=4、b=4,printf输出 “4 4”。
结论 :选 A。
第 7 题 答案:C
考点 :printf格式控制符(%%的转义规则、参数匹配)
解析 :核心知识点:printf中%%是输出单个%的转义写法(因为%本身是格式符起始标志,需转义),具体分析:
- 代码中格式串为
"%%(N+M)=%d",其中:
%%转义后输出一个%;(N+M)为普通字符串,直接原样输出;%d对应一个整型参数(N+M);
- 输入
N=10、M=20,则N+M=30,格式串与参数结合后输出%(N+M)=30; - 多余的
int(N+M)参数不会影响输出(printf会忽略格式串未匹配的多余参数)。
结论 :输出结果为%(N+M)=30,故选 C。
第 8 题 答案:A
考点 :规律周期问题(数字序列周期识别)
解析 :第一步先明确数字序列规律:
- 序列:1 2 3 2 1 2 3 2 1 2 3 2…,核心周期为 4(1→2→3→2 为一个完整周期);
- 第 N 位数字与周期的关系(N 从 1 开始):
| N | N%4 | 对应数字 |
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 3 | 3 |
| 4 | 0 | 2 |
| 5 | 1 | 1 |
| 6 | 2 | 2 |
- 代码逻辑:
M != 0时输出 M,否则输出 2,完全匹配N%4的结果(余数 0 对应输出 2,非 0 对应余数本身); - 其他选项验证:
- B.
N/4(整数除法):如 N=4 时结果为 1,与序列第 4 位数字 2 不符; - C.
N%3:周期错误(序列周期为 4,非 3),如 N=4 时4%3=1,对应数字 1,与实际第 4 位数字 2 不符; - D.
N/3:整数除法结果与序列无对应关系,如 N=3 时结果为 1,与实际数字 3 不符。
结论 :应填入N%4,故选 A。
第 9 题 答案:D
考点 :for 循环执行逻辑(循环体范围、变量自增时机)
解析 :首先明确代码结构(循环体无大括号时,仅紧跟的第一行属于循环体):
int i, tnt = 0;
for (i = 0; i < 100; i++)
tnt += 1;
cout << tnt << ' ' << i;
分步分析:
- 循环条件:
i从 0到 99(共 100 次循环,因为i<100,当i=99时执行最后一次循环,之后i++变为 100,循环终止); - 循环体执行:每次循环tnt执行+1操作;
- 循环终止后:输出tnt和i的值,执行100次后,tnt的值变为100,i的值变为100(循环终止时
i的值为 100,但最后一次循环的i为 99)最终输出结果为100100,故选 D。
第 10 题 答案:B
考点 :for 循环参数修改影响、赋值运算符等价性
解析 :逐一分析选项:
- A. 原循环
i=1,i<10,i+=2:i取值为 1、3、5、7、9(共 5 次);改为i<11后,i仍取 1、3、5、7、9(因i+=2,下一个值为 11,不满足i<11),循环次数和i取值完全相同,结果一致,该选项正确; - B. 原循环
i=1:i为奇数(1、3、5、7、9),tnt累加奇数和;改为i=0后,i取值为 0、2、4、6、8(偶数),tnt累加偶数和,结果不同,该选项错误; - C.
tnt += i是tnt = tnt + i的简写形式,语法完全等价,该选项正确; - D. 加法满足交换律,
tnt + i与i + tnt结果相同,故tnt += i与tnt = i + tnt效果一致,该选项正确。
结论 :错误选项为 B,故选 B。
第 11 题 答案:C
考点 :for 循环 + continue 语句(continue 的作用:跳过当前循环后续代码,进入下一次循环)
解析 :拆解代码:
int i;
for (i = 10; i < 100; i += 10) { // i取值:10、20、...、90(共9次)
if (i % 10 == 0)
continue; // 跳过后续printf,进入下一次循环
printf("%d#", i);
}
if (i >= 100) printf("%d END", i); // 循环终止时i=100,满足条件
关键分析:
- 所有
i的取值(10、20、…、90)均满足i%10==0,每次循环都会执行continue,跳过printf,故循环体内无输出; - 循环终止时,
i经过最后一次i+=10变为 100(满足i>=100),执行末尾printf,输出 “100 END”。
结论 :输出结果为 “100 END”,故选 C。
第 12 题 答案:A
考点 :迭代算法(辗转相减法,求最大公约数的核心逻辑)
解析 :题目核心逻辑:“两数不等时,大数减小数,用结果与小数组成新数,重复至两数相等”,本质是辗转相减法的简化形式:
- 当
N>M时,大数是N,需执行N = N - M(用大数减小数,得到新的N); - 当
M>N时,大数是M,需执行M = M - N(用大数减小数,得到新的M);
逐一验证选项:
- A. 符合 “大数减小数” 的逻辑,
N>M时N=N-M,否则M=M-N,正确; - B. 逻辑颠倒,
N>M时执行M=M-N会导致小数减小数,不符合规则,错误; - C. 赋值语句逻辑混乱(
M=N-M后再N=M-N会导致数据覆盖错误),无法实现迭代,错误; - D. 是交换语句(
N,M=M,N等价于交换N和M),未执行 “大数减小数” 的核心操作,错误。
结论 :选 A。
第 13 题 答案:D
考点 :数位判断逻辑(提取个位 + 整除判断)
解析 :题目定义 “漂亮数”:能被 3 整除,或某一位能被 3 整除。代码逻辑:
- 先判断
N%3==0(能被 3 整除),若成立则为漂亮数; - 否则,遍历
N的每一位,判断是否有位能被 3 整除(核心逻辑在 L1 行)。
关键分析:
- 提取个位的方法:
N%10(取余 10 得到当前个位数字); - 判断个位能被 3 整除:
(N%10)%3 == 0(个位数字对 3 取余为 0,即能被 3 整除);
逐一验证选项:
- A.
N%10==0:判断个位是否为 0,与 “能被 3 整除” 无关,错误; - B.
N%3%10==0:逻辑错误(N%3是N对 3 的余数,再对 10 取余无意义),错误; - C.
N%10%3:仅计算个位对 3 的余数,未判断是否为 0(非 0 则不满足条件),条件表达式不完整,错误; - D.
N%10%3==0:先取个位,再判断能否被 3 整除,符合逻辑,正确。
结论 :选 D。
第 14 题 答案:C
考点 :因数判断 + 奇数判断(核心条件:i是N的奇因数)
解析 :题目要求 “累加所有奇因数的和,若为 27 的倍数则输出 Y”,核心条件需满足:
i是N的因数:N%i == 0(N能被i整除);i是奇数:i%2 != 0(或简写为i%2,因非 0 值在 C++ 中视为真)。
- A.
(N%i) && (i%2):N%i表示N不能被i整除(非 0),与 “因数” 条件相反,错误; - B.
(N%i==0)&&(i%2==0):i%2==0表示偶数,与 “奇因数” 矛盾,错误; - D.
(N%i)&(i%2==0):既要求N不能被i整除(N%i非 0),又要求i是偶数,完全不符合条件,错误。
结论 :选 C。
第 15 题 答案:C
考点 :四位数数位拆分(千位、中间两位、个位)
解析 :四位数i=abcd(千位a,中间两位bc,个位d),代码逻辑:
a=(tmp=i)/1000:tmp初始为i,除以 1000(整数除法)得到千位a;- 需拆分中间两位
bc:先去掉千位(tmp = tmp - a*1000),再除以 10(bc=tmp/10,整数除法得到前两位,即中间两位); - 个位
d=tmp - bc*10(去掉中间两位后剩余个位)。
逐一验证选项:
- A.
tmp=i/10:i/10得到前三位(如 1234→123),无法去掉千位,错误; - B.
tmp=i%100:i%100得到后两位(如 1234→34),无法提取中间两位,错误; - C.
tmp-=a*1000:等价于tmp = tmp - a*1000,去掉千位(如 1234→234),符合后续bc=tmp/10(234→23)的逻辑,正确; - D.
tmp=i - i%1000:i%1000得到后三位,i - i%1000得到千位(如 1234→1000),无法用于提取中间两位,错误。
结论 :选 C。
📌 二、判断题(每题2分,共20分)
第 1 题 答案:❌
考点 :操作系统与编译器的功能区分
解析 :鸿蒙是操作系统,核心功能是管理硬件资源、调度软件运行、提供系统服务;而 “将源程序翻译成目标程序” 是编译器(如 g++、clang)的功能,操作系统不具备编译能力。
结论 :该说法错误。
第 2 题 答案:❌
考点 :算术表达式计算(*和%优先级)
解析 :分别计算两个表达式:
10*4%6:先算10*4=40,再算40%6=4(40 除以 6 余 4);10*2%3:先算10*2=20,再算20%3=2(20 除以 3 余 2);
两者结果不同(4≠2)。
结论 :该说法错误。
第 3 题 答案:❌
考点 :for 循环 + continue+break 的执行逻辑
解析 :修正代码排版(补全大括号):
int i;
for (i=0; i<10; i++) {
if (i%3==0)
continue; // 跳过else,进入下一次循环
else
break; // 仅当i%3!=0时执行
}
cout << i;
执行过程:
i=0:i%3==0,执行continue,跳过 else,i++变为 1;i=1:i%3!=0,执行else中的break,循环终止;
最终i=1,输出 1 而非 0。
结论 :该说法错误。
第 4 题 答案:❌
考点 :for 循环方向对执行结果的影响
解析 :原循环代码:
int tnt = 0;
for (int i = 0; i > -10; i--) { // i从0→-1→-2→...→-9
if (i < 0) i = -i; // 负数转为正数
tnt += i;
}
原循环i的实际取值:0、1、2、…、9(因i=-1时转为 1,i=-2转为 2,直至i=-9转为 9);
改为i<10,i++后,i取值为 0、1、2、…、9,表面取值相同,但循环执行逻辑不同(原循环存在i的反转操作,虽结果可能一致,但执行过程和代码语义不同,且题目明确 “执行结果相同” 的表述错误,因循环变量的变化轨迹不同,属于不同逻辑)。
结论 :该说法错误。
第 5 题 答案:❌
考点 :for 循环体范围 + 变量自增逻辑
解析 :代码排版(循环体无大括号):
int cnt = 0;
for (int i = 0; i < 100; i++)
cout << cnt; // 仅该行属于循环体
cnt += 1; // 循环体外,仅执行1次
执行过程:
- 循环执行 100 次,每次输出
cnt=0(循环体内未修改cnt); - 循环终止后,
cnt自增为 1,不会输出 99。
结论 :该说法错误。
第 6 题 答案:❌
考点 :对称数判断逻辑(核心错误:修改了原数n)
解析 :对称数判断的正确逻辑是 “保存原数→反转数字→比较原数与反转数”,但题目代码中:
while (n != 0)循环中,n不断被n /= 10修改,最终n=0;- 后续判断
n == new_number(new_number是反转后的数),本质是0 == 反转数,只有反转数为 0 时才成立,完全错误(如输入 121,反转后new_number=121,但n=0,判断为不相等)。
结论 :代码逻辑错误,该说法错误。
第 7 题 答案:❌
考点 :for 循环 + 变量累加逻辑
解析 :代码:
int tnt = 0;
for (int i = -100; i < 100; i++)
cout << tnt; // 循环体仅该行,tnt在循环外自增
tnt += i;
执行过程:
- 循环执行 199 次(
i从 – 100 到 99),每次输出tnt=0(循环体内未修改tnt); - 循环终止后,
tnt += i(i=100),tnt=100,但循环体内输出的均为 0,且题目说 “执行后将输出 0”(未明确输出次数,但核心是存在非 0 输出吗?不,循环体内输出的是 0,但题目表述 “执行后将输出 0” 不准确,因循环会输出 199 个 0,且最终tnt=100,但题目核心错误是 “输出 0” 的表述不成立,因代码会输出多个 0,而非单个 0,且逻辑上并非 “仅输出 0” 的核心意图)。
结论 :该说法错误。
第 8 题 答案:❌
考点 :printf格式符%g的特性
解析 :%g是 C++ 中 “自动去除多余小数位” 的格式符,会省略末尾无意义的 0,且默认保留 6 位有效数字(可通过%.ng指定精度)。输出6.14159(6 位有效数字)是%g的正常行为,并非计算机故障或软件问题。
结论 :该说法错误。
第 9 题 答案:❌
考点 :三目运算符的类型转换规则
解析 :C++ 中三目运算符?:的类型转换规则:若两个表达式类型不同,会自动将低精度类型转换为高精度类型(int→double)。题目中1227(int)和12.27(double),1227会自动转为1227.0(double),编译无错误,输出1227.0(或根据输出格式简化)。
结论 :不会报错,该说法错误。
第 10 题 答案:❌
考点 :C++ 关键字识别
解析 :keyword是英文 “关键字” 的含义,但并非 C++ 语言的关键字(C++ 关键字如int、for、if等,是语言内置的语法标识符)。keyword仅为普通英文单词,可作为变量名。
结论 :该说法错误。
📌 三、编程题(每题 25 分,共 50 分)
3.1 小杨的爱心快递
考点 :浮点数计算、分支结构(三目运算符)、输入输出格式控制
题目核心逻辑 :
- 计算两种运费:体积运费(
0.5*V)、重量运费(G<300用M,否则用N); - 取两者最小值,保留 1 位小数输出。
正确代码 :
#include <iostream>
#include <cstdio> // 用于scanf/printf(或用iomanip+cout)
using namespace std;
int main() {
double V, G, M, N;
// 输入4个浮点数(题目输入格式为四行,每行一个,scanf可忽略换行)
scanf("%lf%lf%lf%lf", &V, &G, &M, &N);
double price_volume = 0.5 * V; // 体积运费
double price_weight = (G < 300) ? M : N; // 重量运费
double result = (price_volume < price_weight) ? price_volume : price_weight; // 取最小值
printf("%.1f\n", result); // 保留1位小数输出
return 0;
}
代码解析 :
- 输入:
scanf("%lf", &var)用于读取double类型(%lf是double的输入格式符); - 体积运费:直接按公式
0.5*V计算,等价于V/2.0; - 重量运费:用三目运算符简化分支判断,比
if-else更简洁; - 输出:
printf("%.1f", result)确保输出 1 位小数,符合题目要求。
易错点 :
- 浮点数输入用
%lf,输出用%f(double和float在输出时均可用%f,但输入必须区分%lf和%f); - 不要混淆
M和N的适用条件(G<300用M,G≥300用N)。
3.2 手机电量显示
考点 :多组输入、分支结构(if-else if-else)
题目核心逻辑 :
- 读取数据组数
T; - 每组数据读取电量
P,按条件输出:
P≤10→ 输出R;10<P≤20→ 输出L;P>20→ 输出P。
正确代码 :
#include <iostream>
using namespace std;
int main() {
int T;
cin >> T; // 读取数据组数
while (T--) { // 循环T次(T自减至0)
int P;
cin >> P; // 读取每组电量
if (P <= 10) {
cout << "R\n";
} else if (P <= 20) { // 隐含条件:P>10(因前一个条件不成立)
cout << "L\n";
} else {
cout << P << '\n';
}
}
return 0;
}
代码解析 :
- 多组输入:
while (T--)是多组输入的简洁写法,等价于for (int i=0; i<T; i++); - 分支判断:
else if (P <=20)隐含P>10(因P≤10已被排除),逻辑严谨; - 输出:每行输出后换行(
\n或endl),符合题目 “每组数据输出一行” 的要求。
易错点 :
- 边界条件:
P=10属于R,P=20属于L,不要颠倒; - 多组输入时忘记循环
T次,或循环结构错误(如while (T)未自减)。









暂无评论内容