GESP认证C++编程真题解析 | 202409 二级

附上汇总帖:GESP认证C++编程真题解析 | 汇总


单选题

第1题

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

A. 内存

B. 磁盘

C. CPU

D. 显示器

【答案】:A

【解析】

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

第2题

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

A. 65000

B. 200万

C. 126

D. 128

【答案】:C

【解析】

IPv4版本的 A 类地址网络号占1字节(8位),首位必须是0,全0和全1这两种情况被保留有特殊作用(网络地址和广播地址),所以总共用个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次,7不等效。

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

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

因此,正确答案是:C

第5题

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

A. 1

B. 2

C. 3

D. 4

【答案】:C

【解析】

先进行除法和取模运算:

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

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

然后进行加法运算:1+2=3。

因此最终输出为3,故正确答案为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,个位的位权为;十位的位权为;百位的位权为;第N位的位权为:;该数的数值等于每位的的(数值位权)之和。对于任意正整数N,我们可以将其分解成如下形式:,其中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 >> socre;
	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。

判断题

第1题

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

A. 正确

B. 错误

【答案】:A

【解析】

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

第2题

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

A. 正确

B. 错误

【答案】:B

【解析】

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

第3题

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

A. 正确

B. 错误

【答案】:A

【解析】

现运算10%2=2,再运算2%10=2,最终结果是2。

第4题

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

A. 正确

B. 错误

【答案】:B

【解析】

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

第5题

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

A. 正确

B. 错误

【答案】:B

【解析】

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

第6题

下面C++代码执行后将输出10。( )

int i;
for (i=0; i<10; i++)
	continue;
if (i == 10)
	cout << i;

A. 正确

B. 错误

【答案】:A

【解析】

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;

A. 正确

B. 错误

【答案】:B

【解析】

变量 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;

A. 正确

B. 错误

【答案】:A

【解析】

无论是从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;

A. 正确

B. 错误

【答案】:A

【解析】

每次迭代中,将当前的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;
}

A. 正确

B. 错误

【答案】:B

【解析】

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

编程题

题解:洛谷 B4036 [GESP202409 二级] 数位之和

题解:洛谷 B4037 [GESP202409 二级] 小杨的 N 字矩阵

posted @ 2026-03-28 11:29  团爸讲算法  阅读(52)  评论(0)    收藏  举报