全网最详细 2024年09月GESP CCF 编程能力等级认证 C++ 一级真题解析,快来~

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

1、据有关资料,山东大学于1972年研制成功DJL-1计算机,并于1973年投入运行,其综合性能居当时全国第三 位。DJL-1计算机运算控制部分👓所使用的磁心存储元件由磁心颗粒组成,设计存贮周期为2μs(微秒)。那么该磁心存储元件相当于现代计算机的( )。

A. 内存

B. 磁盘

C. CPU

D. 显示器

答案:A

解析:硬盘的存取周期一般范围在几毫秒至20毫秒左右😃 ,内存的存取周期一般为60纳秒至120纳秒(ns),2us等于2000ns,2us比较接近内存的存储周期,因此本题答案选择A。

2、C++程序执行出现错误,不太常见的调试手段是( )。

A. 阅读源代码

B. 单步调试

C. 输出执行中间结果

D. 跟踪汇编码 

答案:D

解析:在C++程序执行出现错误时,不太常见的调试手段是跟踪汇编码。

在软件开发过程中,调试是确保代码质量和功能正确性的关键环节。对于C++程序,当出现执行错误时,跟踪汇编码是一种较为高级且不常见的调试方法。它涉及底层的机器指令,需要开发者对汇编语言有一定的了解。

3、在C++中🎼,下列表达式错误的是( )。

A. cout << "Hello,GESP!" << endl;

B. cout << 'Hello,GESP!' << endl;

C. cout << """Hello,GESP!""" << endl;

D. cout << "Hello,GESP!' << endl; 

答案:D

解析:‌

A选项是我们最常使用的方式,利用双引号输出字符串。

B选项能够输出,但是结果并不是对应的字符串‌。

C选项cout支持三对双引号输出字符串。

D选项的写法导致程序无法运行,直接报错。

4、C++表达式 10 - 3 * 2 的值是( )。

A. 14

B. 4

C. 1

D. 0 

答案:B

解析:该题考查的知识点是C++中的运算符优先级和结合性。

在C++中,乘法(*)运算符的优先级高于减法(-)运算符。因此,表达式10 - 3 * 2中的乘法会先被计算,计算过程如下:

10−3∗2=10−6=410−3∗2=10−6=4

所以,表达式10-3*2的值是4,选B。

5、在C++中,假设N为正整数10,则 cout <<(N / 3 + N % 3) 将输出( )。

A. 6

B. 4.3

C. 4

D. 2 

答案:C

解析:该题考查的知识点是C++中的整数除法和取模运算

在C++中,当两个整数进行除法运算时,结果将是整数除法的结果,即不包含小数部分的商。取模运算符(%)返回除法后的余数。

给定N为10,表达式(N / 3 + N % 3)可以分解为两部分:

N / 3:这是整数除法,结果是10除以3的商,即3。

N % 3:这是取模运算,结果是10除以3的余数,即1。

将这两部分相加得到:3+1=43+1=4

因此,表达式cout << (N / 3 + N % 3)将输出4,选C。

6、C++语句 printf("6%2={%d}", 6%2) 执行后的输出是( )。

A. "6%2={6%2}"

B. 6%2={6%2}

C. 0=0

D. 6%2={0} 

答案:D

解析:好吧~,自己孤陋寡闻了,经过编译器测试:printf("6%2={%d}", 6%2)的输出结果为D选项,但是参考相关资料,资料显示要输出一个%,在printf必须写两个%%,D选项写了一个也能正常输出,但是如果只执行printf("6%2"),输出结果只有6,%无法正常输出,真奇怪啊~,谁要是知道为什么,记得V我告诉我,唉~

7、 成功执行下面的C++代码,先后从键盘上输入5回车和2回车,输出是( )。

cin >> a;
cin >> b;
cout << a + b;

A. 将输出整数7        

B. 将输出52,5和2之间没有空格

C. 将输出5和2,5和2之间有空格

D. 执行结果不确定🎤,因为代码段没有显示a和b的数据类型

答案:D

解析:a和b的数据类型未知,因此执行结果不确定。例如 a、b为整型,那么结果为7,如果a,b为字符类型,那么结果5为103,因为'5'的ASCII码为53,'2'的ASCII码为50。

8、下面C++代码执行后输出是( ) 

int Sum = 0;
for (int i = 0; i < 10; i++)
    Sum += i;
cout << Sum;

A. 55

B. 45

C. 10

D. 9 

答案:B

解析:该题考查for循环和累加的知识点,i的范围从0到9,将0~9的数据进行累加,得到的结果为45,因此本题选择B选项。

9、下面C++代码执行后输出的是( ) 

int N = 0;
for (int i = 0; i < 10; i++)
    N += 1;
cout << N;

A.55

B. 45

C. 10

D. 9

答案:C

解析:循环10次,N每次+1,因此答案为10,选择C选项

10、下面C++代码执行后输出的是( )

int N = 0;
for (int i = 1; i < 10; i +=2){
if (i % 2 == 1)
    continue;
    N += 1;
}
cout << N;

