朝外信奥 2 队 2026-05-17 笔试训练题目

答案版
题型:单项选择题 + 阅读程序题
题量:30 题
用途:课堂讲评 / LearnDash 嵌入
一、单项选择题(共15题)
每题只有一个正确选项,绿色为正确答案,并附简要解析。
1. 计算机的核心部件是什么?( )
A. 显示器
B. 键盘
C. 中央处理器(CPU)
D. 鼠标
答案:C。CPU 负责指令执行和数据处理,是计算机的核心部件;显示器、键盘、鼠标都只是输入输出设备。
2. 将十进制小数 9.375 转换为二进制小数,其正确的二进制表示是( )。
A. 1001.11
B. 1011.11
C. 1001.011
D. 1011.011
答案:C。整数部分 9 转二进制是 1001,小数部分 0.375 = 0.25 + 0.125,所以是 0.011,合起来为 1001.011
3. 一个 96MB 文件夹里全是分辨率为 1024 × 2048 的 24 位图像,理论上存储了( )张图像?
A. 16 张
B. 20 张
C. 8 张
D. 32 张
答案:A。24 位图像每像素占 3 字节,所以每张大小为 1024×2048×3 = 6291456 字节,即 6MB;96÷6 = 16
4. 六个小朋友排成一列,其中三个三胞胎必须相邻,则有( )种不同排列方法?
A. 72
B. 48
C. 144
D. 218
答案:C。先把三个三胞胎看成一个整体,与另外三个孩子共 4 个对象排列,有 4! 种;三胞胎内部再排 3! 种,总数是 4!×3! = 144
5. 在 C++ 中,关于函数参数传递的说法,哪一个是正确的?( )
A. 只支持值传递
B. 只支持引用传递
C. 既支持值传递也支持引用传递
D. 只支持指针传递
答案:C。C++ 既可以按值传参,也可以通过引用参数直接操作实参;指针传递本质仍然是按值传递指针变量。
6. 对于一个 8 位二进制整数,如果其原码是 10000011,则其补码是( )。
A. 01111100
B. 01111101
C. 11111100
D. 11111101
答案:D。原码 10000011 表示 -3,补码求法是正数 3 的二进制 00000011 取反加 1,得到 11111101
7. 在 C++ 中,执行表达式 12 & 10 的结果是( )。
A. 8
B. 10
C. 12
D. 14
答案:A。12=110010=1010,按位与后得到 1000,即十进制 8。
8. 在 C++ 的 STL 中,如果需要频繁地在序列任意位置插入和删除元素,最合适的容器是( )。
A. std::vector
B. std::queue
C. std::stack
D. std::list
答案:D。双向链表 list 在已知位置时插入删除效率高;vector 中间插删通常需要搬移大量元素。
9. 若 x = 24,执行表达式 ((x >> 2) & 5) | (x ^ 3) 后,结果是( )。
A. 27
B. 31
C. 29
D. 23
答案:B。x>>2 = 66&5 = 424^3 = 27;最后 4|27 = 31
10. C++ 中用于表示枚举类型的关键字是( )。
A. struct
B. union
C. enum
D. static
答案:C。枚举类型使用关键字 enum 定义。
11. 有以下代码段,执行输出的结果为( )。
int a[3] = {1, 3, 5}; int *p = &a[0]; int *q = p + 2; cout << *(p+1) << " " << *q;
A. 2 3
B. 2 4
C. 3 4
D. 3 5
答案:D。*(p+1) 指向 a[1],值为 3;q = p+2 指向 a[2],值为 5。
12. 阅读下面代码,若 a = 10710b = 8208,输出结果是( )。
int gcd(int a, int b) { while (b != 0) { int t = a % b; a = b; b = t; } return a; } cout << gcd(a, b);
A. 8
B. 18
C. 90
D. 306
答案:B。该函数是欧几里得算法,最终可算出 gcd(10710, 8208) = 18
13. 从 15 个男生、9 个女生中选 3 人组队,要求至少有一位女生,共有( )种组合。
A. 1569
B. 2024
C. 1940
D. 1485
答案:A。总选法是 C(24,3)=2024,减去全男生的选法 C(15,3)=455,得到 2024-455=1569
14. 套餐 A:2GB/3 元,B:5GB/7 元,C:10GB/13 元,超出部分 2 元/GB。若预计使用 128GB,则最少付费( )元。
A. 169
B. 168
C. 167
D. 166
答案:B。10GB 套餐的单位价格最低,先买 12 个 C 得到 120GB,花费 156 元;剩余 8GB 用 4 个 A 正好补齐,花费 12 元,总计 168 元。
15. 向一个栈顶指针为 h 的带头结点链栈中插入指针 p 所指结点,应执行( )。
A. h->next = p;
B. p->next = h;
C. p->next = h; p->next = p;
D. p->next = h->next; h->next = p;
答案:D。链栈头插法入栈:先让新结点指向原栈顶,再让头结点指向新结点。
二、阅读程序题(共15题)
阅读代码后作答,绿色为正确答案,并附简要解析。
(一)阅读下面的程序代码,回答 16~18 题
#include <iostream> using namespace std; int main(){ int i,j; char str1[]="pig-is-stupid"; char str2[]="clever"; str1[0]='d'; str1[1]='o'; for (i=7,j=0;j <6; i++,j++)str1[i]=str2[j]; cout << str1 << endl; return 0; }
16. 该程序可以正常运行。( )
A. TRUE
B. FALSE
答案:A。字符数组大小足够,代码只是修改原数组内容后输出,不会越界到字符串结束符之外。
17. 该程序输出结果为整数。( )
A. TRUE
B. FALSE
答案:B。输出的是字符数组 str1 对应的字符串,不是整数。
18. 该程序的输出结果是( )。
A. dog-is-clever
B. dog_is_clever
C. dog-is-stupid
D. dog_is-stupid
答案:A。前两个字符改成 do,再把下标 7~12 的 stupid 改成 clever,最终得到 dog-is-clever
(二)阅读下面的程序代码,回答 19~22 题(NOIP2006)
#include <iostream> using namespace std; #define N 7 int fun(char s[],char a,int n){ int j; j=n; while(a<s[j]&&j>0)j--; return j; } int main(){ char s[N+1]; int k; for (k = 1; k <=N; k++) s[k]='A'+2*k+1; cout<<fun(s,'M',N)<<endl; }
19. 将第 03 行替换为 int N=7;,程序正常运行。( )
A. TRUE
B. FALSE
答案:B。这里 char s[N+1] 需要编译期常量,宏 #define N 7 可以,而普通变量 int N=7; 在标准 C++ 中不能这样用。
20. 将第 13 行去掉,程序编译错误。( )
A. TRUE
B. FALSE
答案:A。第 13 行是 int k;,删除后后面的 for (k = 1; ...) 中变量 k 未定义,编译会报错。
21. 程序会输出什么?( )
A. 3
B. 5
C. 6
D. 7
答案:B。循环后 s[1..7] 依次为 D,F,H,J,L,N,P,函数从后往前找第一个不大于 'M' 的位置,最终返回 5。
22. 在运行到第 14 行时,串 s 等于( )。
A. PNLJHFD
B. DFHJLNP
C. DFMJLNP
D. DDFJLNP
答案:B。由 'A'+2*k+1 可得各位置依次填入 D,F,H,J,L,N,P
(三)阅读下面的程序代码,回答 23~26 题(NOIP2003 改编)
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int a,x,y,ok1,ok2; int main(){ a=100; x=20; y=20; ok1=5; ok2=0; if((x>y)||((y!=20)&&(ok1==0))&&(ok2!=0)) a=1; else if((ok1!=0)&&(ok2==0)) a=-1; else a=0; cout<<a<<endl; return 0; }
23. 把第 02、03 行删除,程序可以正常运行。( )
A. TRUE
B. FALSE
答案:A。程序没有用到 cstdiocstring 中的内容,删掉这两个头文件仍可正常编译运行。
24. 将第 12 行删除,输出结果与原来相同。( )
A. TRUE
B. FALSE
答案:A。第 12 行是 ok2=0;,而全局变量默认初值本来就是 0,因此删除后结果不变。
25. 程序输出为?( )
A. 0
B. 1
C. 2
D. -1
答案:D。第一层 if 条件为假,而 ok1!=0ok2==0 都成立,所以进入 else if,令 a=-1
26. 将第 09 行修改为 x=114;,输出为?( )
A. -1
B. 1
C. 0
D. 100
答案:B。修改后 x>y 立即成立,程序直接进入第一层 if,输出 1。
(四)阅读下面的程序代码,回答 27~30 题(NOIP2003)
#include <iostream> #include <cstdio> #include <cstring> #include <string> using namespace std; string a,t; int i,j; int main(){ a="morning"; j=1; for (int i = 2; i <=7; i++) if(a[j]<a[i]) j=i; j=j-1; for ( i = 0; i <=j ; i++) cout << a[i]; return 0; }
27. 该程序可以正常运行。( )
A. TRUE
B. FALSE
答案:A。虽然循环访问到 a[7] 时会碰到字符串结尾位置,但在本题环境下程序仍能正常输出结果,没有编译错误。
28. 将第 12 行的 a[j]<a[i] 改成 a[j]<=a[i],输出结果不变。( )
A. TRUE
B. FALSE
答案:A。字符串 morning 中按字典序最大的字符是 r,即使把条件改成 <=,记录到的最大位置仍不会影响最后输出的前缀结果。
29. 该程序的输出结果是?( )
A. o
B. mo
C. morning
D. gninrom
答案:B。循环找到字典序最大的字符 r 在下标 2,之后 j=j-1 变为 1,最后输出下标 0 到 1,即 mo
30. 若将第 09 行的字符串改为 "abcdefg",则程序输出为?( )
A. abcdef
B. abcde
C. abcd
D. abc
答案:A。最大字符会更新到 g 所在位置 6,之后减 1 变成 5,于是输出下标 0 到 5,即 abcdef