2024年6月真题
一、单选题(每题2分,共30分)
正确答案:C
考察知识点:计算机基础与编程环境
解析:CCF 组织的 GESP 认证考试第 1 级可选择的认证语言有 Scratch、Python、C++ ,共 3 种。答案为C。
正确答案:B
考察知识点:流程图的概念与描述、闰年判断
解析:菱形中应该填写的闰年判断的条件。答案为B。
正确答案:A
考察知识点:变量的定义与使用
解析:变量名的命名规则:只包含字母、数字和下划线;不能以数字开头;不能和关键字重名。A选项包含其他字符。答案为A。
正确答案:A
考察知识点:控制语句结构-循环
解析:for(int i = 0; i < 10; i++)表示i从 0 开始,每次循环后i自增 1,当i等于 10 时循环结束。
选项 A 中for(int i = 0; i < 10; i += 1)同样是i从 0 开始,每次i增加 1,当i达到 10 时循环结束,与题目中的for循环效果相同。
选项 B 中i从 1 开始,到 10 结束;
选项 C 中i从 10 开始递减到 1;
选项 D 中i从 10 开始,由于初始条件i < 1不成立,循环体一次都不会执行。
答案为 A。
正确答案:A
考察知识点:基本运算,输入输出语句
解析:先计算5 % 2,取余运算结果为 1;再计算5 % 3,结果为 2。然后进行逻辑与&&运算,在 C++ 中逻辑与运算要求两边操作数都为非零值时结果才为真(在 C++ 中用 1 表示真),否则为假(用 0 表示假)。1 和 2 都是非零值,所以1 && 2结果为 1。答案为A。
正确答案:C
考察知识点:控制语句结构-分支
解析:在这段 C++ 代码中,switch 语句根据 month 的值来执行相应的 case 分支。当输入 1 时,匹配到 case 1,执行 cout << "Jan ";,由于 case 1 后面没有 break 语句,程序会继续执行下一个 case 分支,即 case 3,执行 cout << "Mar ";,直到遇到 break 语句才跳出 switch 结构。所以输出为 Jan Mar。答案为C。
正确答案:D
考察知识点:控制语句结构-分支
解析:A 选项:如果先后输入 1 和 1,a = 1,b = 1,a && b 为真(因为 1 和 1 都为非零值),所以会执行 cout << "1";,A选项表述正确。
B 选项:如果先后输入 0 和 1 或者 1 和 0,对于 a || b ,因为有一个为非零值,所以 a || b 为真,会执行 cout << "3";,B选项表述正确。
C 选项:如果先后输入 0 和 0,a = 0,b = 0,a || b 为假(因为两边都为零值),那么 !(a || b) 为真,会执行 cout << "2";,C选项表述正确。
D 选项:由 C 选项的分析可知,输入 0 和 0 时输出 2,不是 4,D选项表述错误。答案为D。
正确答案:B
考察知识点:基本运算
解析:cnt用来统计循环次数。第3行循环条件为1,死循环。每次循环 N 自减2,当 N 为0时,结束循环。N初值为10,循环次数为5,答案为C。
正确答案:C
考察知识点:多层分支/循环结构
解析:这是一个双重循环的问题。外层 for 循环 i 从 0 到 9,内层 for 循环 j 从 1 到 i - 1。
当 i = 0 时,内层循环条件 j < i 不成立,内层循环体不执行。
当 i = 1 时,内层循环条件 j < 1,j 从 1 开始,不满足条件,内层循环体不执行。
当 i = 2 时,内层循环 j 从 1 开始,j < 2,执行 1 次(j = 1),loopCount 加 1。
当 i = 3 时,内层循环 j 从 1 开始,j < 3,执行 2 次(j = 1, 2),loopCount 再加 2。
当 i = 4 时,内层循环 j 从 1 开始,j < 4,执行 3 次(j = 1, 2, 3),loopCount 再加 3。
......
当 i = 9 时,内层循环 j 从 1 开始,j < 9,执行 8 次(j = 1, 2, ..., 8),loopCount 再加 8。
那么 loopCount 的值就是 1 + 2+3+...+8=36。答案为C。
正确答案:C
考察知识点:多层分支/循环结构
解析:这是一个双重循环的 C++ 代码问题,外层循环 i 从 0 到 9,内层循环 j 从 0 到 i - 1。在内层循环中,当 i * j % 2 的结果不为 0(即 i * j 为奇数)时,执行 break 语句跳出内层循环,跳出内层循环执行外层循环的 loopCount += 1 语句。
也就是 loopCount += 1 语句 是外层循环中无条件执行的,即外层循环的循环多少次,该语句就执行多少次。答案选C。
正确答案:D
考察知识点:控制语句结构-循环
解析:选项A:输入0,while循环循环条件不成立,终止循环,选项A表述正确。
选项B:输入N,只要N不为0,循环继续,将N累加到Sum上,在输入N。代码可以实现所有非0整数的累加求和,选项B表述正确。
选项C:第一次输入0,while循环循环条件不成立,不进入循环,Sum值为0。选项C表述正确。
选项D:将 while(N) 改为 while(N==0),也就是循环继续的条件从N不为0,更改为N为0,也就是当输入N不为0时,循环结束,不会陷入死循环。选项D表述错误。答案为D。
正确答案:D
考察知识点:多层分支/循环结构
解析:代码首先从标准输入读取一个整数 N,然后初始化一个布尔变量 Flag 为 true。
接着通过 for 循环从 i = 2 开始到 i < N 进行遍历。在循环中,如果 i * i > N,说明在小于等于 sqrt(N) 的范围内没有找到 N 的因子,直接跳出循环;如果 N % i == 0,说明 N 能被 i 整除,将 Flag 设为 false 并跳出循环。最后根据 Flag 的值判断并输出 N 是否为质数。当输入N为大于等于0的整数时,此代码都可以判断N是否为质数。
D 选项:即使将 Flag = true 修改为 Flag = N>=2? true: false,对于负数,代码依然不能正确判断是否为质数,因为质数定义只针对正整数,该选项错误。答案为D。
正确答案:A
考察知识点:多层分支/循环结构
解析:B选项:移到循环L2内部,则每输出一个数字就输出一个换行,不能实现预期效果。
C选项:移到循环L1外部,则输出完所有数字才会输出换行,不能实现预期效果。
D选项,删除cout<<endl;行,则所有数字会在一行输出,不能实现预期效果。
答案为A。
正确答案:B
考察知识点:多层分支/循环结构
解析:外层 for 循环 i 从 0 到 9。当i 为偶数(0,2,4,6,8)时,第3行条件成立,跳过本次循环,进入下次循环;当 i 为奇数(1,3,5,7,9)时,第 5 行条件成立,cnt1 增加1;第 7 行不会被执行,cnt2 不会被执行,其值一直为 0。代码执行完毕,cnt1 值为 5,cnt2 值为0。答案为B。
正确答案:D
考察知识点:多层分支/循环结构
解析:选项A:N为3,M为36,第8行条件成立,Lucky置为true。跳到第12行执行while循环,M为36,第13行条件不成立,执行第17行M/=10之后M为3;while循环 循环条件成立 继续执行循环,第13行条件成立,输出:3是3的超级幸运数! 选项A表述错误。
选项B:N为7,M为21,输出:0是7的幸运数! 选项B表述错误。
选项C:N为8,M为36,输出:0非8的幸运数! 选项C表述错误。
选项D:N为3,M为63,输出:63是3的超级幸运数! 选项D表述正确。答案为D。
二、判断题(每题2分,共20分)
正确答案:错误
考察知识点:表达式、基本数据类型、数据类型转换
解析:在 C++ 中,'9' 和 '1' 是字符常量,它们存储的是对应的 ASCII 码值,'9' 的 ASCII 码值为 57,'1' 的 ASCII 码值为 49,57 + 49 = 106,所以输出不是 10。答案正确。
正确答案:错误
考察知识点:基本运算、表达式
解析:在 C++ 中,取余运算 a % b(a 为 - 12,b 为 10),结果的符号与被除数 a 相同,-12 % 10 = -2,不是 2。答案错误。
正确答案:错误
考察知识点:数据类型的转换
解析:int (12.56) 是将浮点数 12.56 强制转换为整型,会直接截断小数部分,结果为 12,不是 13。答案错误。
正确答案:正确
考察知识点:基本运算
解析:整型变量 N = 10,N / 3 是整数除法,结果为 3,N % 3 是取余运算,结果为 1,所以输出是 3 - 1。答案正确。
正确答案:错误
考察知识点:变量的定义与使用
解析:scanf 不是 C++ 的关键字,但是它是 C 标准库中的一个函数名,为了避免混淆和语义冲突,不建议将变量命名为 scanf。答案错误。
正确答案:错误
考察知识点:控制语句结构-循环
解析:for 循环中,i 从 0 开始,每次循环 i++,遇到 continue 只是跳过本次循环剩余语句,继续下一次循环条件判断,i < 10 这个条件最终会不满足,不会导致死循环。答案正确。
正确答案:错误
考察知识点:多层分支/循环结构
解析:外层for循环i从 0 到 9,每次进入内层for循环,内层for循环中 j 从 0 到 i - 1,但内层循环体中执行break 语句,即内层循环每次只执行一次就跳出。所以 cnt 只会加 1,最终输出为 1,而不是 10。答案错误。
正确答案:正确
考察知识点:多层分支/循环结构
解析:当 i = 1 时,内层循环 j 从 1 开始,j < 5,j += 1,即 j 取值 1、2、3、4。1 * 1 % 2 = 1,1 * 2 % 2 = 0,1 * 3 % 2 = 1,1 * 4 % 2 = 0,cnt加 2。
当 i = 2 时,内层循环 j 从 2 开始,j < 5,j += 2,即 j 取值 2、4。2 * 2 % 2 = 0,2 * 4 % 2 = 0,cnt加 2。
当 i = 3 时,内层循环 j 从 3 开始,j < 5,j += 3,即 j 取值 3。3 * 3 % 2 = 1,cnt不变。
当 i = 4 时,内层循环 j 从 4 开始,j < 5,j += 4,即 j 取值 4。4 * 4 % 2 = 0,cnt加1。
综上,cnt最终为 5。答案正确
正确答案:正确
考察知识点:控制语句结构-循环
解析:进入while (N)循环,只要N不为 0 就会继续循环。在循环体中,Sum += N % 10; 语句取出N的个位数字并累加到Sum中,N /= 10; 语句则去掉N的个位数字,将N缩小 10 倍。通过不断重复这个过程,最终可以将N的每一位数字都累加到Sum中。
循环结束后,Sum中存储的就是输入正整数各位数字之和,最后通过cout << Sum;输出结果。答案正确。
正确答案:正确
考察知识点:计算机基础与编程环境
解析:GESP测试主要考察编程能力,同一级别能力要求不局限于特定编程语言。答案正确。
三、编程题(每题25分,共50分)
本题考察 多层分支/循环结构、常用数学函数。
cpp
#include<bits/stdc++.h>
using namespace std;
int main() {
int n, a, flag;
cin>>n;
while(n--){
cin>>a;
flag=0;
for(int x=1; x*x<=a; x++) { //确定范围:最小为1,最大满足x*x<=a;
int y = sqrt(a-x*x); //利用 x*x+y*y=a 预求 y
if(y>0 && x*x+y*y == a) { //判断是否真的满足条件
flag=1;
break;
}
}
if(flag) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
本题考察 多层分支/循环结构、数位分离。
cpp
#include<bits/stdc++.h>
using namespace std;
int main() {
int n, k, num, cnt=0;
cin>>n>>k;
for(int i=1; i<=n; i++) {
num=i;
while(num){
if(num%10==k) cnt++; //如果位上的值为k,计数器自增1
num/=10;
}
}
cout<<cnt;
return 0;
}