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

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

题目123456789101112131415
答案ACACCDAACBCAABA

1.据有关资料,山东大学于1972年研制成功DJL-1计算机,并于1973年投入运行,其综合性能居当时全国第三 位。DJL-1计算机运算控制部分所使用的磁心存储元件由磁心颗粒组成,设计存贮周期为2μs(微秒)。那么该磁心 存储元件相当于现代计算机的( )。

A.内存

B.磁盘

C.CPU

D.显示器

【答案】A

【考纲知识点】计算机的存储与网络(二级)

【解析】磁心存储器是一种早期的随机存取存储器(RAM),断电后会丢失数据,设计存取周期为2微秒,具有较快的访问速度,这与内存的特性一致。而磁盘存储则不具备如此高的存取速度,其主要特点是大容量和非易失性,即断电后数据不会丢失。

2.IPv4版本的因特网总共有( )个A类地址网络。

A.65000

B.20万

C.126

D.128

【答案】C

【考纲知识点】计算机的存储与网络(二级)

【解析】IPv4版本的A类地址网络号占1字节(8位),首位必须是0,全0和全1这两种情况被保留有特殊作用(网络地址和广播地址),所以总共用27 - 2  =  126 个A类地址。










 

3.在C++中,下列不可做变量的是( )。

A.ccf-gesp

B.ccf_gesp

C.ccfGesp

D._ccfGesp

【答案】A

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

【解析】有效的变量名是由大小写字母、数字、下划线组成的任意长度的序列,且第一个字符不能为数字。另外,C++中有一些关键字已被编程语言保留,不能用作变量名。A选项的因包含非法字符 -(连字符)而不符合C++变量命名规则。


4.在C++中,与for (int i = 1; i < 10; i++) 效果相同的是( )。

A.for (int i = 0; i < 10; i++)

B.for (int i = 0; i < 11; i++)

C.for (int i = 1; i < 10; ++i)

D.for (int i = 0; i < 11; ++i)


【答案】C

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

【解析】原始循环:for (int i = 1; i < 10; i++) 循环变量i从1开始,到9结束,循环共执行9次。

A选项从0到9,共执行10次,不等效。

B选项从0到10,共执行11次,不等效。

C选项从1到9,共执行9次,且前置递增和后置递增对i的结果无影响,因此效果相同。

D选项从0到10,共执行11次,不等效。

因此,正确答案是:C

5.在C++中,cout << (5 / 2 + 5 % 3) 的输出是( )。

A.1

B.2

C.4

D.5

【答案】C

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

【解析】先进行除法和取模运算:

表达式 5 / 2: 求5除以2的商,结果为2(整数除法,舍去小数部分)。

表达式 5 % 3: 求5除以3的余数,结果为2。

然后进行加法运算:

2 + 2 = 4

因此最终输出为 4,故正确答案是C。

6.假定变量a和b可能是整型、字符型或浮点型,则下面C++代码执行时先后输入 -2 和 3.14 后,其输出不可能是( )。[已知字符 '+'、'-'、'=' 的ASCII码值分别是43、45和61]
cin >> a;

cin >> b;

cout << (a + b);

A.1

B.1.14

C.47

D.将触发异常

答案】D

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

【解析】

A选项:a和b都是整型。输入-2后a = -2,输入3.14会被截断为整数部分,即b = 3。输出结果为-2 + 3 = 1;

B选项:a和b都是浮点型。输入-2后a = -2.0,输入3.14后b = 3.14。输出结果为-2.0 + 3.14 = 1.14。

C选项:a为字符类型b为整数类型,输入-2后a = '-', b = 2,在执行加法时a被转换成整数类型值为'-'的ASCII码45。输出结果45 + 2 = 47。

D选项:默认情况下,cin不会抛出异常,而是设置错误状态标志。

7.在C++代码中假设N为正整数,则下面代码能获得个位数的是( )。

A.N % 10

B.N / 10

C.N && 10

D.以上选项均不正确

【答案】A

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

