GESP认证C++编程真题解析 | 202406 二级
附上汇总帖GESP认证C编程真题解析 | 汇总单选题第1题小杨父母带他到某培训机构给他报名参加CCF组织的GESP认证考试的第1级那他可以选择的认证语言有几种 A.1B.2C.3D.4【答案】C【解析】GESP考察有三种语言可选 为图形化Scratch编程、Python编程及C编程。第2题下面流程图在yr输入2024时可以判定yr代表闰年并输出2月是29天则图中菱形框中应该填入 。A.(yr%4000) || (yr%40)B.(yr%4000) || (yr%40 yr%100!0)C.(yr%4000) || (yr%40)D.(yr%4000) || (yr%40 yr%100 !0)【答案】B【解析】一个年份如果能被400整除是闰年。或者该年份能被4整除但不能被100整除也是闰年。A选项忽略了100的条件C选项和D选项使用了逻辑与而非逻辑或不符合闰年定义。正确答案是B选项。第3题在C中下列不可做变量的是 。A.five-StarB.five_starC.fiveStarD._fiveStar【答案】A【解析】有效的变量名是由大小写字母、数字、下划线组成的任意长度的序列且第一个字符不能为数字。另外C中有一一些关键字已被编程语言保留不能用作变量名。A选项的因包含非法字符-连字符而不符合C变量命名规则。第4题在C中 与for(inti0; i10; i) 效果相同的是 。A.for(int i0; i10; i1)B.for(int i1; i10; i)C.for(int i10; i0; i–)D.for(int i10; i1; i)【答案】A【解析】B选项初始值和终止条件不同C选项循环方向相反D选项的初始条件即不满足不会循环。A选项与原始代码功能完全一致。第5题在C中 cout (5 % 2 5 % 3) 的输出是 A.1B.2C.trueD.false【答案】A【解析】先进行算数运算表达式5%2求5除以2的余数结果为1。表达式5%3求5除以3的余数结果为2。然后进行逻辑运算表达式5%25%3等价于12。在C中做布尔运算时非布尔类型会转换为布尔类型非零值都被转换为true 零值会转换为false 所以12为true。布尔值true输出时对应整数1 因此最终输出为1。综上所述 cout(5%25%3) 的输出是1故正确答案是A。第6题执行下面的C代码时输入1则输出是 。intmonth;cinmonth;switch(month){case1:coutJan ;case3:coutMar ;break;default:;}A.JanB.MarC.Jan MarD.以上均不对【答案】C【解析】当month1时 程序执行case 1中的代码即输出Jan 由于没有break语句 程序将继续执行下一个case。接着会执行case 3中的代码 输出Mar 然后遇到break语句 跳出switch语句块。因此 当用户输入1时 程序依次输出Jan 和Mar “ 最终结果为Jan Mar”。第7题执行下面C代码后有关说法错误的是 。inta,b;cinab;if(ab)cout1;elseif(!(a||b))cout3;elsecout4;A.如果先后输入1和1则将输出1B.如果先后输入0和1或者1和0则将输出3C.如果先后输入0和0则将输出2D.如果先后输入0和0则将输出4【答案】D【解析】如果输入0和0则!(a||b)为真输出“2。第8题某货币由5元2元和1元组成。输入金额假设为正整数计算出最少数量。为实现其功能横线处应填入代码是 。intN;cinN;intMS,M2,M1;MSN/5;M2____;M1____;printf(5*%d2*%d1*%d,MS,M2,M1);A.第1横线处应填入N / 2第2横线处应填入N - M5 - M2B.第1横线处应填入(N - M5 * 5) / 2第2横线处应填入N - M5 * 5 - M2 * 2C.第1横线处应填入N - M5 * 5 / 2第2横线处应填入N - M5 * 5 - M2 * 2D.第1横线处应填入(N - M5 * 5) / 2第2横线处应填入N - M5 - M2【答案】B【解析】A选项没有考虑到5元硬币的影响C选项表达式1的优先级错误D 选项在第二个横线处没有正确减去所有已经使用的硬币数。B选项正确。首先用(N - M5 * 5) / 2计算2元硬币的数量然后用N - M5 * 5 - M2 * 2计算1元硬币的数量。第9题下面C代码执行后的输出是 。intloopCount0;for(inti0;i10;i)for(intj1;ji;j)loopCount1;coutloopCount;A.55B.45C.36D.28【答案】C【解析】当i0时内层循环不执行因为j0不成立。当i1时内层循环也不执行因为j1不成立。当i2时内层循环执行一次j1所以loopCount增加1。当i3时内层循环执行两次j12所以loopCount增加2。…当i9时内层循环执行八次j1 2 3 4 5 6 7 8) 所以loopCount增加8。总结增加次数为1234567836因此 最终loopCount的值是36 对应的选项是C。第10题下面C代码执行后的输出是 。intloopCount0;for(inti0;i10;i){for(intj0;ji;j)if(i*j%2)break;loopCount1;}coutloopCount;A.25B.16C.10D.9【答案】C【解析】if语句和for语句只控制下面的第一个语句或第一个由{}包括所包含的语句块。外层循环从i0到i9 一共会执行10次。loopCount在外层循环中增加10次最终值为10。第11题假设下面C代码执行过程中仅输入正负整数或0有关说法错误的是 。intN,Sum0;cinN;while(N){SumN;cinN;}coutSum;A.执行上面代码如果输入0将终止循环B.执行上面代码能实现所有非0整数的求和C.执行上面代码第一次输入0最后将输出0D.执行上面代码将陷入死循环 可将while(N) 改为while(N0)【答案】D【解析】原代码在输入0时会正常退出循环不会陷入死循环。第12题执行下面的C代码有关说法正确的是 【质数是指仅能被1和它本身整除的正整数】。intN;cinN;boolFlagtrue;for(inti2;iN;i){if(i*iN)break;if(N%i0){Flagfalse;break;}}if(Flag)coutN是质数endl;elsecoutN不是质数endl;A.如果输入正整数上面代码能正确判断N是否为质数B.如果输入整数上面代码能正确判断N是否为质数C.如果输入大于等于0的整数上面代码能正确判断N是否质数D.如将Flagtrue修改为FlagN2?true:false则能判断所有整数包括负整数、0、正整数是否为质数【答案】D【解析】原代码输入负数、0和1会输出错误的结果D选项为三目运算如果N大于等于2 Flag会被初始化为true否则被初始化为false。通过初始化Flag来处理小于2的特殊情况从而能够正确判断所有整数是否为质数第13题下面C代码用于实现如下图所示的效果其有关说法正确的是 。for(inti1;i6;i){// L1for(intj1;ji1;j)// L2couti*j ;coutendl;A.当前代码能实现预期效果无需调整代码B.如果coutendl 移到循环L2内部 则可实现预期效果C.如果coutendl 移到循环L1外部 则可实现预期效果D.删除coutendl 行 则可实现预期效果【答案】A【解析】当前代码能实现预期效果。第14题下面C代码执行后输出是 。intcnt10,cnt20;for(inti0;i10;i){if(i%20)continue;if(i%2)cnt11;elseif(i%30)cnt21;}coutcnt1 cnt2;A.5 2B.5 0C.0 2D.0 0【答案】B【解析】循环从i0到i9共进行10次迭代。第一条if (i % 2 0)判断是否为偶数 如果是则跳过当前循环continue 即只处理奇数值的i。对于每个奇数i 第二条if(i % 2) 总是成立 因为奇数对2取余不等于0 所以cnt1将增加1。因此 else if (i % 3 0)永远不会被执行 因为所有进入该分支的i都是奇数且已经通过了 if (i % 2)分支。每一个奇数都会使cnt1增加1 共有5个奇数(1 3 5 7 9) 因此cnt15。cnt2在任何情况下都不会增加 保持cnt20。第15题在下面的C代码中N必须是小于10大于1的整数M为正整数大于0。如果M被N整除则M为幸运数如果M中含有N且能被N整除则为超级幸运数否则不是幸运数。程序用于判断M是否为幸运数或超级幸运数或非幸运数。阅读下面代码有关说法正确的是 。intN,M;cout请输入幸运数字 ;cinN;cout请输入正整数 ;cinM;boolLucky;if(M%N0)Luckytrue;elseLuckyfalse;while(M){if(M%10NLucky){printf(%d是%d的超级幸运数!,M,N);break;}M/10;}if(M0)if(Lucky)printf(%d是%d的幸运数!,M,N);elseprintf(%d是%d的幸运数!,M,N);A.如果N输入3M输入36则将输出36是3的超级幸运数!B.如果N输入7M输入21则将输出21是7的幸运数!C.如果N输入8M输入36则将输出36非8的超级幸运数!D.如果N输入3M输入63则将输出63是3的超级幸运数!【答案】D【解析】随之while循环的进行 M会不断的除以10 直至M变为0或M的个位等于N循环结束掉break。因此A选项输出时M为3 B选项输出时M为0C选项输出时M为0D选项正确。判断题第16题执行C代码 cout‘9’‘1’; 的输出为10。 A.正确B.错误【答案】B【解析】‘9’和’1’是字符常量做算数运算时会被转换成int类型其值为ASCII码值即57和49。因此’9’1’实际上是5749等于106不是10。第17题C表达式-12 % 10的值为2。 A.正确B.错误【答案】B【解析】%运算符返回的是余数-12%10的结果是-2。第18题C表达式int(12.56) 的值为13。 A.正确B.错误【答案】B【解析】int(12.56) 将浮点数12.56转换为整数 方法为截断取整即12。第19题C的整型变量N被赋值为10 则语句cout N / 3 “-” N % 3执行后输出是3-1。 A.正确B.错误【答案】A【解析】N10N / 3等于3整数除法N % 3等于1取模运算所以输出是3-1。第20题在C代码中不可以将变量命名为scanf 因为scanf是C语言的关键字。 A.正确B.错误【答案】B【解析】scanf不是C的关键字 它是C标准库中的函数 用于输入操作。因此在C中 可以将变量命名为scanf。第21题下面C代码执行后将导致死循环。for(inti0;i10;i)continue;A.正确B.错误【答案】B【解析】continue语句只是跳过当前循环中的剩余部分并进入下一次迭代。因此这个循环会正常结束不会导致死循环。第22题下面C代码执行后将输出10。 intcnt0;for(inti0;i10;i)for(intj0;ji;j){cnt1;break;}coutcnt;A.正确B.错误【答案】B【解析】外层循环从i0到i9一共会执行10次。j的初值为0当ji时会进入内层循环因此i为(123…9)时会进入内层循环共9次。在内层循环中会执行一次cnt自增并结束break 因此cnt自增9次输出值为9。第23题下面C代码执行后将输出5。 intcnt0;for(inti1;i5;i)for(intj1;j5;ji)if(i*j%20)cnt1;coutcnt;A.正确B.错误【答案】A【解析】外层循环从i1到i4内层循环从ji到j5每次增加i。当i1时j为1234其中有2次i * j是2的倍数;当i2时j为24其中有2次i * j是2的倍数当i3时j为3当i4时j为4其中有1次i * j是2的倍数总共自增5次 cnt最终值为5第24题下面C代码能实现正整数各位数字之和。 intN,Sum0;cinN;while(N){SumN%10;N/10;}coutSum;A.正确B.错误【答案】A【解析】使用while循环 当N不为0时 执行以下操作用N % 10获取N的最后一位数字 并将其加到Sum上。用N / 10去掉N的最后一位数字。循环结束后 输出Sum的值 即输入整数各位数字之和。第25题GESP测试是对认证者的编程能力进行等级认证 同一级别的能力基本上与编程语言无关。 A.正确B.错误【答案】A【解析】同一级别不同语言所考察内容除语法细节外基本上相同。编程题题解洛谷 B4002 [GESP202406 二级] 平方之和题解洛谷 B4003 [GESP202406 三级] 移位