Skip to content

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

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

(1) 以下选项中属于 C 语言的数据类型是

  • A) 复数型
  • B) 逻辑型
  • C) 双精度型
  • D) 集合型
查看答案与解析

答案:C

解析: C 语言的基本数据类型包括字符型(char)、整型(int)、单精度浮点型(float)和双精度浮点型(double)。


难度: ⭐
考点: #基本数据类型

💡 学习锦囊

📖 相关公式与知识点:

  • 基础数据类型关键字:char, int, float, double

思路分析

熟悉基础关键字体系即可迅速判断。

易错点

勿将面向对象特有的 Boolean 等类型代入传统 C 语言基础部分。

🔄 举一反三
  1. 以下不属于 C 语言基本类型的是( )
    • A. char
    • B. string
    查看练习答案与解析

    答案:B
    解析:C 语言内建字符串表示为字符指针或字符数组,并非基础的独立 string 关键字。

(2) 在 C 语言中(假设 int 类型为 2 字节),不正确的 int 类型的常数是

  • A) 32768
  • B) 0
  • C) 037
  • D) 0xAF
查看答案与解析

答案:A

解析: 当 int 类型为 2 字节(16 位)时,有符号 int 的取值范围为 -32768 到 32767。常数 32768 超出此范围,不是合法的 int 类型常数。B 为十进制 0;C 为八进制 37(十进制 31);D 为十六进制 AF(十进制 175),均在范围内。

注意:在现代 32 位及以上系统中,int 通常为 4 字节,32768 是合法的 int 常数。本题基于 16 位系统环境。


难度: ⭐⭐
考点: #整型常数极限 #数据类型范围

💡 学习锦囊

📖 相关公式与知识点:

  • 16 位有符号整型取值:$-2^{15} \sim 2^{15}-1$,即 -32768 ~ 32767。
  • 32 位有符号整型取值:$-2^{31} \sim 2^{31}-1$,即约 ±21 亿。

思路分析

对比主流进制字面格式,并校验范围边界。注意题目对 int 字节数的假设。

易错点

  • 不同系统环境下 int 的字节数不同,需根据题目假设作答。
🔄 举一反三
  1. 下列为非法八进制整型字面量的是?
    • A. 012
    • B. 089
    查看练习答案与解析

    答案:B
    解析:八进制数位仅可使用 0-7。

(3) 语句:printf("%d", (a=2)&& (b=-2); 的输出结果是

  • A) 无输出
  • B) 结果不确定
  • C) -1
  • D) 1
查看答案与解析

答案:D

解析:(a=2) && (b=-2) 两边都获得非零值(逻辑真),交汇产出最终值 1。


难度: ⭐
考点: #逻辑乘积求值

💡 学习锦囊

📖 相关公式与知识点:

  • 逻辑真输出均为 1。

易错点

防止混淆最终的复合条件真值与分支内的变量赋值。

🔄 举一反三
  1. 0 && 5 执行后的求值结果为?
    查看练习答案与解析

    答案:0

(4) 下列描述中不正确的是

A) 字符型数组中可以存放字符串
B) 可以对字符型数组进行整体输入、输出
C) 可以对整型数组进行整体输入、输出
D) 不能在赋值语句中通过赋值运算符"="对字符型数组进行整体赋值

查看答案与解析

答案:C

解析: C 语言不允许像操作单独变量那样宏观操作整型数组集合。


难度: ⭐
考点: #一维整体访问屏蔽

💡 学习锦囊

思路分析

记住唯有字符流支持 %s 整体遍历机制。

🔄 举一反三
  1. 可以使用 %s 直接读入一串整型数吗?
    查看练习答案与解析

    答案:不可以。

(5) 设有如下定义: int $x = 1$ , $y = -1$ ; , 则语句: printf("%d\n", (x--&++y)); 的输出结果是

  • A) 1
  • B) 0
  • C) -1
  • D) 2
查看答案与解析

答案:B

解析:x-- 取值为 1;++y 执行后将 y 提升至 0。计算 1 & 0 = 0


难度: ⭐⭐
考点: #位操作前置区分

💡 学习锦囊