【解析】在十进制满10进1,个位的位权为100= 1;十位的位权为101;百位的位权为102;第N位的位权为:10N-1 ;该数的数值等于每位的(数值×位权)之和。对于任意正整数N,我们可以将其分解成如下形式:N = k × 10 + r其中k是除去个位后的部分,而r则是个位数。所以N % 10可以获得个位数。

8.面C++代码执行后的输出是( )。
int i;

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

if (i % 2)

break;

cout << "0#";

}

if(i==10) cout << "1#";

A.0#

B.1#

C.0#0#1

D.没有输出 

【答案】A

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

【解析】第一次迭代时,i = 0,检查条件i % 2,因为0 % 2 = 0,条件为假,不执行break。执行cout << "0#"输出0#。增加i的值

第二次迭代时,i = 1,检查条件i % 2,因为1 % 2 = 1,条件为真,执行break跳出循环。

因为跳出循环,此时i = 1,不满足if(i==10)条件,所以不会输出"1#"。

因此,程序在第一次循环中输出0#后,由于i % 2为真而跳出循环,因此最终的输出结果是0#。

9.执行下面C++代码并输入1和0,有关说法正确的是( )。
int a,b;

cin >> a >> b;

if(a&&b)

cout << ("1");

else if(!(a||b))

cout << ("2");

else if(a || b)

cout << ("3");

else

cout << ("4");

A.1

B.2

C.3

D.4
【答案】C

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

【解析】用户输入a = 1和b = 0。

程序首先检查if (a && b)条件,因为a = 1和b = 0,所以a && b为假,不输出"1"。

接下来检查else if (!(a || b))条件,因为a为真,所以a || b为真,取反后为假,不输出"2"。

然后检查else if (a || b) 条件,因为a为真,所以a || b为真,满足条件,输出"3"。

最后的else不会被执行。


 

10.下面C++代码执行后的输出是( )。
int loopCount = 0;

for (int i = 1; i < 5; i += 2)

loopCount += 1;

cout << (loopCount);

A.1

B.2

C.3

D.5
【答案】B

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

【解析】初始化loopCount为0。for循环从i = 1 开始,条件是i < 5,每次迭代i增加2。

第一次迭代:i = 1条件满足(1 < 5),进入循环体,loopCount加1,变为1。

第二次迭代:i = 3条件满足(3 < 5),进入循环体,loopCount再加1,变为2。

第三次迭代:i = 5条件不满足(5 >= 5),退出循环。

最终输出loopCount的值,即2

11.下图是C++程序执行后的输出。为实现其功能,横线处应填入代码是( )。
7

1

2 3

3 4 5

4 5 6 7

5 6 7 8 9

6 7 8 9 10 11

7 8 9 10 11 12 13

//

int lineNum;

cin >> lineNum;

for (int i= 1; i < lineNum+1; i++){

for(int __________________)

cout << j << " ";

cout << endl;

}

A.j = i; j < i; j++

B.j = 1; j < i; j++

C.j = i; j < i*2; j++

D.j = i+1; j < i+i; j++

【答案】C

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

【解析】根据给定的输出格式,每行的数字从当前行号开始,到当前行号乘以2为止。因此内层循环的条件应该是j = i; j < i * 2; j++。

12.下面C++代码执行后输出逆序数,如输入 123 则输出 321 。如输入 120 则输出 21 。横线处先后应填入的代码是( ) 。
int N;

cin >> N;

int rst = 0;

while (N){

____________________;

____________________;

}

cout << (rst);
A.rst = rst * 10 + N % 10 N = N / 10

B.rst += N % 10 N = N / 10

C.rst = rst * 10 + N / 10 N = N % 10

D.rst += N / 10 N = N % 10

【答案】A

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

【解析】使用变量rst存储结果。每次取出原数最右边的一位数字,并将其加到结果中。将原数字去掉最右边的一位,继续上述过程直到数字为零。

rst = rst * 10 + N % 10:将当前结果向左移动一位并加上新提取的一位数字。

N = N / 10:去掉原数字的最右边一位。

13.下面的C++代码用于输入学生成绩,并根据人数计算出平均成绩,有关说法错误的是( )。
float Sum = 0; // 保存总成绩

int cnt = 0; // 保存学生人数

