2023-09 GESP C++二级试题及答案解析
一、单选题(每题 2 分,共 30 分)
1、我国第⼀台⼤型通用电⼦计算机使用的逻辑部件是( )。
A. 集成电路
B. ⼤规模集成电路
C. 晶体管
D. 电⼦管
【答案】D 中国第一台计算机通用数字电子计算机于 1958 年 6 月由中科院计算所研制成功。那时候的逻辑部件是电子管。
2、下列流程图的输出结果是( )?
A. 5 12
B. 12 5
C. 5 5
D. 12 12
【答案】B
3、如果要找出整数 a 、 b 中较⼤⼀个,通常要⽤下⾯哪种程序结构?( )。
A. 顺序结构
B. 循环结构
C. 分支结构
D. 跳转结构
【答案】C 比较大小,需要分支结构。
4、以下不是 C++关键字的是( )。
A. continue
B. cout
C. break
D. goto
【答案】B cout 不是关键字,是一个类的对象。
5、C++表达式 int(-123.123 / 10) 的值是( )。
A. -124
B. -123
C. -13
D. -12
【答案】D -123.123/10=-12.3123,转换成整数是-12。
6、以下 C++代码实现从⼤到⼩的顺序输出 N 的所有因⼦。例如,输⼊ N = 18时输出 18 9 6 3 2 1 ,横线处应填⼊( )。
int N = 0;
cin >> N;
for(_________)//此处填写代码
if(!(N%i))
cout << i <<' ';
A. ; ;
B. int i = 1; i < N; i++
C. int i = N; i > 0; i--
D. int i = N; i > 1; i--
【答案】C 从大到小输出 N 的所有因子,判断范围是[N,1]。
7、如下图所⽰,输出 N ⾏ N 列的矩阵,对角线为 1,横线处应填⼊( )。
请输入行列数量:9
1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0
0 0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 1
int N=0;
cout<<"请输入行列数量:";
cin>>N;
for(int i=1;i<N+1;i++) {
for(int j=1;j<N+1;j++) {
if(________)//此处填写代码
cout<<1<<" ";
else
cout<<0<<" ";
}
cout<<endl;
}
A. i = j
B. j != j
C. i >= j
D. i == j
【答案】D 根据题意,对角线上的元素等于 1,对角线元素的坐标特点是行左边等于列坐标,也就是 i==j。
8、下⾯C++代码⽤于判断 N 是否为质数(素数),约定输⼊ N 为⼤于等于 2的正整数,请在横线处填⼊合适的代码( )。
int N=0,i=0;
cout<<"请输入一个大于等于2的正整数:";
cin>>N;
for(int i=2;i<N;i++)
if(N%i==0) {
cout<<"非质数";
________;//此处填写代码
}
if(i==N)
cout<<"是质数";
A. break
B. continue
C. exit
D. return
【答案】A 判断质数,质数的特点是只能被 1和它本身整除,如果被 2---N-1 之间的数字整除,就不是质数,这样的数字找到1 个,就不需要再循环判断了,因此填 break。
9、下⾯C++代码执⾏后的输出是( )。
int N=9;
for(int i=2;i<N;i++)
if(N%i)
cout<<"1#";
cout<<"0"<<endl;
A. 1#0
B. 1#
C. 1#1#1#1#1#1
D. 1#1#1#1#1#1#0
【答案】D 根据代码,最后的 0 肯定输出,所以判断 AD选项。9%2==1,会输出 1#,可以判断 i=2,4,5,6,7,8 时都会输出 1#。
10、下⾯C++代码执⾏后的输出是( )。
int cnt=0;
for(int i=1;i<9;i++)
for(int j=1;j<i;j+=2)
cnt+=1;
cout<<cnt;
A. 16
B. 28
C. 35
D. 36
【答案】A
11、下⾯C++代码执⾏后的输出是( )。
int cnt=0;
for(int i=1;i<13;i+=3)
for(int j=1;j<i;j+=2)
if(i*j%2==0)
break;
else
cnt+=1;
cout<<cnt;
A. 1
B. 3
C. 15
D. 没有输出
【答案】B 根据题意,i 的范围是[1,12],i 每次累加 3;j每次的范围是[1,i-1],j 每次累加 2。我们会发现,j 每次的值都是奇数,根据 if条件,i 是偶数的时候不会累加,只有奇数的时候才会累加 cnt,因此 i 的范围是1,7。I=1,j 不会循环(j<i);i=7,j 的合理范围是 1,3,5,cnt 会增加 3 次。
12、下⾯C++代码执⾏后的输出是( )。
int x=1;
while(x<100){
if(!(x%3))
cout<<x<<",";
else if(x/10)
break;
x+=2;
}
cout<<x;
A. 1
B. 3,9,11
C. 3,6,9,10
D. 1,5,7,11,13,15
【答案】B while 循环中,x 每次增加 2,x=1,3,5,7,9,11….. 根据 if 条件,1%3==1,!(1)==0,不会输出;x=3 时,会输出“3,”,以此类推,x=11 时,x/10 等于 1,退出循环,输出 11。
13、下⾯图形每⼀⾏从字母 A 开始,以 ABC⽅式重复。⾏数为输⼊的整数。请在 C++代码段横线处填⼊合适代码( ) 。
请输入字母行数:7
A
AB
ABC
ABCA
ABCAB
ABCABC
ABCABCA
int N=0;
cout<<"请输入字母行数:";
cin>>N;
for(int i=1;i<N+1;i++){
for(int j=0;j<i;j++)
cout<<__________;//此处填写代码
cout<<endl;
}
A. 'A' + j / 3
B. (char)('A' + j / 3)
C. 'A' + j % 3
D. (char)('A' + j % 3)
【答案】D 根据题意,要输出 N 行字符,每行字符数量都等于行数,例如第 1 行输出 1 个字符,第 2 行输出 2 个字符…… 每行输出的内容总结是:ABC 循环输出,BD 选项可以输出字符,模拟 B 选项发现会连续输出 A,因此选择 D 选项。
14、输⼊⾏数,约定 1≤ lineCount ≤ 9,输出以下图形。应在 C++代码横线处填⼊( )。
请输入行数量:9
1
1 2 1
1 2 3 2 1
1 2 3 4 3 2 1
1 2 3 4 5 4 3 2 1
1 2 3 4 5 6 5 4 3 2 1
1 2 3 4 5 6 7 6 5 4 3 2 1
1 2 3 4 5 6 7 8 7 6 5 4 3 2 1
1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1
int LineCount=0;
cout<<"请输入行数量:";
cin>>LineCount;
for(int i=0;i<LineCount;i++){
for(int j=0;j<________;j++)//此处填写代码
cout<<' ';
for(int j=1;j<i+1;j++)
cout<<j<<' ';
for(int j=i+1;j>0;j--)
cout<<j<<' ';
cout<<endl;
}
A. (lineCount - i - 1) * 2
B. (lineCount - i) * 2
C. lineCount - i - 1
D. lineCount - i
【答案】A 根据给出的数字三角形,总结规律:1、每行前面空格逐渐减少,最后 1 行不需要输出,AC 中选择;2、每行每个数字之间还有 1 个空格,因此每行前还要多输出 1 个空格。
15、某班级⼈数不知,连续输⼊成绩直到输⼊负数停⽌,输⼊结束后求出平均成绩。在以下 C++代码横线处应填⼊是( )。
double totalScore=0;//总分
int studCount=0;//总人数
while(________){//此处填写代码
cin>>score;
if(score<0)
break;
totalScore+=score;
studCount+=1;
}
cout<<"平均分:"<<totalScore/studCount;
A. true
B. false
C. True
D. False
【答案】A while 循环内是根据输入数据退出,如果输入不是负数,就一直循环下去。CD 关键字错误,B 直接退出循环,不能实现题意,选 A。
二、判断题(每题 2 分,共 20 分)
1、我们常说的互联⽹(Internet)是⼀个覆盖全球的⼴域⽹络,它不属于任何⼀个国家。
【答案】正确
2、神威·太湖之光超级计算机是中国⾃主研制的超级计算机,在全球超级计算机 TOP500 排⾏榜中多次荣膺榜⾸。
【答案】正确
3、C++表达式 7.8 / 2 的值为 3.9 ,类型为 float 。
【答案】错误 小数默认是 double 类型。
4、C++ 表 达 式 (2 * 3) || (2 + 5) 的 值 为 67 。
【答案】错误 逻辑运算||最后操作,返回结果是 0 或者 1,该表达式返回 1。
5、如果 m 和 n 为 int 类型变量,则执⾏ for (m = 0, n = 1; n <9; ) n = ((m = 3 * n, m + 1), m - 1); 之后 n 的值为偶数。
【答案】正确
6、 如果 a 为 int 类型的变量,则表达式 (a >= 5 && a <= 10) 与 (5 <= a <= 10)的值总是相同的。
【答案】错误 前者是 2 个条件都要满足,后者的操作是先计算 5<=a 的结果,然后再和 10 比大小。例如 a=20,5<=20 的结果是1,1 再和 10 比较大小,也成立,返回结果是 1. (a >= 5 && a <= 10)返回结果是 0。
7、下⾯C++代码执⾏后的输出为 10 。
int cnt=0;
for(int i=1;i<10;i++){
cnt+=1;
i+=1;
}
cout<<cnt;
【答案】错误 每次循环,i 实际上是+2,cnt 加不到 10 次,输出不是 10,是 5。
8、执⾏以下 C++代码后的输出为 0 。
int rst=0;
for(int i=-100;i<100;i+=2){
rst+=i;
}
cout<<rst;
【答案】错误 每次循环,i 每次+2,观察一下 i 值变化是:-100,-98,-96……0,2,4,……98。Rst 是-100。
9、执⾏以下 C++代码后的输出为 30 。
int rst=0;
for(int i=0;i<10;i+=2){
rst+=i;
}
cout<<rst;
【答案】错误 每次循环,i 每次+2,观察一下 i 值变化是:0,2,4,6,8,rst累加了 0,2,4,6,8。i=10 的时候退出循环,rst 是 20。
10、C++是⼀种⾼级程序设计语⾔。
【答案】正确
三、编程题(每题 25 分,共 50 分)
1、⼩杨的 X 字矩阵
问题描述
⼩杨想要构造⼀个 N×N 的 X 字矩阵(N 为奇数),这个矩阵的两条对角线都是半角加号+,其余都是半角减号-。例如,⼀个 5×5 的 X 字矩阵如下:
+---+
-+-+-
--+--
-+-+-
+---+
请你帮⼩杨根据给定的 N 打印出对应的“X 字矩阵”。
输入描述
⼀⾏⼀个整数 N(5≤N≤49,保证 N 为奇数)。
输出描述
输出对应的“X 字矩阵”。
请严格按格式要求输出,不要擅⾃添加任何空格、标点、空⾏等任何符号。你应该恰好输出 N⾏,每⾏除了换⾏符外恰好包含 N 个字符,这些字符要么是+,要么是-。
样例输入 1
5
样例输出 1
+---+
-+-+-
--+--
-+-+-
+---+
样例输入 2
7
样例输出 2
+-----+
-+---+-
--+-+--
---+---
--+-+--
-+---+-
+-----+
// 3.1 样例代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j||i+j==n+1)
cout<<"+";
else
cout<<"-";
}
cout<<endl;
}
return 0;
}
2、数字⿊洞
问题描述
给定⼀个三位数,要求各位不能相同。例如,352 是符合要求的,112 是不符合要求的。将这个三位数的三个数字重新排列,得到的最⼤的数,减去得到的最⼩的数,形成⼀个新的三位数。对这个新的三位数可以重复上述过程。神奇的是,最终⼀定会得到 495!
试试看,重新排列 352,得到的最⼤数为 532,最⼩数为 235,它们的差是 297;变换 297,得到 972-279=693;变换 693,963-369=594;变换 594,954-459=495。因此,352 经过 4 次变换得到了 495。
现在,输⼊的三位数,你能通过编程得出,这个三位数经过多少次变换能够得到495 吗?
输入描述
输⼊⼀⾏,包含⼀个符合要求的三位数 。
输出描述
输出⼀⾏,包含⼀个整数 ,表⽰经过 次变换得到 。
样例输入 1
352
样例输出 1
4
// 3.2 样例代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,ans=0,a,b,c;
cin>>n;
while(n!=495){
a=n%10;
b=(n/10)%10;
c=(n/100)%10;
if(a<b) swap(a,b);
if(a<c) swap(a,c);
if(b<c) swap(b,c);
n=a*100+b*10+c-(c*100+b*10+a);
ans++;
}
cout<<ans<<endl;
return 0;
}