📖 相关公式与知识点:

  • ++x 先变后用,x++ 先用后变。
🔄 举一反三
  1. int x=0; printf("%d", ++x); 的输出是?
    查看练习答案与解析

    答案:1

(6) 当 c 的值不为 0 时, 在下列选项中能正确将 c 的值赋给变量 a、b 的是

A) $c = b = a;$
B) $(a = c) \parallel (b = c);$
C) $(a = c) \&\& (b = c);$
D) $a = c = b;$

查看答案与解析

答案:C

解析: 利用逻辑与的延续性规避短路阻滞。


难度: ⭐⭐
考点: #短路阻断控制

💡 学习锦囊

易错点

逻辑或在捕获真值后会截断后续命令。

🔄 举一反三
  1. int a=1; (a=0) && (b=2); 之后 b 的值?
    查看练习答案与解析

    答案:不变。

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

  • A) 10 1 9 2
  • B) 9 8 7 6
  • C) 10 9 9 0
  • D) 10 10 9 1
c
main() {
    int x = 10, y = 10, i;
    for (i = 0; x > 8; y = ++i)
        printf("%d,%d ", x--, y);
}
查看答案与解析

答案:D

解析:

  • 第一次判断 10 > 8,打印 10 10;x 变为 9,步进 y = ++i(i=1, y=1)。
  • 第二次判断 9 > 8,打印 9 1;x 变为 8,步进 i=2, y=2。
  • 第三次判断 8 > 8 失败,停止。

难度: ⭐⭐
考点: #变量步进生命期

💡 学习锦囊

📖 相关公式与知识点:

  • for 的步长改变在当前循环体完整结束后被触发。
🔄 举一反三
  1. 典型 for(i=0;i<2;i++) 流程共输出几次?
    查看练习答案与解析

    答案:2次。

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

  • A) 52
  • B) 51
  • C) 53
  • D) 97
c
main() {
    int i, x[3][3] = {9, 8, 7, 6, 5, 4, 3, 2, 1}, *p = &x[1][1];
    for (i = 0; i < 4; i += 2)
        printf("%d", p[i]);
}
查看答案与解析

答案:C

解析:p 绑定到 5 的物理空间。p[0] 提取 5;p[2] 获取两个字节偏移量后的 3。


难度: ⭐⭐⭐
考点: #连续地址映射

💡 学习锦囊

📖 相关公式与知识点:

  • p[i] 等同于内存计算公式 *(p + i)

思路分析

将高维结构化映射至一维存储池分析。

🔄 举一反三
  1. int a[5]={1,2,3,4,5}, *p = a;*(p+1) 的值?
    查看练习答案与解析

    答案:2

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

  • A) 6
  • B) 6789
  • C) '6'
  • D) 789
c
main() {
    char a[10] = {'1', '2', '3', '4', '5', '6', '7', '8', '9', 0}, *p;
    int i;
    i = 8;
    p = a + i;
    printf("%s\n", p - 3);
}
查看答案与解析

答案:B

解析:p-3 回拨到 5 下标处的字符 '6',继续扫描直至空边界。


难度: ⭐⭐
考点: #字符流读断点

💡 学习锦囊

📖 相关公式与知识点:

  • %s 持续向下搜捕 \0
🔄 举一反三
  1. 指针偏移向低地址靠拢使用的操作?
    查看练习答案与解析

    答案:减号运算。

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

  • A) 运行后报错
  • B) 66
  • C) 612
  • D) 55
c
#include <stdio.h>
main() {
    int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
    int *p = a + 5, *q = NULL;
    *q = *(p + 5);
    printf("%d%d\n", *p, *q);
}
查看答案与解析

答案:A

解析: 尝试使用未关联安全块的空指针对象引发段异常。


难度: ⭐
考点: #异常指针解引用

💡 学习锦囊

易错点

使用指针变量的第一要务是初始化或验证有效性。

🔄 举一反三
  1. 尝试给 NULL 赋值将抛出?
    查看练习答案与解析

    答案:段错误/报错。

(11) 以下说法中正确的是

A) #define 和 printf 都是 C 语句
B) #define 是 C 语句,而 printf 不是
C) printf 是 C 语句,但 #define 不是
D) #define 和 printf 都不是 C 语句