while (1){

int score;

cin >> score;

if (score < 0)

break;

cnt += 1;

Sum += score;

}

cout << "总学生数:" << cnt << "平均分:" << Sum/cnt;


 

A.代码while (1) 写法错误

B.如果输入负数,将结束输入,并正确输出

C.如果输入的学生成绩含有小数,程序将无法正常执行

D.变量int score 初始值不确定,但不影响程序执行
【答案】A

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

【解析】在C++中,while (1)中1会被转换为true是一种常见的无限循环写法,没有语法错误。

14.以下C++代码判断输入的正整数是否为质数,如果该数字是质数,则输出 YES ,否则输出 NO 。质数是指仅能被1和它本身整除的正整数。请在横线上填写代码。( )
int num, i;

cin >> num;

for(i = 2; i < num; i++)

if (__________){

cout << ("NO");

break;

}

if(i == num)

cout << ("YES");


A.num % i

B.num % i == 0

C.num / i

D.num / i == 0

【答案】B

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

【解析】判断一个数是否为质数,即检查从2到num - 1是否有任何数能整除num,在循环中使用条件if (num % i == 0)来检查i是否为num的因子。如果存在这样的数,则num不是质数。

15.一个数如果能被某个数(比如7)整除,或者含有该数,则说该数是某个数的相关数。下面C++代码用于判定输入的数与7是否有关。下列说法错误的是( )。
int N, M;

bool Flag = false;

cin >> N;

M = N;

if (M % 7 == 0)

Flag = true;

while (!Flag && M){

if (M % 10 == 7){

Flag = true;

break;

}

M /= 10;

}

if (Flag)

cout << N << "与7有关";

else

cout << N << "与7无关";

A.删除break语句不会导致死循环,但有时会导致结果错误

B.删除M /= 10 将可能导致死循环

C.删除M = N 并将其后代码中的M变量改为N,并调整输出同样能完成相关功能

D.删除break语句不会导致死循环,但有时会影响效率

【答案】A

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

【解析】A / D选项:删除break语句不会导致死循环,只会影响效率。

B选项:正确,没有M /= 10,M永远不会变成0,循环将永远进行下去。

C选项:正确,修改后可以在while循环前输出N。

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

题目12345678910
答案

×

×

×

×

×

1.小杨最近开始学习C++编程,老师说C++是一门面向对象的编程语言,也是一门高级语言。( )

【答案】正确

【考纲知识点】程序设计语言的特点(二级)

【解析】C++是一门支持面向对象的高级语言。

2.在C++中, cout << (3, 4, 5) 可以输出 3 4 5 ,且每个输出项之间用空格分开。( )

【答案】错误

【考纲知识点】输入输出语句(一级)

【解析】C++中,逗号运算符(, )的作用是计算所有表达式并返回最后一个表达式的值。因此,(3, 4, 5) 实际上等价于5,最终会输出5。

3.C++表达式 12 % 10 % 10 的值为2。( )

 

【答案】正确

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

【解析】先运算10 % 2 = 2,再运算2 % 10 = 2,最终结果是2。

4.C++语句 cout << rand() << ' ' << rand(); 的第二个输出值较大。( )

【答案】错误

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

【解析】rand()用于生成伪随机数,无法任何保证两次调用中哪个值更大。

5.定义C++的 int 类型的变量 ch ,而且值为 '1' ,则语句 cout << int(ch); 的输出为 1 。( )

【答案】错误

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

【解析】字符'1'的ASCII值是49。当将字符'1'转换为整数时,实际上是在获取它的ASCII编码值,而不是其字面上的数值。因此,int('1')的结果是49,而不是1。

6.下面C++代码执行后将输出10。( )
int i;

for (i = 0; i < 10; i++)

continue;

if(i == 10)

cout << i;

【答案】正确

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

【解析】i被初始化为0。只要i < 10为真,循环继续。每次迭代i增加1 (i++)。continue语句使得循环体内没有其他操作直接进入下一次迭代。当i达到10时,条件i < 10 不再满足,循环终止,此时i的值是10因此最终输出10。

7.下面C++代码能求整数N和M之间所有整数之和,包含N和M。( )
int N, M, Sum;

