Skip to content

《C语言程序设计》第二学期重修试卷A (精选08)

一、单项选择题(本大题共10小题,每小题2分,共20分)

(1) 有以下语句:int a = 6; a += a -= a*a; printf("%d", a); 输出结果是(B)。

A. -132
B. -60
C. -24
D. 0

查看答案与解析

答案:B

解析: 复合赋值从右向左结合:

  1. a -= a*a:a = 6 - 36 = -30
  2. a += a:a = -30 + (-30) = -60

难度: ⭐⭐⭐
考点: #复合赋值 #运算符结合性

💡 学习锦囊

📖 相关公式与知识点:

  • 复合赋值运算符从右向左结合。
  • a += a -= a*a 等价于 a += (a -= (a*a))

思路分析

按从右向左的顺序逐步计算。

🔄 举一反三
  1. int a = 5; a += a *= 2; 结果是多少?
    查看练习答案与解析

    答案:20 解析:a *= 2 → a=10;a += 10 → a=20。

(2) 以下程序的输出结果是(D)。

c
main()
{
    int a = 5, b = 4, c = 6, d;
    printf("%d\n", d = a > b ? (a > c ? a : c) : b);
}

A. 5
B. 4
C. 6
D. 3

查看答案与解析

答案:C(6)

解析: 嵌套条件表达式:

  • a > b = 5 > 4 = 真
  • 执行 a > c ? a : c = 5 > 6 ? 5 : 6 = 6

难度: ⭐⭐
考点: #条件表达式

💡 学习锦囊

📖 相关公式与知识点:

  • 条件表达式:条件 ? 表达式1 : 表达式2
  • 可以嵌套使用。

思路分析

从内向外分析嵌套条件表达式。

🔄 举一反三
  1. int max = a > b ? a : b; 的功能是什么?
    查看练习答案与解析

    答案:求 a 和 b 的最大值 解析:条件表达式常用于求最值。

(3) 以下程序的运行结果是(B)。

c
main()
{
    int x = 2, y = -1, z = 2;
    if (x < y)
        if (y < 0)
            z = 0;
        else
            z = z + 1;
    printf("%d\n", z);
}

A. 3
B. 2
C. 1
D. 0

查看答案与解析

答案:B(2)

解析:x < y = 2 < -1 = 假,所以内层 if 不执行,z 保持 2。

注意:else 与最近的 if 配对。


难度: ⭐⭐
考点: #if嵌套 #else配对

💡 学习锦囊

📖 相关公式与知识点:

  • else 与最近的未配对的 if 配对。

思路分析

注意 else 的配对规则。

🔄 举一反三
  1. 若用花括号将内层 if-else 包裹,输出是多少?
    查看练习答案与解析

    答案:2(不变) 解析:花括号不影响外层 if 的条件判断,x < y 仍为假。

(4) 以下程序段的输出结果是(C)。

c
int n = 2;
while (n--);
printf("%d\n", n);

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-- 仍会执行。

思路分析

注意后缀自减在条件中的行为。

🔄 举一反三
  1. 若将 while (n--) 改为 while (--n),输出是多少?
    查看练习答案与解析

    答案:0 解析:n=2→--n=1 真; n=1→--n=0 假,循环结束,n=0。

(5) 以下程序段的输出结果是(A)。

c
int a = 0, b = 0, c = 0;
if (++a > 0 || ++b > 0)
    ++c;
printf("%d,%d,%d\n", a, b, c);

A. 1,0,1
B. 1,1,1
C. 0,0,0
D. 0,1,1

查看答案与解析

答案:A

解析:++a > 0 = 1 > 0 = 真。由于 || 短路求值,右边 ++b > 0 不执行,b 保持 0。然后 ++c,c = 1。

结果:a=1, b=0, c=1


难度: ⭐⭐⭐
考点: #短路求值

💡 学习锦囊

📖 相关公式与知识点:

  • || 短路:左边为真,右边不执行。
  • && 短路:左边为假,右边不执行。

易错点

短路求值可能导致某些表达式不被执行。

