注意!做题时长为2小时,孩子做完题目后对照讲解视频和讲解分析,针对薄弱点,进行有效的专项提高。
?讲解视频
2024.6GESPc++真题讲解
?讲解分析
1 单选题(每题 2 分,共 30 分)?
答案与解析:选A 。
[解释]:C++中,变量名不能包含连字符(-),因此选项 A 是不可做变量名的。其他选项 B、C、D 都是符合C++命名规则的变量名。
答案与解析:选D。
[解释]:要计算表达式 3 - 3 * 3 / 5
的值,需要按照运算符优先级和结合性的规则进行计算。在这个表达式中,乘法和除法的优先级高于减法,且乘法和除法具有左结合性。
按照这些规则,首先计算乘法和除法,然后再计算减法。计算过程如下:
3−3∗3/5 = 3−9/5 = 3−1.8 = 1.2
答案与解析:选B 。
[解释]:我们可以考虑当 N 取不同的值时,表达式的结果。在这里,N 是正整数。
首先,我们观察 %
运算符的性质:对于正整数 N,N % M
的结果范围是 0 到 M-1。
因此,当 N % 3 和 N % 7 的结果都取到各自的最大值时,即 N % 3 = 2,N % 7 = 6 时,表达式的结果最大。此时,N % 3 + N % 7 = 2 + 6 = 8
。
答案与解析:选C 。
[解释]:在C++语句 printf("5%%2={%d}\n", 5 % 2)
中,%%
表示输出一个百分号 %
。因此,实际上会输出字符串 "5%2={1}",其中 %d
会被 % 2
的结果替换。对于表达式 5 % 2
,计算结果为 1。
答案与解析:选B.
[解释]:程序在输入“5+2”后,他会挨个读取内容,读到“+”后发现不符合条件,所以停止录入,所以a里是5。
答案与解析:选C。
[解释]:在这段给出的C++代码中,变量 a
被声明为浮点数 float
类型。首先,a
被赋值为 101.101
,然后又被重新赋值为整数 101
。 在 printf
函数中,"%.0f"
表示输出浮点数,小数部分保留0位,且被a+1替代,进而a+1的值是101+1=102,除了"%.0f"
之外的字符串原封不变的输出。所以最终输出结果是a+1={102}。
答案与解析:选B。
[解释]:要计算表达式 9/4 - 6 % (6 - 2) * 10
的值,我们需要按照运算符的优先级和结合性规则进行计算。在这个表达式中,括号具有最高优先级,然后是取模运算 %
,接着是乘法和除法,最后是加法和减法。
按照这些规则,我们依次计算表达式的值:
首先计算括号内的表达式(6 - 2)
,结果为 4
。接着计算取模运算 6 % 4
,结果为 2
。然后计算乘法 2 * 10
,结果为 20
。最后计算除法 9/4
,结果为 2
。将步骤3和步骤4的结果相减,即 2 - 20
,结果为 -18
。 答案与解析:选C 。
[解释]:在这段给出的C++代码中,当输入为 10 时,我们来逐行分析代码的执行:
用户输入为 10,赋值给变量N
。根据 if (N % 3)
,计算 N % 3
,即 10 % 3
,结果为 1
。因为 10 % 3
的结果为非零值,所以执行 if
分支,输出 "第5行代码 1"
答案与解析:选C。
[解释]:在这段代码中,循环会执行10次,每次将 i
加到 Sum
中,然后递增 i
。最终输出 i
的值和 Sum
的值。由于循环结束后 i
的值为 10
,Sum
的值为 45
。因此,这段代码执行后的输出是 10 45
。
综上所述,这段 C++ 代码执行后的输出是:10 45
答案与解析:选C 。
在这段给出的 C++ 代码中,根据输入的整数 N
判断其是否为质数。让我们逐项分析选项:
A. 如果输入负整数,可能输出“是质数”
[解释]:这个选项是不正确的。因为代码中通过if (N >= 2)
来判断输入的整数是否大于等于2,如果输入为负整数,不会进入判断为质数的逻辑,因此不会输出“是质数”。 B. 如果输入2,将输出“不是质数”,因为此时循环不起作用
[解释]:这个选项也是不正确的。虽然输入为2时循环体不会被执行,但是由于2符合质数的定义(只能被1和它本身整除),所以输出应该是“是质数”。C. 如果输入2,将输出“是质数”,即便此时循环体没有被执行
[解释]:这个选项是正确的。因为2符合质数的定义,即使循环体没有被执行,输出应该是“是质数”。D. 如果将 if (N >= 2) 改为 if (N > 2) 将能正确判断N是否质数
[解释]:这个选项是不正确的。将if (N >= 2)
改为 if (N > 2)
会导致无法判断2是否为质数,因为2符合质数的定义,应该被判断为质数。 答案与解析:选C 。
让我们逐项分析这段给出的 C++ 代码,以及关于描述的选项:
【A选项】 当输入为 10 时,代码执行后的输出是 11 25。
[解释]:这个选项是正确的。因为代码会计算1到10之间所有奇数的和,包括10在内,最后输出的 i
为 11
,Sum
为 25
。
【B选项】 当输入为 5 时,代码执行后的输出是 6 9。
[解释]:这个选项是错误的。因为代码会计算1到5之间所有奇数的和,包括5在内,最后输出的 i
为 6
,Sum
为 9
。
【C选项】 将 i += 1
移到 if (i % 2 == 1)
前一行,同样能实现题目要求。
[解释]:这个选项是正确的。将 i += 1
移到 if (i % 2 == 1)
前一行,不会影响代码逻辑,仍然能够正确计算1到N之间所有奇数的和。
【D选项】 删除 if (i % 2 == 1)
,并将 i += 1
改为 i += 2
,同样可以实现题目要求。
[解释]:这个选项是错误的。删除了判断奇数的条件和改变了增加的步长,会导致计算结果不正确,无法实现题目要求。
答案与解析:选D.
[解释]:在这段 C++ 代码中,我们需要填入的代码应该是用来判断 N 是否为一个完全平方数的条件。根据题目描述,一个整数 N 能够表示为 XX 的形式时,即 N = XX,那么它就是一个完全平方数。因此,在横线处应填入的代码是:i*i == N。
答案与解析:选C,
[解释]: 在这段代码中,循环从 i = 0
开始,每次迭代 i
增加 2,直到 i*i
不小于 64 为止。然后统计循环执行的次数,即 cnt
的值。
我们来逐步分析循环的执行过程:
当i = 0
时,i*i = 0
,满足条件,cnt
加一。当 i = 2
时,i*i = 4
,满足条件,cnt
再加一。当 i = 4
时,i*i = 16
,满足条件,cnt
再加一。当 i = 6
时,i*i = 36
,满足条件,cnt
再加一。当 i = 8
时,i*i = 64
,不满足条件,循环结束。 因此,循环执行了 4 次,最终输出的 cnt
的值为 4。
答案与解析:选C ,
[解释]: 分别是C++,Python,Scratch。
答案与解析: 选B。
[解释]:感应线圈不用制造计算机,集成电路和晶体管发明时间分别是1958年和1947年,其中晶体管是电子管的升级版,在第一台计算机制造出来之后才发明成功。
2 判断题(每题 2 分,共 20 分)?
答案与解析: ×,如果变量X定义为float或者double那么16.44 除以 10 的结果是 1.644,如果变量X定义的数据类型是int,那么结果才是1。
答案与解析: ×, 如果变量N=10,那么
N/4 = 10/4 = 2.5(int) = 2,这是因为N和4都是int类型,那么相除的结果会自动变成int。N%4= 10%4 = 2,N/4.0 = 10 / 4.0 = 2.5(float) = 2.5, N为int,4.0为float,那么相除的结果会是float。所以最后的结果是 2->2->2.5。
答案与解析: √,正整数,负整数和浮点数都被允许进行int和float的强制转换操作,先是转变为浮点型,最后都会变成整数输出。
答案与解析: ×,printf 函数中的格式化字符串 "%d*2" 中只会输出 N 的值,不会进行计算,所以输出为 "5*2"。
答案与解析: √, break和continue用于for与while。
答案与解析:√, 是的,满足一定的条件才去continue。
答案与解析: ×, printf 是 C 语言的函数,而不是 C++ 的关键字,因此在 C++ 中可以将变量命名为 printf。
答案与解析: ×,在 C++ 中,除法运算符 /
和 //
(整数除法)的优先级是相同的,它们都属于乘法和除法运算符,且遵循从左向右的结合规则。因此,在表达式中同时存在 /
和 //
运算符时,它们将按照出现的顺序依次计算。
例如,对于表达式 8 / 4 // 2
,根据从左向右的结合规则,首先计算 8 / 4
,结果为 2,然后再计算 2 // 2
,结果为 1。
答案与解析: ×, !N的值为0,!!N的值为!0=1,最后结果是1。
答案与解析:√,GESP测试主要是对编程能力进行认证,与具体编程语言无关,语言只是工具,对算法和编程的理解才是最重要的。
3 编程题(每题 25 分,共 50 分) ?
#include<bits/stdc++.h>using namespace std;int main(){ int h,m,s; //小杨开始学习的时间 小时h 分钟m 秒钟s cin>>h>>m>>s; //小杨学习多久就去休息 秒钟s int k; cin>>k; /* 思路很简单,统一时间单位为秒,因为只有单位统一才能进行加减乘除,一般都是统一为最小的单位, 在时分秒中,秒最小,所以全部变为秒钟 分钟*60 = 秒 小时*60 = 分钟 故小时*60*60 = 秒钟 */ int now=h*60*60+m*60+s; // 小杨学习多久就去休息已经是秒钟了,直接加上,比如我今天第80s开始学习100s后休息,那么我只需要使用80+100再转换为时分秒就完成,如何转换回去?乘法变除法即可,除不尽的要余数给下一位除 now+=k; // 转换回去必须先计算 最大的开始 时 int hh = now/3600; //余出代表分钟的秒 now %= 3600; // 秒变成分钟 int mm = now/60; // 余出秒钟 now %= 60; cout<<hh<<" "<<mm<<" "<<now<<"\n";}
#include<bits/stdc++.h>using namespace std;int main(){ int n; cin>>n; //设置一个开关,如果是立方数就让他等于1,如果不是就等于0,也就是不变,方便我们最后的输出 int fl=0; // 进入循环,从1 遍历 到 n ,所以结束条件需要是n + 1 for(int i=1;i<=n;i++){ //如果是立方数 满足 i*i*i = n if(i*i*i==n){ //标记一下 说明n是立方数 fl=1; //已经知道这个数是立方数了,直接结束循环退出了 break; } } // 打印结果,如果f1标记了f1=1,那么代表是立方数。 if(fl)cout<<"Yes\n"; else cout<<"No\n";}