2023-09 GESP C++二级试题及答案解析

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宏阳李老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值