Appearance
《C语言程序设计》第一学期重修试卷B (精选02)
一、选择题(本大题共20题,每题2分,共40分)
(1) 下列语句中符合 C 语言语法的赋值语句是 (D)。
A) $a = 7 + b + c = a + 7$
B) $a = 7 + b + + = a + 7$
C) $a = 7 + b,b + + ,a + 7$
D) $a = 7 + b,c = a + 7$
查看答案与解析
答案:D
解析: A 选项:c = a + 7 的返回值不能作为左值,语法错误。
B 选项:++ 不能出现在赋值号左边。
C 选项:a + 7 不是赋值语句,只是表达式。
D 选项:逗号表达式,a = 7 + b 和 c = a + 7 都是合法赋值语句。
难度: ⭐
考点: #赋值语句 #逗号表达式
💡 学习锦囊
📖 相关公式与知识点:
- 赋值语句格式:
变量 = 表达式; - 逗号表达式:
表达式1, 表达式2,依次执行,值为最后一个表达式的值。
思路分析
赋值号左边必须是可修改的左值(变量),不能是表达式。
🔄 举一反三
- 以下哪些是合法赋值语句?c
a = b = c = 1; a = (b = 3, c = 4);1
2查看练习答案与解析
答案:都合法 解析:连续赋值和逗号表达式赋值都是合法的。
(2) 在 C 语言中, 要求运算数必须是整型的运算符是 (A)。
A) %
B) /
C) <
D) !
查看答案与解析
答案:A
解析: 取模运算符 % 要求两个操作数都必须是整型。其他运算符 /、<、! 都可以用于浮点数。
难度: ⭐
考点: #取模运算 #运算符
💡 学习锦囊
📖 相关公式与知识点:
%只能用于整型数据。/用于整型时结果为整除,用于浮点型时为普通除法。
思路分析
牢记 % 的运算数限制,这是 C 语言的基础规则。
🔄 举一反三
5.0 % 2.0是否合法?查看练习答案与解析
答案:不合法 解析:
%不能用于浮点数,编译会报错。
(3) 已知字母 A 的 ASCII 码为十进制的 65,下面程序的输出是 (A)。
main()
{
char ch1, ch2;
ch1 = 'A' + '5' - '3';
ch2 = 'A' + '6' - '3';
printf("%d,%c\n", ch1, ch2);
}2
3
4
5
6
7
A) 67, D
B) B, C
C) C, D
D) 不确定的值
查看答案与解析
答案:A
解析:'5' 的 ASCII 码是 53,'3' 的 ASCII 码是 51。
ch1 = 65 + 53 - 51 = 67,对应字符 'C',但用 %d 输出为 67。'6' 的 ASCII 码是 54。
ch2 = 65 + 54 - 51 = 68,对应字符 'D',用 %c 输出为 D。
难度: ⭐⭐
考点: #ASCII码 #字符运算
💡 学习锦囊
📖 相关公式与知识点:
- 字符在 C 语言中以 ASCII 码存储,可以进行算术运算。
'0'的 ASCII 码为 48,'A' 为 65,'a' 为 97。
思路分析
将字符转换为对应的 ASCII 码值进行计算,再将结果转换回字符。
🔄 举一反三
ch1 = 'A' + '1' - '0';的结果是什么?查看练习答案与解析
答案:'B'(ASCII 66) 解析:
'1'-'0'=1,所以65+1=66,即 'B'。
(4) 下面程序的输出是 (B)。
main()
{
int x = 10, y = 3;
printf("%d\n", y = x / y);
}2
3
4
5
A) 0
B) 3
C) 3.333
D) 不确定的值
查看答案与解析
答案:B
解析:x / y 为整数除法,10 / 3 = 3(截断小数)。y = 3 将 3 赋值给 y,然后 printf 输出 y 的值 3。
难度: ⭐
考点: #整数除法 #赋值表达式
💡 学习锦囊
📖 相关公式与知识点:
- 整数除法截断小数部分,不是四舍五入。
- 赋值表达式的值等于被赋的值。
思路分析
注意 x/y 是整型运算,结果也是整型。
🔄 举一反三
- 若
x = 10.0, y = 3.0,输出是什么?查看练习答案与解析
答案:3.333...(取决于精度) 解析:浮点数除法得到精确结果。
(5) 若执行下面的程序时从键盘上输入 3 和 4,则输出是 (B)。
main()
{
int a, b, s;
scanf("%d%d", &a, &b);
s = a;
if (a < b) s = b;
s = s * s;
printf("%d\n", s);
}2
3
4
5
6
7
8
9
A) 14
B) 16
C) 18
D) 20
查看答案与解析
答案:B
解析: 输入 3 和 4,s 初始化为 3。因为 3 < 4,所以 s = 4。然后 s = s * s = 4 * 4 = 16。
难度: ⭐
考点: #if语句 #输入输出
💡 学习锦囊
📖 相关公式与知识点:
scanf("%d%d", &a, &b)读取两个整数。- if 语句选择较大值。
思路分析
程序逻辑:求两个数的最大值,然后平方输出。
🔄 举一反三
- 若输入 5 和 2,输出是什么?
查看练习答案与解析
答案:25 解析:s=5,5>2 所以 s 保持 5,5*5=25。
(6) 下面的程序 (A)。
main()
{
int x = 3, y = 0, z = 0;
if (x = y + z)
printf("***");
else
printf("####");
}2
3
4
5
6
7
8
A) 有语法错误不能通过编译
B) 输出****
C) 可以通过编译,但是不能通过连接,因而不能运行
D) 输出####
查看答案与解析
答案:A
解析:printf("####") 缺少左括号,应为 printf("####")。这是语法错误,编译无法通过。
难度: ⭐
考点: #语法错误 #printf函数
💡 学习锦囊
📖 相关公式与知识点:
printf调用格式:printf("格式字符串", 参数列表);- 括号必须成对出现。
思路分析
注意代码中的括号匹配问题。
🔄 举一反三
- 若修正为
printf("####");,输出是什么?查看练习答案与解析
答案:#### 解析:
x = y + z即x = 0,条件为假,执行 else 分支。
(7) 下面的程序 (C)。
main()
{
int x = 3;
do {
printf("%d\n", x == 2);
} while (--x);
}2
3
4
5
6
7
A) 输出的是 1
B) 输出的是 1 和 -2
C) 输出的是 0、1 和 0
D) 是死循环
查看答案与解析
答案:C
解析:
- x=3:
x==2为假(0),输出 0。--x使 x=2,非零继续。 - x=2:
x==2为真(1),输出 1。--x使 x=1,非零继续。 - x=1:
x==2为假(0),输出 0。--x使 x=0,零结束。
输出:0、1、0(共3行),选 C。
难度: ⭐⭐
考点: #do-while循环 #关系运算符
💡 学习锦囊
📖 相关公式与知识点:
do-while先执行后判断,至少执行一次。--x先减后用。x == 2是关系表达式,结果为 0 或 1。
思路分析
注意 --x 和 x-- 的区别,以及关系表达式 == 和赋值 = 的区别。
🔄 举一反三
- 若将
--x改为x--,输出有何不同?查看练习答案与解析
答案:输出 0、1、0、0(多一次循环) 解析:
x--是先用后减,当 x=1 时输出 0,然后 x 变为 0,while 判断 x-- 时先用 0(假),x 变为 -1,循环结束。但由于 x=0 时条件已为假,实际输出仍为 0、1、0。注意:x-- 在 while 条件中,先用 x=0 判断(假),循环结束,不再执行循环体。所以输出与 --x 相同。
(8) 下面程序的输出是 (B)。
main()
{
int x = 023;
printf("%d\n", --x);
}2
3
4
5
A) 17
B) 18
C) 23
D) 24
查看答案与解析
答案:B
解析:023 是八进制数,转换为十进制:2×8 + 3 = 19。--x 先减后用,输出 18。
难度: ⭐
考点: #八进制数 #自减运算符
💡 学习锦囊
📖 相关公式与知识点:
- 八进制数以 0 开头。
--x先自减再使用。
思路分析
先转换八进制到十进制,再执行自减运算。
🔄 举一反三
int x = 0x23; printf("%d", --x);输出什么?查看练习答案与解析
答案:34 解析:
0x23= 2×16+3 = 35,减 1 得 34。
(9) 若执行下面的程序时从键盘上输入 5,则输出是 (B)。
main()
{
int x;
scanf("%d", &x);
if (x++ > 5)
printf("%d\n", x);
else
printf("%d\n", x--);
}2
3
4
5
6
7
8
9
A) 7
B) 6
C) 5
D) 4
查看答案与解析
答案:B
解析: 输入 5,x=5。x++ > 5:先用 5 与 5 比较(5>5 为假),然后 x 自增为 6。执行 else 分支:printf("%d", x--) 先输出 x 的当前值 6,然后 x 自减为 5。所以输出 6,选 B。
难度: ⭐⭐
考点: #自增自减 #if-else
💡 学习锦囊
📖 相关公式与知识点:
x++先用后增,++x先增后用。x--先用后减,--x先减后用。
思路分析
注意后缀运算符的特性:先使用当前值,再改变变量。
🔄 举一反三
- 若输入 6,输出是什么?
查看练习答案与解析
答案:7 解析:
x++ > 5先用 6 比较(6>5 为真),x 变为 7,执行 if 分支输出 7。
(10) 下面程序的输出是 (A)。
main()
{
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, *p = a;
printf("%d\n", *(p + 2));
}2
3
4
5
A) 3
B) 4
C) 1
D) 2
查看答案与解析
答案:A
解析:p = a 使 p 指向数组首元素 a[0]=1。*(p+2) 即 a[2]=3。指针加整数 i 表示偏移 i 个元素,p+2 指向第3个元素 a[2]。
难度: ⭐
考点: #指针运算 #数组访问
💡 学习锦囊
📖 相关公式与知识点:
*(p + i)等价于p[i]等价于a[i](当 p=a 时)。- 指针加整数 i,实际偏移 i 个元素。
思路分析
指针 p 指向数组首地址,p+2 指向第三个元素。
🔄 举一反三
*(p + 5)的值是多少?查看练习答案与解析
答案:6 解析:a[5] = 6。
(11) 执行下面程序中的输出语句,a 的值是 (C)。
main()
{
int a;
printf("%d\n", (a = 3 * 5, a * 4, a + 5));
}2
3
4
5
A) 65
B) 20
C) 15
D) 10
查看答案与解析
答案:C
解析: 逗号表达式 (a = 3*5, a*4, a+5):
a = 15a * 4 = 60(无赋值,a 不变)a + 5 = 20(无赋值,a 不变)
逗号表达式的值为最后一个表达式的值 20,但 a 的值始终是 15。题目问 a 的值,所以是 15。
难度: ⭐⭐
考点: #逗号表达式 #变量赋值
💡 学习锦囊
📖 相关公式与知识点:
- 逗号表达式依次执行,值为最后一个表达式的值。
- 只有赋值操作会改变变量的值。
思路分析
注意区分"表达式的值"和"变量的值"。
🔄 举一反三
a = (a = 3, a = a + 2, a * 2);执行后 a 的值是多少?查看练习答案与解析
答案:10 解析:a=3→a=5→表达式值=10,赋值给 a,最终 a=10。
(12) 下面程序的输出是 (C)。
main()
{
int a = -1, b = 4, k;
k = (a++ <= 0) && (!(b-- <= 0));
printf("%d%d%d\n", k, a, b);
}2
3
4
5
6
A) 003
B) 012
C) 103
D) 112
查看答案与解析
答案:C
解析:
a++ <= 0:a=-1 <= 0 为真(1),然后 a 自增为 0。- 由于
&&左边为真,不短路,继续计算右边。 !(b-- <= 0):b=4 <= 0 为假(0),取反为真(1),然后 b 自减为 3。- k = 1 && 1 = 1。
- 输出:k=1, a=0, b=3,即 "103",选 C。
难度: ⭐⭐⭐
考点: #逻辑运算 #短路求值 #自增自减
💡 学习锦囊
📖 相关公式与知识点:
&&短路特性:左边为假时右边不执行。||短路特性:左边为真时右边不执行。
思路分析
注意短路求值和自增自减的副作用。
🔄 举一反三
- 若
a = 1, b = 4,输出是什么?查看练习答案与解析
答案:003(k=0, a=2, b=4) 解析:
a++<=0先用 1 比较(1<=0 为假),a 变为 2。&&短路,右边不执行,b 不变。k=0,输出 "024"。注意:a=2, b=4,输出 "024"。
(13) 下面程序的输出是 (B)。
#include <stdio.h>
#include <string.h>
main()
{
char *p1 = "abc", *p2 = "ABC", str[50] = "xyz";
strcpy(str + 2, p1);
printf("%s\n", str);
}2
3
4
5
6
7
8
A) xyzabc
B) xyabc
C) xabc
D) xyabcABC
查看答案与解析
答案:B
解析:strcpy(str + 2, p1) 将 "abc" 复制到 str[2] 开始的位置。原 str = "xyz\0...",复制后变为 "xyabc\0..."。输出 "xyabc"。
难度: ⭐⭐
考点: #字符串函数 #指针运算
💡 学习锦囊
📖 相关公式与知识点:
strcpy(dest, src)将 src 复制到 dest,包括终止符 '\0'。str + 2指向字符串第 3 个字符位置。
思路分析
注意 strcpy 会覆盖目标位置的原有内容。
🔄 举一反三
strcpy(str, p2)后 str 的内容是什么?查看练习答案与解析
答案:"ABC" 解析:从首地址开始复制 "ABC"。
(14) 下面程序的输出是 (B)。
main()
{
int y = 9;
for (; y > 0; y--)
{
if (y % 3 == 0)
{
printf("%d", --y);
continue;
}
}
}2
3
4
5
6
7
8
9
10
11
12
A) 741
B) 852
C) 963
D) 875421
查看答案与解析
答案:B
解析:
- y=9:9%3==0,--y 使 y=8,输出 8。continue 跳过 y--,但 for 循环会执行 y--,y=7。
- y=7:7%3!=0,无输出。y--,y=6。
- y=6:6%3==0,--y 使 y=5,输出 5。y--,y=4。
- y=4:4%3!=0,无输出。y--,y=3。
- y=3:3%3==0,--y 使 y=2,输出 2。y--,y=1。
- y=1:1%3!=0,无输出。y--,y=0,结束。
输出:852,选 B。
难度: ⭐⭐⭐
考点: #for循环 #continue语句 #自减运算符
💡 学习锦囊
📖 相关公式与知识点:
continue跳过本次循环剩余部分,进入下一次循环。--y先减后用,与y--不同。
思路分析
追踪 y 的值变化,注意 --y 和 y-- 的区别以及 continue 的影响。
🔄 举一反三
- 若将
--y改为y--,输出是什么?查看练习答案与解析
答案:963 解析:先输出 y 的当前值,再减。y=9 输出 9,然后减为 8,for 再减为 7...
(15) 下面程序的输出是 (B)。
main()
{
char x = 040;
printf("%d\n", x = x << 1);
}2
3
4
5
A) 100
B) 64
C) 120
D) 80
查看答案与解析
答案:B
解析:040 是八进制数,等于十进制的 32。x << 1 左移 1 位,相当于乘以 2,32 × 2 = 64。
难度: ⭐⭐
考点: #位运算 #八进制数
💡 学习锦囊
📖 相关公式与知识点:
- 左移
<< n:相当于乘以 2^n。 - 右移
>> n:相当于除以 2^n(整数)。
思路分析
先转换八进制到十进制,再执行位运算。
🔄 举一反三
x = x >> 1后 x 的值是多少?查看练习答案与解析
答案:16 解析:32 / 2 = 16。
(16) 以下说法中正确的是 (C)。
A) C 语言程序总是从第一个的函数开始执行
B) 在 C 语言程序中, 要调用的函数必须在 main()函数中定义
C) C 语言程序总是从 main()函数开始执行
D) C 语言程序中的 main()函数必须放在程序的开始部分
查看答案与解析
答案:C
解析: C 语言程序总是从 main() 函数开始执行,这是 C 语言的规定。函数可以在程序的任何位置定义,只要在调用前声明即可。
难度: ⭐
考点: #程序结构 #main函数
💡 学习锦囊
📖 相关公式与知识点:
- main() 是 C 程序的入口点。
- 函数定义位置不限,但调用前需要声明或定义。
思路分析
牢记 C 程序的执行流程。
🔄 举一反三
- 函数定义在 main 之后,调用前需要做什么?
查看练习答案与解析
答案:函数声明 解析:在 main 前或调用前声明函数原型。
(17) 执行下面的程序后,a 的值为 (B)。
main()
{
int a, b;
for (a = 1, b = 1; a <= 100; a++)
{
if (b >= 20) break;
if (b % 3 == 1)
{
b += 3;
continue;
}
b -= 5;
}
}2
3
4
5
6
7
8
9
10
11
12
13
14
A) 7
B) 8
C) 9
D) 10
查看答案与解析
答案:B
解析: 追踪 a 和 b 的变化:
- a=1, b=1:b%3==1,b=4,continue
- a=2, b=4:b%3==1,b=7,continue
- a=3, b=7:b%3==1,b=10,continue
- a=4, b=10:b%3==1,b=13,continue
- a=5, b=13:b%3==1,b=16,continue
- a=6, b=16:b%3==1,b=19,continue
- a=7, b=19:b%3==1,b=22,continue
- a=8, b=22:b>=20,break
最终 a=8,选 B。
难度: ⭐⭐⭐
考点: #for循环 #break语句 #continue语句
💡 学习锦囊
📖 相关公式与知识点:
break跳出整个循环。continue跳过本次循环剩余部分。
思路分析
逐轮追踪变量值,注意 break 和 continue 的执行时机。
🔄 举一反三
- 若将
b >= 20改为b >= 15,a 的值是多少?查看练习答案与解析
答案:6 解析:a=6 时 b=16>=15,break。
(18) 以下程序段的输出结果是 (A)。
int x = 3;
do {
printf("%3d", x -= 2);
} while (!(-x));2
3
4
A) 1
B) 30
C) 1 -2
D) 死循环
查看答案与解析
答案:A
解析:
- x=3:
x -= 2得 x=1,输出 " 1"。-x即 -1,!(-1)= 0(假),循环结束。
只输出 1,选 A。
难度: ⭐⭐⭐
考点: #do-while循环 #复合赋值
💡 学习锦囊
📖 相关公式与知识点:
x -= 2等价于x = x - 2。!x:x 为 0 时结果为 1(真),非 0 时结果为 0(假)。
思路分析
注意 !(-x) 的运算顺序和逻辑非的特性。
🔄 举一反三
- 若
x = 5,输出是什么?查看练习答案与解析
答案:3 解析:x=5-2=3,输出 3,-3 非零,!(-3)=0,循环结束。
(19) 两次运行下面的程序,如果从键盘上分别输入 6 和 4,则输出结果是 (A)。
main()
{
int x;
scanf("%d", &x);
if (x++ > 5)
printf("%d", x);
else
printf("%d\n", x--);
}2
3
4
5
6
7
8
9
A) 7 和 5
B) 6 和 3
C) 7 和 4
D) 6 和 4
查看答案与解析
答案:A
解析: 输入 6:
x++ > 5:6 > 5 为真,x 变为 7。输出 7。
输入 4:
x++ > 5:4 > 5 为假,x 变为 5。执行 else,输出 5,然后 x-- 使 x=4。
输出:7 和 5,选 A。
难度: ⭐⭐
考点: #自增自减 #if-else
💡 学习锦囊
📖 相关公式与知识点:
x++先用后增。x--先用后减。
思路分析
分别追踪两次运行的变量变化。
🔄 举一反三
- 若输入 5,输出是什么?
查看练习答案与解析
答案:6 解析:
5++ > 5为假(5>5 假),x 变为 6,输出 6。
(20) 设有如下定义:char *aa[2] = {"abcd", "ABCD"}; 则以下说法中正确的是 (C)。
A) aa 数组元素的值分别是"abcd"和"ABCD"
B) aa 是指针变量,它指向含有两个数组元素的字符型一维数组
C) aa 数组的两个元素分别存放的是含有 4 个字符的一维字符数组的首地址
D) aa 数组的两个元素中各自存放了字符'a'和'A'的地址
查看答案与解析
答案:C
解析:char *aa[2] 是一个指针数组,包含 2 个 char* 类型的元素。每个元素存放一个字符串常量的首地址。"abcd" 和 "ABCD" 都是字符串常量,存储在只读数据区,aa[0] 和 aa[1] 分别指向它们的首地址。
难度: ⭐⭐⭐
考点: #指针数组 #字符串常量
💡 学习锦囊
📖 相关公式与知识点:
char *aa[2]:指针数组,2 个 char* 元素。- 字符串常量在内存中存储为字符数组,返回首地址。
思路分析
区分指针数组和数组指针:char *aa[2] 是指针数组,char (*aa)[2] 是数组指针。
🔄 举一反三
aa[0][1]的值是什么?查看练习答案与解析
答案:'b' 解析:aa[0] 指向 "abcd",aa[0][1] 即 'b'。
二、填空题(本大题共6空,每空5分,共30分)
(1) 以下程序的功能是:从键盘上输入若干个学生的成绩,统计并输出最高成绩和最低成绩,当输入负数时结束输入。请填空。
main()
{
float x, amax, amin;
scanf("%f", &x);
amax = x;
amin = x;
while (x >= 0)
{
if (x > amax) amax = x;
if (___①___) amin = x;
scanf("%f", &x);
}
printf("\namax=%f\namin=%f\n", amax, amin);
}2
3
4
5
6
7
8
9
10
11
12
13
14
查看答案与解析
答案:① x < amin(或 amin > x)
解析: 当输入的 x 小于当前最小值 amin 时,更新 amin。与更新 amax 的逻辑对称。
难度: ⭐
考点: #循环 #求最值
💡 学习锦囊
📖 相关公式与知识点:
- 求最大值:遇到更大的数就更新。
- 求最小值:遇到更小的数就更新。
思路分析
初始化 amax 和 amin 为第一个输入值,然后逐次比较更新。
🔄 举一反三
- 如何同时统计输入的成绩个数和平均值?
查看练习答案与解析
答案:增加计数器 n 和累加器 sum。 解析:
cint n = 0; float sum = 0; while (x >= 0) { n++; sum += x; ... } printf("平均=%f\n", sum/n);1
2
3
(2) 下面程序通过函数 average 计算数组中各元素的平均值,请填空。
float average(int *pa, int n)
{
int i;
float avg = 0.0;
for (i = 0; i < n; i++)
avg = avg + ___②___;
avg = ___③___;
return avg;
}
main()
{
int i, a[5] = {2, 4, 6, 8, 10};
float mean;
mean = average(a, 5);
printf("mean=%f\n", mean);
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
查看答案与解析
答案:② *(pa + i)(或 pa[i]) ③ avg / n
解析: ② 通过指针访问数组元素,*(pa+i) 或 pa[i]。③ 平均值 = 总和 / 元素个数。
难度: ⭐
考点: #指针 #数组 #函数
💡 学习锦囊
📖 相关公式与知识点:
*(pa + i)等价于pa[i]。- 平均值 = 总和 / 个数。
思路分析
指针作为函数参数,可以像数组一样访问元素。
🔄 举一反三
- 如何修改函数使其同时返回最大值和最小值?
查看练习答案与解析
答案:使用指针参数返回多个值。 解析:
cvoid stats(int *pa, int n, float *avg, int *max, int *min)1
(3) 以下程序的功能是:从键盘上输入一行字符,存入一个字符数组中,然后输出该字符串,请填空。
#include "ctype.h"
#include "stdio.h"
main()
{
char str[81], *sptr;
int i;
for (i = 0; i < 80; i++)
{
str[i] = getchar();
if (str[i] == '\n')
break;
}
str[i] = ___④___;
sptr = str;
while (*sptr)
putchar(___⑤___);
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
查看答案与解析
答案:④ '\0'(或 0) ⑤ *sptr++(或 *(sptr++))
解析: ④ 字符串必须以 '\0' 结尾。⑤ 输出当前字符,然后指针后移。
难度: ⭐⭐
考点: #字符串 #指针 #输入输出
💡 学习锦囊
📖 相关公式与知识点:
- C 字符串以 '\0' 结尾。
*sptr++:先取 *sptr 的值,再 sptr++。
思路分析
输入字符后需要添加字符串结束符,然后用指针遍历输出。
🔄 举一反三
- 如何统计输入字符串的长度?
查看练习答案与解析
答案:
cint len = 0; while (str[len]) len++;1
2解析:遍历到 '\0' 为止。
三、阅读程序题(本题共4小题,每题5分,共20分)
(1) 下面程序的输出是
#define MAX 5
int a[MAX], k;
main()
{
fun1();
fun3();
fun2();
fun3();
printf("\n");
}
fun1()
{
for (k = 0; k < MAX; k++)
a[k] = k + k;
}
fun2()
{
int a[MAX], k;
for (k = 0; k < 5; k++)
a[k] = k;
}
fun3()
{
int k;
for (k = 0; k < MAX; k++)
printf("%d", *(a + k));
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
查看答案与解析
答案: 0246802468
解析:
- fun1():全局数组 a 被赋值为 0, 2, 4, 6, 8。
- fun3():输出全局数组 a,即 02468。
- fun2():定义局部数组 a,不影响全局数组 a。
- fun3():再次输出全局数组 a,仍为 02468。
最终输出:0246802468
难度: ⭐⭐⭐
考点: #全局变量 #局部变量 #作用域
💡 学习锦囊
📖 相关公式与知识点:
- 全局变量在所有函数中可见(除非被局部变量遮蔽)。
- 局部变量只在其定义的函数/块中有效。
思路分析
fun2 中的局部数组 a 遮蔽了全局数组 a,但不影响全局数组的值。
易错点
- 误以为 fun2 修改了全局数组 a。
🔄 举一反三
- 若去掉 fun2 中的
int a[MAX]声明,输出是什么?查看练习答案与解析
答案:
0246801234解析:fun2 直接修改全局数组 a 为 0,1,2,3,4。
(2) 以下程序运行后,输出结果是
main()
{
int y = 18, i = 0, j, a[8];
do {
a[i] = y % 2;
i++;
y = y / 2;
} while (y >= 1);
for (j = i - 1; j >= 0; j--)
printf("%d", a[j]);
printf("\n");
}2
3
4
5
6
7
8
9
10
11
12
查看答案与解析
答案: 10010
解析: 程序将十进制数 18 转换为二进制:
- 18 % 2 = 0, y = 9, a[0] = 0
- 9 % 2 = 1, y = 4, a[1] = 1
- 4 % 2 = 0, y = 2, a[2] = 0
- 2 % 2 = 0, y = 1, a[3] = 0
- 1 % 2 = 1, y = 0, a[4] = 1
数组 a = {0, 1, 0, 0, 1},逆序输出:10010。
难度: ⭐⭐
考点: #进制转换 #数组 #do-while循环
💡 学习锦囊
📖 相关公式与知识点:
- 十进制转二进制:不断除以 2 取余数。
- 先得到的余数是低位,后得到的是高位,所以需要逆序输出。
思路分析
模拟十进制转二进制的过程,注意输出顺序。
🔄 举一反三
- 若 y = 13,输出是什么?
查看练习答案与解析
答案:1101 解析:13 = 8+4+1 = 1101₂。
(3) 以下程序的输出结果是
main()
{
int i, j, x = 0;
for (i = 0; i < 2; i++)
{
x++;
for (j = 0; j < 3; j++)
{
if (j % 2)
continue;
x++;
}
x++;
}
printf("%d\n", x);
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
查看答案与解析
答案: 8
解析: 外层循环 i=0,1,执行 2 次。每次外层循环:
- x++:x 增 1
- 内层 j=0,1,2:
- j=0:0%2=0,不 continue,x++
- j=1:1%2=1,continue,跳过 x++
- j=2:2%2=0,不 continue,x++ 内层共增 2
- x++:x 增 1
每次外层循环 x 增加 4,2 次共增加 8。初始 x=0,最终 x=8。
难度: ⭐⭐
考点: #嵌套循环 #continue语句
💡 学习锦囊
📖 相关公式与知识点:
continue跳过本次循环体剩余部分,进入下一次迭代。j % 2:j 为奇数时结果为 1(真),偶数时为 0(假)。
思路分析
逐层追踪循环执行过程,注意 continue 的作用。
🔄 举一反三
- 若将
if (j % 2)改为if (!(j % 2)),输出是什么?查看练习答案与解析
答案:4 解析:此时 j 为偶数时 continue,只有 j=1 时 x++,每次外层增 2。
(4) 以下程序的输出结果是
main()
{
char *s = "12134211";
int v[4] = {0, 0, 0, 0}, k, i;
for (k = 0; s[k]; k++)
{
switch (s[k])
{
case '1': i = 0;
case '2': i = 1;
case '3': i = 2;
case '4': i = 3;
}
v[i]++;
}
for (k = 0; k < 4; k++)
printf("%d", v[k]);
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
查看答案与解析
答案: 0008
解析: switch 语句中所有 case 都没有 break,所以会穿透到最后一个 case。无论 s[k] 是 '1'、'2'、'3' 还是 '4',最终都执行 i = 3,然后 v[3]++。
字符串 "12134211" 有 8 个字符,所以 v[3] = 8,其余为 0。输出 0008。
难度: ⭐⭐⭐
考点: #switch穿透 #字符串遍历
💡 学习锦囊
📖 相关公式与知识点:
- switch 中若无 break,会顺序执行后续 case。
- 字符串遍历:
for(k=0; s[k]; k++)
思路分析
注意 switch 的穿透特性,所有 case 最终都落到 i=3。
易错点
- 误以为每个 case 独立执行,分别计数。
🔄 举一反三
- 若在每个 case 后添加 break,输出是什么?
查看练习答案与解析
答案:
3320解析:'1' 出现 4 次,'2' 出现 2 次,'3' 出现 1 次,'4' 出现 1 次。
四、程序题(10分)
- 从键盘输入一个字符串 a,并在 a 串中的最大元素后边插入字符串 b(b[]="ab")。试编程。
查看答案与解析
参考答案:
#include <stdio.h>
#include <string.h>
main()
{
char a[100], b[] = "ab";
int i, max_idx = 0;
printf("请输入字符串 a: ");
gets(a);
/* 找最大字符的位置 */
for (i = 1; a[i]; i++)
if (a[i] > a[max_idx])
max_idx = i;
/* 将 max_idx 后的字符后移 2 位 */
for (i = strlen(a); i > max_idx; i--)
a[i + 2] = a[i];
/* 插入 b */
a[max_idx + 1] = 'a';
a[max_idx + 2] = 'b';
printf("结果: %s\n", a);
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
解析:
- 遍历字符串找到最大字符的索引 max_idx。
- 将 max_idx 之后的所有字符后移 2 位,腾出空间。
- 在 max_idx+1 和 max_idx+2 位置插入 'a' 和 'b'。
- 注意字符串需要有足够的空间容纳新增字符。
难度: ⭐⭐⭐
考点: #字符串操作 #数组移动 #插入算法
💡 学习锦囊
📖 相关公式与知识点:
- 字符串插入:先移动后插入。
- 移动方向:从后往前,避免覆盖未移动的数据。
思路分析
找到最大字符位置 → 后移字符腾出空间 → 插入新字符。
易错点
- 移动字符时从前向后移会导致数据覆盖。
- 忘记给插入后的字符串添加结束符 '\0'(本题中后移时已包含)。
🔄 举一反三
- 如何在最小字符前插入字符串?
查看练习答案与解析
答案:找到最小字符位置,将其后的字符后移,在最小字符位置插入。 解析:
cfor (i = strlen(a); i >= min_idx; i--) a[i + 2] = a[i]; a[min_idx] = 'a'; a[min_idx + 1] = 'b';1
2
3
4