CCF编程能力等级认证GESP—C++3级—20241207

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

1、下列二进制表示的十进制数值分别是( )

[10000011]=( )
[10000011]=( )
A. -125-3 
B. -3, -125 
C. -3-3
D. -125-125

正确答案:B

2、关于计算机中的编码,下列说法中错误的是()

A. 对于无符号数,原码就是真值
B. 正数的反码是其本身
C. 负数的反码和补码是不一样的
D. 负数的反码,在其原码的基础上, 各个位取反

正确答案:D

3、16进制数B2025转换成8进制数是()


A. 2620045 
B. 2004526 
C. 729125 
D. 2420045

正确答案:A

4、625.625变成二进制是( )。

A. 1001110001.101
B. 101.101
C. 101.1001110001
D. 1001110001.1101

正确答案:A

5、下面逻辑运算中,正确的是( )

A. 5&&3==0
B. 5|3==8
C. 5||3==11 
D. 5&3==0001

正确答案:D

6、补码1111 1101进行运算1111 1101>>1以后得到的结果是()

A. 1111 1100
B. -2
C. 1111 1101
D. 1111 1010

正确答案:B

7、下列代码输出的是

string s="1234@@chenadai";
string str="12345";
s.replace(1,5,str); 
cout<<s<<endl;
A. 12345
B. 2345@
C. 112345chenadai 
D. 12345chenadai

正确答案:C

8、a|10(a与10都是10进制,且二进制表示最高位为1)运算的结果是( )。

A. 使a的二进制表示从右往左的第二位为1
B. 使a的二进制表示从右往左的第一位为0
C. 使a的二进制表示从右往左第二位为0
D. 使a的二进制表示最高位为0

正确答案:A

9、下列程序输出的是( )

string ch="hello";
if(ch[5]==NULL){
	cout<<"right"<<endl; 
}else if (ch[5]=='\0'){
	cout<<"wrong"<<endl; 
}else{
	cout<<"hello"<<endl;
}
A. right
B. wrong
C. hello
D. 不能正确执行

正确答案:A

10、下列程序中,假设一个字符占用的内存空间是1,下列程序中,ch占用的内存空间是 ( )

char ch[] = "hello world";
size_t ret=strlen(ch);
cout<<ret<<endl;
A. 11 
B. 10 
C. 13 
D. 12

正确答案:D

11、下列程序最后输出的是()

int a=65;
cout<<tolower(a)<<endl;
A. 65 
B. A 
C. a 
D. 97

正确答案:D

12、想要计算从数字n到数字m之间(包含n和m)有多少个数字d出现,下列程序哪个能够实现( )。

A.
int n,m,res,d;
cin >> n >> m>>d;
for(int i = n+1; i <= m; i++){
	int temp = i;
	while (temp){
		if (temp % 10 == d) res++;
		temp /= 10;
	}
}
cout << res << endl;
return 0;
B.
int n,m,res,d;
cin >> n >> m>>d; 
for(int i=n;i<=m;i++){
	int temp = i;
	while(temp){
        if(temp % 10 = d) res++;
        temp /= 10;
	}
}
cout << res << endl;
return 0;
C.
int n,m,res=0,d;
cin >> n >> m>>d; 
for(int i=n;i<=m;i++){
	int temp = i;
	while(temp){
        if(temp % 10 == d) res++;
        temp /= 10;
	}
}
cout << res << endl;
return 0;
D.
int n,m,res=0,d;
cin >> n >> m>>d; 
for(int =n;i<=m;i++){
	while(temp){
	    if(temp % 10 == d) res++;
	    temp /= 10;
	}
}
cout << res << endl;
return 0;

正确答案:C

13、兔子五元一只,鸡三元一只,小鸭子一元三只,现在你有一百元要买一百只,兔子、鸡、鸭子,问兔子、 鸡、鸭子各买多少只,每种必须至少一只,下列哪个程序能实现。( )。

A.
for(int i = 0; i <= 100; i++){
    for(int j = 0; j <= 100; j++){
		for(int k = 0; k <= 100; k++){
    		if(i + j + k == 100 && 25 * i + 10 * j + k == 300)
        		cout << i << " " << j << " " << k << endl;
		}
	}
}
B.
for(int i = 0; i <= 100; i++){
    for(int j = 0; j <= 100; j++){
		for(int k = 0; k <= 100; k++){
    		if(i + j + k == 100 && 20 * i + 10 * j + k == 300)
        		cout << i << " " << j << " " << k << endl;
		}
	}
}
C.
for(int i=0;i<=20;i++){ 
	for(int j = 0; j <= 34; j++){
		for(int k = 0; k <= 20; k++){
    		if(i + j + k == 100 && 15 * i + 9 * j + k == 300)
        		cout << i << " " << j << " " << k << endl;
		}
	}
}
D.
for(int i = 0; i <= 100; i++){
    for(int j = 0; j <= 100; j++){
		for(int k = 0; k <= 100; k++){
		    if(i + j + k == 100 && 15 * i + 9 * j + k == 300)
		        cout << i << " " << j << " " << k << endl;
		}
	}
}

