Skip to content

《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 + bc = a + 7 都是合法赋值语句。


难度: ⭐
考点: #赋值语句 #逗号表达式

💡 学习锦囊

📖 相关公式与知识点:

  • 赋值语句格式:变量 = 表达式;
  • 逗号表达式:表达式1, 表达式2,依次执行,值为最后一个表达式的值。

思路分析

赋值号左边必须是可修改的左值(变量),不能是表达式。

🔄 举一反三
  1. 以下哪些是合法赋值语句?
    c
    a = b = c = 1;
    a = (b = 3, c = 4);
    查看练习答案与解析

    答案:都合法 解析:连续赋值和逗号表达式赋值都是合法的。

(2) 在 C 语言中, 要求运算数必须是整型的运算符是 (A)。

A) %
B) /
C) <
D) !

查看答案与解析

答案:A

解析: 取模运算符 % 要求两个操作数都必须是整型。其他运算符 /<! 都可以用于浮点数。


难度: ⭐
考点: #取模运算 #运算符

💡 学习锦囊

📖 相关公式与知识点:

  • % 只能用于整型数据。
  • / 用于整型时结果为整除,用于浮点型时为普通除法。

思路分析

牢记 % 的运算数限制,这是 C 语言的基础规则。

🔄 举一反三
  1. 5.0 % 2.0 是否合法?
    查看练习答案与解析

    答案:不合法 解析% 不能用于浮点数,编译会报错。

(3) 已知字母 A 的 ASCII 码为十进制的 65,下面程序的输出是 (A)。

c
main()
{
    char ch1, ch2;
    ch1 = 'A' + '5' - '3';
    ch2 = 'A' + '6' - '3';
    printf("%d,%c\n", ch1, ch2);
}

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 码值进行计算,再将结果转换回字符。

🔄 举一反三
  1. ch1 = 'A' + '1' - '0'; 的结果是什么?
    查看练习答案与解析

    答案:'B'(ASCII 66) 解析'1'-'0'=1,所以 65+1=66,即 'B'。

(4) 下面程序的输出是 (B)。

c
main()
{
    int x = 10, y = 3;
    printf("%d\n", y = x / y);
}

A) 0
B) 3
C) 3.333
D) 不确定的值

查看答案与解析

答案:B

解析:x / y 为整数除法,10 / 3 = 3(截断小数)。y = 3 将 3 赋值给 y,然后 printf 输出 y 的值 3。


难度: ⭐
考点: #整数除法 #赋值表达式

💡 学习锦囊

📖 相关公式与知识点:

  • 整数除法截断小数部分,不是四舍五入。
  • 赋值表达式的值等于被赋的值。

思路分析

注意 x/y 是整型运算,结果也是整型。

🔄 举一反三
  1. x = 10.0, y = 3.0,输出是什么?
    查看练习答案与解析

    答案:3.333...(取决于精度) 解析:浮点数除法得到精确结果。

(5) 若执行下面的程序时从键盘上输入 3 和 4,则输出是 (B)。

c
main()
{
    int a, b, s;
    scanf("%d%d", &a, &b);
    s = a;
    if (a < b) s = b;
    s = s * s;
    printf("%d\n", s);
}

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 语句选择较大值。

思路分析

程序逻辑:求两个数的最大值,然后平方输出。

🔄 举一反三
  1. 若输入 5 和 2,输出是什么?
    查看练习答案与解析

    答案:25 解析:s=5,5>2 所以 s 保持 5,5*5=25。

(6) 下面的程序 (A)。

c
main()
{
    int x = 3, y = 0, z = 0;
    if (x = y + z)
        printf("***");
    else
        printf("####");
}

A) 有语法错误不能通过编译
B) 输出****
C) 可以通过编译,但是不能通过连接,因而不能运行
D) 输出####

查看答案与解析

答案:A

解析:printf("####") 缺少左括号,应为 printf("####")。这是语法错误,编译无法通过。


难度: ⭐
考点: #语法错误 #printf函数

💡 学习锦囊

📖 相关公式与知识点:

  • printf 调用格式:printf("格式字符串", 参数列表);
  • 括号必须成对出现。

思路分析

注意代码中的括号匹配问题。

