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

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

题目123456789101112131415
答案CBAAACDBCCDDABD

1.小杨父母带他到某培训机构给他报名参加CCF组织的GESP认证考试的第1级 ,那他可以选择的认证语言有几种?  (     )

A.1

B.2

C.3

D.4

【答案】C

【考纲知识点】了解高级语言

【解析】本题考察GESP等级的认证语言,包括c++、python和图形化编程三种语言

2.下⾯流程图在yr输⼊2024时 ,可以判定yr代表闰年 ,并输出 2月是29天 ,则图中菱形框中应该填⼊(  )。

A. (yr%400==0) || (yr%4==0)

B. (yr%400==0) || (yr%4==0 && yr%100 !=0)

C. (yr%400==0) && (yr%4==0)

D. (yr%400==0) && (yr%4==0 && yr%100 !=0)
【答案】B

【考纲知识点】 分支结构中的if条件语句

【解析】本题通过流程图体现分支结构,条件判断框中填写闰年的判定条件:年份是4的倍数时,该年是闰年。当年份是100的倍数时,当且仅当年份是400的倍数时才是闰年

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

A.five-Star

B.five_star

C.fiveStar

D._fiveStar
【答案】A

【考纲知识点】掌握变量的命名规则

【解析】本题考察c++中变量的命名由数字、字母、下划线组成,没有短横线,并且只能由字母或下划线开头

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

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

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

C. for(int i=10; i>0; i--)  

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

【答案】A

【考纲知识点】赋值运算符

【解析】本题考察c++中的加赋值运算符,i+=1的含义是i=i+1,也就是实现了i++的操作

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

A.1

B.2

C.true  

D. False
【答案】A

【考纲知识点】掌握%、&&和布尔值的含义

【解析】5%2的结果非0,为1;5%3的结果非0,为1;二者进行&&与运算,结果仍为1,通过cout进行输出

6.执⾏下⾯的C++代码时输⼊1,则输出是(      )。
int month;

cin >> month;

switch(month){

case 1:

cout << "Jan ";

case 3:

cout << "Mar ";

break;

default:

;

}

A. Jan

B. Mar

C. Jan Mar

D.以上均不对

【答案】C

【考纲知识点】掌握分支结构switch-case语句

【解析】本题考察对于switch语句的理解,当没有使用break将各种分支情况隔离开时,会执行所有分支情况的语句

7.执行下面C++代码后 ,有关说法错误的是(    )。
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和1,则将输出1

B.如果先后输⼊0和1或者1和0,则将输出3

C.如果先后输⼊0和0,则将输出2

D.如果先后输⼊0和0,则将输出4
【答案】D

【考纲知识点】if-else条件语句

【解析】本题考察对于if-else条件语句的理解。当if括号内的语句为真,会执行if代码块中的语句,否则跳转至else if或者else。当a=0、b=0时,a||b的结果为0,所以!(a||b)的结果为1,输出2

8.某货币由5元 ,2元和1元组成 。输入金额(假设为正整数) ,计算出最少数量 。为实现其功能 ,横线处应填 ⼊代码是(    )。
int N;

cin >>N;

int M5,M2,M1;

M5 = N / 5;

M2 = ______________;

M1 = ______________;

printf("5*%d+2*%d+1*%d", M5, M2, M1);

A. 第1横线处应填⼊:N / 2

   第2横线处应填⼊:N - M5 - M2

B. 第1横线处应填⼊: (N - M5 * 5) / 2    

   第2横线处应填⼊:N - M5 * 5 - M2 * 2

  1. 第1横线处应填⼊:N - M5 * 5 / 2

   第2横线处应填⼊:N - M5 * 5 - M2 * 2

D. 第1横线处应填⼊: (N - M5 * 5) / 2

   第2横线处应填⼊:N - M5  - M2
【答案】B

【考纲知识点】数学逻辑、格式化输出

【解析】本题考察对题干中逻辑的理解,其中M5、M2、M1分别代表5元、2元、1元货币的个数。需要货币总数尽可能少,因此尽可能使用面额更高的货币。首先由N/5计算出5元货币的个数,这个结果将会取得整数。剩余无法用5元来表示的金额,则 是N - M5 * 5,用(N - M5 * 5) / 2 计算出2元货币的个数,剩余金额(N - M5 * 5 - M2 * 2)/1得到1元货币的个数

