一、单项选择题(共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。12=1100,10=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) 后,结果是( )。
答案:B。x>>2 = 6,6&5 = 4;24^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 = 10710,b = 8208,输出结果是( )。
int gcd(int a, int b) {
while (b != 0) {
int t = a % b;
a = b;
b = t;
}
return a;
}
cout << gcd(a, b);
答案: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。字符数组大小足够,代码只是修改原数组内容后输出,不会越界到字符串结束符之外。
17. 该程序输出结果为整数。( )
答案: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;,程序正常运行。( )
答案:B。这里 char s[N+1] 需要编译期常量,宏 #define N 7 可以,而普通变量 int N=7; 在标准 C++ 中不能这样用。
20. 将第 13 行去掉,程序编译错误。( )
答案:A。第 13 行是 int k;,删除后后面的 for (k = 1; ...) 中变量 k 未定义,编译会报错。
21. 程序会输出什么?( )
答案: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。程序没有用到 cstdio 和 cstring 中的内容,删掉这两个头文件仍可正常编译运行。
24. 将第 12 行删除,输出结果与原来相同。( )
答案:A。第 12 行是 ok2=0;,而全局变量默认初值本来就是 0,因此删除后结果不变。
25. 程序输出为?( )
答案:D。第一层 if 条件为假,而 ok1!=0 与 ok2==0 都成立,所以进入 else if,令 a=-1。
26. 将第 09 行修改为 x=114;,输出为?( )
答案: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。虽然循环访问到 a[7] 时会碰到字符串结尾位置,但在本题环境下程序仍能正常输出结果,没有编译错误。
28. 将第 12 行的 a[j]<a[i] 改成 a[j]<=a[i],输出结果不变。( )
答案: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。