A. 5

B. 4

C. 2

D. 0

答案:D

解析:i的取值为1,3,5,7,9,当i为奇数的时候,那么直接强制进入下一轮循环,言外之意也就是说每一轮循环都执行continue,即N+=1,不会被执行,因此N的取值为0,本道题答案选择D选项。

 11、下面C++代码执行时输入 14+7 后,正确的输出是( )。

int P;
printf("请输入正整数P: ");
scanf("%d", &P);
if (P % 3 || P % 7)
    printf("第5行代码%d, %d", P % 3, P % 7);
else
    printf("第7行代码%2d", P % 3 && P % 7);

A. 第5行代码2, 0

B. 第5行代码1, 0

C. 第7行代码 1

D. 第7行代码 0 

答案:A

解析:scanf中的格式化说明符为%d,代表要读取一个整数,当输入14+7后,scanf只会读取14,后面的+7不再读取,因此P的值为14,P%3等于2,P%7等于0,在C++中,0为假,非0为真,||的运算规则为,左右两边只要有一个表达式为真,那么整体为真,因为P%3为真,因此if后面的条件成立,执行if条件成立后的代码:printf("第5行代码%d, %d", P % 3, P % 7);即输出结果为A选项。

12、执行下面C++代码后得到的输出是( )。

int count= 0, i, s;
for (i = 0, s = 0 ; i < 20; i++, count++)
    s += i++;
cout << s << " " << count;

A. 190 20

B. 95 10

C. 90 19

D. 90 10 

答案:D

解析:这道题很容易入坑,注意,i每次增加的是2,也就是i的取值为0、2、4、……、18,将这些数累加起来,2,4,……18是一个等差数列,求和公式为:a1*n+(n-1)*n/2*d,a1代表第1项,n代表总共的项数,d代表公差,即共有9项,结果为2*9+8*9/2*2=90,所以s等于90,count的值为10,因为for循环执行了10次,本题选择D选项。

13、 下面C++代码拟用于计算整数N的位数,比如对 123 则输出 123是3位整数 ,但代码中可能存在bug。下面 有关描述正确的是( )。

int N, N0, rc=0;
cout << "请输入整数:";
cin >> N;
N0 = N;
while (N){
    rc++;
    N /= 10;
}
printf("%d是%d位整数\n", N, rc); // L11

A. 变量N0占用额外空间,可以去掉

B. 代码对所有整数都能计算出正确位数

C. L11标记的代码行简单修改后可以对正整数给出正确输出

D. L11标记的代码行的输出格式有误 

答案:

解析:

14、下面的C++代码用于求连续输入的若干正五位数的百位数之和。例如输入 32488 25731 41232 0 ,则输 出 3个正五位数的百位数之和为13 。有关描述错误的是( )。

int M, Sum=0, rc=0;
cout << "请输入正整数:";
cin >> M;
while (M){
    M = (M / 100 % 10); // L6
    Sum += M;
    rc++;
    cin >> M;
}
cout << rc << "个正五位数的百位数之和为" << Sum;

 A. 执行代码时如果输入 23221 23453 12345 11111 0 ,则最后一行Sum的值是 10

B. 执行代码时如果输入 2322 2345 1234 1111 0 ,程序也能运行

C. 将代码标记为 L6 那行改为 M = (M % 1000 / 100); ,同样能实现题目要求

D. 将代码标记为 L6 那行改为 M = (M % 100 / 10); ,同样能实现题目要求

答案:

解析:

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

1、小杨最近开始学习C++编程,老师说C++是一门面向对象的编程语言,也是一门高级语言。( )

答案:

解析:C++、Python都是面向对象语言,同时也是一门高级语言

2、在C++中,表达式 10/4 和 10%4 的值相同,都是整数2,说明 / 和 % 可以互相替换。( )

答案:

解析:虽然表达式10/4和10%4的值相同,但是/和%所代表的含义不一样,比如10/2=5,而10%2=0,此时就是错误的。

3、N是C++程序中的整型变量,则语句 scanf("%d", &N) 能接收形如正整数、负整数和0输入,但如果输入含字母或带小数点数,将导致无法执行。 ( )

答案:

解析:输入含字母或带有小数点的数时,程序依然能运行起来,但是答案错误。

4、下面C++代码能够执行,则将输出45。( )

for (int i = 0; i < 10; i++)
    Sum += i;
cout << Sum;

答案:

解析:代码中没有对Sum进行初始化,因此Sum的初始值未知,只有当加上Sum=0此句代码时,该程序的执行结果才是45

5、在C++代码中整型变量X被赋值为20.24,则 cout << (X++, X+1) / 10 执行后输出的是 2.124 ( )

答案:错误

解析:整型变量X被赋值为20.24,此时20.24的小数部分会被舍弃,因此X的值是20,cout后为一个逗号表达式,逗号表达式需要从左到右执行每一个子表达式,然后以最后一个子表达式的值作为整个逗号表达式的返回结果,因此X++之后,X的值为21,然后再执行X+1,因此整个逗号表达式的值为22,然后用整数22/10,根据/的运算规则,因为/左右两边都是整数,因此22/10等于2。

