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

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

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

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

正确答案: A
在C++中,标识符(变量名)的命名规则如下:

  1. 必须以字母(大写或小写)或下划线(_)开头:标识符不能以数字开头。
  2. 可以包含字母(大写或小写)、数字和下划线:标识符可以包含这些字符。
  3. 区分大小写:C++中的标识符区分大小写,例如A和a是两个不同的标识符。

A选项:five-Star包含字符(-),违反了第二条规则,因此不是合法的变量名。
B选项:five_star以字母开头,包含字母、数字和下划线,符合标识符的命名规则,是合法的变量名。
C选项:fiveStar以字母开头,包含字母和大写字母,符合标识符的命名规则,是合法的变量名。
D选项:_fiveStar以下划线开头,包含字母和大写字母,符合标识符的命名规则,是合法的变量名。

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

A. -1.2
B. 1 
C. 0 
D. 2

正确答案: D
运算顺序:根据C++的运算符优先级,首先执行乘法和除法,然后执行减法。

  1. 3 * 3的结果是9。
  2. 9 / 5的结果是1,因为这是整数除法,结果向下取整。
  3. 3 - 1的结果是2。

3、在C++中,假设N为正整数,则表达式 cout << (N % 3 + N % 7) 可能输出的最大值是( )。

A. 6
B. 8 
C. 9 
D. 10

正确答案: B

  1. 取模运算:表达式N % 3和N % 7分别计算N除以3和7的余数。余数的范围分别是0到2和0到6。
  2. 最大余数:为了使N % 3 + N % 7的值最大,我们需要找到N的值,使得两个余数都达到最大。
     1)N % 3的最大值是2。
     2)N % 7的最大值是6。
  3. 最大和:因此,N % 3 + N % 7的最大值是2 + 6 = 8。

4、C++语句 printf(“5%%2={%d}\n”, 5 % 2) 执行后的输出是( )。

A. 1={1}
B. 5%2={5%2} 
C. 5%2={1} 
D. 5 ={1}

正确答案: C

  1. printf函数:printf是C语言中的一个标准输出函数,用于按照指定的格式输出数据。
  2. 格式化字符串:"5%%2={%d}\n"是一个格式化字符串,其中%d是一个占位符,表示将一个整数插入到这个位置。
  3. 取模运算:5 % 2计算5除以2的余数,结果是1。
  4. 输出结果:printf函数将5 % 2的结果1插入到格式化字符串的%d位置,因此输出结果是5%2={1}。

5、对整型变量i,执行C++语句 cin >> i, cout << i 时如果输入 5+2 ,下述说法正确的是( )。

A. 将输出整数7
B. 将输出 5
C. 语句执行将报错,输入表达式不能作为输出的参数 
D. 语句能执行,但输出内容不确定

正确答案: B

  1. 输入操作:cin >> i是从标准输入流(通常是键盘)读取数据并存储到变量i中。在C++中,cin只能读取以空格、换行符或制表符分隔的单个数据项。
  2. 输入表达式:当输入5+2时,cin只会读取5,因为+是一个非空白字符,cin在遇到非空白字符时会停止读取。
  3. 变量赋值:因此,变量i只会被赋值为5。
  4. 输出操作:cout << i是将变量i的值输出到标准输出流(通常是屏幕)。由于i的值为5,所以输出结果将是5。

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

float a;
a = 101.101;
a = 101;
printf("a+1={%.0f}", a+1);
A. 102={102}
B. a+1={a+1}
C. a+1={102}
D. a先被赋值为浮点数,后被赋值为整数,执行将报错

正确答案: C

  1. 变量定义和赋值:首先定义了一个float类型的变量a,并将其赋值为101.101。
  2. 再次赋值:然后,将a的值更改为101。由于a是float类型的,所以101会被隐式转换为101.0。
  3. 输出操作:使用printf函数输出a+1的值。%.0f是格式化字符串,表示输出一个没有小数部分的浮点数。
  4. 计算结果:a+1的值是101.0 + 1.0 = 102.0。由于%.0f格式化,102.0会被输出为102。

7、表达式 9/4 - 6 % (6 - 2) * 10 的值是( )。

A. -17.75
B. -18
C. -14
D. -12.75

