CCF编程能力等级认证GESP—C++2级—20240629

单选题(每题 2 分,共 30 分)

1、小杨父母带他到某培训机构给他报名参加CCF组织的GESP认证考试的第1级,那他可以选择的认证语言有几种?( )

A. 1
B. 2
C. 3
D. 4

正确答案:C

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

3、在C++中,下列不可做变量的是( )。

A. five-Star 
B. five_star 
C. fiveStar 
D. _fiveStar

正确答案:A

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

5、在C++中,cout << (5 % 2 && 5 % 3)的输出是( )。

A. 1
B. 2
C. true 
D. false

正确答案:A

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

7、执行下面C++代码后,有关说法错误的是( )。

int a, b; 
cin>>a>>b; 
if(a&&b)
    cout << "1";
else if (!(a || b))
	cout << "2"; 
elseif(a||b) 
	cout << "3";
else
	cout << "4";
A. 如果先后输入11,则将输出1
B. 如果先后输入01或者10,则将输出3 
C. 如果先后输入00,则将输出2
D. 如果先后输入00,则将输出4

正确答案:D

8、某货币由5元,2元和1元组成。输入金额(假设为正整数),计算出最少数量。为实现其功能,横线处应填 入代码是( )。

intN;
cin >>N;
int M5,M2,M1;
M5=N/5;
M2 = ______________;
M1 = ______________;
printf("5*%d+2*%d+1*%d", M5, M2, M1);
A.1横线处应填入:N / 22横线处应填入:N - M5 - M2
B.1横线处应填入:(N - M5 * 5) / 22横线处应填入:N - M5 * 5 - M2 * 2 
C.1横线处应填入:N - M5 * 5 / 22横线处应填入:N - M5 * 5 - M2 * 2 
D.1横线处应填入:(N - M5 * 5) / 22横线处应填入:N - M5 - M2

正确答案:B

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

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

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

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

13、下面C++代码用于实现如下图所示的效果,其有关说法正确的是( )。

1
2 4
3 6 9
4 8 12 16
5 10 15 20 25

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

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

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则将输出:363的超级幸运数! 
B. 如果N输入7,M输入21则将输出:217的幸运数!
C. 如果N输入8,M输入36则将输出:368的超级幸运数! 
D. 如果N输入3,M输入63则将输出:633的超级幸运数!

正确答案:D

判断题(每题 2 分,共 20 分)

1、执行C++代码 cout << ‘9’+‘1’; 的输出为10。( )

正确答案:错误

2、C++表达式-12 % 10的值为2。( )

正确答案:错误

3、C++表达式 int(12.56) 的值为13。( )

正确答案:错误

4、C++的整型变量N被赋值为10,则语句 cout << N / 3 << “-” << N % 3 执行后输出是3-1。 ( )

正确答案:正确

5、在C++代码中,不可以将变量命名为scanf,因为scanf是C++语言的关键字。( )

正确答案:错误

6、下面C++代码执行后将导致死循环。( )

for(inti=0;i<10;i++) 
	continue;

正确答案:错误

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;

正确答案:错误

8、下面C++代码执行后,将输出5。( )

intcnt=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;

正确答案:正确

9、下面C++代码能实现正整数各位数字之和。( )

int N, Sum = 0;
cin >> N;
while (N){
	Sum += N % 10;
	N /= 10;
}
cout << Sum;

正确答案:正确

10、GESP测试是对认证者的编程能力进行等级认证,同一级别的能力基本上与编程语言无关。( )

正确答案:正确

编程题 (每题 25 分,共 50 分)

平方之和

【问题描述】
小杨有n个正整数 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an,他想知道对于所有的 i ( 1 < = i < = n ) i(1 <= i <= n) i(1<=i<=n),是否存在两个正整数x和y满足 x ∗ x + y ∗ y = a i x * x + y * y = a_i xx+yy=ai
【输入描述】
第一行包含一个正整数n,代表正整数数量。
之后n行,每行包含一个正整数,代表 a i a_i ai
【输出描述】
对于每个正整数 a i a_i ai,如果存在两个正整数x和y满足 x ∗ x + y ∗ y = a i x * x + y * y = a_i xx+yy=ai,输出Yes,否则输出No。
【样例输入 1】
2
5
4
【样例输出 1】
Yes
No
【样例解释】
对于第一个正整数,存在 1 ∗ 1 + 2 ∗ 2 = 5 1 * 1 + 2 * 2 = 5 11+22=5,因此答案为Yes。
【数据范围】
对于全部数据,保证有 1 < = n < = 10 , 1 < = a i < = 1 0 6 1 <= n <= 10, 1 <= a_i <= 10^6 1<=n<=10,1<=ai<=106