9.下⾯C++代码执⾏后的输出是(   )。
int loopCount = 0;

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

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

loopCount += 1;

cout << loopCount;

A. 55

B. 45

C. 36

D. 28

【答案】C

【考纲知识点】双重for循环

【解析】本题考察对于循环嵌套以及赋值运算符的理解。使用loopcount变量记录内层循环总次数,当i=2时,内层循环执行1次,当i=3时,内层循环执行2次......当i=9时,内层循环执行8次.因此总次数为(1+8)*8/2=36


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

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

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

if (i * j % 2)

break;

loopCount += 1;

}

cout << loopCount;

A.25

B.16

C.10

D.9

【答案】C

【考纲知识点】双重for循环和break终止语句

【解析】本题考察对于循环嵌套以及break终止语句的理解。当i=1时,j=0,i*j%2的结果是0;当i=2时,j=0/1,结果都是0;当i=3时,j=0/1/2,结果分别是0/1/0......当结果为1时,执行break语句终止内层循环,进入下一轮的外层循环。使用loopcount变量记录结果为0的次数。实际上loopCount计数不受内层循环影响,执行了10次加1操作。





 

11.假设下⾯C++代码执行过程中仅输入正负整数或0,有关说法错误的是(   )。
int N,Sum = 0;

cin >> N;

while (N){

Sum += N;

cin >> N;

}

cout << Sum;

A.执行上面代码如果输入0,将终止循环

B.执行上面代码能实现所有非0整数的求和  

C.执行上面代码第⼀次输入0,最后将输出0

D.执行上面代码将陷入死循环 ,可将 while (N) 改为while (N==0)
【答案】D

【考纲知识点】while循环的条件

【解析】该代码不会陷入死循环,N的值随机,D选项的改动后执行意义都变了,只能输出0

12.执行下面的C++代码 ,有关说法正确的是(   )【质数是指仅能被1和它本身整除的正整数】 。
int N;

cin >> N;

bool Flag = true;

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

if (i * i > N)

break;

if (N % i == 0){

Flag = false;

break;

}

}

if (Flag)
cout << N << "是质数" << endl;

else

cout << N << "不是质数" << endl;

A.如果输⼊正整数 ,上面代码能正确判断N是否为质数

B.如果输⼊整数 ,上面代码能正确判断N是否为质数

C.如果输⼊⼤于等于0的整数 ,上⾯代码能正确判断N是否质数

D.如将Flag = true 修改为Flag = N>=2? true:false 则能判断所有整数包括负整数、0、正整数是否为质数

【答案】D

【考纲知识点】for循环、条件判断、对质数的理解

【解析】原代码没有考虑N=1的情况,将输出1为质数,由此排除ABC。D选项的改动规避了N<2的情况,正确

13.下⾯C++代码⽤于实现如下图所⽰的效果 ,其有关说法正确的是( )。

for (int i = 1; i < 6; i++){ // L1

for (int j = 1; j < i+1; j++) //L2

cout << i*j << " ";

cout << endl;

}

A.当前代码能实现预期效果 ,无需调整代码

B.如果cout << endl; 移到循环L2内部 ,则可实现预期效果  

C.如果cout << endl; 移到循环L1外部 ,则可实现预期效果

D.删除cout << endl; ⾏ ,则可实现预期效果
【答案】A

【考纲知识点】双重for循环

【解析】i=1,j=1,输出1后换行;i=2,j=1/2,输出2 4后换行;以此类推得到的输出结果与题干相符

14.下⾯C++代码执行后 ,输出是(    )。
int cnt1 = 0, cnt2 = 0;

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

if (i % 2 == 0)

continue;

if (i % 2)

cnt1 += 1;

else if (i % 3 == 0)

cnt2 += 1;

}

cout << cnt1 << " " << cnt2;

A.5 2

B.5 0

C.0 2

D.0 0

【答案】B

【考纲知识】for循环和if-else条件判断语句