正确答案: B
运算顺序:根据C++的运算符优先级,首先执行括号内的运算,然后是乘法和除法,最后是减法。

  1. 6 - 2的结果是4。
  2. 6 % 4的结果是2,因为6除以4的余数是2。
  3. 2 * 10的结果是20。
  4. 9 / 4的结果是2,因为这是整数除法,结果向下取整。
  5. 2 - 20的结果是-18。

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

int N;
cout << "请输入正整数:"; 
cin >> N;
if(N % 3)
	printf("第5行代码%2d", N % 3); 
else
	printf("第6行代码%2d", N % 3);
A.5行代码1 
B.6行代码1 
C.5行代码 1 
D.6行代码 1

正确答案: C

  1. 输入操作:程序首先提示用户输入一个正整数,并通过cin读取这个值到变量N中。
  2. 条件判断:if(N % 3)检查N除以3的余数是否为0。如果余数不为0,即N不能被3整除,条件为真。
  3. 输出操作:
     1)由于输入的N为10,10 % 3的结果是1,所以N不能被3整除,if条件为真。
     2)因此,执行if块内的printf语句:printf(“第5行代码%2d”, N % 3);。
  4. printf格式化输出:%2d指定输出的整数占两个字符宽,如果数字位数不足两位,则左边填充空格。由于N % 3的结果是1,所以输出是第5行代码 1。

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

int Sum = 0,i = 0;
for(; i < 10; )
	Sum += i++;
cout << i << " " << Sum;
A. 9 45
B. 10 55 
C. 10 45 
D. 11 55

正确答案: C

  1. 变量初始化:代码中定义了两个整型变量Sum和i,并分别初始化为0和0。
  2. 循环结构:使用for循环,初始条件是i < 10,循环体中Sum += i++。
  3. 循环体:
     1)i++是后增运算符,意味着i的值在表达式求值后增加。
     2)在每次循环中,Sum累加i的当前值,然后i增加1。
  4. 循环执行细节:
     1)初始时i = 0,Sum = 0。
     2)第一次循环后:i = 1,Sum = 0 + 0 = 0。
     3)第二次循环后:i = 2,Sum = 0 + 1 = 1。
     4)以此类推,直到i增加到10。
  5. 循环终止:当i增加到10后,i++变为11,此时i < 10的条件不满足,循环终止。
  6. 输出语句:循环结束后,i的值为11,Sum的值为0 + 1 + 2 + … + 9(即前9个自然数的和)。

10、下面C++代码用于判断N是否为质数(只能被1和它本身整除的正整数)。程序执行后,下面有关描述正确的是( )。

int N;
cout << "请输入整数:"; 
cin >> N;
bool Flag = false;
if(N >= 2){ 
	Flag = true;
    for (int i = 2; i < N; i++)
        if (N % i == 0){
			Flag = false;
			break; 
		}
}
if(Flag)
	cout << "是质数";
else
	cout << "不是质数";
A. 如果输入负整数,可能输出“是质数”
B. 如果输入2,将输出“不是质数”,因为此时循环不起作用
C. 如果输入2,将输出“是质数”,即便此时循环体没有被执行
D. 如果将 if (N >= 2) 改为 if (N > 2) 将能正确判断N是否质数

正确答案: C

  1. 输入和变量初始化:程序首先提示用户输入一个整数,并通过cin读取这个值到变量N中。同时,定义了一个布尔型变量Flag并初始化为false。
  2. 质数判断逻辑:
     1)如果N大于或等于2,Flag被设置为true。
     2)接着,使用一个for循环从2遍历到N-1,检查N是否有除了1和它本身之外的因数。
     3)如果在循环中发现N能被i整除(即N % i == 0),则Flag被设置为false并跳出循环。
  3. 输出结果:
     1)如果Flag为true,则输出“是质数”。
     2)如果Flag为false,则输出“不是质数”。