查看答案与解析

答案:D

解析: 预编译指引非控制语句;常规函数非独立控制结构。


难度: ⭐
考点: #语句底层划分

💡 学习锦囊

📖 相关公式与知识点:

  • 宏指令在编译开始前就替换完毕。
🔄 举一反三
  1. 函数调用转化为语句的核心要求?
    查看练习答案与解析

    答案:追加分号。

(12) 语句:printf("%d\n", 12 &012); 的输出结果是

  • A) 12
  • B) 8
  • C) 6
  • D) 012
查看答案与解析

答案:B

解析: 012 被解读为八进制数据 10。位与结算得出 8。


难度: ⭐⭐
考点: #进制交叉运算

💡 学习锦囊

📖 相关公式与知识点:

  • 以零开头的表示体系。
🔄 举一反三
  1. 011 对应的十进制值?
    查看练习答案与解析

    答案:9

(13) 能正确表示 a 和 b 同时为正或同时为负的逻辑表达式是

A) $(a>=0\parallel b>=0) \&\& (a<0\parallel b<0)$
B) $(a>=0\&\&b>=0) \&\& (a<0\&\&b<0)$
C) $(a+b>0) \&\& (a+b<=0)$
D) $a*b>0$

查看答案与解析

答案:D

解析: 数学判定法:同号的积总是大于零的。


难度: ⭐
考点: #代数映射化简

💡 学习锦囊

思路分析

尽可能将分支选择合并到数学运算法则中。

🔄 举一反三
  1. 判定异号?
    查看练习答案与解析

    答案a*b < 0

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

  • A) 20
  • B) 31
  • C) 321
  • D) 210
c
main() {
    int n = 4;
    while (n--)
        printf("%d ", --n);
}
查看答案与解析

答案:A

解析: 循环控制和内部逻辑各自削减,产出阶跃落差 2 0。


难度: ⭐⭐⭐
考点: #嵌套减量分析

💡 学习锦囊

📖 相关公式与知识点:

  • 自增自减在当前表达式求值中的更新时机。
🔄 举一反三
  1. n=2; while(n--); 结束时 n 的取值?
    查看练习答案与解析

    答案:-1

(15) 若已定义: int a[9], *p=a; 并在以后的语句中未改变 p 的值, 不能表示 a[1] 地址的表达式是

  • A) p + 1
  • B) a+1
  • C) a++
  • D) ++p
查看答案与解析

答案:C

解析: 常数形式地址不可应用位移迭代赋新值。


难度: ⭐
考点: #常量语义属性

💡 学习锦囊

📖 相关公式与知识点:

  • 常量左值保护。
🔄 举一反三
  1. 可以对数组名 a 执行 scanf 吗?
    查看练习答案与解析

    答案:可以,其本身就是地址。

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

  • A) 17, 021, 0x11
  • B) 17, 17, 17
  • C) 17, 0x11, 021
  • D) 17, 21, 11
c
main() {
    int k = 17;
    printf("%d, %o, %x\n", k, k, k);
}
查看答案与解析

答案:D

解析: 未搭配井号的前导修饰输出。


难度: ⭐
考点: #基础输出配置

💡 学习锦囊

📖 相关公式与知识点:

  • 常见的十、八、十六进制控制符。
🔄 举一反三
  1. 带前缀的输出方法?
    查看练习答案与解析

    答案%#o, %#x

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

A)-11 B)01 C)10 D)00

c
#include <stdio.h>
main() {
    int a = -1, b = 1;
    if (++a < 0 && !(b-- <= 0))
        printf("%d%d\n", a, b);
    else
        printf("%d%d\n", b, a);
}
查看答案与解析

答案:C

解析:++a(变为0)导致第一个条件分支中断,直接偏向 else


难度: ⭐⭐
考点: #分支截断

💡 学习锦囊

📖 相关公式与知识点:

  • 逻辑与的短路判定。
🔄 举一反三
  1. 1 || 0 是否会继续计算右侧?
    查看练习答案与解析

    答案:不会。

(18) 若有说明:long *p, a; 则不能通过 scanf 语句正确给输入项读入数据的程序段是

