课堂小测试-03月21日

朝外信奥2队课堂练习(答案版)

信息学奥赛 C++ 基本语句课堂练习|20题教师答案与讲解

第 1 题
把十进制数 45 转换成二进制:45 = (________)2
答案:101101
讲解:45 = 32 + 8 + 4 + 1,所以二进制写成 101101。
第 2 题
已知 8 位二进制中,+6 的原码为 00000110,则 -6 的补码是 ________。
答案:11111010
讲解:+6 的二进制是 00000110,按位取反得 11111001,再加 1,得到 11111010。
第 3 题
学校运动会记录成绩时,需要存储“某位同学 100 米跑的成绩 12.58 秒”。在 int、float、bool、char 中,最合适的数据类型是 ________。
答案:float
讲解:成绩带小数部分,应该用浮点型存储。
第 4 题
已知字符 ‘A’ 的 ASCII 码是 65,字符 ‘a’ 的 ASCII 码是 97。那么表达式 'C' + 3 的结果对应的字符是 ________。
答案:’F’
讲解:’C’ 的 ASCII 码是 67,加 3 后得到 70,对应字符 ‘F’。
第 5 题
下面标识符中,符合 C++ 变量命名规则的是:A. 2abc B. int C. score_1 D. my-name
答案:C
讲解:变量名不能以数字开头,不能用关键字,不能包含减号,所以只有 score_1 合法。
第 6 题
int a = 5, b = 2;,执行语句 b = a++ + ++a; 后,a 的值是 ________,b 的值是 ________。
题目有问题:不建议给出固定标准答案
讲解:这个表达式对同一个变量 a 在一次表达式求值中做了多次修改,属于不适合作为基础题标准答案的写法。不同教材或编译环境下常有人算成 a=7, b=12,但从规范角度不应当把它当作可靠标准题。
建议改题:可改为 b = a + ++a; 或拆成两步,避免歧义。
第 7 题
阅读代码,写出程序输出结果:
int a = 4, b = 7;
int c = a + b * 2 - 3;
cout << c;
答案:15
讲解:先算乘法 7*2=14,再算 4+14-3=15
第 8 题
计算下面表达式的值:18 - 3 * 4 + 17 / 5 + 17 % 5 = ________。
答案:11
讲解:先算乘、除、取模:3*4=1217/5=3(整数除法),17%5=2。所以结果是 18-12+3+2=11
原教师答案版这里写成了 9,这里已更正。
第 9 题
char ch = 'b'; 执行 ch = ch + 3; 后,ch 中存放的字符是 ________,它对应的 ASCII 码是 ________。
答案:e,101
讲解:’b’ 的 ASCII 码是 98,加 3 后得到 101,对应字符 ‘e’。
第 10 题
数学中,⌈x⌉ 表示对 x 进行上取整。在 cmath 库中,对应的函数名是 ________。
答案:ceil
讲解:上取整函数是 ceil,向下取整是 floor
第 11 题
阅读下面代码,写出程序输出结果:
int x = 8;
if (x % 2 == 0) cout << "Yes";
else cout << "No";
答案:Yes
讲解:8 除以 2 的余数为 0,所以条件成立,输出 Yes。
第 12 题
表达式 (7 < 3 ? 10 : 20) 的值是 ________。
答案:20
讲解:7 < 3 为假,所以三目运算取冒号后面的 20。
第 13 题
a = 5, b = 8,则逻辑表达式 (a < b && b < 10) 的结果是 ________。
答案:true(输出时通常记为 1)
讲解:两个条件都成立,所以整个与运算结果为 true。
第 14 题
阅读下面代码,写出最终输出结果:
bool a = true, b = false, c = true;
cout << (a && !b || c && b);
答案:1
讲解:a && !b 为 true,c && b 为 false,最后 true || false,输出 1。
第 15 题
阅读下面代码,写出最终输出结果:
int i = 1, s = 0;
while (i <= 5){
    if (i % 2 == 0) s += i;
    i++;
}
cout << s;
答案:6
讲解:把 1 到 5 里的偶数 2 和 4 加起来,得到 6。
第 16 题
阅读下面代码,写出最终输出结果:
int s = 0;
for (int i = 1; i <= 6; i++){
    if (i == 4) continue;
    if (i == 6) break;
    s += i;
}
cout << s;
答案:11
讲解:累加的是 1、2、3、5。遇到 4 时跳过,遇到 6 时直接结束,所以结果为 1+2+3+5=11
原教师答案版这里写成了 8,这里已更正。
第 17 题
补全下面代码中的空白处,使其判断 n 是否为质数:
int n, i = 2;
cin >> n;
while (__________ && i * i <= n){
    i++;
}
if (i * i > n) cout << "Yes";
else cout << "No";
答案:n % i != 0
讲解:只要当前 i 不是 n 的因子,并且还没检查到平方根,就继续往下试。这个写法在常规“判断大于 1 的整数是否为质数”场景下成立。
第 18 题
补全下面代码中的空白处,使其依次求出后面的斐波那契数:
int a = 1, b = 1, c;
for (int i = 3; i <= 6; i++){
    c = __________;
    a = b;
    b = c;
}
cout << c;
答案:a + b
讲解:每一项都等于前两项之和。依次得到 2、3、5、8,最后输出 8。
第 19 题
补全欧几里得算法中的关键语句:
int a, b, r;
cin >> a >> b;
while (b != 0){
    r = a % b;
    a = b;
    b = __________;
}
cout << a;
答案:r
讲解:欧几里得算法每轮把较小数和余数继续带入,直到余数为 0。
第 20 题
已知 n = 1234,补全下面代码,求 n 的各位数字之积。程序运行结果应为 24。
int n = 1234;
int ans = 1;
while (n > 0){
    ans *= __________;
    n /= 10;
}
cout << ans;
答案:n % 10
讲解:每次先取个位,再把 n 去掉个位。于是计算的是 1×4×3×2×1=24