🔄 举一反三
  1. 若将 || 改为 &&,输出是什么?
    查看练习答案与解析

    答案:1,1,1 解析++a > 0=1 真,不短路,++b > 0=1 真,++c,a=1,b=1,c=1。

(6) 以下程序中,while 循环的循环次数是(D)。

c
main()
{
    int i = 0;
    while (i < 10)
    {
        if (i < 1)
            continue;
        if (i == 5)
            break;
        i++;
    }
}

A. 1
B. 10
C. 6
D. 死循环

查看答案与解析

答案:D

解析: 初始 i=0,进入循环。i < 1 为真,执行 continue,跳过 i++,回到 while 条件。i 始终为 0,死循环。


难度: ⭐⭐⭐
考点: #continue #死循环

💡 学习锦囊

📖 相关公式与知识点:

  • continue 跳过循环体剩余部分,回到条件判断。

易错点

continue 会跳过循环变量更新,可能导致死循环。

🔄 举一反三
  1. 若将 if (i < 1) continue; 改为 if (i < 1) i++;,循环次数是多少?
    查看练习答案与解析

    答案:10 次 解析:i 从 0 到 9,每次 i++ 正常递增,循环 10 次后 i=10 退出。

(7) 以下程序的运行结果是(A)。

c
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);
}

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

难度: ⭐⭐⭐
考点: #switch穿透

💡 学习锦囊

📖 相关公式与知识点:

  • switch 穿透:匹配后无 break 则继续执行后续 case。

易错点

注意 case 的排列顺序和穿透效果。

🔄 举一反三
  1. 若在每个 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。

(8) 以下程序的运行结果是(C)。

c
main()
{
    int a = 1, b = 2, c = 3;
    printf("%d\n", c > b > a);
}

A. 2
B. 3
C. 0
D. 1

查看答案与解析

答案:C

解析:c > b > a 等价于 (c > b) > a = (3 > 2) > 1 = 1 > 1 = 0。


难度: ⭐⭐⭐
考点: #关系运算

💡 学习锦囊

📖 相关公式与知识点:

  • 关系运算符是左结合的。
  • a > b > c 等价于 (a > b) > c

易错点

C 语言不能连写关系表达式,必须用逻辑运算符连接。

🔄 举一反三
  1. 如何正确表达 a > b > c 的数学含义?
    查看练习答案与解析

    答案a > b && b > c解析:用逻辑与连接两个关系表达式。

(9) 以下函数调用语句中含有实参个数为(A)。

c
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)。

思路分析

注意区分逗号表达式和参数分隔符。

🔄 举一反三
  1. int x = (1, 2, 3); 后 x 的值是多少?
    查看练习答案与解析

    答案:3 解析:逗号表达式取最后一个值。

(10) 以下程序段的输出结果是(C)。

c
int k, n, m;
n = 10; m = 1; k = 1;
while (k++ <= n)
    m *= 2;
printf("%d\n", m);

A. 512
B. 1024
C. 2048
D. 4096

查看答案与解析

