一、单选题(每题2分,共30分)
题目 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
答案 | C | B | A | A | A | C | D | B | C | C | D | D | A | B | D |
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横线处应填⼊: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分)
题目 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
答案 | × | × | × | √ | × | × | × | √ | √ | √ |
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;
}