#include <iostream>
#include <cmath>
using namespace std;
// 不加sqrt 超时, 得30分
int main(){
	int n, a;
	cin >> n;
	for (int i = 1; i <= n; i++){
		cin >> a;
		bool is_f = false;
		for (int x = 1; x <= sqrt(a); x++){
			for (int y = 1; y <= sqrt(a); y++){
				if (x * x + y * y == a)
				{
					is_f = true;
					break;
				}
			}
		}
		if (is_f){
			cout << "Yes" << endl;
		}else{
			cout << "No" << endl;
		}
	}
		return 0;
}

计数

【问题描述】
小杨认为自己的幸运数是正整数k(注: 保证1 <= k <= 9)。小杨想知道,对于从1到n到所有正整数中,k出现了多少次。
【输入描述】
第一行包含一个正整数n。
第二行包含一个正整数k。
【输出描述】
输出从1到n到所有正整数中,k出现的次数。
【样例输入 1】
25
2
【样例输出 1】
9
【样例解释】
从1 到25 中,2 出现的正整数有2,12,20,21,22,23,24,25,一共出现了9次
【数据范围】
对于全部数据,保证有 1 < = n < = 1000 , 1 < = k < = 9 1 <= n <= 1000, 1 <= k <= 9 1<=n<=1000,1<=k<=9

#include <iostream>

using namespace std;

int main(){
	int n, k, cnt = 0;
	cin >> n >> k;
	for (int i = 1; i <= n; i++){
		int tmp = i;
		while (tmp){
			if (tmp % 10 == k){
				cnt++;
			}
			tmp /= 10;
		}
	}
	cout << cnt << endl;
	return 0;
}
### 关于CCF GESP C++ 5编程能力等级认证模拟题解析 #### 模拟题目一:多态机制的理解与应用 当定义基类指针指向派生类对象并调用虚函数时,实际会调用派生类中的版本。因此,在给定的代码片段中创建了一个`base`类型的指针`b`以及一个`derived`实例`d`,接着让`b`指向`d`,最后通过`b->show()`来触发成员方法调用。由于存在继承关系且`show`被声明为虚拟函数,所以最终输出将是“derived class”[^1]。 ```cpp #include <iostream> using namespace std; class base { public: virtual void show() { cout << "base class" << endl; } }; class derived : public base { public: void show() override { cout << "derived class" << endl; } }; int main() { base* b; derived d; b = &d; b->show(); return 0; } ``` #### 模拟题目二:数组越界访问风险分析 对于第二个例子而言,程序试图打印字符数组`geSP`中位于索引位置等于整型数组`x`大小处的那个元素。考虑到`sizeof(x)`返回的是整个数组占用字节数而非元素数量,并且假设每个整形占四个字节,则该表达式的计算结果应为16(即4 * sizeof(int)),这显然超出了字符串的实际长度范围。这种情况下可能会导致未定义行为的发生,具体表现为可能显示随机内存内容或引发异常终止等问题[^2]。 ```cpp int main() { int x[] = {2, 0, 2, 4}; char geSP[] = "Grade Examination of SP"; cout << geSP[sizeof(x)] << endl; cout << endl; return 0; } ``` #### 模拟题目三:不常见调试技巧的选择 面对复杂逻辑错误或者难以定位的问题时,通常建议采用多种方式相结合来进行排查工作。选项A至C均属于较为常规有效的做法;然而D项涉及到了汇编层面的操作,除非开发者具备深厚底层知识背景并且确实有必要深入探究指令集细节外,一般不会作为首选方案考虑。故而最不可能成为常用解决办法的就是跟踪汇编码[^3]。 #### 模拟题目四:位运算符特性考察 针对给出的选择题,可以逐一验证各个选项: - `2>>1=1`, `1>>1=0`: 不相同; - `(2>>2)=0`, `(1>>1)=0`: 相同; - `(11^00)=(11)_bin=(3)_dec`, `(1^0)=1`: 不相同; - `~0=-1`(补码表示法下),不是正数1。 综上所述,只有B选项描述成立[(2>>2)和(1>>1)的结果相等][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

青岛少儿编程-王老师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值