答案:B(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++ 在条件中的行为。

🔄 举一反三
  1. 若将 k++ <= n 改为 ++k <= n,m 的值是多少?
    查看练习答案与解析

    答案:512 解析:k 从 2 到 10 共 9 次循环,m = 2^9 = 512。

二、填空题(本大题共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。

思路分析

不要按数学直觉理解连比。

🔄 举一反三
  1. 3 > 2 > 1 的值是多少?
    查看练习答案与解析

    答案:0 解析(3 > 2) > 1 = 1 > 1 = 0。

(2) 以下程序的输出结果是 6

c
main()
{
    int i;
    for (i = 1; i <= 5; i++)
        ;
    printf("%d\n", i);
}
查看答案与解析

答案: 6

解析: 循环体是空语句(分号)。i 从 1 到 5,每次加 1。当 i=6 时,条件 i <= 5 为假,循环结束。输出 i = 6。


难度: ⭐⭐
考点: #for循环 #空语句

💡 学习锦囊

📖 相关公式与知识点:

  • for 循环体可以是空语句(只有一个分号)。

易错点

不要忽略空语句,它也是一个完整的循环体。

🔄 举一反三
  1. 若 for 循环体不是空语句而是 printf("%d ", i);,输出是什么?
    查看练习答案与解析

    答案:1 2 3 4 5 6 解析:循环体执行 5 次输出 1-5,循环结束后输出 i=6。

(3) 以下程序段的输出结果是 **(2个*)。

c
int x = 2;
do
{
    printf("*");
    x--;
} while (!x == 0);
查看答案与解析

答案: **

解析:

  • 第一次:输出 *,x=1。!x == 0 = !1 == 0 = 0 == 0 = 真,继续。
  • 第二次:输出 *,x=0。!x == 0 = !0 == 0 = 1 == 0 = 假,结束。

难度: ⭐⭐⭐
考点: #do-while #逻辑运算

💡 学习锦囊

📖 相关公式与知识点:

  • ! 优先级高于 ==

思路分析

注意运算符优先级。

🔄 举一反三
  1. 若将 !x == 0 改为 !x = 0,会怎样?
    查看练习答案与解析

    答案:编译错误 解析!x 是右值,不能被赋值。

(4) 以下程序段的输出结果是 x=8

c
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);
查看答案与解析

答案: 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 只影响所在的最内层循环。

思路分析

逐层追踪循环变量。

🔄 举一反三
  1. 若将内层 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) 以下程序的运行结果是 100,200,100,200

c
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;
}
查看答案与解析

答案: 100,200,100,200

解析: sub1 是值传递,x 和 y 的改变不影响实参。


难度: ⭐⭐⭐
考点: #全局变量 #值传递

💡 学习锦囊

📖 相关公式与知识点:

  • 值传递不改变实参。

思路分析

注意区分全局变量和局部变量。

🔄 举一反三
  1. 若 sub1 的参数改为指针 int *x, int *y,输出是什么?
    查看练习答案与解析

    答案:200,100,200,100 解析:指针传递会修改实参的值。

(2) 以下程序的运行结果是 5

c
main()
{
    int a[5] = {1, 2, 3, 4, 5};
    int *p = a;
    printf("%d\n", *(p + 4));
}
查看答案与解析

答案: 5

解析: p 指向数组首元素,p + 4 指向第 5 个元素(下标 4),即 a[4] = 5。


难度: ⭐
考点: #指针运算

💡 学习锦囊

📖 相关公式与知识点:

  • p + n 指向第 n 个元素。

思路分析

指针加减按元素大小偏移。

🔄 举一反三
  1. int *p = &a[2];*(p - 1) 的值是多少?
    查看练习答案与解析

    答案:2 解析:p 指向 a[2]=3,p-1 指向 a[1]=2。

四、程序填充题(本大题共3小题,每小题6分,共18分)

(1) 将十个整数输入数组,求出其平均值并输出。

c
main()
{
    int i, a[10], sum = 0;
    int *p = a;  /* 第一空 */
    for (i = 0; i < 10; i++)
    {
        scanf("%d", p + i);
        sum += *(p + i);  /* 第二空 */
    }
    printf("%8.2f\n", (float)sum / 10);  /* 第三空 */
}
查看答案与解析

答案:

  • 第一空:a&a[0]
  • 第二空:*(p + i)a[i]
  • 第三空:(float)sum / 10

解析: 用指针遍历数组,计算平均值。注意类型转换。


难度: ⭐⭐
考点: #指针 #数组 #平均值

💡 学习锦囊

📖 相关公式与知识点:

  • 平均值 = 总和 / 个数,注意类型转换。

思路分析

确保平均值计算时进行浮点除法。

🔄 举一反三
  1. 若要求平均值保留 1 位小数,printf 格式应如何修改?
    查看练习答案与解析

    答案printf("%8.1f\n", (float)sum / 10);解析.1 表示保留 1 位小数。

(2) 输入一个无符号整数后求出它的各位数之和并输出。

c
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));
}
查看答案与解析

答案:

  • 第一空:unsigned int f(unsigned int num)
  • 第二空:num % 10
  • 第三空:numnum != 0