cin >> N >> M;

if (N > M){

int tmp = N;

N = M, M = tmp;

}

for (int i = N; i < M+1; i++)

Sum += i;

cout << Sum;

【答案】错误

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

【解析】变量Sum没有被初始化为0。Sum持有一个无法确定的初始值,从而导致最终的结果无法确定。

8.将下面C++代码中的 L3 标记的代码行调整为 for (int i = 0; i < 5; i++) 后输出结果相同。( )
int loopCount = 0;

for (int i = 1; i < 5; i++) // L3

for (int j = 0; j < i; j++)

loopCount += 1;

cout << loopCount;

【答案】正确

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

【解析】无论是从i = 1到i < 5还是从i = 0 到i < 5,最终累加到loopCount的总和都是10。因此,该题的正确答案为“正确”。

9.某一系列数据的规律是从第3个数值开始是前两个数之和。下面的代码求第N个数的值,N限定为大于2。()
int start1; // 第1个数

int start2; // 第2个数

int N; //求N个数的值

int tmp;

cin >> start1 >> start2 >> N;

for (int i = 2; i < N; i++){

tmp = start1 + start2;

start1 = start2;

start2 = tmp;

}

cout << start2;

【答案】正确

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

【解析】每次迭代中,将当前的start1与start2相加得到tmp。然后更新start1和start2的值,使得start1变为之前的start2,start2变为新的和tmp。

这个过程模拟了斐波那契数列的生成方式,从第三个数开始每个数都是前两个数之和。最终输出的是第N个数的值,即start2。

10.下面C++代码执行时如果输入 2024 ,则输出是 4202 。( )
int N, flag=0;

cin >> N;

while (N){

if(!flag) cout << N % 10;

N /= 10;

flag = (flag + 1)%2;

}

【答案】错误

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

【解析】flag的值在0和1之间交替,如果flag为0,则输出N的最后一位数字(即N % 10)。该程序的实际输出是40,而不是题目所述的4202。

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

 

1、数位之和

【问题描述】

小杨有n个正整数,他认为一个正整数是美丽数字当且仅当该正整数每一位数字的总和是7的倍数。 小杨想请你编写一个程序判断 n个正整数哪些是美丽数字。

【输入描述】

第一行包含一个正整数n,代表正整数数量。

之后n行,每行包含一个正整数。

【输出描述】

对于每个正整数,如果是美丽数字则输出Yes,否则输出No。

【样例输入 】

3

7

52

103

【样例输出 】

Yes

Yes

No

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

【解题思路】

读取输入的( n ) 和后续的( n ) 个正整数。

对于每个正整数,计算其各位数字之和。

判断各位数字之和是否为7的倍数,若是则输出Yes,否则输出No。

【参考程序】
#include<bits/stdc++.h>

using namespace std;

int main(){

int n;

cin>>n;

int ans=0;

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

int x;

cin>>x;

int tot=0;

while(x){

tot+=(x%10);

x/=10;

}

if(tot%7==0)cout<<"Yes\n";

else cout<<"No\n";

}

return 0;

}

2、小杨的N字矩阵

【问题描述】

小杨想要构造一个m×m的N字矩阵( 为奇数),这个矩阵的从左上角到右下角的对角线、第1列和第m列都 是半角加号 +,其余都是半角减号-。例如,一个5×5的N字矩阵如下:
+---+

++--+

+-+-+

+--++

+---+
请你帮小杨根据给定的 打印出对应的 N字矩阵。

【输入描述】

输入格式第一行包含一个正整数m。

【输出描述】

输出对应的N字矩阵。

【样例输入 】

5

【样例输出 】

+---+

++--+

+-+-+

+--++

+---+

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

【解题思路】

使用两层嵌套循环来生成矩阵。

根据条件判断每个位置应该填充+或-。

【参考程序】
#include<bits/stdc++.h>

using namespace std;

int main(){

int n;

cin>>n;

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

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

if(j==1||j==n)cout<<"+";

else{

if(i==j)cout<<"+";

else cout<<"-";

}

}

cout<<"\n";

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值