【解析】i的取值范围从0遍历到9,使用cnt1变量记录满足i%2==1的个数,使用cnt2变量记录满足i%3==0的个数,分别是i=1、3、5、7、9。通过观察if-else结构可知,只有当i%2==1且i%2!=1时才会执行else if判断,这显然互相矛盾,因此else if之后的语句不会执行,cnt2保持初始值0

15.在下面的C++代码中,N必须是小于10大于1的整数 ,M为正整数(大于0) 。如果M被N整除则M为幸运数 ,如果M中含有N且能被N整除 ,则为超级幸运数 ,否则不是幸运数 。程序用于判断M是否为幸运数或超级幸运数 或非幸运数 。阅读下面代码 ,有关说法正确的是(  )。

int N, M;

cout << "请输入幸运数字:";

cin >> N;

cout << "请输入正整数:";

cin >> M;

bool Lucky;

if (M % N == 0)

Lucky = true;

else

Lucky = false;

while (M){

if (M % 10 == N && Lucky){

printf("%d是%d的超级幸运数!", M, N);

break;

}

M /= 10;

}

if (M == 0)

if (Lucky)

printf("%d是%d的幸运数!", M, N);

else

printf("%d非%d的幸运数!", M, N);

A.如果N输⼊3 ,M输⼊36则将输出:36是3的超级幸运数!

B.如果N输⼊7,M输⼊21则将输出:21是7的幸运数!

C.如果N输⼊8,M输⼊36则将输出:36非8的超级幸运数!

D.如果N输⼊3,M输⼊63则将输出:63是3的超级幸运数!

【答案】D

【考纲知识点】程序阅读能力

【解析】本题需要注意当M的个位与N不相同时,M会不断除以10即发生变化,而且没有变量存储原M值。因此A、B、C选项中最终会输出的M都不是最开始的输入值。

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

题目12345678910
答案××××××

1.执⾏C++代码cout << '9 '+ '1 '; 的输出为10。(    )

【答案】错误

【考纲知识点】cout语句

【解析】使用单引号代表这是一个字符,本条cout语句会输出数字字符9和数字字符1的ascII码之和106


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

【答案】错误

【考纲知识点】运算符%

【解析】c++中对于负数的取模运算,就是正常取余后保留负号

3.C++表达式int(12.56)的值为13。 ( )

【答案】错误

【考纲知识点】int()强制类型转换

【解析】在c++中使用int()对浮点数做强制类型转换,会舍弃小数部分,保留为整数12

4.C++的整型变量N被赋值为10,则语句cout << N / 3 << "-" << N % 3 执⾏后输出是3-1。(  )

【答案】正确

【考纲知识点】运算符/和%的含义

【解析】本题考察c++中运算符/和%。/表示整数除法,返回的值是做整数除法,取除法的商。因此10/3 =3,10%3=1。

5.在C++代码中 ,不可以将变量命名为scanf, 因为scanf是C++语⾔的关键字 。  ( )

【答案】错误

【考纲知识点】对于scanf的理解

【解析】scanf()是c++中的库函数,用于标准输入,而不是关键字。

6.下⾯C++代码执⾏后将导致死循环 。  ( )
for (int i = 0; i < 10; i++)

continue;

【答案】错误

【考纲知识点】for循环和continue语句

【解析】执行continue语句后,会跳过当前循环的剩余语句不执行转而进入下一轮循环。题干中i=0,此时执行continue回到for语句,i自增为1,继续执行continue回到for语句,i自增为2;依次循环直到i=10不再执行。因此总循环数为10次,并不会出现死循环。
7.下面C++代码执行后将输出10。( )
int cnt = 0;

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

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

cnt += 1;

break;

}

cout << cnt;
 

【答案】错误

【考纲知识点】双重for循环、赋值运算符

【解析】本题使用cnt变量记录第二层循环执行的次数,当i=0时,内层循环执行0次;当i=1时,内层循环执行1次,当i=2时,内层循环执行2次......当i=9时,内层循环执行9次.因此总次数为(1+9)*9/2=45

8.下面C++代码执行后,将输出5。( )
int cnt = 0;

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

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

if (i * j % 2 == 0)

cnt += 1;

cout << cnt;

【答案】正确

【考纲知识点】双重for循环和if语句