🔄 举一反三
  1. 若修正为 printf("####");,输出是什么?
    查看练习答案与解析

    答案:#### 解析x = y + zx = 0,条件为假,执行 else 分支。

(7) 下面的程序 (C)。

c
main()
{
    int x = 3;
    do {
        printf("%d\n", x == 2);
    } while (--x);
}

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。

思路分析

注意 --xx-- 的区别,以及关系表达式 == 和赋值 = 的区别。

🔄 举一反三
  1. 若将 --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)。

c
main()
{
    int x = 023;
    printf("%d\n", --x);
}

A) 17
B) 18
C) 23
D) 24

查看答案与解析

答案:B

解析:023 是八进制数,转换为十进制:2×8 + 3 = 19--x 先减后用,输出 18。


难度: ⭐
考点: #八进制数 #自减运算符

💡 学习锦囊

📖 相关公式与知识点:

  • 八进制数以 0 开头。
  • --x 先自减再使用。

思路分析

先转换八进制到十进制,再执行自减运算。

🔄 举一反三
  1. int x = 0x23; printf("%d", --x); 输出什么?
    查看练习答案与解析

    答案:34 解析0x23 = 2×16+3 = 35,减 1 得 34。

(9) 若执行下面的程序时从键盘上输入 5,则输出是 (B)。

c
main()
{
    int x;
    scanf("%d", &x);
    if (x++ > 5)
        printf("%d\n", x);
    else
        printf("%d\n", x--);
}

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 先减后用。

思路分析

注意后缀运算符的特性:先使用当前值,再改变变量。

🔄 举一反三
  1. 若输入 6,输出是什么?
    查看练习答案与解析

    答案:7 解析x++ > 5 先用 6 比较(6>5 为真),x 变为 7,执行 if 分支输出 7。

(10) 下面程序的输出是 (A)。

c
main()
{
    int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, *p = a;
    printf("%d\n", *(p + 2));
}

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 指向第三个元素。

🔄 举一反三
  1. *(p + 5) 的值是多少?
    查看练习答案与解析

    答案:6 解析:a[5] = 6。

(11) 执行下面程序中的输出语句,a 的值是 (C)。

c
main()
{
    int a;
    printf("%d\n", (a = 3 * 5, a * 4, a + 5));
}

A) 65
B) 20
C) 15
D) 10

查看答案与解析

答案:C

解析: 逗号表达式 (a = 3*5, a*4, a+5)

  1. a = 15
  2. a * 4 = 60(无赋值,a 不变)
  3. a + 5 = 20(无赋值,a 不变)

逗号表达式的值为最后一个表达式的值 20,但 a 的值始终是 15。题目问 a 的值,所以是 15。


难度: ⭐⭐
考点: #逗号表达式 #变量赋值

💡 学习锦囊

📖 相关公式与知识点:

  • 逗号表达式依次执行,值为最后一个表达式的值。
  • 只有赋值操作会改变变量的值。

思路分析

注意区分"表达式的值"和"变量的值"。

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

    答案:10 解析:a=3→a=5→表达式值=10,赋值给 a,最终 a=10。

(12) 下面程序的输出是 (C)。

c
main()
{
    int a = -1, b = 4, k;
    k = (a++ <= 0) && (!(b-- <= 0));
    printf("%d%d%d\n", k, a, b);
}

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。

难度: ⭐⭐⭐
考点: #逻辑运算 #短路求值 #自增自减

💡 学习锦囊

📖 相关公式与知识点:

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

思路分析

注意短路求值和自增自减的副作用。

🔄 举一反三
  1. 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)。

c
#include <stdio.h>
#include <string.h>
main()
{
    char *p1 = "abc", *p2 = "ABC", str[50] = "xyz";
    strcpy(str + 2, p1);
    printf("%s\n", str);
}

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 会覆盖目标位置的原有内容。

🔄 举一反三
  1. strcpy(str, p2) 后 str 的内容是什么?
    查看练习答案与解析

    答案:"ABC" 解析:从首地址开始复制 "ABC"。

(14) 下面程序的输出是 (B)。

c
main()
{
    int y = 9;
    for (; y > 0; y--)
    {
        if (y % 3 == 0)
        {
            printf("%d", --y);
            continue;
        }
    }
}

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 的值变化,注意 --yy-- 的区别以及 continue 的影响。

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

    答案:963 解析:先输出 y 的当前值,再减。y=9 输出 9,然后减为 8,for 再减为 7...