A选项:如果输入负整数,N >= 2的条件不满足,因此不会进入循环,Flag保持初始的false状态,输出“不是质数”。所以A选项不正确。
B选项:如果输入2,N % i == 0的条件在循环中不会满足,因为2只能被1和它本身整除,所以循环不起作用,但Flag保持为true,正确输出“是质数”。所以B选项不正确。
C选项:如果输入2,循环体确实没有被执行(因为循环是从2开始,而2是循环的起始值),但由于N为2满足质数定义,Flag保持为true,输出“是质数”。所以C选项正确。
D选项:如果将if (N >= 2)改为if (N > 2),则N为2的情况将不会被判断为质数,因为2是最小的质数,所以这个修改将导致程序不能正确判断所有质数。所以D选项不正确。

11、下面的C++代码用于求1~N之间所有奇数之和,其中N为正整数,如果N为奇数,则求和时包括N。有关描述错误的是( )。

int N;
cout << "请输入正整数:"; 
cin >> N;
int i = 1, Sum = 0;
while (i <= N){
    if (i % 2 == 1)
        Sum += i;
    i += 1;
} 
cout << i << " " << Sum;
A. 执行代码时如果输入10,则最后一行输出将是 11 25
B. 执行代码时如果输入5,则最后一行输出将是 6 9
C.将i += 1移到if (i % 2 == 1)前一行,同样能实现题目要求
D.删除if (i % 2 == 1),并将i += 1改为i += 2,同样可以实现题目要求

正确答案: C
A选项:如果输入10,循环会计算1到10之间所有奇数的和,即1+3+5+7+9=25,循环结束后i将增加到11,所以输出将是11 25。因此,A选项描述正确。
B选项:如果输入5,循环会计算1到5之间所有奇数的和,即1+3+5=9,循环结束后i将增加到6,所以输出将是6 9。因此,B选项描述正确。
C选项:如果将i += 1移到if (i % 2 == 1)前一行,那么每次循环都会增加i的值,不论i是奇数还是偶数。这意味着循环将跳过一些奇数,因为当i为偶数时,if条件不满足,i增加后,下一个奇数将不会被累加到Sum中。因此,C选项描述错误。
D选项:删除if (i % 2 == 1)并将i += 1改为i += 2,这样每次循环都将i增加2,直接跳到下一个奇数。这种方法同样可以实现只累加奇数之和的目的,因此D选项描述正确。

12、如果一个整数N能够表示为 X*X 的形式,那么它就是一个完全平方数,下面C++代码用于完成判断N是否为一个完全平方数,在横线处应填入的代码是( )。

int N;
cin >> N; 
for(int i = 0; i <= N; i++)
	if(____)
		cout << N << "是一个完全平方数\n";
A. i == N * N 
B. i * 10 == N 
C. i + i == N 
D. i * i == N

正确答案: D

  1. 完全平方数的定义:一个整数N是完全平方数,如果存在一个整数i使得i的平方等于N,即i * i = N。
  2. 循环结构:for循环从i=0开始,直到i等于N。循环变量i代表可能的平方根。
  3. 条件判断:需要在循环中检查i的平方是否等于N,即i * i是否等于N。
  4. 输出结果:如果找到这样的i,则输出N是一个完全平方数。

13、执行下面C++代码后输出的cnt的值是( )。

int cnt = 0;
for(int i = 0; i * i < 64; i += 2)
	cnt++;
cout << cnt;
A. 8 
B. 7 
C. 4 
D. 1

正确答案: C

  1. 变量初始化:代码中定义了一个整型变量cnt,并初始化为0。
  2. 循环结构:使用for循环,初始化int i = 0,条件是i * i < 64,步进表达式是i += 2,意味着每次循环i的值增加2。
  3. 循环体:在每次循环中,cnt的值增加1。
  4. 循环执行细节:
     1)初始时i = 0,0 * 0 < 64为真,cnt变为1。
     2)第二次循环i = 2,2 * 2 < 64为真,cnt变为2。
     3)第三次循环i = 4,4 * 4 < 64为真,cnt变为3。
     4)第四次循环i = 6,6 * 6 < 64为真,cnt变为4。
     5)第五次循环i = 8,8 * 8等于64,不满足i * i < 64的条件,循环结束。
  5. 输出语句:循环结束后,cnt的值将从0增加到4,因此cout << cnt;将输出4。

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

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

正确答案: C
CCF GESP认证考试的第1级可以选择的认证语言包括C++、Python和图形化编程三种语言。因此,小杨可以选择的认证语言有3种。

