2024年3月GESPC++二级真题解析

一、单选题(每题2分,共30分)

题目123456789101112131415
答案BBBCBCDBCADACCC

1.下列流程图的输出结果是?( )

A.优秀

B.良好

C.不及格

D.没有输出

【答案】B

【考纲知识点】流程图的概念与描述(二级)

【解析】程序开始; cj 被赋值为75 ; 验证cj >= 60 ; 75 >= 60成立进入YES 分支,验证cj >= 90 ;75 >= 90 不成立进入NO 分支;输出 良好 ,程序结束。

2.以下选项中不符合C++变量命名规则的是?( )

A.student

B.2_from

C._to

D.Text

【答案】B

【考纲知识点】变量的定义与使用(一级)

【解析】有效的变量名是由大小写字母、数字、下划线组成的任意长度的序列,且第一个字符不能为数字。另外,C++中有一些关键字已被编程语言保留,不能用作变量名。B选项的第一个字符为数字,不符合要求。

3.以下选项中,不能用于表示分支结构的C++保留字是?( )

A. switch

B. return

C. else

D. If
【答案】B

【考纲知识点】分支结构(一级)

【解析】switch是用于多分支选择的保留字,根据条件值执行若干语句。if、else也是用于分支选择的保留字,根据条件真假执行特定语句。return不是表示分支结构的保留字,它用于终止当前函数并返回指定值(如果存在)给调用者。



 

4.下列说法错误的是?( )

A. while 循环满足循环条件时不断地运行,直到指定的条件不满足为止

B. if 语句通常用于执行条件判断

C.在C++中可以使用foreach 循环

D. break 和continue 语句都可以用在for 循环和while 循环中
【答案】C

【考纲知识点】 分支 / 循环结构(一级)

【解析】C++中也没有直接称为foreach的循环结构。C++11中引入的用于遍历的容器的范围for循环使用的是任然是关键字for。C++中没有foreach关键字。

5.下列4个表达式中,答案不是整数8的是?( )

A.abs(-8)

B.min(max(8, 9), 10)

C.int(8.88)

D.sqrt(64)

【答案】B

【考纲知识点】常用数学函数(二级)

【解析】A选项为绝对值函数,表达式的结果是8;B选项为最值函数首先执行内部的max(8, 9),结果是9,然后执行min(9, 10),结果是9。C选项为函数式强制类型转换,截断取整结果为8。D选项为平方根函数结果为浮点类型的8。


6.下面C++代码执行后的输出是?()
int n,a,m,i;
n=3, a = 5;
m = (a - 1) * 2;
for (i=0; i<n-1; i++)
m = (m - 1) * 2;
cout << m;

A.8

B.14

C.26

D.50
【答案】C

【考纲知识点】循环结构(一级)

【解析】n = 3,i的初值为0,当i小于2是会执行循环。因此,循环会执行两次。m的初值为8 ,第一次循环m = 7 * 2 被更新为14;第二次循环m = 13 * 2;被更新为26,最终输出26。





 

7.下面C++代码执行后的输出是?()

int n,i,result;
n = 81;
i = 1, result = 1;
while (i * i <= n){

if (n % (i * i) == 0)

result = i * i;

i += 1;
}
cout << result;

A.16

B.36

C.49

D.81
【答案】D

【考纲知识点】多层分支/ 循环结构(二级)

【解析】i = 1,n = 81因为while条件满足进入循环,执行i += 1,当i增加到3的时候if 条件成立result被赋值为9;当i增加到9的时候if 条件第二次成立result被赋值为81;当i增加为10时,while条件不成立结束循环输出81。

8.下面C++代码执行后的输出是?()
int s,t,ans;
s = 2, t = 10;
ans = 0;
while (s != t){
if (t % 2 == 0 && t / 2 >= s)
t /= 2;
else
t -= 1;
ans += 1;
}
cout << ans;

A.2

B.3

C.4

D.5

【答案】B

【考纲知识点】多层分支/ 循环结构(二级)

【解析】s = 2,t = 10 第一次进入循环if 条件成立t 被更新为5;第二次进入循环if 条件不成立t被更新为4;第三次进入循环if 条件成立t被更新为2与s相等结束循环;循环执行了3次ans自增了三次最终输出3。
 