(15) 下面程序的输出是 (B)。

c
main()
{
    char x = 040;
    printf("%d\n", x = x << 1);
}

A) 100
B) 64
C) 120
D) 80

查看答案与解析

答案:B

解析:040 是八进制数,等于十进制的 32。x << 1 左移 1 位,相当于乘以 2,32 × 2 = 64。


难度: ⭐⭐
考点: #位运算 #八进制数

💡 学习锦囊

📖 相关公式与知识点:

  • 左移 << n:相当于乘以 2^n。
  • 右移 >> n:相当于除以 2^n(整数)。

思路分析

先转换八进制到十进制,再执行位运算。

🔄 举一反三
  1. 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 程序的执行流程。

🔄 举一反三
  1. 函数定义在 main 之后,调用前需要做什么?
    查看练习答案与解析

    答案:函数声明 解析:在 main 前或调用前声明函数原型。

(17) 执行下面的程序后,a 的值为 (B)。

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

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 的执行时机。

🔄 举一反三
  1. 若将 b >= 20 改为 b >= 15,a 的值是多少?
    查看练习答案与解析

    答案:6 解析:a=6 时 b=16>=15,break。

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

c
int x = 3;
do {
    printf("%3d", x -= 2);
} while (!(-x));

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) 的运算顺序和逻辑非的特性。

🔄 举一反三
  1. x = 5,输出是什么?
    查看练习答案与解析

    答案:3 解析:x=5-2=3,输出 3,-3 非零,!(-3)=0,循环结束。

(19) 两次运行下面的程序,如果从键盘上分别输入 6 和 4,则输出结果是 (A)。

c
main()
{
    int x;
    scanf("%d", &x);
    if (x++ > 5)
        printf("%d", x);
    else
        printf("%d\n", x--);
}

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-- 先用后减。

思路分析

分别追踪两次运行的变量变化。

🔄 举一反三
  1. 若输入 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] 是数组指针。

🔄 举一反三
  1. aa[0][1] 的值是什么?
    查看练习答案与解析

    答案:'b' 解析:aa[0] 指向 "abcd",aa[0][1] 即 'b'。

二、填空题(本大题共6空,每空5分,共30分)

(1) 以下程序的功能是:从键盘上输入若干个学生的成绩,统计并输出最高成绩和最低成绩,当输入负数时结束输入。请填空。

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