6、下面C++代码执行后,最后一次输出是10。( ) 

for (int i = 1; i < 10; i+=3)
    cout << i << endl;

答案:

解析:i的取值为1、4、7因此最后一次输出是7,不是10,如果i为10,那么for循环条件已经不成立,退出循环了,不会输出10。

7、在C++, break 语句通常与if语句配合使用。( )

答案:

解析:break语句通常和循环语句配合使用(ps:此题存在争议,官方给出的答案是错的,但是实际上在循环内部break和if通常配合使用)

8、在C++代码中,不可以将变量命名为 five-star ,因为变量名中不可以出现 - (减号)符号( )

答案:

解析:变量名的命名规则为 ① 不能以数字开头  ② 不能是关键字 ③ 不能出现除了数字、字母下划线_以外的其它字符,five-start,出现了-,因此不能作为变量名。

9、在C++语言中,整型、实数型、字符型、布尔型是不同数据类型,但这四种类型的变量间都可以比较大小。 ( )

答案:

解析:字符本质上是一个整数,布尔类型的取值为0或者1,整数、实数、字符、布尔数据它们本质上都是数字,它们之间可以做运算和比较大小。

10、C++中,定义变量 int a=5,b=4,c=3 ,则表达式(a<b<c)的值为逻辑假()。

答案:

解析:a<b条件不成立,得到0,0<c,即0<3,因此该表达式的值为逻辑真

 三、编程题(每题2分,共50分)

1、小杨购物

题目描述:小杨有n元钱用于购物。商品A的单价是a元,商品B的单价是b元。小杨想购买相同数量的商品A和商品B。 请你编写程序帮小杨计算出他最多能够购买多少个商品A和商品B 

输入格式:

第⼀⾏包含⼀个正整数 , 代表小杨⽤于购物的钱的⾦额。
第⼆⾏包含⼀个正整数 , 代表商品A的单价。
第三⾏包含⼀个正整数 , 代表商品B的单价。
 

输出格式: 

输出⼀⾏, 包含⼀个整数, 代表小杨最多能够购买的商品A和商品B的数量。

样例输入1:

12

1

2

样例输出1:

4
 

对于样例1, 由于需要购买相同数量的两种商品, 因此小杨最多能够购买4件商品A和4件商品B, 共花费 4 x 1 + 4 x 2 = 12元,因此, 样例1的答案为 4。

样例输入2:

13

1

2

样例输出2:

4
 

对于样例2, 由于需要购买相同数量的两种商品, 因此小杨最多能够购买4件商品A和4件商品B, 共花费 4 x 1 + 4 x 2 = 12元,如果小杨想购买5件商品A和5件商品B,则需花费5x1+5x2=15元, 超过了小杨的预算13元。 因此, 样例2的答案为4。

对于全部数据, 保证有1<=n,a,b<=10^5。

 题解:假设最多能买x件相同数量的A商品和B商品,A商品的单价为a元,B商品的单价为b元,那么需要x*a+b*x元,即x*(a+b)元,假设小杨总共有m元,那么最多能够买m/(a+b)件相同数量的A商品和B商品,代码如下:

#include<bits/stdc++.h>
using namespace std;
int main(){
    int m,a,b;
    cin>>m>>a>>b;
    cout<<m/(a+b);
}

 2、美丽数字

题目描述:小杨有n个正整数, 他认为⼀个正整数是美丽数字当且仅当该正整数是9的倍数但不是8的倍数。小杨想请你编写⼀个程序计算n个正整数中美丽数字的数量。

输入格式:

第⼀⾏包含⼀个正整数n , 代表正整数个数。
第⼆⾏包含n个正整数,a1,a2,a3,……,an。

输出格式: 

输出⼀个整数, 代表其中美丽数字的数量。

输入样例1:

3

1

9

72

输出样例1:

1

对于样例1:

  • 1既不是9的倍数, 也不是8的倍数;
  • 9是9的倍数, 不是8的倍数;
  • 72既是9的倍数, 也是8的倍数;

因此答案为1。
 

对于全部数据, 保证有 1<=n<=10^5,1<=ai<=10^5。

题解:输入n个数,对每一个数判断其是否是9的倍数,且不是8的倍数,如果是,计数变量+1。假设每个数为x,即判断x%9==0&&x%8!=0是否成立,如果成立,计数变量+1,参考代码如下:

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    int ans=0,x;
    for(int i=1;i<=n;i++){
        cin>>x;
        if(x%9==0&&x%8!=0)ans++;
    }
    cout<<ans;
}

        以上就是2024.9月GESP C++一级的真题解析,关于其它科目和其它等级的解析稍后有时间会慢慢出,有问题的话我们可以一起探讨(知道了😆知道了,别催了别催了😬) ,拜拜咯~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值