【解析】当i=1时,j=1/2/3/4,此时i*j%2的结果为1/0/1/0,结果为0时满足if条件判断则执行cnt的自增语句;当i=2时,j=2/4,此时i*j%2的结果为0/0;当i=3时,j=3,此时i*j%2的结果为1;当i=4时,j=4,此时i*j%2的结果为0;

9. 下面C++代码能实现正整数各位数字之和。( )
int N,Sum = 0;

cin >> N;

while (N){

Sum += N % 10;

N /= 10;

}

cout << Sum;

【答案】正确

【考纲知识点】运算符%、赋值运算符+=和/=

【解析】本题考察对两种运算符的认识,通过N%10取得N的个位数,用sum变量保存,再通过N/=10去掉N的个位数,下一次取得的实际上是N的十位数。循环往复,直到N=0循环结束,此时已将N的所有位数加到sum中

10.GESP测试是对认证者的编程能力进行等级认证,同一级别的能力基本上与编程语言无关。( )

【答案】正确

【考纲知识点】对GESP的认识

【解析】本题考察对GESP的认识,GESP测试是对认证者的编程能力进行等级认证, 同⼀级别的能力基本上与编程语言无关

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

1、平方之和

【问题描述】

⼩杨有n个正整数a1, a2, · · · , an,他想知道对于所有的i ( 1 ≤ i ≤ n) ,是否存在两个正整数x和y 满⾜x*x + y*y = ai。

【输入描述】

第一行包含⼀个正整数n,代表正整数数量。之后n⾏ ,每⾏包含⼀个正整数 ,代表 ai。

【输出描述】

对于每个正整数ai,如果存在两个正整数x和y满⾜x*x + y*y = ai,输出Yes,否则输出No。

【样例输入】

2

5

4

【样例输出】

Yes
No

【题目大意】

给定n,一共输入n个正整数a1~an。判断ai能否表示为两个正整数x和y的平方之和。

【考纲知识点】
开方运算、输入输出语句、循环

【解题思路】

1、按题目要求定义好需要的变量,并实现输入

2、通过while循环n次单独接收每次的数据ai,定义f1变量表示结果

3、在1~根号ai之间遍历数字i,此时i就是x

4、调用check()函数计算ai,剩余的数为ai-i*i,判断它能否被开方5、如果可以则f1=1,输出Yes,否则输出No

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

using namespace std;

bool check(int x){

int y = sqrt(x);

return y*y==x;

}

int main(){

int t;

cin>>t;

while(t--){

int n;

cin>>n;

int fl=0;

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

int j=n-i*i;

if(check(j))fl=1;

}

if(fl)cout<<"Yes\n";

else cout<<"No\n";

}

}

2、计数

【问题描述】

⼩杨认为⾃⼰的幸运数是正整数k(注:保证1 ≤ k ≤ 9) 。⼩杨想知道 ,对于从 1到n的所有正整数中 ,k出现了多少次。

【输入描述】

第⼀⾏包含⼀个正整数n。 第⼆⾏包含⼀个正整数 k。

【输出描述】

输出从1到n的所有正整数中 ,k出现的次数。

【样例输入】

25
2

【样例输出】

9

【题目大意】

给定正整数n和k,要计算k这个数在1~n中出现了多少次

【考纲知识点】
取模和除运算、输入输出语句、循环

【解题思路】

1、按题目要求定义好需要的变量,并实现输入

2、通过for循环遍历1~n中的每个数i,调用check()函数计算该数中k出现多少次

3、定义check()函数,传入参数i和k,通过i%10得到i的个位,与k比较,如果相同则cnt+1.再通过i/10去掉i的个位。通过循环重复上述步骤,将i的每一位都与k作对比

4、定义ans变量累计每次cnt的结果,得到最终答案

【参考程序】
#include <iostream>

using namespace std;

int check(int x, int y) {

int cnt = 0;

while (x > 0) {

int tmp = x % 10;

if (tmp == y) {

cnt++;

}

x = x / 10;

}

return cnt;

}

int main() {

int n, k;

cin >> n >> k;

int ans = 0;

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

ans += check(i, k);

}

cout << ans << endl;

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值