Appearance
《C语言程序设计》第一学期重修试卷B (精选07)
一、单项选择题(本大题共10小题,每小题2分,共20分)
(1) 属于C语言基本数据类型的是(B)。
A. 指针型
B. 无符号整型
C. 数组型
D. 结构型
查看答案与解析
答案:B
解析: C 语言基本数据类型包括:char、short、int、long、float、double,以及它们的无符号版本(unsigned)。指针、数组、结构体属于派生类型或构造类型。
难度: ⭐
考点: #数据类型
💡 学习锦囊
📖 相关公式与知识点:
- 基本类型:整型(signed/unsigned)、浮点型(float/double)、字符型(char)。
- 派生类型:指针、数组、函数。
- 构造类型:结构体、共用体、枚举。
思路分析
区分基本类型和构造类型。
🔄 举一反三
- 数组型属于什么类型?
查看练习答案与解析
答案:构造类型(派生类型) 解析:数组由基本类型元素组成,属于构造类型。
(2) 以下用户标识符中,合法的是(B)。
A. int
B. nit
C. 123
D. a+b
查看答案与解析
答案:B
解析: A 是关键字,不能作为标识符。C 是数字开头,不合法。D 包含 +,不合法。B 合法。
难度: ⭐
考点: #标识符
💡 学习锦囊
📖 相关公式与知识点:
- 标识符规则:字母/下划线开头,后续可为字母、数字、下划线。
- 关键字不能作为标识符。
思路分析
记住关键字和标识符规则。
🔄 举一反三
_123是合法的标识符吗?查看练习答案与解析
答案:是 解析:下划线开头,后续为数字,符合标识符规则。
(3) 以下不正确的语句(设有 int p, q)是(D)。
A. p *= 3;
B. p /= q;
C. p += 3;
D. p &&= q;
查看答案与解析
答案:D
解析: C 语言中没有 &&= 这种复合赋值运算符。+=、-=、*=、/=、%= 等是合法的,但逻辑运算符没有复合赋值形式。
难度: ⭐
考点: #赋值运算符
💡 学习锦囊
📖 相关公式与知识点:
- 复合赋值运算符:
+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=。 - 没有
&&=和||=。
思路分析
记住合法的复合赋值运算符。
🔄 举一反三
p |= q等价于什么?查看练习答案与解析
答案:
p = p | q解析:|=是按位或的复合赋值运算符。
(4) 以下程序中,while 循环的循环次数是(D)。
main()
{
int i = 0;
while (i < 10)
{
if (i < 1)
continue;
if (i == 5)
break;
i++;
}
}2
3
4
5
6
7
8
9
10
11
12
A. 1
B. 10
C. 6
D. 死循环
查看答案与解析
答案:D
解析: 初始 i=0,进入循环。i < 1 为真,执行 continue,跳过 i++,回到 while 条件。i 始终为 0,死循环。
难度: ⭐⭐⭐
考点: #continue #死循环
💡 学习锦囊
📖 相关公式与知识点:
- continue 跳过循环体剩余部分,回到条件判断。
- 注意 continue 可能跳过循环变量的更新。
易错点
continue 会跳过循环变量更新,可能导致死循环。
🔄 举一反三
- 若将
if (i < 1) continue;改为if (i < 1) i++;,循环次数是多少?查看练习答案与解析
答案:10 次 解析:i 从 0 到 9,每次 i++ 正常递增,循环 10 次后 i=10 退出。
(5) 以下程序的输出结果是(A)。
main()
{
int a = 0, i;
for (i = 1; i < 5; i++)
{
switch (i)
{
case 0:
case 3: a += 2;
case 1:
case 2: a += 3;
default: a += 5;
}
}
printf("%d\n", a);
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
A. 31
B. 13
C. 10
D. 20
查看答案与解析
答案:A
解析: 没有 break,发生穿透:
- i=1:case 1 → case 2 → default,a += 3 + 5 = 8
- i=2:case 2 → default,a += 3 + 5 = 16
- i=3:case 3 → case 1 → case 2 → default,a += 2 + 3 + 5 = 26
- i=4:default,a += 5 = 31
输出 31。
难度: ⭐⭐⭐
考点: #switch穿透
💡 学习锦囊
📖 相关公式与知识点:
- switch 穿透:匹配后无 break 则继续执行后续 case。
易错点
注意 case 的排列顺序和穿透效果。
🔄 举一反三
- 若在每个 case 后都加上
break;,a 的最终值是多少?查看练习答案与解析
答案:13
解析:i=1→case1→a+=3=3, break; i=2→case2→a+=3=6, break; i=3→case3→a+=2=8, break; i=4→default→a+=5=13。 :::
(6) 以下程序段的输出结果是(C)。
main()
{
int n = 2;
while (n--);
printf("%d\n", n);
}2
3
4
5
6
A. 2
B. 1
C. -1
D. 0
查看答案与解析
答案:C
解析:n-- 先用后减:
- n=2:条件为真,n 变为 1
- n=1:条件为真,n 变为 0
- n=0:条件为假(0),但 n-- 仍会执行,n 变为 -1
循环结束,输出 n = -1。
难度: ⭐⭐⭐
考点: #自增自减 #while循环
💡 学习锦囊
📖 相关公式与知识点:
n--作为条件:先判断 n 的值,再自减。- 即使条件为假(n=0),n-- 仍会执行。
思路分析
注意后缀自减在条件中的行为。
🔄 举一反三
- 若将
while (n--)改为while (--n),输出是多少?查看练习答案与解析
答案:0
解析:n=2→--n=1 真; n=1→--n=0 假,循环结束,n=0。 :::
(7) 以下函数调用语句中含有实参个数为(A)。
func((exp1, exp2), (exp3, exp4, exp5));A. 2
B. 5
C. 1
D. 3
查看答案与解析
答案:A
解析: 实参是两个逗号表达式:
(exp1, exp2):值为 exp2(exp3, exp4, exp5):值为 exp5
共 2 个实参。
难度: ⭐⭐
考点: #逗号表达式
💡 学习锦囊
📖 相关公式与知识点:
- 逗号表达式:
(a, b, c)的值为最后一个表达式的值(c)。 - 逗号表达式作为函数参数时,整体算作一个参数。
思路分析
注意区分逗号表达式和参数分隔符。
🔄 举一反三
int x = (1, 2, 3);后 x 的值是多少?查看练习答案与解析
答案:3 解析:逗号表达式取最后一个值。
(8) 以下程序的运行结果是(D)。
main()
{
int a = 1, b = 2, c = 3;
printf("%d\n", c > b > a);
}2
3
4
5
A. 2
B. 3
C. 0
D. 1
查看答案与解析
答案:C(0)
解析:c > b > a 等价于 (c > b) > a = (3 > 2) > 1 = 1 > 1 = 0。
注意:不能连续比较,C 语言中 c > b > a 不是数学中的连比。
难度: ⭐⭐⭐
考点: #关系运算
💡 学习锦囊
📖 相关公式与知识点:
- 关系运算符是左结合的。
a > b > c等价于(a > b) > c,不是数学中的 a > b 且 b > c。
易错点
C 语言不能连写关系表达式,必须用逻辑运算符连接。
🔄 举一反三
- 如何正确表达
a > b > c的数学含义?查看练习答案与解析
答案:
a > b && b > c解析:用逻辑与连接两个关系表达式。
(9) 以下程序的运行结果是(B)。
main()
{
int a = 5, b = 4, c = 6, d;
printf("%d\n", d = a > b ? (a > c ? a : c) : (b));
}2
3
4
5
A. 5
B. 6
C. 4
D. 不确定
查看答案与解析
答案:B
解析: 嵌套条件表达式:
a > b=5 > 4= 真- 执行
a > c ? a : c=5 > 6 ? 5 : 6= 6 - d = 6
难度: ⭐⭐
考点: #条件表达式
💡 学习锦囊
📖 相关公式与知识点:
- 条件表达式:
条件 ? 表达式1 : 表达式2 - 可以嵌套使用。
思路分析
从内向外分析嵌套条件表达式。
🔄 举一反三
int max = a > b ? a : b;的功能是什么?查看练习答案与解析
答案:求 a 和 b 的最大值 解析:条件表达式常用于求最值。
(10) 以下程序的运行结果是(C)。
main()
{
int a = 0, b = 0, c = 0;
if (++a > 0 || ++b > 0)
++c;
printf("%d,%d,%d\n", a, b, c);
}2
3
4
5
6
7
A. 0,0,0
B. 1,1,1
C. 1,0,1
D. 0,1,1
查看答案与解析
答案:C
解析:++a > 0 = 1 > 0 = 真。由于 || 短路求值,右边 ++b > 0 不执行,b 保持 0。然后 ++c,c = 1。
结果:a=1, b=0, c=1
难度: ⭐⭐⭐
考点: #短路求值
💡 学习锦囊
📖 相关公式与知识点:
||短路:左边为真,右边不执行。&&短路:左边为假,右边不执行。
易错点
短路求值可能导致某些表达式不被执行。
🔄 举一反三
- 若将
||改为&&,输出是什么?查看练习答案与解析
答案:1,1,1 解析:
++a > 0=1 真,不短路,++b > 0=1 真,++c,a=1,b=1,c=1。
二、填空题(本大题共10空,每空2分,共20分)
(1) C 语言表达式 5 > 2 > 7 > 8 的值是 0。
查看答案与解析
答案: 0
解析:5 > 2 > 7 > 8 = ((5 > 2) > 7) > 8 = (1 > 7) > 8 = 0 > 8 = 0。
难度: ⭐⭐
考点: #关系运算
💡 学习锦囊
📖 相关公式与知识点:
- 关系运算符左结合。
- 结果只有 0 或 1。
思路分析
不要按数学直觉理解连比。
🔄 举一反三
3 > 2 > 1的值是多少?查看练习答案与解析
答案:0 解析:
(3 > 2) > 1=1 > 1= 0。
(2) 以下程序的输出结果是 1。
main()
{
int x = 2, y = -1, z = 2;
if (x < y)
if (y < 0)
z = 0;
else
z = z + 1;
printf("%d\n", z);
}2
3
4
5
6
7
8
9
10
查看答案与解析
答案: 2(z 不变)
解析:x < y = 2 < -1 = 假,所以内层 if 不执行,z 保持 2。
注意:else 与最近的 if 配对。
难度: ⭐⭐
考点: #if嵌套 #else配对
💡 学习锦囊
📖 相关公式与知识点:
- else 与最近的未配对的 if 配对。
- 可以用花括号改变配对关系。
思路分析
注意 else 的配对规则。
🔄 举一反三
- 若用花括号将内层 if-else 包裹,输出是多少?
查看练习答案与解析
答案:2(不变) 解析:花括号不影响外层 if 的条件判断,
x < y仍为假。
(3) 以下程序的输出结果是 10。
main()
{
int i;
for (i = 1; i <= 5; i++)
;
printf("%d\n", i);
}2
3
4
5
6
7
查看答案与解析
答案: 6
解析: 循环体是空语句(分号)。i 从 1 到 5,每次加 1。当 i=6 时,条件 i <= 5 为假,循环结束。输出 i = 6。
难度: ⭐⭐
考点: #for循环 #空语句
💡 学习锦囊
📖 相关公式与知识点:
- for 循环体可以是空语句(只有一个分号)。
- 注意循环结束后循环变量的值。
易错点
不要忽略空语句,它也是一个完整的循环体。
🔄 举一反三
- 若 for 循环体不是空语句而是
printf("%d ", i);,输出是什么?查看练习答案与解析
答案:1 2 3 4 5 6 解析:循环体执行 5 次输出 1-5,循环结束后输出 i=6。
(4) 以下程序段的输出结果是 9。
int k, n, m;
n = 10; m = 1; k = 1;
while (k++ <= n)
m *= 2;
printf("%d\n", m);2
3
4
5
查看答案与解析
答案: 1024
解析:k++ <= n:
- k=1:1<=10 真,k=2,m=2
- k=2:2<=10 真,k=3,m=4
- ...
- k=10:10<=10 真,k=11,m=1024
- k=11:11<=10 假,结束
m = 2^10 = 1024。
难度: ⭐⭐
考点: #while循环 #自增
💡 学习锦囊
📖 相关公式与知识点:
k++ <= n:先比较,后自增。
思路分析
注意 k++ 在条件中的行为。
🔄 举一反三
- 若将
k++ <= n改为++k <= n,m 的值是多少?查看练习答案与解析
答案:512 解析:k 从 2 到 10 共 9 次循环,m = 2^9 = 512。
(5) 以下程序段的输出结果是 4。
int x = 2;
do
{
printf("*");
x--;
} while (!x == 0);2
3
4
5
6
查看答案与解析
答案: **(2个*)
解析:
- 第一次:输出 *,x=1。
!x == 0=!1 == 0=0 == 0= 真,继续。 - 第二次:输出 *,x=0。
!x == 0=!0 == 0=1 == 0= 假,结束。
输出 **。
难度: ⭐⭐⭐
考点: #do-while #逻辑运算
💡 学习锦囊
📖 相关公式与知识点:
!优先级高于==。!x == 0等价于(!x) == 0。
思路分析
注意运算符优先级。
🔄 举一反三
- 若将
!x == 0改为!x = 0,会怎样?查看练习答案与解析
答案:编译错误 解析:
!x是右值,不能被赋值。
(6) 以下程序段的输出结果是 2。
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("x=%d\n", x);2
3
4
5
6
7
8
9
10
11
12
13
查看答案与解析
答案: x=8
解析: 外层循环 2 次,每次:
- x++:x=1
- 内层 j=0,1,2,3:
- j=0:0%2=0,不 continue,x=2
- j=1:1%2=1,continue,跳过 x++
- j=2:2%2=0,不 continue,x=3
- j=3:3%2=1,continue,跳过 x++
- x++:x=4
第二次外层循环:x=8
难度: ⭐⭐⭐
考点: #嵌套循环 #continue
💡 学习锦囊
📖 相关公式与知识点:
- continue 只影响所在的最内层循环。
思路分析
逐层追踪循环变量。
🔄 举一反三
- 若将内层
if (j % 2) continue;改为if (j % 2 == 0) continue;,x 的值是多少?查看练习答案与解析
答案:x=8 解析:j=0,2 时 continue,j=1,3 时 x++,每轮内层 x 加 2,结果相同。
三、程序分析题(本大题共4小题,每小题5分,共20分)
(1) 以下程序的运行结果是 200,100,100,200。
int a1 = 100, a2 = 200;
main()
{
int a3 = 100, a4 = 200;
sub1(a3, a4);
sub1(a1, a2);
printf("%d,%d,%d,%d\n", a1, a2, a3, a4);
}
sub1(int x, int y)
{
a1 = x;
x = y;
y = a1;
}2
3
4
5
6
7
8
9
10
11
12
13
14
查看答案与解析
答案: 100,200,100,200
解析: sub1 是值传递,x 和 y 的改变不影响实参。
sub1(a3, a4):a1 = 100(全局变量),x 和 y 交换不影响 a3, a4。sub1(a1, a2):a1 = 100(不变),x 和 y 交换不影响 a1, a2。
最终:a1=100, a2=200, a3=100, a4=200。
难度: ⭐⭐⭐
考点: #全局变量 #值传递
💡 学习锦囊
📖 相关公式与知识点:
- 值传递不改变实参。
- 全局变量在所有函数中可见。
思路分析
注意区分全局变量和局部变量,以及值传递的效果。
🔄 举一反三
- 若 sub1 的参数改为指针
int *x, int *y,输出是什么?查看练习答案与解析
答案:200,100,200,100 解析:指针传递会修改实参的值。
(2) 以下程序的运行结果是 5。
main()
{
int a[5] = {1, 2, 3, 4, 5};
int *p = a;
printf("%d\n", *(p + 4));
}2
3
4
5
6
查看答案与解析
答案: 5
解析: p 指向数组首元素,p + 4 指向第 5 个元素(下标 4),即 a[4] = 5。
难度: ⭐
考点: #指针运算
💡 学习锦囊
📖 相关公式与知识点:
p + n指向第 n 个元素(不是第 n 个字节)。
思路分析
指针加减按元素大小偏移。
🔄 举一反三
- 若
int *p = &a[2];,*(p - 1)的值是多少?查看练习答案与解析
答案:2 解析:p 指向 a[2]=3,p-1 指向 a[1]=2。
四、程序填充题(本大题共3小题,每小题6分,共18分)
(1) 将十个整数输入数组,求出其平均值并输出。
main()
{
int i, a[10], sum = 0;
float *p = a; /* 第一空:应为 float avg; 或调整类型 */
/* 正确写法: */
int *p = a; /* 第一空 */
for (i = 0; i < 10; i++)
{
scanf("%d", p + i); /* 或用 &a[i] */
sum += *(p + i); /* 第二空 */
}
printf("%8.2f\n", (float)sum / 10); /* 第三空 */
}2
3
4
5
6
7
8
9
10
11
12
13
查看答案与解析
答案:
- 第一空:
a或&a[0](p 的初始化) - 第二空:
*p或a[i](累加) - 第三空:
(float)sum / 10(平均值)
解析: 用指针遍历数组,计算平均值。注意类型转换,确保得到浮点结果。
难度: ⭐⭐
考点: #指针 #数组 #平均值
💡 学习锦囊
📖 相关公式与知识点:
- 指针遍历数组:
p + i或p++。 - 平均值 = 总和 / 个数,注意类型转换。
思路分析
确保平均值计算时进行浮点除法。
🔄 举一反三
- 若数组有 n 个元素,如何用指针计算平均值?
查看练习答案与解析
答案:
for (p = a; p < a + n; p++) sum += *p; avg = (float)sum / n;解析:指针遍历数组,注意类型转换。
(2) 输入一个无符号整数后求出它的各位数之和并输出。
例如若输入 123,则将各位之和 6(即 1+2+3)输出。
unsigned int f(unsigned int num) /* 第一空 */
{
unsigned int k = 0;
do
{
k += num % 10; /* 第二空 */
num /= 10;
} while (num); /* 第三空 */
return k;
}
main()
{
unsigned int n;
scanf("%d", &n);
printf("%u\n", f(n));
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
查看答案与解析
答案:
- 第一空:
unsigned int f(unsigned int num)或f(num) - 第二空:
num % 10 - 第三空:
num或num != 0
解析: 通过取余和整除分离各位数字,累加求和。
难度: ⭐⭐
考点: #数位分离 #函数
💡 学习锦囊
📖 相关公式与知识点:
- 取个位:
num % 10 - 去掉个位:
num / 10
思路分析
用循环逐位分离并累加。
🔄 举一反三
- 如何求一个整数的位数?
查看练习答案与解析
答案:
int count = 0; while (num) { count++; num /= 10; }解析:每次除以 10 去掉一位,计数器加 1。
(3) 为数组输入数据,逆序置换后输出。
#define N 8
main()
{
int i, j, t, a[N];
for (i = 0; i < N; i++)
scanf("%d", a + i);
i = 0; j = N - 1;
while (i < j)
{
t = *(a + i);
*(a + i) = *(a + j); /* 第一空 */
*(a + j) = t; /* 第二空 */
i++; /* 第三空 */
j--;
}
for (i = 0; i < N; i++)
printf("%5d", *(a + i));
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
查看答案与解析
答案:
- 第一空:
*(a + j) - 第二空:
*(a + j) = t - 第三空:
i++(或++i)
解析: 双指针法:i 从头,j 从尾,交换元素,向中间移动。
难度: ⭐⭐
考点: #数组逆序 #双指针
💡 学习锦囊
📖 相关公式与知识点:
- 逆序:首尾交换,向中间靠拢。
- 终止条件:
i >= j。
思路分析
注意循环终止条件和指针移动。
🔄 举一反三
- 如何用单指针实现数组逆序?
查看练习答案与解析
答案:用
for (i = 0; i < N/2; i++)交换a[i]和a[N-1-i]。 解析:只需遍历一半,用下标计算对称位置。
五、程序设计题(第29小题7分,第30小题各10分,共17分)
(1) 将 100 个整数输入数组后按每行 10 个数输出。
查看答案与解析
参考答案:
#include <stdio.h>
main()
{
int a[100], i;
/* 输入 */
printf("请输入100个整数:\n");
for (i = 0; i < 100; i++)
scanf("%d", &a[i]);
/* 输出,每行10个 */
for (i = 0; i < 100; i++)
{
printf("%5d", a[i]);
if ((i + 1) % 10 == 0)
printf("\n");
}
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
解析: 用循环控制输出格式,每输出 10 个数换一行。(i + 1) % 10 == 0 判断是否换行。
难度: ⭐⭐
考点: #数组 #格式化输出
💡 学习锦囊
📖 相关公式与知识点:
- 换行条件:
(i + 1) % n == 0
思路分析
注意 i 从 0 开始,所以用 (i + 1) % 10 判断。
🔄 举一反三
- 如何每行输出 5 个数,每个数占 8 列宽度?
查看练习答案与解析
答案:
printf("%8d", a[i]); if ((i + 1) % 5 == 0) printf("\n");解析:修改宽度和每行个数即可。
(2) 计算 e = 1 + 1/1! + 1/2! + ... + 1/n! 的值并输出(设 n=20)。
查看答案与解析
参考答案:
#include <stdio.h>
main()
{
int n = 20, i;
double e = 1.0, factorial = 1.0;
for (i = 1; i <= n; i++)
{
factorial *= i; /* i! */
e += 1.0 / factorial;
}
printf("e = %.15f\n", e);
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
解析: 利用递推关系:n! = n × (n-1)!,避免重复计算。
难度: ⭐⭐⭐
考点: #阶乘 #级数求和
💡 学习锦囊
📖 相关公式与知识点:
- e 的泰勒展开:e = Σ(1/n!)
- 递推计算阶乘,避免溢出和重复计算。
思路分析
用递推法计算阶乘,注意使用 double 类型。
易错点
- int 阶乘会溢出,用 double 存储。
- 除法要用
1.0 / factorial而非1 / factorial。
🔄 举一反三
- 如何计算 sin(x) 的泰勒展开?
查看练习答案与解析
答案:
cdouble sin_x = x, term = x; for (i = 1; i <= n; i++) { term *= -x * x / ((2*i) * (2*i + 1)); sin_x += term; }1
2
3
4
5
6解析:利用递推关系计算每一项。