解析: 通过取余和整除分离各位数字,累加求和。


难度: ⭐⭐
考点: #数位分离 #函数

💡 学习锦囊

📖 相关公式与知识点:

  • 取个位:num % 10
  • 去掉个位:num / 10

思路分析

用循环逐位分离并累加。

🔄 举一反三
  1. 若输入 12345,函数 f 的返回值是多少?
    查看练习答案与解析

    答案:15 解析:1+2+3+4+5=15。

(3) 为数组输入数据,逆序置换后输出。

c
#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));
}
查看答案与解析

答案:

  • 第一空:*(a + j)
  • 第二空:*(a + j) = t
  • 第三空:i++(或 ++i

解析: 双指针法:i 从头,j 从尾,交换元素,向中间移动。


难度: ⭐⭐
考点: #数组逆序 #双指针

💡 学习锦囊

📖 相关公式与知识点:

  • 逆序:首尾交换,向中间靠拢。

思路分析

注意循环终止条件和指针移动。

🔄 举一反三
  1. 若 N=5,输入 1 2 3 4 5,逆序后数组内容是什么?
    查看练习答案与解析

    答案:5 4 3 2 1 解析:首尾交换,a[0]↔a[4],a[1]↔a[3]。

五、程序设计题(第29小题7分,第30小题各10分,共17分)

(1) 将 100 个整数输入数组后按每行 10 个数输出。

查看答案与解析

参考答案:

c
#include <stdio.h>

main()
{
    int a[100], i;
    
    printf("请输入100个整数:\n");
    for (i = 0; i < 100; i++)
        scanf("%d", &a[i]);
    
    for (i = 0; i < 100; i++)
    {
        printf("%5d", a[i]);
        if ((i + 1) % 10 == 0)
            printf("\n");
    }
}

解析: 用循环控制输出格式,每输出 10 个数换一行。


难度: ⭐⭐
考点: #数组 #格式化输出

💡 学习锦囊

📖 相关公式与知识点:

  • 换行条件:(i + 1) % n == 0

思路分析

注意 i 从 0 开始,所以用 (i + 1) % 10 判断。

🔄 举一反三
  1. 若要求每行输出 5 个数,换行条件如何修改?
    查看练习答案与解析

    答案if ((i + 1) % 5 == 0) printf("\n");解析:将 10 改为 5 即可。

(2) 生成 Fibonacci 数列的前 20 项并输出。

$$f_i = \begin{cases} 1 & \text{当 } i = 0 \\ 1 & \text{当 } i = 1 \\ f_{i-1} + f_{i-2} & \text{当 } i \geq 2 \end{cases}$$
查看答案与解析

参考答案:

c
#include <stdio.h>

main()
{
    int f[20], i;
    
    f[0] = 1;
    f[1] = 1;
    
    for (i = 2; i < 20; i++)
        f[i] = f[i-1] + f[i-2];
    
    printf("Fibonacci 数列前20项:\n");
    for (i = 0; i < 20; i++)
    {
        printf("%8d", f[i]);
        if ((i + 1) % 5 == 0)
            printf("\n");
    }
}

解析: Fibonacci 数列:1, 1, 2, 3, 5, 8, 13, ... 从第 3 项开始,每项等于前两项之和。


难度: ⭐⭐
考点: #Fibonacci数列 #递推

💡 学习锦囊

📖 相关公式与知识点:

  • Fibonacci 递推公式:f[n] = f[n-1] + f[n-2]
  • 初始条件:f[0] = f[1] = 1

思路分析

先初始化前两项,再用递推公式计算后续项。

易错点

  • 注意初始条件的设置。
  • 数组不要越界。
🔄 举一反三
  1. 如何用递归计算 Fibonacci 数列?
    查看练习答案与解析

    答案

    c
    int fib(int n)
    {
        if (n == 0 || n == 1)
            return 1;
        return fib(n-1) + fib(n-2);
    }

    解析:递归方法简单但效率低,有大量重复计算。

你正在阅读的是会员专属文档,💕 限时特惠进行中
你尚未登录,目前新用户可获3天体验会员,去登录