9.下面C++代码执行后的输出是?()
int n, masks, days,cur;
n = 17, masks = 10, days = 0;
cur = 2;
while (masks != n){
if (cur == 0 || cur == 1)
masks += 7;
masks -= 1;
days += 1;
cur = (cur + 1) % 7;
}
cout << days;

A. 5

B. 6

C. 7

D. 8
【答案】C

【考纲知识点】多层分支/ 循环结构(二级)

【解析】cur = 2,masks = 10,前5次循环if条件不满足,第5次循环后cur = 0,masks = 5;第6次进入循环if条件满足masks先加7后减1被更新为11;第7次进入循环if 条件满足masks被更新为17 与n 相同结束循环。循环执行了7次days自增了7次最终输出7。

10.以下C++代码判断一个正整数N的各个数位是否都是偶数。如果都是,则输出“是”,否则输出“否”。例如N=2024时输出“是”。则横线处应填入( )。
int N,Flag;
cin >> N;
Flag = true;
while (N != 0){
if (N %2 != 0){

Flag = false;

_____________

}else

N /= 10;
}

if(Flag == true)

cout << "是";

else

cout << "否";

A. break

B. continue

C. N = N / 10

D. N = N % 10

【答案】A

【考纲知识点】多层分支/ 循环结构(二级)

【解析】在十进制下,一个数的奇偶性由它的个位数字决定。因为,十进制是基于10的倍数来构建的,而10是2的倍数,这意味着除了个位以外的任何位上的数字(十位、百位、千位等)乘以其对应的10的幂次,都将产生一个偶数。本题在循环中使用if语句判断当前N的个位是否为偶数,如果是则通过N /= 10去掉个位继续检查下一位;如果不是则说明已经找到了一个奇数位,没有必要继续检查,使用break立刻结束循环。

11. 有句俗话叫“三天打渔,两天晒网”。如果小杨前三天打渔,后两天晒网,一直重复这个过程,以下程序代码用于判断,第n天小杨是在打鱼还是晒网,横线处应填写?( )
int n,i;
cin >> n;

i = n % 5;

if (__________________) // 在此处填写代码

cout << "晒网";

else

cout << "打鱼";

A. i == 0

B. i == 4

C. i == 0 && i == 4

D. i == 0 || i == 4
【答案】D

【考纲知识点】分支结构(一级)

【解析】n为4或5时晒网,当n = 4时i为4 % 5 = 4;当n = 5时5 % 5 = 0。

12.一个数的所有数字倒序排列后这个数的大小保持不变,这个数就是回文数,比如101 与6886 都是回文数, 而 100不是回文数。以下程序代码用于判断一个数是否为回文数,横线处应填写?( )
int n,a,k;

cin >> n;

a = 0;

k = n;

while (n > 0){

a = __________; // 在此处填写代码

n /= 10;

}

if (a == k)

cout << "是回文数";

else

cout << "不是回文数";

A. 10 * a + n % 10

B. a + n % 10

C. 10 * a + n / 10

D. a + n / 10

【答案】A

【考纲知识点】分支/ 循环结构(一级)

【解析】要判断一个数是否为回文数,需要将这个数反转。反转的过程中,每一步都需要将已有的反转数a 乘以10(为新的数字位腾出空间),然后加上n 的当前最后一个数字(即n % 10)。所以,横线处的代码应该是:a = 10 * a + n % 10; 这样每次循环都会取出n 的最后一位数字,加到a 的最后,同时n 除以10 去掉最后一位。循环直到n 为0,此时如果a与原始的数字k 相等,那么原始的数字就是回文数。

13.给定两个整数n与k,打印出一个栅栏图形,这个栅栏应该分成n段,段与段之间的间隔为+ , 段内的填充为k个- 。形如n = 5,k = 6时,图形如下:
+------+------+------+------+------+
以下程序代码用于绘制该图形,横线处应填写?( )
int n, k, i, j;

n = 5, k = 6;

for (i = 0; i < n; i++){

__________ // 在此处填写代码

for (j = 1; j < k; j++)

cout << '-' ;

}

cout << '+';

A. cout << '+' << endl;

B. cout << '+' << ' ' << endl;

C. cout << '+';

D. cout << '+' << ' ';


【答案】C

【考纲知识点】多层分支/ 循环结构(二级)

