1 单选题(每题 2 分,共 30 分)
第1题 近日,空中客车公司表示,约6000架空客A320系列飞机需要紧急更换一种易受太阳辐射影响的飞行控制软件。空客表示,在对一起飞行事故分析后的结果显示,强烈的太阳辐射可能会损坏飞行控制系统所需的关键数据,导致判断失误,进而引发飞行异常。那这里的飞行控制系统执行判断的部件最可能是下面的( )。
A. 辐射传感器 B. 处理器 C. 内存单元 D. 输出设备
解析:答案B。飞行控制系统的核心是处理器,它负责接收传感器数据、执行控制算法并输出指令,是判断和决策的关键部件。辐射传感器用于检测辐射,只提供检测数据,不直接参与判断,内存单元用于存储数据不直接参与判断,输出设备用于执行动作更不直接参与判断。因此,处理器最可能是执行判断的部件。故选B。
第2题 小明最近为了备考GESP,开始看B站上关于网络知识的视频。其中提到计算机网络系统有不同的划分标准,那他平时上学所在的教学楼内的网络是一个( )。
A. PAN B. LAN C. MAN D. WAN
解析:答案B。PAN(个人区域网,一般短距离10米左右)、LAN(局域网,一般距离100米~数百米,一幢楼宇或数幢楼宇),MAN(城域网,一般可以覆盖一个大城市)和WAN(广域网,可覆盖全球),根据覆盖范围,教学楼内网络属局域网。故选B。
第3题 下面有关C++变量的说法,正确的是( )。
A. 不可以用 for 作为变量名,因为 for 是C++的关键字(保留字)。
B. _tnt 不可以是变量名,因为变量名的第一个字符必须是英文字母。
C. tnt 不可以是变量名,因为最后一个字符容易与减号混淆。
D. 可以用 printf 作为变量名,因为 printf 是关键字,但这不是好习惯,因为 printf 有约定的功能与含义。
解析:答案A。C++变量名的命名规则是:(1)只能是字母、数字和下划线(),(2)不能数字开头,(3)为能是关键字。for是关键字,不能用作变量,正确;变量名可以以下划线开头,tnt是合法的,错误;下划线()可以出现在变量任何位置,最后一个字符是下划线(),不会与减号(-)混淆,_tnt_是合法的,错误;printf不是C++的关键字,是标准库函数名,可以作为变量名,但不建议用作变量名,否则printf将无函数功能。故选A。
第4题 一个小数是0.123123123......无限循环,其小数点后1位是1,后2位是2,依此类推,求第N位的值。横线处应 填入的代码是( )。
cpp
int N;
cin >> N;
remainder = ______________;
if (remainder == 0)
cout << 1;
else if (remainder == 1)
cout << 2;
else
cout << 3;
A. N % 3 B. (N - 1) % 3 C. N / 3 D. (N - 1) / 3
解析:答案B。题目中小数 0.123123123... 是无限循环小数,循环节为 123,长度为3。第N位的值取决于N在循环节中的位置:
当选A(N % 3) N=3 时,值为0,输出1,错误。当选B((N-1) % 3) N=1 时,值为0,输出1,N=2 时,值为1,输出2,N=3 时,值为2,输出3,正确。C、D结果为浮点数,不符合题目要求。故选B。
第5题 某同学执行C++代码时 printf("%g\n", (3 + 3.1415926535)); 输出 6.14159 ,其原因最可能是( )。
A. C++中整数和浮点数相加时,整数会被转换为浮点数,而某些十进制小数无法精确表示为二进制小数,从而产生某些舍入误差。
B. C++的 printf 函数在输出浮点数时根据格式有默认小数点位数,因此输出了较少的位数。
C. 3.1415926535 是一个无限循环小数,在计算机中无法精确表示。
D. 由于计算机CPU的运算错误导致。
解析:答案B。常量转浮点数为double型,有效数可达15位,不会只有6位有效数,A错误。当printf以占位符"%f"为固定6位小数,以占位符"%g"为固定6位有效数,且这6位有效数字小于10⁶时以浮点数或整数输出(6位有效数字),大于等于10⁶时以科学计数法输出(6位有效数字),所以B正确。3.1415926535是有限小数,所以C错误。CPU运算错误与本题无关,浮点数精度问题是计算机表示机制导致的,所以D错误。故选B。
第6题 某单位工号的编码规则:编码总长5位,均为数字,前4位依次整除以3其值累加之和除以10的余数为第5位数 字。如某工号为76587,前4位分别整除以3后,商分别为2、2、1、2,其累加之和为7,除以10的余数为7,故第5位 为7。下面代码依次输入前4位后,两个横线处分别应填的是( )。
cpp
int rst = 0, N;
for (int i = 0; i < 4; i++){
cin >> N;
rst += ___________; // L1
}
cout << ___________; // L2
|----|----------------|----|----------------|----|----------------|----|----------------|
| A. | N % 3 rst / 10 | B. | N % 3 rst % 10 | C. | N / 3 rst / 10 | D. | N / 3 rst % 10 |
解析:答案D。C++,整数除以整数为整除,整数模整数为余数。根据题目L1处要整除,求整除以3的累加和,故排除A、B。和除以10的余数,所以L2处为求余数,所以C错误。故选D。
第7题 下面的C++代码执行后的输出是( )。
cpp
for (int i = -2; i < 2; i++)
if (i % 2)
printf("%d#",i);
A. -1#1# B. -1#0#1# C. -2#-1#1# D. -2#-1#1#2#
解析:答案A。循环i为-2、-1、0、1,期中-2和0模2为0,条件不成立,-1和1时i%2不等于0等价为True,输出:-1#1#。故选A。
第8题 下面的C++代码执行后其输出是( )。
cpp
int cnt = 0, N;
for (int i =1; i < 10; i += 2)
for (int j =0; j < i; j++)
cnt += 1;
cout << cnt;
A. 100 B. 55 C. 45 D. 25
解析:答案D。循环i为1、3、5、7、9,j循环i次,cnt加i次1,1+3+5+7+9=25。故选D。
第9题 下面C++代码执行后其输出是( )。
cpp
int i,j;
for (i = 1; i < 12; i++){
if (i % 2 == 0)
continue;
for (j = 0; j < i; j++)
if (i * j % 2 == 0)
break;
if(j >= i)
cout << i * j << " ";
}
if(i >= 12)
cout << (i * j);
A. 0 0 B. 11 C. 0 D. 0 11
解析:答案C。循环i为1~11,偶数跳过,j循环从0~i-1,i*j为偶数跳出内层循环,j>=i显示i*j。当j=0时,i*j=0,i*j%2==0,而j>=i不可能成立,break跳出内层循环时j=0,最后外层循环结束时i=12,故最后输出i*j为0,故选C。
第10题 与下面C++输出效果不一致的代码是( )。
cpp
int i;
for (i = 0; i < 10; i++)
cout << i;
|----|----------------------------------------------------------------------|----|----------------------------------------------------------------------|
| A. | int i = 0; while (i < 10){ cout << i; i += 1; } | B. | int i = 0; while (i < 10){ i += 1; cout << i; } |
| C. | int i = 0; while (true){ cout << i; i += 1; if (i >= 10) break; } | D. | int i = 0; while (true){ if (i >= 10) break; cout << i; i += 1; } |
解析:答案B。题目输出从0开始到9,A的i初值为0,i<10输出,输出后i+=1,与题目一致。B的i初值为0,i<10输出,但输出前i+=1,实际输出的是1到10,与题目不一致。C的i初值为0,采用无限循环("死循环")输出,输出后i+=1,i>=10跳出循环,与题目一致。D的i初值为0,采用无限循环("死循环")输出,输出前判i>=10跳出循环,输出后i+=1,与题目一致。故选B。
第11题 下面C++代码执行后输出是( )。
cpp
int num = 0;
while (num <= 5){
num += 1;
if (num % 3)
continue;
printf("%d#",num);
}
if(num > 5)
printf("%d", num);
A. 3#6# B. 3#6#6 C. 1#2#3#4#5#6# D. 1#2#3#4#5#6#6
解析:答案B。题目num从0开始到5,加1后判能否被3整除,不能整除则跳过,输出的是num能被3整除的,输出的是3#6#,循环结束num=6>5,最后还会输出6,合起来输出3#6#6。故选B。
第12题 下面C++代码执行后,其输出是( )。
cpp
int cnt = 0;
for (int i = 0; i <5; i++)
for (int j =i; j < 4; j++)
cnt += 1;
cout << cnt;
A. 9 B. 10 C. 14 D. 20
解析:答案B。题目外层循环i从0开始到4,内层循环j从i到3,对cnt计数,i=0计数4次,i=1计数3次,i=2计数2次,i=3计数1次,i=4不计数,合起来计数10次,输出10。故选B。
第13题 漂亮数的定义是:如果N能被M整除,或者某位是M,或者N的每位数之和能被M整除,则说N是M的漂亮数。如果三个条件都满⾜,则是完整漂亮数。123是3的完整漂亮数,因为123能被3整除,也含有3,其每位数之和为6也能被3整除。下⾯的代码⽤于判断N是否为M的完整漂亮数并输出。相关说法正确的是( )。
cpp
int N, M, Flag, Sum, num;
cout << "请输入N,不等于0的正整数:";
cin >> N;
cout << "请输入M:M必须大于1小于9:";
cin >> M;
Sum = 0; // 记录各位数之和
Flag = 0; // 假设记录N不含有M
while (N != 0){
num = N % 10;
Sum += num;
if (num == M)
Flag = 1;
N /= 10;
}
if ((N % M == 0) && (Flag == 1) && (Sum % M == 0)) // L1
printf("%d 是 %d 的完整漂亮数", N, M);
else
printf("%d 不是 %d 的完整漂亮数", N, M);
A. 代码能完成题目设定目标。
B. 在 while 循环中N最终将变成0,因此L1行代码中 N % M 将总是满足条件,可以在 while 前增加一行代码 int old_num = N; ,并将L1开始这4行代码中的 N 都改为 old_num 就可以做出正确的判定。
C. while 循环中 if 判断语句可以增加 else 子句,其内容为 Flag = 0 。
D. 如果先后输入 0 和 3 ,则肯定会输出 0是3的完整漂亮数 。
解析:答案B。题目中给出的程序,由于循环N=0,求N%M==0恒等,无意义,A错误。while循环前记录N,L1开始用记录N则结果正确,B正确。不能加else子句,否则不是最后等于M,Flag将等于0,C错误。如果N=0,则Flag不可能等于1,D错误。故选B。
第14题 阅读下面的C++代码。执行后如输入 5 ,其输出的字符图形是( )。
cpp
int n,i,j,k;
cin >> n;
for (i = 0; i < n; i++){
for (j = 0; j < n-i-1; j++)
cout << " ";
for (k = 0; k < 2*i+1; k++)
cout << "*";
cout << endl;
}
|----|------------------------------------|----|--------------------------------------------------------|----|------------------------------------|----|------------------------------------|
| A. | ***** **** *** ** * | B. | * *** ***** ******* ********* | C. | * ** *** **** ***** | D. | * ** *** **** ***** |
解析:答案B。外循环i从0到n-1,第1个内循环,j从0到n-i-1,打印空格,B正确。不能加else子句,否则不是最后等于M,Flag将空格从多到少,排除A、C。第2个内循环循环次数为奇数,所以B正确。故选B。
第15题 某学校举办"十佳歌手大奖赛",经过选拔最终参赛选手有25人,评委10人,最终计分规则去掉一个最高分去掉一个最低分作为该参赛选手的最终得分,并输出该得分。如果单个评委可给满分为10分,则相关说法正确的是( )。
cpp
float total_score, max_score, min_score, now_score;
for (int i = 0; i < 25; i++){
max_score = 0; // 记录最高分
min_score = 10; // 记录最低分
total_score = 0; // 记录总分
for (int j = 0; j < 10; j++){
cin >> now_score; // 录入评委打分
max_score = max(max_score, now_score); // L1
min_score = min(min_score, now_score); // L2
total_score += now_score;
}
cout << (total_score - max_score - min_score);
}
A. 程序总体逻辑错误。因为要去掉最高分和最低分,需要排序,而程序没有相关代码。
B. 内层循环和外层循环之间的三行代码也就是 max_score = 0 开始的三行代码应该移动到外层循环外。
C. L1和L2标记的两行代码可以分别改为简单的 if 语句或 ? : 语句。
D. total_score += now_score 不可以更改为 total_score = total_score + now_score 。
解析:答案C。程序内循环求某位选手10位评委的分数,因为评委最高分为10分,最低分初始化为10,最高分初始0正确,去掉一个最高分去掉一个最低分无需排序,A正确。如将内层循环和外层循环之间的三行代码也就是 max_score = 0 开始的三行代码应该移动到外层循环外,则变量初始化只做一次,第2位选手起会累加前面所有选手的分数导致结果不正确,B错误。Max、min函数可用if 语句或 ? : 语句替代,C正确。total_score += now_score 与 total_score = total_score + now_score等价,D错误。故选C。
2 判断题(每题 2 分,共 20 分)
第1题 鸿蒙是华为公司开发的一款操作系统,那么它能够将正确的源程序翻译成目标程序,并运行。( )
解析:答案╳(错误)。操作系统不是编译系统,源程序翻译成目标程序的软件是编译系统,故错误。
第2题 C++表达式 5 < 10 && 20 对应的逻辑值为 true 。( )
解析:答案√(正确)。C++表达式5 < 10 && 20,5 < 10结果为true,20非零等价为true,所以true && true结果为true,故正确。
第3题 C++表达式 10 / 0.333333 == 10 / (1 / 3) 的值为 true 。( )
解析:答案╳(错误)。C++浮点数常量默认为double型,10/0.333333为double型30,而1/3为整除,结果为0, 10/0出现异常,所以结果不为true,故错误。
第4题 下面C++代码中N是整数,执行时无论输入负整数、0或正整数,其输出都将是 0 。 ( )
cpp
cin >> N;
while (N)
N /= 10;
cout << N;
解析:答案√(正确)。N /= 10,等价为 N = N / 10,不管N是正负整数,还是0,最终终为0,故正确。
第5题 下面的C++代码执行后,其输出是 4 0 。( )
cpp
int a,b;
a = 4;
b = a == 5;
cout << a << ' ' << b;
解析:答案√(正确)。在C++中,赋值运算符=的优先级(16)远低于相等性比较运算符==的优先级(9)。这意味着在表达式中,相等性比较会先于赋值操作执行,b = a == 5等价为b = (a == 5),所以b = false,输出为0,输出为4 0,故正确。
第6题 C++代码中对表达式 ('Z' - 'A') < ('z' - 'A') 的结果输出为 0 。( )
解析:答案╳(错误)。ASCII码小写字母大于大写字母,'A'为65,'a'为97,'Z'为90,'z'为122,所以'Z' - 'A') < ('z' - 'A'等价为25 < 57,关系成立,输出为1,故错误。
第7题 下面的C++代码可以用于判断正整数N的位数(即几位数,如123是3位数,12为2位数)。( )
cpp
int N, N10, i;
cin >> N;
N10 = 10, i = 1;
while (1) {
if (N % N10 == N) {
printf("%d 是 %d 位数", N, i);
break;
}
i++, N10 *= 10;
}
解析:答案√(正确)。程序N10后几个0去模N会等于N,那么这个0的个数刚好是N的位数,N10初值10,为1后一个0,N10*=10,相当于N10后添了个0。如123 % 1000等于123,12 % 100等于12,故正确。
第8题 计算交叉加减的结果,形如 1-2+3-4+5-...... 。下面C++代码中的变量都是整型,则将 Flag = -Flag 改为 Flag -= Flag 效果相同。( )
cpp
cin >> N;
Flag = -1;
tnt = 0;
for (i = 1; i < N + 1; i++) {
Flag = -Flag;
tnt += Flag * i;
}
cout << tnt;
解析:答案╳(错误)。因为Flag初值为-1,Flag = -Flag相当于Flag从-1变+1,或Flag从+1变-1,实现正负交替。Flag -= Flag,等价为Flag = Flag -- Flag,Flag -- Flag恒为0,不能实现正负交替。故错误。
第9题 下列C++代码段执行后将输出 55 。( )
cpp
int cnt = 0;
for (i = 0; i < 10; i++)
for (j = i; j < 10; j++)
cnt += 1;
cout << cnt;
解析:答案√(正确)。外层循环i从0到9,内层循环j从i到9,进行计数。i=0时,j从0到9计数10次;i=1时,最低价1到9计数9次;......;i=9时,j从9到9计数1次。10+9+...+1=55,故正确。
第10题 下面C++代码执行后输出如下,因为代码 printf("\n") 没有任何可读内容,删除不影响输出效果。( )
cpp
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
cpp
for (int i = 1; i < 10; i++) {
for(int j = 1; j < 10; j++)
printf("%3d", i * j);
printf("\n");
}
解析:答案╳(错误)。内层循环是连续按3位宽打印i*j,而printf("\n")是打印一行后换行("\n"是换行符)。删除printf("\n")将使这9行连在一起打印,得不到题目给出的输出效果,故错误。
3 编程题(每题 25 分,共 50 分)
3.1 编程题 1
- 试题名称:环保能量球
- 时间限制:1.0 s
- 内存限制:512.0 MB
3.1.1题目描述 小杨最近在玩一个环保主题的游戏。在游戏中,小杨每行走 1 公里就可以获得 1 点"环保能量"。为了激励玩家,游戏设置了"里程奖励":小杨每行走 𝑥 公里,游戏就会额外奖励 1 点能量。 现在已知小杨总共行走了 𝑛 公里,请你帮他计算,他一共能获得多少点环保能量?
3.1.2 输入格式
第一行包含一个正整数 𝑡,代表测试数据组数。
对于每组测试数据:
第一行包含一个正整数 𝑛,代表行走的公里数。
第二行包含一个正整数 𝑥,代表奖励触发的间隔。
3.1.3 输出格式
对于每组测试数据,输出一个整数,代表小杨获得的环保能量总数。
3.1.4 样例
3.1.4.1 输入样例
cpp
3
5
2
10
3
2
5
3.1.4.2 输出样例
cpp
7
13
2
3.1.4.3 样例解释
对于第1 组数据,𝑛=5, 𝑥=2:小杨行走获得 5 点能量。此外,他在第2 公里和第4 公里时各获得 1 点额外奖励,总共 7 点。
对于第2 组数据,𝑛=10, 𝑥=3:行走获得 10 点。他在第3、6、9 公里时各获得 1 点额外奖励,总共 13 点。
对于第3 组数据,𝑛=2, 𝑥=5:行走获得 2 点。由于行走路程不足 5 公里,没有额外奖励,总共 2 点。
3.1.5 数据范围
对于全部数据,保证: 1≤𝑡≤100,1≤𝑛, 𝑥≤1000。
3.1.6 编写程序
编程思路:
方法一:
(1) 𝑡 组数据,每组两个数 𝑛 和 𝑥。根据数据范围,不需要对特殊数据(如0,负数等)进行处理。
(2) 每组的基础能量为 𝑛 点,每满 𝑥 额外奖励 1 点能量,即额外奖励 𝑛 整除 𝑥 ( 𝑛 / 𝑥)点能量。
(3) 总能量 = 𝑛 + 𝑛 / 𝑥。注意C++整数除以整数为整除(只取商且为整数)。
参考程序代码如下:
cpp
#include <iostream>
using namespace std;
int main() {
int t, n, x;
cin >> t;
for(int i=0;i<t;i++){
cin >> n >> x;
cout << (n + n / x) << endl; // 整数除以整数为整除
}
return 0;
}
方法二:
(1) 𝑡 组数据,每组两个数 𝑛 和 𝑥。根据数据范围,不需要对特殊数据(如0,负数等)进行处理。
(2) 每组从 1 走到 𝑛 公里,每走 1 公里,能量加 1,每满 𝑥 公里(走过的公里数是 𝑥 的倍数额外加 1能量。
(3) 计数结果为总能量。
参考程序代码如下:
cpp
#include <iostream>
using namespace std;
int main() {
int t, n, x;
cin >> t;
for(int i=0;i<t;i++){
cin >> n >> x;
int cnt=0; // cnt为计分
for(int j=1;j<=n;j++){ // 每走1公里
cnt ++; // 计1点(基础能量)
if(j % x == 0) // 走到的公里数是x倍数
cnt++; // 额外奖励1点(奖励能量)
}
cout << cnt << endl; // 输出总能量
}
return 0;
}
3.2 编程题 2
- 试题名称:黄金格
- 时间限制:1.0 s
- 内存限制:512.0 MB
3.2.1题目描述 小杨在探险时发现了一张神奇的矩形地图,地图有 𝐻 行和 𝑊 列。每个格子的坐标是 (𝑟, 𝑐),其中 𝑟 表示行号从 1 到 𝐻,𝑐 表示列号 1 到 𝑊。
小杨听说地图中隐藏着一些"黄金格",这些格子满足一个神秘的数学挑战:当格子坐标(𝑟, 𝑐) 代入特定的不等式关系成立时,该格子就是黄金格。具体来说,黄金格的条件是:
。
例如,如果参数 𝑥=5,那么格子(4, 3)就是黄金格。因为左边坐标平方和的平方根
算出来是 5,而右边 5+4-3 算出来是 6,5 小于等于 6,符合条件。
3.2.2 输入格式
三行,每行一个正整数,分别表示 𝐻, 𝑊, 𝑥。含义如题面所示。
3.2.3 输出格式
一行一个整数,代表黄金格数量。
3.2.4 样例
3.2.4.1 输入样例1
cpp
4
4
2
3.2.4.2 输出样例1
cpp
4
3.2.4.3 样例解释

图中标注为黄色的四个格子是黄金格,坐标分别为 (1, 1),(2, 1),(3, 1),(4, 1)。
3.2.5 数据范围
对于所有测试点,保证给出的正整数不超过 1000。
3.2.6 编写程序
编程思路:
方法一:
根据数据范围,不需要对特殊数据(如0,负数等)进行处理。本方法采用枚举法,遍历所有格子,测试黄金格的条件是:
,条件成立为黄金格,计数加1,否则不计数。条件可转化为 𝑟² + 𝑐² ≤ (𝑥 + 𝑟 -- 𝑐)²,避免开平方运算。
参考程序代码如下:
cpp
#include <iostream>
using namespace std;
int main() {
int H, W, x, cnt=0; // cnt为计黄金格数
cin >> H >> W >> x;
for(int r=1;r<=H;r++){
for(int c=1;c<=W;c++)
if (r*r + c*c <= (x + r - c)*(x + r - c)) // 满足条件
cnt ++; // 计黄金格数加1
}
cout << cnt << endl; // 输出总黄金格
return 0;
}
方法二:
根据数据范围,不需要对特殊数据(如0,负数等)进行处理。本方法采用枚举法,遍历所有格子,测试黄金格的条件是:
,条件成立为黄金格,计数加1,否则不计数。开平方需math库的sqrt()函数。
参考程序代码如下:
cpp
#include <iostream>
#include <cmath> // math库,C++为cmath
using namespace std;
int main() {
int H, W, x, cnt=0; // cnt为计黄金格数
cin >> H >> W >> x;
for(int r=1;r<=H;r++){
for(int c=1;c<=W;c++)
if (sqrt(r*r + c*c) <= x + r - c) // 满足条件
cnt ++; // 计黄金格数加1
}
cout << cnt << endl; // 输出总黄金格
return 0;
}