高频考点强化练习 · 计算机基础与程序设计
适用:2027 届广东专升本《计算机基础与程序设计》 编排:按考频从高到低排列,每个考点配 2–3 道典型题 用法:先做题,再看解析,错题回 系统笔记 补概念
C 语言高频考点
考点 1:sizeof 与 strlen 的区别(考频 ★★★★★)
核心区别:
sizeof:运算符,编译时计算,返回类型/变量所占字节数,包含\0strlen:函数,运行时计算,返回字符串字符数,不包含\0sizeof(数组)= 整个数组大小;sizeof(指针)= 4 或 8 字节
题 1:以下程序输出是( )
char s[] = "hello";
char *p = s;
printf("%d, %d, %d\n", sizeof(s), sizeof(p), strlen(s));A. 5, 4, 5 B. 6, 4, 5 C. 6, 6, 5 D. 5, 5, 6
答案:B
解析:
sizeof(s)= 6(5字符+\0),sizeof(p)= 4(32位指针)或 8(64位),strlen(s)= 5。
题 2:以下程序输出是( )
int a[10];
printf("%d\n", sizeof(a) / sizeof(int));A. 10 B. 4 C. 40 D. 1
答案:A
解析:
sizeof(a)= 40(10×4),sizeof(int)= 4,40/4 = 10。这是计算数组长度的常用写法。
考点 2:运算符优先级与表达式求值(考频 ★★★★★)
优先级速记(从高到低):
()[]->.!~++--+(单目)-(单目)*(解引用)&(取地址)sizeof*/%+-<<>><<=>>===!=&(按位与)^(按位异或)|(按位或)&&||?:(三目)=+=-=等赋值,(逗号)
题 1:表达式 2 + 3 * 4 - 5 / 2 的值是( )
A. 9 B. 12 C. 10 D. 11
答案:B
解析:
3*4=12,5/2=2(整数除法),2+12-2=12。
题 2:表达式 10 != 9 的值是( )
A. 0 B. 1 C. true D. 非0
答案:B
解析:C 语言中关系表达式为真时值为 1(不是任意非0),为假时值为 0。
题 3:逗号表达式 (a = 3, b = 5, a + b) 的值是( )
A. 3 B. 5 C. 8 D. 15
答案:C
解析:逗号表达式从左到右计算,取最后一个表达式的值。a=3, b=5, a+b=8。
考点 3:三目运算符(条件运算符)(考频 ★★★★)
语法:条件 ? 表达式1 : 表达式2
- 条件为真 → 取表达式1
- 条件为假 → 取表达式2
- 只执行其中一个分支
- C 语言中唯一的三目运算符
题 1:以下程序输出是( )
int a = 5, b = 3;
printf("%d\n", a > b ? a++ : b++);
printf("%d, %d\n", a, b);A. 5 和 6,3 B. 5 和 5,3 C. 3 和 5,4 D. 5 和 6,4
答案:A
解析:
a > b为真,取a++(先返回 5,再加 1),所以输出 5,a 变为 6。b 不执行,仍为 3。
题 2:以下程序输出是( )
int x = 10;
printf("%d\n", x > 5 ? x < 8 ? 1 : 2 : 3);A. 1 B. 2 C. 3 D. 10
答案:B
解析:嵌套三目。
x > 5为真,执行x < 8 ? 1 : 2;x < 8为假,取 2。
考点 4:整数除法与取余(考频 ★★★★)
核心规则:
- 两个整数相除,结果截断为整数(向零取整)
5 / 2 = 2,-5 / 2 = -2(向零取整)- 取余
%只能用于整数,结果符号与被除数相同 - 想要浮点结果:
5.0 / 2或(float)5 / 2
题 1:表达式 17 % 5 的值是( )
A. 2 B. 3 C. 4 D. 5
答案:A
解析:17 = 5×3 + 2,余数为 2。
题 2:以下程序输出是( )
printf("%d, %.1f\n", 7 / 2, 7.0 / 2);A. 3, 3.5 B. 3.5, 3.5 C. 3, 3.0 D. 3.5, 3
答案:A
解析:
7/2整数除法 = 3;7.0/2浮点除法 = 3.5。
考点 5:自增自减运算符(考频 ★★★★)
核心区别:
i++:先使用 i 的值,再加 1(后置)++i:先加 1,再使用 i 的值(前置)i--/--i同理- 注意:同一表达式中多次修改同一变量是未定义行为,考试通常按从左到右理解
题 1:以下程序输出是( )
int i = 5;
printf("%d\n", i++);
printf("%d\n", i);A. 5 和 5 B. 6 和 5 C. 5 和 6 D. 6 和 6
答案:C
解析:
i++先返回 5,再加 1。第一个 printf 输出 5,之后 i=6,第二个输出 6。
题 2:以下程序输出是( )
int a = 3, b;
b = a++ + ++a;
printf("%d, %d\n", a, b);A. 5, 8 B. 5, 7 C. 4, 7 D. 结果不确定
答案:D(考试通常按 A 理解,但严格来说是未定义行为)
解析:同一表达式中两次修改 a,C 标准未定义求值顺序。若按从左到右:a++取3(a=4),++a取5(a=5),3+5=8。考试一般按这个理解。
考点 6:字符串函数(考频 ★★★★★)
常用函数(都在 string.h):
strlen(s):返回字符串长度(不计\0)strcpy(dest, src):复制 src 到 dest(含\0),返回 deststrcat(dest, src):把 src 拼接到 dest 末尾(覆盖 dest 的\0)strcmp(s1, s2):比较,s1<s2 返回负,相等返回 0,s1>s2 返回正strchr(s, c):查找字符 c 首次出现位置
题 1:以下程序输出是( )
char s[20] = "hello";
strcat(s, "world");
printf("%d\n", strlen(s));A. 5 B. 10 C. 11 D. 20
答案:B
解析:拼接后 s = "helloworld",strlen = 10。
题 2:以下程序输出是( )
char s1[] = "abc", s2[] = "abd";
printf("%d\n", strcmp(s1, s2));A. 正数 B. 负数 C. 0 D. 1
答案:B
解析:逐字符比较,前两个字符相同,第三个 'c' < 'd',所以 s1 < s2,返回负数。
考点 7:指针与数组(考频 ★★★★★)
核心关系:
- 数组名在表达式中退化为指向首元素的指针
a[i]等价于*(a + i)&a[i]等价于a + i- 数组名是常量指针,不能修改(不能
a++) - 指针是变量,可以修改(
p++) - 数组作为函数参数退化为指针,
sizeof会失效
题 1:以下程序输出是( )
int a[5] = {1, 2, 3, 4, 5};
int *p = a;
printf("%d\n", *(p + 2));A. 1 B. 2 C. 3 D. 4
答案:C
解析:p 指向 a[0],p+2 指向 a[2],*(p+2) = a[2] = 3。
题 2:以下程序输出是( )
int a[5] = {1, 2, 3, 4, 5};
int *p = &a[3];
printf("%d\n", p[-1]);A. 2 B. 3 C. 4 D. 编译错误
答案:B
解析:p 指向 a[3],p[-1] 等价于 *(p-1) = a[2] = 3。指针下标可以为负,只要不越界。
考点 8:函数参数传递(考频 ★★★★)
核心规则:
- C 语言只有传值调用
- 普通变量传值:形参改变不影响实参
- 想要修改实参:传指针(地址),在函数内解引用修改
- 数组传参:退化为指针,函数内可修改数组元素
- 二维数组传参:必须指定第二维大小,如
int a[][4]
题 1:以下程序输出是( )
void func(int a) { a = 100; }
int main() {
int x = 5;
func(x);
printf("%d\n", x);
return 0;
}A. 5 B. 100 C. 0 D. 不确定
答案:A
解析:传值调用,形参 a 是实参 x 的副本,修改 a 不影响 x。
题 2:以下程序输出是( )
void func(int *a) { *a = 100; }
int main() {
int x = 5;
func(&x);
printf("%d\n", x);
return 0;
}A. 5 B. 100 C. 0 D. 编译错误
答案:B
解析:传地址,函数内通过指针修改实参 x 的值为 100。
考点 9:循环结构(考频 ★★★★)
核心考点:
for循环三部分:初始化、条件、增量while/do-while区别:do-while 至少执行一次break:跳出整个循环continue:跳过本次循环剩余部分,进入下一次- 嵌套循环的执行次数
题 1:以下程序输出是( )
int i, j, count = 0;
for (i = 0; i < 3; i++)
for (j = 0; j < 2; j++)
count++;
printf("%d\n", count);A. 5 B. 6 C. 3 D. 2
答案:B
解析:外层 3 次,内层 2 次,共 3×2 = 6 次。
题 2:以下程序输出是( )
int i;
for (i = 0; i < 5; i++) {
if (i == 2) continue;
if (i == 4) break;
printf("%d ", i);
}A. 0 1 2 3 4 B. 0 1 3 C. 0 1 3 4 D. 0 1 2 3
答案:B
解析:i=0 打印,i=1 打印,i=2 continue 跳过,i=3 打印,i=4 break 退出。输出 0 1 3。
考点 10:选择结构(考频 ★★★)
核心考点:
if-else的 else 配对:else 与最近的未配对的 if 配对(悬空 else)switch的break:不加 break 会穿透==与=的区别(高频错误)- 逻辑运算符
&&||的短路求值
题 1:以下程序输出是( )
int a = 3, b = 5;
if (a > b);
printf("A");
printf("B");A. AB B. A C. B D. 编译错误
答案:A
解析:
if (a > b);末尾有分号,if 语句是空语句。无论条件真假,后面的printf("A")都会执行。输出 AB。
题 2:以下程序输出是( )
int x = 1;
switch (x) {
case 1: printf("1");
case 2: printf("2"); break;
case 3: printf("3");
default: printf("default");
}A. 1 B. 12 C. 123default D. 2
答案:B
解析:x=1 进入 case 1,打印 1,没有 break,继续穿透到 case 2,打印 2,遇到 break 退出。输出 12。
数据结构高频考点
考点 11:栈和队列(考频 ★★★★★)
核心概念:
- 栈:后进先出(LIFO),只在栈顶操作
- 队列:先进先出(FIFO),队尾插入、队头删除
- 循环队列:判空
front == rear,判满(rear + 1) % maxSize == front - 栈的应用:函数调用、表达式求值、括号匹配、递归
- 队列的应用:进程调度、BFS、缓冲区
题 1:入栈序列 1,2,3,4,不可能的出栈序列是( )
A. 4,3,2,1 B. 2,1,4,3 C. 3,1,4,2 D. 1,2,3,4
答案:C
解析:C 中 3 先出栈说明 1,2 已入栈且 2 在栈顶,出栈必须 2 先于 1,不可能 1 先出。
题 2:循环队列用数组 A[0..m-1] 存放元素,front 指向队头元素,rear 指向队尾元素的下一个位置,则当前元素个数是( )
A. (rear - front + m) % m B. rear - front + 1 C. rear - front D. (rear - front) % m
答案:A
解析:循环队列元素个数公式:
(rear - front + m) % m。加 m 是为了处理 rear < front 的情况。
考点 12:二叉树的性质与遍历(考频 ★★★★★)
核心性质:
- 第 i 层最多 2^(i-1) 个节点
- 深度为 k 的二叉树最多 2^k - 1 个节点
- 叶子节点数 n0 = 度为 2 的节点数 n2 + 1
- 完全二叉树深度:⌊log2(n)⌋ + 1
- 满二叉树:每层都满
三种遍历:
- 先序:根 → 左 → 右
- 中序:左 → 根 → 右
- 后序:左 → 右 → 根
题 1:一棵二叉树有 10 个度为 1 的节点,15 个度为 2 的节点,则叶子节点数是( )
A. 15 B. 16 C. 25 D. 26
答案:B
解析:n0 = n2 + 1 = 15 + 1 = 16。度为 1 的节点数不影响这个公式。
题 2:先序遍历 ABDEGCF,中序遍历 DBGEACF,后序遍历是( )
A. DGEBFCA B. DGEBCFA C. DEGBCFA D. DGEFCBA
答案:A
解析:
- 根 A,左子树 DBGE,右子树 CF
- 左子树先序 BDEG,中序 DBGE → B 为根,D 左,EG 右
- 右子树 EG:先序 EG,中序 GE → E 为根,G 左
- 右子树 CF:先序 CF,中序 CF → C 为根,F 右
- 后序:D → G → E → B → F → C → A = DGEBFCA
考点 13:排序算法(考频 ★★★★★)
八大排序对比:
| 排序 | 最好 | 平均 | 最坏 | 空间 | 稳定性 |
|---|---|---|---|---|---|
| 冒泡 | O(n) | O(n²) | O(n²) | O(1) | 稳定 |
| 选择 | O(n²) | O(n²) | O(n²) | O(1) | 不稳定 |
| 插入 | O(n) | O(n²) | O(n²) | O(1) | 稳定 |
| 希尔 | O(n) | O(n^1.3) | O(n²) | O(1) | 不稳定 |
| 快速 | O(nlogn) | O(nlogn) | O(n²) | O(logn) | 不稳定 |
| 归并 | O(nlogn) | O(nlogn) | O(nlogn) | O(n) | 稳定 |
| 堆排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(1) | 不稳定 |
| 基数 | O(d(n+r)) | O(d(n+r)) | O(d(n+r)) | O(n+r) | 稳定 |
题 1:以下排序中,平均时间复杂度为 O(n log n) 且稳定的是( )
A. 快速排序 B. 归并排序 C. 堆排序 D. 希尔排序
答案:B
解析:归并排序 O(nlogn) 且稳定。快速排序不稳定,堆排序不稳定,希尔排序不稳定且复杂度 O(n^1.3)。
题 2:对序列 {49, 38, 65, 97, 76, 13, 27} 进行第一趟快速排序(以第一个元素为基准)后的结果是( )
A. {27, 38, 13, 49, 76, 97, 65} B. {13, 27, 38, 49, 65, 76, 97} C. {27, 38, 13, 49, 65, 97, 76} D.
答案:A
解析:基准 49,从右找小于 49 的(27),从左找大于 49 的(65),交换... 最终 49 归位,左边都小于 49,右边都大于 49。结果:{27, 38, 13, 49, 76, 97, 65}。
考点 14:图的存储与遍历(考频 ★★★★)
存储方式:
- 邻接矩阵:二维数组,适合稠密图,空间 O(n²)
- 邻接表:数组+链表,适合稀疏图,空间 O(n+e)
遍历:
- DFS(深度优先):类似先序遍历,用栈/递归
- BFS(广度优先):类似层序遍历,用队列
题 1:n 个顶点 e 条边的无向图,用邻接表存储时,边表节点总数是( )
A. e B. 2e C. n+e D. n+2e
答案:B
解析:无向图每条边在邻接表中出现两次(u 的邻接表有 v,v 的邻接表有 u),所以边表节点总数是 2e。
题 2:图的 BFS 遍历类似于二叉树的( )
A. 先序遍历 B. 中序遍历 C. 后序遍历 D. 层序遍历
答案:D
解析:BFS 按层次遍历,先访问距离起点近的节点,类似于二叉树的层序遍历。
考点 15:查找算法(考频 ★★★★)
核心考点:
- 顺序查找:O(n),无序表也可用
- 折半查找:O(log n),要求顺序存储 + 有序
- 散列表:平均 O(1),冲突处理:开放定址法、链地址法
- 散列表 ASL(平均查找长度)与装填因子 α 有关
题 1:对长度为 10 的有序表进行折半查找,等概率下查找成功的平均查找长度是( )
A. 2.9 B. 3.0 C. 3.1 D. 2.5
答案:A
解析:构造判定树,10 个节点的判定树:
- 第1层1个(比较1次)
- 第2层2个(比较2次)
- 第3层4个(比较3次)
- 第4层3个(比较4次) ASL = (1×1 + 2×2 + 4×3 + 3×4) / 10 = (1+4+12+12)/10 = 29/10 = 2.9
题 2:散列表的装填因子 α 越大,则( )
A. 冲突可能性越小,查找效率越高 B. 冲突可能性越大,查找效率越低 C. 冲突可能性越小,查找效率越低 D. 冲突可能性越大,查找效率越高
答案:B
解析:α = 元素数 / 表长,α 越大表越满,冲突越多,查找效率越低。
考点 16:线性表(考频 ★★★)
核心考点:
- 顺序表:随机访问 O(1),插入删除 O(n)
- 链表:插入删除 O(1)(已知位置),查找 O(n)
- 单链表、双链表、循环链表
- 链表操作:插入、删除、反转、合并
题 1:在长度为 n 的顺序表中删除第 i 个元素(1≤i≤n),需要移动( )个元素
A. n-i B. n-i+1 C. i D. i-1
答案:A
解析:删除第 i 个元素,后面的元素(i+1 到 n)都要前移,共 n-i 个。
题 2:在单链表中,已知 q 指向 p 的前驱节点,若在 q 和 p 之间插入 s 节点,则执行( )
A. s->next = p->next; p->next = s; B. q->next = s; s->next = p; C. p->next = s; s->next = q; D. s->next = q; q->next = s;
答案:B
解析:q 是 p 的前驱,在 q 和 p 之间插入 s:先让 s 指向 p(s->next = p),再让 q 指向 s(q->next = s)。顺序不能反。
考点 17:算法复杂度分析(考频 ★★★)
核心概念:
- 时间复杂度:算法执行时间随问题规模 n 的增长率
- 空间复杂度:算法所需额外空间随 n 的增长率
- 常见复杂度:O(1) < O(log n) < O(n) < O(n log n) < O(n²) < O(n³) < O(2^n)
- 分析循环:嵌套循环相乘,并列循环相加
题 1:以下程序的时间复杂度是( )
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
a[i][j] = 0;A. O(n) B. O(n log n) C. O(n²) D. O(2^n)
答案:C
解析:两层嵌套循环,每层 n 次,共 n² 次操作,O(n²)。
题 2:以下程序的时间复杂度是( )
i = 1;
while (i <= n)
i = i * 2;A. O(n) B. O(log n) C. O(n²) D. O(1)
答案:B
解析:i 每次乘 2,设循环 k 次,则 2^k ≤ n,k ≤ log2(n),时间复杂度 O(log n)。
高频考点刷题清单
| 优先级 | 考点 | 建议题量 |
|---|---|---|
| ★★★★★ | sizeof/strlen、运算符优先级、字符串函数、指针与数组 | 各 10 题 |
| ★★★★★ | 栈和队列、二叉树遍历、排序算法 | 各 8 题 |
| ★★★★ | 三目运算符、整数除法、自增自减、函数传参 | 各 6 题 |
| ★★★★ | 图的存储遍历、查找算法 | 各 6 题 |
| ★★★ | 循环结构、选择结构、线性表、复杂度分析 | 各 5 题 |