【解析】每段的开始打印一个+,然后打印k 个-。因为j 从1 开始,循环会执行k-1 次,所以我们需要在循环外再打印一个- 来确保每段有k 个-。在所有段打印完之后,还需要打印一个额外的+ 来结束栅栏图形。因此,选项C  是正确的,它每段的开始打印一个+,不会造成换行或额外的空格。

14.小杨的父母最近刚刚给他买了一块华为手表,他说手表上跑的是鸿蒙,这个鸿蒙是。( )

A.小程序

B.计时器

C.操作系统

D.神话人物

【答案】C

【考纲知识点】计算机基础(一级)

【解析】鸿蒙HarmonyOS是华为开发的全场景分布式操作系统,支持多种终端设备运行,提供应用开发、设备开发的一站式服务的平台。

15.中国计算机学会(CCF)在2024年1月27日的颁奖典礼上颁布了王选奖,王选先生的重大贡献是( )。

A.制造自动驾驶汽车

B.创立培训学校

C.发明汉字激光照排系统

D.成立方正公司
【答案】C

【考纲知识点】计算机历史(一级)

【解析】王选先生是中国著名的计算机科学家,他的重大贡献是发明了汉字激光照排系统,这一发明极大地推动了中国印刷业的现代化进程。

二、判断题(每题2分,共20分)

题目12345678910
答案××××××

1.如果有以下C++代码:
double s;
int t;
s = 18.5;
t = int(s) + 10;
那么 cout << t 的结果为 28.5 。

【答案】错误

【考纲知识点】数据类型的转换(二级)

【解析】int(s)将double类型的18.5转换为int类型,通过截断取整结果为18再加上10最终输出28。

2.Xyz,xYz ,xyZ 是三个不同的变量。( )

【答案】正确

【考纲知识点】变量的定义与使用(一级)

【解析】在C++中,变量名是区分大小写的,Xyz、xYz和xyZ是三个不同的变量。

3.cout << (8< 9< 10) 的输出结果为true。( )

【答案】错误

【考纲知识点】基本运算(一级)

【解析】程序输出结果为1。

4.for (i = 0; i < 100; i+=2) ; 语句中变量i的取值范围是0到99。(  )

【答案】错误

【考纲知识点】循环结构(一级)

【解析】在这个for循环中,变量i从0开始,以2为步长递增,直到它不小于100。因此,i的取值是0, 2, 4, ..., 96, 98。99不在这个范围内,所以它不会取到99。

5.C++中cout << float(2022) 与cout << float('2022') 运行后的输出结果均为2022。(   )

【答案】错误

【考纲知识点】数据类型的转换(二级)

【解析】cout << float(2022)将输出浮点数2022。而cout << float('2022')会将int类型的多字符字面量转换成float类型后做输出,输出结果不为2022。

6.已知A的ASCII码值为65,表达式int('C')+abs(-5.8)的值为72.8。(   )

【答案】正确

【考纲知识点】 ASCII编码(二级)

【解析】字符'C'的ASCII码值是67。int('C')将字符'C'转换为其ASCII码值,即67。abs(-5.8)计算-5.8的绝对值,结果是5.8。所以表达式int('C') + abs(-5.8)的值是67 + 5.8,等于72.8。

7.bool()函数用于将给定参数或表达式转换为布尔类型。语句bool(-1) 返回的是false 值。(   )

【答案】错误

【考纲知识点】数据类型的转换(二级)

【解析】语句bool(-1)返回的是true值,因为在C++中任何非零整数值转换为布尔时都会被视为true。

8.如果变量a的值使得C++表达式sqrt(a)==abs(a),则a的值为0。(  )

【答案】错误

【考纲知识点】常用数学函数(二级)

【解析】如果变量 a 的值使得 C++ 表达式 sqrt(a)==abs(a),则 a 的值可以是 0 或1。

9.小杨今年春节回奶奶家了,奶奶家的数字电视要设置ip地址并接入到WIFI盒子才能收看节目,那这个WIFI盒子具有路由器的功能。( )

【答案】正确

【考纲知识点】 计算机网络

【解析】WIFI盒子如果能够为连接的设备分配IP地址,并且提供接入互联网的能力,那么它就具备了路由器的基本功能。

10.任何一个for循环都可以转化为等价的while循环。( )

【答案】正确

【考纲知识点】循环结构(一级)

【解析】任何一个 for 循环都可以用 while 循环来表示,反之亦然。

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

 

1、乘法问题

【问题描述】