15、ENIAC于1946年投入运行,是世界上第一台真正意义上的计算机,它的主要部件都是( )组成的。

A. 感应线圈
B. 电子管 
C. 晶体管
D. 集成电路

正确答案: B
ENIAC于1946年投入运行,是世界上第一台真正意义上的计算机,它的主要部件都是由电子管组成的。具体来说,ENIAC使用了约17468个电子管,这些电子管是构成其主要逻辑元件的关键部分,使得ENIAC能够执行复杂的计算任务。

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

1、在C++代码中变量 X 被赋值为16.44,则 cout << X / 10 执行后输出的一定是 1 。( )

正确答案: 错误

  1. 如果x是整数类型,则x / 10的值为1
  2. 如果x是浮点数类型,则x / 10 的值为1.644

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

正确答案: 错误

  1. N / 4:这是一个整数除法,其中N是整型变量,值为10。10除以4的结果是2,因为整数除法会向下取整。
  2. N % 4:这是一个取模运算,计算10除以4的余数,结果是2。
  3. N / 4.0:这是一个浮点除法,因为除数是4.0,即一个浮点数。10除以4.0的结果是2.5,因为这里执行的是浮点数除法,会保留小数部分。

因此,正确的输出应该是2->2->2.5,而不是2->2->2.0。

3、定义C++的 float 型变量 N ,则语句 cin >> N; cout << int(float(N)) 可以输入正负整数和浮点数,并将其转换为整数后输出。( )

正确答案: 正确

  1. 变量定义:定义了一个float类型的变量N。
  2. 输入操作:cin >> N;允许用户输入一个值,这个值可以是正负整数或浮点数,然后存储到变量N中。
  3. 类型转换:
     1)float(N):首先将N转换为float类型,这一步实际上是多余的,因为N已经是一个float类型的变量。
     1)int(float(N)):接着将float类型的值转换为int类型,这个过程中会发生截断,即小数部分会被丢弃。
  4. 输出操作:cout << int(float(N));将转换后的整数值输出。

4、C++的整型 N 被赋值为5,语句 printf(“%d*2”,N) 执行后将输出 10 。( )

正确答案: 错误
在C++中,printf函数用于格式化输出,但是它不会进行算术运算。给定的printf语句中,%d是一个格式占位符,用于输出一个整数。

  1. 变量赋值:整型变量N被赋值为5。
  2. printf函数:printf(“%d*2”,N)会将N的值替换到%d的位置,并按照字符串字面量"%d*2"的格式输出。
  3. 输出结果:因此,输出将是5*2,而不是通过计算得到的10。

5、在C++中, break 语句用于终止当前层次的循环,循环可以是 for 循环,也可以是 while 循环。( )

正确答案: 正确
在C++中,break语句确实用于立即终止当前层次的循环,无论是for循环、while循环还是do-while循环。

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

正确答案: 正确
在C++中,continue语句通常与if语句配合使用,用于跳过当前循环的剩余部分,并立即开始下一次循环迭代。

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

正确答案: 错误

  1. printf:printf是C语言标准库中的一个函数,用于格式化输出,它在C++中也是可用的,因为它被包含在C++标准库中。
  2. 关键字检查:printf并不是C++的关键字。C++的关键字是那些被语言规范预留的单词,用于特定的语法结构,如if、for、while等。
  3. 命名冲突:尽管printf不是关键字,但它是一个在C标准库中定义的函数名,因此将其作为变量名会导致命名冲突,使得代码无法正确编译。
  4. 最佳实践:即使printf不是关键字,按照编程习惯和命名规范,也不应该使用与标准库函数同名的标识符作为变量名,以避免潜在的混淆和错误。

8、在C++中有整型变量N,则表达式 N += 8/4//2 相当于 N += 8/(4/2) 。( )

正确答案: 错误

  1. 表达式N += 8/4//2:
     1)首先执行除法8/4,结果是2(整数除法)。
     2)然后执行整除(也称为地板除)2//2,结果是1。
     3)最后执行加法赋值操作,N增加1。
  2. 表达式N += 8/(4/2):
     1)首先执行括号内的除法4/2,结果是2(整数除法)。
     2)然后执行除法8/2,结果是4(整数除法)。
     3)最后执行加法赋值操作,N增加4。