正确答案:D

14、求小于等于N的素数的方法中,有一种方法是将所有从2到它本身减1的数都除一遍,如果不能整除,就是素 数。下列哪个程序,体现了这种方法()

A.
if(N >= 3){
	cout<<2<<endl;
	for(int i = 2;i <= N;i ++){
		for(int j = 2;j < i;j ++){
		    if(i % j != 0){
				flag = 1;
			}
		}
		if(flag == 0){
			cout<<i<<endl;
		}
		flag = 0;
	}
}
B.
if(N >= 2){
	for(int i = 3;i <= N;i ++){
		for(int j = 2;j < i;j ++){
	    	if(i % j == 0){
				flag = 1;
			}
		}
		if(flag == 0){
			cout<<i<<endl;
		}
		flag = 0;
	}
}
C.
if(N >= 2){
	cout<<2<<endl;
	for(int i = 3;i <= N;i ++){
		for(int j = 2;j < i;j ++){
		    if(i % j == 0){
				flag = 1;
			}
		}
		if(flag == 0){
			cout<<i<<endl;
		}
	flag = 0;
	}
}
D.
if (N >= 2){
	cout << 2 << endl;
	for(int i = 3;i <= N;i ++){
	    for(int j = 2;j < i;j ++){
	        if(i % j == 0){
	            flag = 1;
	        }
	    }
		if (flag == 0){
			cout << i << endl;
		}
	}
}

正确答案:C

15、工人工作一天,会得到一个金环作为工资报酬,某个工作需要15天完成,一条15个环的金环项链,为了严格执行每天工作结束时,完成对工人工资的结算,最少需要将金环项链剪裁成几段,每段几个金环( )

A. 4段,分别是1248
B. 15段,每段1个
C. 6段,分别是333321
D. 9段,分别是222222111

正确答案:A

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

1、为了简化计算机基本运算电路,使加减法都只需要通过加法电路实现,也就是让减去一个正数或加上一个负 数这样的运算可以用加上一个正数来代替。于是改变负数存储的形式,存储成一种可以直接当成正数来相加的形 式,这种形式就是补码。

正确答案:正确

2、使用原码进行的计算, 2+(-1) 的结果是 -3

正确答案:正确

3、反码计算加减法:加法与减法结果都是正确的,只是解决不了 -0 的问题

正确答案:正确

4、10 进制数 63,在转换成二进制的计算过程中,产生了如下的式子:

63/2=311
31/2=151
15/2=71
7/2=31
3/2=11
1/2=01
按照从前往后的顺序,获得 63 的二进制值是 111111

正确答案:错误

5、下列程序输出的是 A

char x=65;
x=x&00001111; 
cout<<x<<endl;

正确答案:正确

6、下列可执行程序段中,最后 pos 的值是 4

string str="chenADai";
int pos = str.find('D');
--pos&11;

正确答案:正确

7、该段程序将不能正确执行

string ch="chen";
cout<<ch[4]<<endl;

正确答案:错误

8、将输出 97

char a='A';
a=a+32;
cout<<(int)a<<endl;

正确答案:正确

9、自然界中,最小的素数是 2

正确答案:正确

10、CCF(十六进制) = 12363(七进制)

正确答案:正确

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

数字替换

【问题描述】
小杨有一个包含n个数字的序列A,即 A = { a 1 , a 2 , . . . , a n } A = \{a_1, a_2, ..., a_n\} A={a1,a2,...,an},他想将其中大于k的数字都替换为序列的最大值,将其中小于k的数字都替换为序列的最小值,请你帮他计算出替换后的序列。
【输入格式】
第一行包含两个正整数n,k,含义如题面所示。
第二行包含n个数字,代表序列A。
【输出格式】
输出n个整数,代表替换后的结果。
【样例输入 1】
5 0
-2 -1 0 1 2
【样例输出 1】
-2 -2 0 2 2
对于全部数据,保证有 1 ≤ n ≤ 1 0 5 , ∣ k ∣ , ∣ a i ∣ ≤ 1 0 5 1 \le n \le 10^5, |k|,|a_i| \le 10^5 1n105,k,ai105

打印数字

【问题描述】
小杨为数字0,1,2和3设计了一款表示形式,每个数字占用了5*5的网格。数字0,1,2和3的表示形式如下:

..... ****. ..... .....
.***. ****. ****. ****.
.***. ****. ..... .....
.***. ****. .**** ****.
..... ****. ..... .....

小杨想请你将给定的数字n转换为对应的表示形式。
【输入描述】
第一行包含一个正整数代表n。
【输出描述】
输出对应的表示形式。
【样例输入 1】
12230
【样例输出 1】

****..................... 
****.****.****.****..***. 
****.................***. 
****..****.********..***. 
****.....................

对于全部数据,保证有 0 ≤ n ≤ 1 0 6 0 \le n \le 10^6 0n106,且n仅由数字0,1,2,3组成。

### 关于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]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

青岛少儿编程-王老师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值