小A最近刚刚学习了乘法,为了帮助他练习,我们给他若干个正整数,并要求他将这些数乘起来。对于大部分题目,小A可以精准地算出答案,不过,如果这些数的乘积超过 ,小 A就不会做了。请你写一个程序,告诉我们小A 会如何作答。

【输入描述】

第一行一个整数 ,表示正整数的个数。

接下来n行,每行一个整数a。小A 需要将所有的a乘起来。

保证n ≤ 50,a ≤ 100 。

【输出描述】

输出一行,如果乘积超过106,则输出>1000000;否则输出所有数的乘积。

【样例输入 1】

2
3
5

【样例输出 1】

15

【样例输入 2】

3
100
100
100

【样例输出 2】

1000000
【样例输入 3】
4
100
100
100
2

【样例输出 3】
>1000000

【题目大意】

输入n个数,对这些数求积,检查乘积是否超过106

【考纲知识点】
基本数据类型(一级)、多层分支 /循环结构(二级)

【解题思路】

1.首先,读取整数n,表示正整数的个数。

2.初始化长整型变量product 为1,用于存储n个数的积。

3.接下来,使用 for循环来读取n个数,并且在每次循环中将读取的数与product 相乘。

4.在每次乘法之前,我们检查product 与当前读取的数相乘后是否会超过106。如果超过,输出">1000000" 并且立即结束程序。

5.如果循环没有中途结束,证明乘积没有超过106,直接输出product 的值。

注意:在乘法之前进行了是否超过106的检查,这是为了防止不必要的计算,一旦超过就立即结束程序。如果不提前检查乘积是否超过106在极端情况会出现溢出错误。

【参考程序】
#include <iostream>

using namespace std;

int main() {

int n;

cin >> n;

long long product = 1;

for (int i = 0; i < n; ++i) {

int a;

cin >> a;

if (product * a > 1000000) {

cout << ">1000000" << endl;

return 0;

}

product *= a;

}

cout << product << endl;

return 0;

}

2、小杨的日字矩阵

【问题描述】

小杨想要构造一个N×N的日字矩阵(N为奇数),具体来说,这个矩阵共有N行,每行N个字符,其中最左列、最右列都是|,而第一行、最后一行、以及中间一行(即第(N+1)/2行)的第2 ~ N - 1个字符都是-,其余所有字符都是半角小写字母x。例如,一个N = 5的日字矩阵如下:
|---|

|xxx|

|---|

|xxx|

|---|

请你帮小杨根据给定的 打印出对应的“日字矩阵”。

【输入描述】

一行一个整数N(5 ≤ N ≤ 49,保证N为奇数)。

【输出描述】

输出对应的“日字矩阵”。

请严格按格式要求输出,不要擅自添加任何空格、标点、空行等任何符号。你应该恰好输出N行,每行除了换行符外恰好包含N个字符,这些字符要么是-,要么是|,要么是x。你的输出必须和标准答案完全一致才能得分,请在提交前仔细检查。

特别提醒

在常规程序中,输⼊、输出时提供提⽰是好习惯。但在本场考试中,由于系统限定,请不要在输⼊、输出中附带任何提⽰信息。

【样例输入 1】

5

【样例输出 1】

|---|

|xxx|

|---|

|xxx|

|---|

【样例输入 2】

7

【样例输出 2】

|-----|

|xxxxx|

|xxxxx|

|-----|

|xxxxx|

|xxxxx|

|-----|

【题目大意】

输出N × N的字符矩阵,最左列、最右列为字符'|',对于除最左最右列外的每一列:第一行、最后一行以及中间行为字符'-',其余行为字符'x'。


【考纲知识点】
多层循环结构(二级)

【解题思路】

1.首先,读取整数n,表示矩阵的N行N列。

2.使用双重循环遍历矩阵的每一个位置,循环变量i为矩阵的行号,j为矩阵的列号。

3.依次检查列号、行号,根据规则输出相应字符。

【参考程序】
#include <iostream>

using namespace std;

int main() {

int n;

cin >> n;

for (int i = 0; i < n; ++i) {

for (int j = 0; j < n; ++j) {

char ch;

if (j == 0 || j == n - 1) {

ch = '|';

} else if (i == 0 || i == n - 1 || i == n / 2) {

ch = '-';

} else {

ch = 'x';

}

cout << ch;

}

cout << endl;

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值