9、C++中定义变量int N,则表达式(!!N)的值也是N的值。( )

正确答案: 错误

  1. 逻辑非操作:!是C++中的逻辑非操作符,它将布尔值取反。如果操作数是非零值,!操作将其转换为false(0);如果操作数是零,!操作将其转换为true(1)。
  2. 两次逻辑非:(!!N)相当于对N进行了两次!操作。第一次!操作会将N(如果N是非零,则变为false;如果N是零,则变为true)。第二次!操作会再次取反结果(如果第一次结果是false,则变为true;如果第一次结果是true,则变为false)。
  3. 结果:因此,(!!N)的结果实际上与N是否为零相同,但类型为bool。如果N是非零值,(!!N)的结果是true;如果N是零,(!!N)的结果是false。

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

正确答案: 正确

  1. 编程能力评估:GESP测试旨在评估认证者在编程和算法设计方面的能力,这些能力是跨语言的,即不依赖于使用哪种具体的编程语言。
  2. 语言无关性:虽然在实际测试中可能会使用特定的编程语言来实现解决方案,但测试的核心是解决问题的能力和编程思维,而不是对特定语言语法的熟悉程度。
  3. 等级认证:GESP测试根据认证者的表现给出等级认证,这个等级认证反映了认证者在编程领域的综合能力,而不是仅仅针对某一门编程语言的能力。

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

休息时间

【问题描述】
小杨计划在某个时刻开始学习,并决定在学习 秒后开始休息。
小杨想知道自己开始休息的时刻是多少。
【输入描述】
前三行每行包含一个整数,分别表示小杨开始学习时刻的时h、分m、秒s(h,m,s的值符合 1 < = h < = 12 , 0 < = m < = 59 , 0 < = s < = 59 1<= h <= 12, 0<= m <= 59, 0 <= s <= 59 1<=h<=12,0<=m<=59,0<=s<=59
第四行包含一个整数k,表示小杨学习的总秒数(注:k的值符合 1 < = k < = 3600 1 <= k <= 3600 1<=k<=3600
【输出描述】
输出一行,包含三个整数,分别表示小杨开始休息时刻的时、分、秒。
【样例输入 1】
12
59
59
10
【样例输出 1】
13 0 9
【样例解释】
小杨在时刻 12:59:59 开始学习,学习 10秒后开始休息,即在 13:0:9 时刻开始休息。
【数据范围】
对于全部数据,保证有 1 < = h < = 12 , 0 < = m < = 59 , 0 < = s < = 59 , 1 < = k < = 3600 1<= h <= 12, 0<= m <= 59, 0 <= s <= 59, 1 <= k <= 3600 1<=h<=12,0<=m<=59,0<=s<=59,1<=k<=3600

#include <iostream>  

using namespace std;  

int main() {  
    int h, m, s, k;
    cin >> h >> m >> s >> k;
    int sumn = h * 3600 + m * 60 + s + k;
    int a1 = sumn / 3600;
    int a2 = (sumn - a1 * 3600) / 60;
    int a3 = sumn - a1 * 3600 - a2 * 60;
    printf("%d %d %d", a1, a2, a3);
    return 0;  
}

立方数

【问题描述】
小杨有一个正整数n ,他想知道n是否是一个立方数。
一个正整数n是立方数当且仅当存在一个正整数x满足 x ∗ x ∗ x = n x * x * x = n xxx=n
【输入描述】
第一行包含一个正整数n。
【输出描述】
如果正整数n是一个立方数,输出 Yes,否则输出 No。
【样例输入 1】
8
【样例输出 1】
Yes
【样例输入 2】
9
【样例输出 2】
No
【样例解释】
对于样例1,存在正整数2使得 8 = 2 ∗ 2 ∗ 2 8 = 2 * 2 * 2 8=222,因此 为立方数。
对于样例2,不存在满足条件的正整数,因此9不为立方数。
【数据范围】
对于全部数据, 保证有 1 < = n < = 1000 1 <= n <= 1000 1<=n<=1000

#include <iostream>  

using namespace std;  

int main() {  
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++){
    	if (i * i * i == n){
    		cout << "Yes";
    		return 0;
		}
	}
	cout << "No";
    return 0;  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

青岛少儿编程-王老师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值