A) $*p = \& a;$ scanf("%ld", p);
B) $p = (long *)malloc(8);$ scanf("%ld", p);
C) scanf("%ld", p = &a);
D) scanf("%ld", &a);

查看答案与解析

答案:A

解析: 错误解引用空地址引发越权冲突。


难度: ⭐⭐⭐
考点: #动态注入合法性

💡 学习锦囊

📖 相关公式与知识点:

  • 解引用操作会尝试读写实际关联的存储区。
🔄 举一反三
  1. long *p; scanf("%ld", p); 安全吗?
    查看练习答案与解析

    答案:极不安全,野指针。

(19) 若有以下定义和语句: double $r = 99$ *p = &r; *p = r 则以下正确的叙述是

A) 以下两处的 $* p$ 含义相同, 都说明给指针变量 $p$ 赋值
B) 在"double r=99, *p=&r; "中,把 r 的地址赋值给了 p 所指的存储单元
C) 语句 ${}^{*}p = r;$ 把变量 $r$ 的值赋给指针变量 $p$
D) 语句" $^{\ast}\mathrm{p} = \mathrm{r}$ ; "取变量 r 的值放回 r 中

查看答案与解析

答案:D

解析: 解引用即原物理变量别称。


难度: ⭐
考点: #代名词等价

💡 学习锦囊

📖 相关公式与知识点:

  • 指针映射法则。
🔄 举一反三
  1. 改变 *p 等同于改变什么?
    查看练习答案与解析

    答案:它当前绑定的变量。

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

  • A) 编译不通过, 无输出
  • B) aceg
  • C) acegi
  • D) abcdefghi
c
#include <stdio.h>
main() {
    int i;
    for (i = 'A'; i < 'I'; i++, i++)
        printf("%c", i + 32);
    printf("\n");
}
查看答案与解析

答案:B

解析: 循环跨越,把对应的字符组化为小写形式。


难度: ⭐
考点: #离散区间遍历

💡 学习锦囊

📖 相关公式与知识点:

  • ASCII 排列。
🔄 举一反三
  1. 'b''B' 差值?
    查看练习答案与解析

    答案:32

二、填空题(本大题共7空,每空4分,共28分)

(1) 以下程序的功能是: 从键盘上输入若干个学生的成绩, 统计计算出平均成绩,并输出低于平均分的学生成绩, 用输入负数结束输入。请填空。

c
main() {
    float x[1000], sum = 0.0, ave, a;
    int n = 0, i;
    printf("Enter mark:\n");
    scanf("%f", &a);
    while (a >= 0.0 && n < 1000) {
        sum += (1);
        x[n] = (2);
        n++;
        scanf("%f", &a);
    }
    ave = (3);
    printf("Output:\n");
    printf("ave=%f\n", ave);
    for (i = 0; i < n; i++)
        if (4)
            printf("%f\n", x[i]);
}
查看答案与解析

答案:

  • (1) a
  • (2) a
  • (3) sum / n
  • (4) x[i] < ave

解析:

  • 1、2:捕获最新的评分项。
  • 3:总和除以样本数获取平均线。
  • 4:判断哪一项处于劣势。

难度: ⭐⭐
考点: #综合循环设计

💡 学习锦囊

易错点

不要漏掉变量的每次递增计数。

🔄 举一反三
  1. 循环累加总计?
    查看练习答案与解析

    答案sum += x;

(2) 以下程序中,主函数调用了 LineMax 函数,实现在 N 行 M 列的二维数组中,找出每一行上的最大值。请填空。

c
#define N 3
#define M 4

void LineMax(int x[N][M]) {
    int i, j, p;
    for (i = 0; i < N; i++) {
        p = 0;
        for (j = 1; j < M; j++)
            if (x[i][p] < x[i][j])
                (5);
        printf("The max value in line %d is %d\n", i, (6));
    }
}

main() {
    int x[N][M] = {1, 5, 7, 4, 2, 6, 4, 3, 8, 2, 3, 1};
    (7);
}
查看答案与解析

答案:

  • (5) p = j
  • (6) x[i][p]
  • (7) LineMax(x)

