2025年12月一级真题解析

📌一、单选题(每题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)

  1. 第一步X=3:赋值操作,X 的值变为 3;
  2. 第二步X++:后置自增,先使用当前值(3),再自增,执行后 X 的值变为 4;
  3. 第三步++X:前置自增,先自增(X 变为 5),再使用,该表达式结果为 5;

逗号表达式的最终结果取最后一个表达式的值(5),故cout输出 5。

结论 :选 C。

第 4 题 答案:B

考点 :算术运算符优先级(%*优先级高于+,同级运算符从左到右执行)

解析 :按优先级分步计算:

  1. 先执行乘法和取余(同级,左到右):3*4=12,再计算12%5(取余运算:12 除以 5 商 2 余 2),结果为 2;
  2. 再执行加法:2+2=4

结论 :表达式结果为 4,故选 B。

第 6 题 答案:A

考点 :赋值语句的右结合性(赋值运算符=从右到左执行)

解析 :拆解代码b = a = 4

  1. 赋值语句右结合,先执行右侧a=4,此时变量a的值变为 4;
  2. 再执行左侧b=a,将a的当前值(4)赋给b,此时b的值为 4;

最终a=4b=4printf输出 “4 4”。

结论 :选 A。

第 7 题 答案:C

考点printf格式控制符(%%的转义规则、参数匹配)

解析 :核心知识点:printf%%是输出单个%的转义写法(因为%本身是格式符起始标志,需转义),具体分析:

  • 代码中格式串为"%%(N+M)=%d",其中:
  • %%转义后输出一个%
  • (N+M)为普通字符串,直接原样输出;
  • %d对应一个整型参数(N+M);
  • 输入N=10M=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 开始):
NN%4对应数字
111
222
333
402
511
622
  • 代码逻辑: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;

分步分析:

  1. 循环条件:i从 0到 99(共 100 次循环,因为i<100,当i=99时执行最后一次循环,之后i++变为 100,循环终止);
  2. 循环体执行:每次循环tnt执行+1操作;
  3. 循环终止后:输出tnt和i的值,执行100次后,tnt的值变为100,i的值变为100(循环终止时i的值为 100,但最后一次循环的i为 99)最终输出结果为100 100,故选 D。

第 10 题 答案:B

考点 :for 循环参数修改影响、赋值运算符等价性

解析 :逐一分析选项:

  • A. 原循环i=1,i<10,i+=2i取值为 1、3、5、7、9(共 5 次);改为i<11后,i仍取 1、3、5、7、9(因i+=2,下一个值为 11,不满足i<11),循环次数和i取值完全相同,结果一致,该选项正确;
  • B. 原循环i=1i为奇数(1、3、5、7、9),tnt累加奇数和;改为i=0后,i取值为 0、2、4、6、8(偶数),tnt累加偶数和,结果不同,该选项错误;
  • C. tnt += itnt = tnt + i的简写形式,语法完全等价,该选项正确;
  • D. 加法满足交换律,tnt + ii + tnt结果相同,故tnt += itnt = 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>MN=N-M,否则M=M-N,正确;
  • B. 逻辑颠倒,N>M时执行M=M-N会导致小数减小数,不符合规则,错误;
  • C. 赋值语句逻辑混乱(M=N-M后再N=M-N会导致数据覆盖错误),无法实现迭代,错误;
  • D. 是交换语句(N,M=M,N等价于交换NM),未执行 “大数减小数” 的核心操作,错误。

结论 :选 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%3N对 3 的余数,再对 10 取余无意义),错误;
  • C. N%10%3:仅计算个位对 3 的余数,未判断是否为 0(非 0 则不满足条件),条件表达式不完整,错误;
  • D. N%10%3==0:先取个位,再判断能否被 3 整除,符合逻辑,正确。

结论 :选 D。

第 14 题 答案:C

考点 :因数判断 + 奇数判断(核心条件:iN的奇因数)

解析 :题目要求 “累加所有奇因数的和,若为 27 的倍数则输出 Y”,核心条件需满足:

  1. iN的因数:N%i == 0N能被i整除);
  2. 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)/1000tmp初始为i,除以 1000(整数除法)得到千位a
  • 需拆分中间两位bc:先去掉千位(tmp = tmp - a*1000),再除以 10(bc=tmp/10,整数除法得到前两位,即中间两位);
  • 个位d=tmp - bc*10(去掉中间两位后剩余个位)。

逐一验证选项:

  • A. tmp=i/10i/10得到前三位(如 1234→123),无法去掉千位,错误;
  • B. tmp=i%100i%100得到后两位(如 1234→34),无法提取中间两位,错误;
  • C. tmp-=a*1000:等价于tmp = tmp - a*1000,去掉千位(如 1234→234),符合后续bc=tmp/10(234→23)的逻辑,正确;
  • D. tmp=i - i%1000i%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=0i%3==0,执行continue,跳过 else,i++变为 1;
  • i=1i%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_numbernew_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 += ii=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++ 中三目运算符?:的类型转换规则:若两个表达式类型不同,会自动将低精度类型转换为高精度类型(intdouble)。题目中1227(int)和12.27(double),1227会自动转为1227.0(double),编译无错误,输出1227.0(或根据输出格式简化)。

结论 :不会报错,该说法错误。

第 10 题 答案:❌

考点 :C++ 关键字识别

解析keyword是英文 “关键字” 的含义,但并非 C++ 语言的关键字(C++ 关键字如intforif等,是语言内置的语法标识符)。keyword仅为普通英文单词,可作为变量名。

结论 :该说法错误。

📌 三、编程题(每题 25 分,共 50 分)

3.1 小杨的爱心快递

考点 :浮点数计算、分支结构(三目运算符)、输入输出格式控制

题目核心逻辑

  1. 计算两种运费:体积运费(0.5*V)、重量运费(G<300M,否则用N);
  2. 取两者最小值,保留 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类型(%lfdouble的输入格式符);
  • 体积运费:直接按公式0.5*V计算,等价于V/2.0
  • 重量运费:用三目运算符简化分支判断,比if-else更简洁;
  • 输出:printf("%.1f", result)确保输出 1 位小数,符合题目要求。

易错点

  • 浮点数输入用%lf,输出用%fdoublefloat在输出时均可用%f,但输入必须区分%lf%f);
  • 不要混淆MN的适用条件(G<300MG≥300N)。

3.2 手机电量显示

考点 :多组输入、分支结构(if-else if-else

题目核心逻辑

  1. 读取数据组数T
  2. 每组数据读取电量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已被排除),逻辑严谨;
  • 输出:每行输出后换行(\nendl),符合题目 “每组数据输出一行” 的要求。

易错点

  • 边界条件:P=10属于RP=20属于L,不要颠倒;
  • 多组输入时忘记循环T次,或循环结构错误(如while (T)未自减)。

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容