答案:① x < amin(或 amin > x

解析: 当输入的 x 小于当前最小值 amin 时,更新 amin。与更新 amax 的逻辑对称。


难度: ⭐
考点: #循环 #求最值

💡 学习锦囊

📖 相关公式与知识点:

  • 求最大值:遇到更大的数就更新。
  • 求最小值:遇到更小的数就更新。

思路分析

初始化 amax 和 amin 为第一个输入值,然后逐次比较更新。

🔄 举一反三
  1. 如何同时统计输入的成绩个数和平均值?
    查看练习答案与解析

    答案:增加计数器 n 和累加器 sum。 解析

    c
    int n = 0; float sum = 0;
    while (x >= 0) { n++; sum += x; ... }
    printf("平均=%f\n", sum/n);

(2) 下面程序通过函数 average 计算数组中各元素的平均值,请填空。

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

答案:② *(pa + i)(或 pa[i]) ③ avg / n

解析: ② 通过指针访问数组元素,*(pa+i)pa[i]。③ 平均值 = 总和 / 元素个数。


难度: ⭐
考点: #指针 #数组 #函数

💡 学习锦囊

📖 相关公式与知识点:

  • *(pa + i) 等价于 pa[i]
  • 平均值 = 总和 / 个数。

思路分析

指针作为函数参数,可以像数组一样访问元素。

🔄 举一反三
  1. 如何修改函数使其同时返回最大值和最小值?
    查看练习答案与解析

    答案:使用指针参数返回多个值。 解析

    c
    void stats(int *pa, int n, float *avg, int *max, int *min)

(3) 以下程序的功能是:从键盘上输入一行字符,存入一个字符数组中,然后输出该字符串,请填空。

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

答案:④ '\0'(或 0) ⑤ *sptr++(或 *(sptr++)

解析: ④ 字符串必须以 '\0' 结尾。⑤ 输出当前字符,然后指针后移。


难度: ⭐⭐
考点: #字符串 #指针 #输入输出

💡 学习锦囊

📖 相关公式与知识点:

  • C 字符串以 '\0' 结尾。
  • *sptr++:先取 *sptr 的值,再 sptr++。

思路分析

输入字符后需要添加字符串结束符,然后用指针遍历输出。

🔄 举一反三
  1. 如何统计输入字符串的长度?
    查看练习答案与解析

    答案

    c
    int len = 0;
    while (str[len]) len++;

    解析:遍历到 '\0' 为止。

三、阅读程序题(本题共4小题,每题5分,共20分)

(1) 下面程序的输出是

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

答案: 0246802468

解析:

  • fun1():全局数组 a 被赋值为 0, 2, 4, 6, 8。
  • fun3():输出全局数组 a,即 02468。
  • fun2():定义局部数组 a,不影响全局数组 a。
  • fun3():再次输出全局数组 a,仍为 02468。

最终输出:0246802468


难度: ⭐⭐⭐
考点: #全局变量 #局部变量 #作用域

💡 学习锦囊

📖 相关公式与知识点:

  • 全局变量在所有函数中可见(除非被局部变量遮蔽)。
  • 局部变量只在其定义的函数/块中有效。

思路分析

fun2 中的局部数组 a 遮蔽了全局数组 a,但不影响全局数组的值。

易错点

  • 误以为 fun2 修改了全局数组 a。
🔄 举一反三
  1. 若去掉 fun2 中的 int a[MAX] 声明,输出是什么?
    查看练习答案与解析

    答案0246801234解析:fun2 直接修改全局数组 a 为 0,1,2,3,4。

(2) 以下程序运行后,输出结果是

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

答案: 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 取余数。
  • 先得到的余数是低位,后得到的是高位,所以需要逆序输出。

思路分析

模拟十进制转二进制的过程,注意输出顺序。

🔄 举一反三
  1. 若 y = 13,输出是什么?
    查看练习答案与解析

    答案:1101 解析:13 = 8+4+1 = 1101₂。

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

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

答案: 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 的作用。

🔄 举一反三
  1. 若将 if (j % 2) 改为 if (!(j % 2)),输出是什么?
    查看练习答案与解析

    答案:4 解析:此时 j 为偶数时 continue,只有 j=1 时 x++,每次外层增 2。

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

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

答案: 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 独立执行,分别计数。
🔄 举一反三
  1. 若在每个 case 后添加 break,输出是什么?
    查看练习答案与解析

    答案3320解析:'1' 出现 4 次,'2' 出现 2 次,'3' 出现 1 次,'4' 出现 1 次。

四、程序题(10分)

  1. 从键盘输入一个字符串 a,并在 a 串中的最大元素后边插入字符串 b(b[]="ab")。试编程。
查看答案与解析

参考答案:

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

解析:

  1. 遍历字符串找到最大字符的索引 max_idx。
  2. 将 max_idx 之后的所有字符后移 2 位,腾出空间。
  3. 在 max_idx+1 和 max_idx+2 位置插入 'a' 和 'b'。
  4. 注意字符串需要有足够的空间容纳新增字符。

难度: ⭐⭐⭐
考点: #字符串操作 #数组移动 #插入算法

💡 学习锦囊

📖 相关公式与知识点:

  • 字符串插入:先移动后插入。
  • 移动方向:从后往前,避免覆盖未移动的数据。

思路分析

找到最大字符位置 → 后移字符腾出空间 → 插入新字符。

易错点

  • 移动字符时从前向后移会导致数据覆盖。
  • 忘记给插入后的字符串添加结束符 '\0'(本题中后移时已包含)。
🔄 举一反三
  1. 如何在最小字符前插入字符串?
    查看练习答案与解析

    答案:找到最小字符位置,将其后的字符后移,在最小字符位置插入。 解析

    c
    for (i = strlen(a); i >= min_idx; i--)
        a[i + 2] = a[i];
    a[min_idx] = 'a';
    a[min_idx + 1] = 'b';
你正在阅读的是会员专属文档,💕 限时特惠进行中
你尚未登录,目前新用户可获3天体验会员,去登录