解析:

  • 5:更新当前已知最优点指针坐标。
  • 6:输出优胜项数值。
  • 7:发起业务函数过程。

难度: ⭐⭐
考点: #局部极值追踪

💡 学习锦囊

📖 相关公式与知识点:

  • 二维数组参数化匹配。
🔄 举一反三
  1. 求最小值表达式?
    查看练习答案与解析

    答案if (x[i][p] > x[i][j])

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

(1) 下列程序的输出结果是

c
#include <stdio.h>
#include <string.h>
main() {
    char b[30], *chp;
    strcpy(&b[0], "CH");
    strcpy(&b[1], "DEF");
    strcpy(&b[2], "ABC");
    printf("%s\n", b);
}
查看答案与解析

答案:CDABC

解析: 前置区因越位调用发生了局部重叠修改。


难度: ⭐⭐⭐
考点: #越位重写

💡 学习锦囊

易错点

strcpy 自动覆盖直至空字节结尾。

🔄 举一反三
  1. 再次执行会覆盖多深?
    查看练习答案与解析

    答案:依长度确定。

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

c
#include <stdio.h>

void t(int x, int y, int cp, int dp) {
    cp = x * x + y * y;
    dp = x * x - y * y;
}

main() {
    int a = 4, b = 3, c = 5, d = 6;
    t(a, b, c, d);
    printf("%d %d\n", c, d);
}
查看答案与解析

答案:5 6

解析: 副本运算无法反馈给源变量。


难度: ⭐
考点: #隔离生存域

💡 学习锦囊

📖 相关公式与知识点:

  • C 语言基础按值传递的隔离屏障。
🔄 举一反三
  1. 如何影响主调用栈数据?
    查看练习答案与解析

    答案:改用地址间接操作。

(3) 下列程序中字符串中各单词之间有一个空格, 则程序的输出结果是

c
#include <string.h>
#include <stdio.h>
main() {
    char strl[] = "How do you do", *p1 = strl;
    strcpy(strl + strlen(strl) / 2, "es she");
    printf("%s\n", p1);
}
查看答案与解析

答案:How does she

解析: 从中间的空白点开始重新写入后半部分文本。


难度: ⭐⭐
考点: #偏移合并

💡 学习锦囊

思路分析

准确定位偏移索引。

🔄 举一反三
  1. 指针平移?
    查看练习答案与解析

    答案str + n

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

c
#include <stdio.h>

int func(int a, int b) {
    static int m = 0, i = 2;
    i += m + 1;
    m = i + a + b;
    return m;
}

main() {
    int k = 4, m = 1, p;
    p = func(k, m);
    printf("%d", p);
    p = func(k, m);
    printf("%d\n", p);
}
查看答案与解析

答案:817

解析: 静态保留区域使内存得以持续驻留不释放。


难度: ⭐⭐⭐
考点: #驻留内存特性

💡 学习锦囊

📖 相关公式与知识点:

  • static 变量跨越多次调用生命线。
🔄 举一反三
  1. 初始化重置频率?
    查看练习答案与解析

    答案:一生一次。

四、 程序题(12分)

  1. 编写一程序,将字符串中的第 $\mathrm{m}$ 个字符开始的全部字符复制成另一个字符串。要求在主函数中输入字符串及 $\mathrm{m}$ 的值并输出复制结果,在被调用函数中完成复制。试编程。
查看答案与解析

答案:

c
#include <stdio.h>

void strmcpy(char *s, char *t, int m) {
    int i = 0;
    while (s[m - 1 + i] != '\0') {
        t[i] = s[m - 1 + i];
        i++;
    }
    t[i] = '\0';
}

int main() {
    char str1[100], str2[100];
    int m;
    printf("请输入字符串:");
    gets(str1);
    printf("请输入起始位置m:");
    scanf("%d", &m);
    strmcpy(str1, str2, m);
    printf("复制结果:%s\n", str2);
    return 0;
}

难度: ⭐⭐
考点: #字符串子集提取

💡 学习锦囊

📖 相关公式与知识点:

  • 指针迭代逻辑与数组复制。
🔄 举一反三
  1. 拷贝结束依据?
    查看练习答案与解析

    答案:读取到 \0

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