#1628. 信息素养大赛——初中组模拟卷 1
信息素养大赛——初中组模拟卷 1
信息素养大赛——初中组模拟卷 1
一、单选题(共20题,每题2分,共40分)
1 执行以下 C++代码后,变量 c 的值是()。
int a = 10, b = 3;
double c = a / b;
{{ select(1) }}
- 3.33333
- 3.333
- 3.0
- 3
2 下列逻辑表达式中,结果为 true 的是()。
{{ select(2) }}
- (5 <= 5) && (7 < 5)
- !(10 > 5)
- (10 != 10) || (5 >= 3)
- (5 == 3) && (4 > 2)
3 关于 C++数组,下列说法错误的是()。
{{ select(3) }}
- 数组的下标通常从0开始
- int arr[5]; 声明了一个包含5个整数的数组
- 数组的大小必须在编译时确定,不能使用变量定义大小
- 可以通过 arr[5] 来访问 int arr[5]; 数组的最后一个元素
4 执行以下代码后,变量sum的值是()
int sum = 0;
for (int i = 1; i <= 5; i += 2) {
sum += i;
int sum = 0;
}
{{ select(4) }}
- 6
- 9
- 15
- 死循环
5 有数组定义:int arr[4] = {1, 2, 3}; 执行 arr[3] = arr[0] + arr[2]; 后,数组arr的内容是()。
int arr[4] = {1,2,3};
arr[3] = arr[0] + arr[2];
{{ select(5) }}
- {1,2,3,3}
- {1,2,3,4}
- {1,2,3,5}
- {1,2,3,6}
6 以下代码中,count++ 语句执行的次数是()。
int i = 10, count = 0;
while (i > 0) {
i = 3;
continue;
count++;
}
{{ select(6) }}
- 0
- 1
- 无限次
- 2
7 执行以下嵌套循环后,输出结果是()。
for (int i = 0; i < 3; i++) {
for (int j = 0; j <= i; j++)
cout << j;
cout << "#";
}
{{ select(7) }}
- 0#01#012#
- 0#1#2#
- 1#12#123#
- 0#01#012#
8 关于变量作用域错误的是:
{{ select(8) }}
- 在for循环语句中声明的变量,其作用域仅限于该循环体内
- 在函数内部声明的变量(局部变量),仅在函数内部有效
- 在所有函数外部声明的变量,在整个程序中都有效
- 不同函数中的局部变量可以同名,它们代表不同的内存单元
9 给定整数x=120,执行以下代码后,reversed的值是()。
int reversed = 0;
while (x) {
int digit = x % 10;
x /= 10;
reversed = reversed * 10 + digit;
}
{{ select(9) }}
- 21
- 12
- 120
- 0
10 以下函数用于查找数组中的最大值,横线处应填入()。
int findMax(int arr[], int size) {
int maxVal = ______;
for (int i = 1; i < size; i++)
if (arr[i] > maxVal) maxVal = arr[i];
return maxVal;
}
{{ select(10) }}
- 0
- arr[-1]
- arr[0]
- size
11 以下代码中存在几处错误?()
const int SIZE = 5;
int arr[SIZE];
for (int i = 0; i <= SIZE; i++)
arr[i] = i * 2;
cout << arr[SIZE];
{{ select(11) }}
- 0处
- 1处
- 2处
- 3处
12 关于C++中string类和字符数组(char[]),下列说法错误的是()。
{{ select(12) }}
- string对象可以使用 = 进行赋值,而字符数组需要使用 strcpy
- string对象的长度可以使用 length() 成员函数获取,而字符数组需要使用 strlen()
- string对象在内存中是动态分配空间的,因此可以自动处理字符串长度的变化
- string对象和字符数组都可以使用 == 运算符来直接比较两个字符串的内容是否相同
13 已知正整数N=1234,M=2(表示从右向左取第2位),以下代码输出为()。
int N = 1234, M = 2, div = 1;
for (int i = 0; i < M - 1; i++) div *= 10;
cout << N / div % 10;
{{ select(13) }}
- 1
- 2
- 3
- 4
14 执行以下代码后,输出结果是()。
int a = 5, b = 10, c;
c = a == b;
cout << c;
{{ select(14) }}
- 0
- 1
- 5
- 10
15. 以下代码执行后,cnt的值为()。
int cnt = 0;
for (int i = 1; i <= 9; i++)
for (int j = 0; j < i; j++)
cnt++;
cout << cnt;
{{ select(15) }}
- 36
- 45
- 55
- 90
16. 以下代码的输出是()。
for (int i = 1; i <= 5; i++) {
if (i % 2 == 0) continue;
cout << i;
}
{{ select(16) }}
- 135
- 12345
- 24
- 无输出
17. 执行以下代码后,变量a的值是()。
int a = 'a' + 'b';
int b = 'a' - 'b';
a = a - b;
{{ select(17) }}
- 196
- -1
- 1
- 0
18. 以下代码实现了欧几里得算法,输入a=12, b=18,输出结果是()。
int a, b, r;
cin >> a >> b;
while (b != 0) {
r = a % b;
a = b;
b = r;
}
cout << a;
{{ select(18) }}
- 6
- 12
- 18
- 3
19. 优美的数字定义为十进制下所有数位相同。不超过100的正整数中,优美的数字有()个。
{{ select(19) }}
- 9
- 18
- 20
- 100
20. 对于菱形输出,给定n=5(奇数),中心点位于第3行第3列。以下哪个条件可以判断位置(i,j)是否需要输出'#'?(其中k=n/2=2)
{{ select(20) }}
- abs(k-i) + abs(k-j) == k
- abs(k-i+1) + abs(k-j+1) == k
- abs(k-i) + abs(k-j) == 0
- i == j
二、阅读程序(共3题,判断题2分/题+选择题3分/题,共30分)
第一题:
阅读下面的C++代码,回答后面的问题。程序功能:输入正整数n,统计1到n之间“与5有关的数”的个数(含有数字5或者能被5整除)。
#include <iostream>
using namespace std;
int main() {
int n, cnt = 0;
cin >> n;
for (int i = 1; i <= n; i++) {
int x = i;
bool has5 = false;
while (x > 0) {
if (x % 10 == 5) {
has5 = true;
break;
}
x /= 10;
}
if (has5 || i % 5 == 0)
cnt++;
}
cout << cnt;
return 0;
}
1.判断题
(1) 当输入n=5时,输出为1。()
{{ select(21) }}
- 对
- 错
(2) 当输入n=10时,输出为3。()
{{ select(22) }}
- 对
- 错
(3) 代码中的 break 语句可以替换为 continue,结果不变。()
{{ select(23) }}
- 对
- 错
2.选择题
(1) 输入n=20,输出结果是()。
{{ select(24) }}
- 4
- 5
- 6
- 7
(2) 若将 while (x > 0) 改为 while (x >= 0),则()。
{{ select(25) }}
- 程序运行结果不变
- 程序可能死循环
- 编译错误
- 输出始终为0
第二题:
阅读下面的C++代码,回答后面的问题。
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int min_val, max_val, x;
cin >> x;
min_val = max_val = x;
while (x != -999) {
if (x > max_val) max_val = x;
if (x < min_val) min_val = x;
cin >> x;
}
cout << min_val << " " << max_val;
return 0;
}
程序功能:输入若干整数,以-999结束,输出其中的最小值和最大值(不包括-999)。
1.判断题
(1) 如果第一个数就是-999,则输出“-999 -999”。()
{{ select(16) }}
- 对
- 错
(2) 如果输入中没有-999,程序会一直等待输入,不会输出结果。()
{{ select(27) }}
- 对
- 错
(3) 将 cin >> x; 移到 while 循环体的最后一行(原来位置删除)结果不变。()
{{ select(28) }}
- 对
- 错
2.选择题
(1) 输入序列为:5 2 8 -1 3 -999,输出结果是()。
{{ select(29) }}
- -1 8
- 2 8
- -1 5
- 2 5
(2) 若将 if (x > max_val) 改为 if (x >= max_val),则当输入中有多个相同最大值时,()。
{{ select(30) }}
- 结果不变
- max_val会变成最后一个最大值
- min_val会改变
- 程序出错
第三题:
阅读下面的C++代码,回答后面的问题。
#include <iostream>
using namespace std;
int main() {
int N;
cin >> N;
int k = N / 2;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (abs(k - i + 1) + abs(k - j + 1) == k)
cout << "#";
else
cout << ".";
}
cout << endl;
}
return 0;
}
程序功能:输入一个奇数N,输出一个由#和.组成的菱形图案。
1.判断题
(1) 当N=3时,输出菱形只有一行有#。()
{{ select(31) }}
- 对
- 错
(2) 当N=5时,输出图案的中心位置(第3行第3列)是#。()
{{ select(32) }}
- 对
- 错
(3) 将条件中的 == k 改为 <= k,输出图案会变成实心菱形。()
{{ select(33) }}
- 对
- 错
2.选择题
(1) 输入N=3,输出图案共有()个#。
{{ select(34) }}
- 3
- 4
- 5
- 6
(2) 若将 k = N / 2 改为 k = N / 2 + 1,且N=5,则图案()。
{{ select(35) }}
- 不变
- 变大
- 变小
- 偏移
三、完善程序(共2题,每题5个空,每空3分,共30分)
(1)优美的数字
题目描述 如果一个正整数在十进制下的所有数位都相同,则称它为"优美的数字”。 例如:6、77、888、9999都是优美的;123、101、2025都不是优美的。 给定一个正整数n,请你统计不超过n的正整数中,一共有多少个优美的数字。 输入格式 一行,一个正整数n(1<=n<=2025)。 输出格式 一行,一个整数,表示优美的数字的个数。 样例输入1: 6 样例输出1: 6 样例输入2: 20 样例输出3: 10 代码(请将下划线处填写正确的选项)
#include <iostream>
using namespace std;
int main() {
int n, ans = 0;
cin >> n;
for (int i = 1; i <= n; i++) {
int v = i % 10; // 取个位数
int t = i / 10;
int chk = 1; // 假设 i 是优美的
while ( ____(1)____ ) {
if ( ____(2)____ ) {
chk = 0;
break;
}
____(3)____;
}
if ( ____(4)____ )
____(5)____;
}
cout << ans;
return 0;
}
(1) 循环继续的条件是 t 中还有未检查的数字,应填
{{ select(36) }}
- t == 0
- t > 0
- t >= 0
- t < 0
(2) 判断当前末位是否与个位数不同
{{ select(37) }}
- t % 10 != v
- t % 10 == v
- t / 10 != v
- t / 10 == v
(3) 去掉已经检查过的末位
{{ select(38) }}
- t %= 10
- t /= 10
- v *= 10
- v /= 10
(4) 如果仍然是优美的,则累加计数
{{ select(39) }}
- chk == 1
- chk == 0
- i == v
- t == 0
(5) 正确的计数累加语句
{{ select(40) }}
- ans += i
- ans += 1
- ans += chk
- ans = ans + i
(2)数组清零(模拟操作)
题目描述 小A有一个由n个非负整数构成的数组a=[a1,a2,...,an]。他会对数组重复进行以下操作,直到所有元素都变成0: 1.在数组中找到最大的整数(如果有多个最大值,选择其中下标最大的那个),记其位置为k。 2.在数组所有非零的整数中找到最小的整数aj。 3.将第1步找到的ak减去第2步找到的aj(即ak = ak一aj)。 例如:数组[2,3,4]需要7次操作才能变成[0,0,0]。 给定一个数组,请计算需要多少次操作才能让所有元素变成0。题目保证有限步内可以完成。输入格式 第一行一个正整数n(1≤n≤100)。 第二行n个非负整数ai(0≤ai≤100)。 输出格式 一行一个整数,表示最少操作次数。 样例输入1: 3 2 3 4 样例输出1: 7 样例输入2: 5 1 3 2 2 5 样例输出2: 13 代码(请将下划线处填写正确的选项)
#include <iostream>
using namespace std;
int main() {
int n, a[105];
cin >> n;
for (int i = 0; i < n; i++) cin >> a[i];
int op = 0;
while (true) {
// 1. 找到最大值(下标最大的)
int maxPos = -1, maxVal = -1;
for (int i = 0; i < n; i++) {
if (a[i] > 0 && a[i] >= maxVal) {
maxVal = a[i];
maxPos = i;
}
}
// 2. 若全为0则退出
if ( ____(1)____ ) break;
// 3. 找到所有非零数中的最小值
int minVal = 1000000;
for (int i = 0; i < n; i++) {
if (a[i] > 0 && a[i] < minVal)
minVal = a[i];
}
// 4. 执行减法
____(2)____;
op++;
// 5. 循环继续
}
cout << op;
return 0;
}
(1) 判断是否所有元素都已为0
{{ select(41) }}
- maxPos == -1
- maxVal == -1
- maxVal == 0
- maxPos == n
(2) 将最大值减去最小值
{{ select(42) }}
- a[maxPos] -= minVal
- a[maxPos] = minVal
- minVal -= a[maxPos]
- a[maxPos] = 0
(3) 查找最大值时使用条件 a[i] >= maxVal 的目的是
{{ select(43) }}
- 确保选中第一个最大值
- 确保选中最后一个最大值(下标最大)
- 避免相等时更新
- 提高效率
(4) 若将查找最小值的初始值 minVal = 1000000 改为 minVal = 0,则程序可能
{{ select(44) }}
- 正确运行,结果不变
- 永远找不到最小值,导致死循环
- 编译错误
- 输出结果变小
(5) 若输入数组中包含负数(与题目保证矛盾),则程序可能
{{ select(45) }}
- 正常运行并正确输出
- 无限循环
- 数组越界
- 输出负数