全国计算机等级考试 · 复习系统

二级 C 语言程序设计
科目 24 · 考点与真题

二级 C 语言不是只背语法就能通过的考试——它考的是 数据类型与运算符 + 三大程序结构 + 数组 + 函数 + 指针 + 字符串/结构体/文件 + 编译预处理 + 公共基础知识。 其中真正决定通过与否的是 指针、数组、函数、循环 的代码能力。 本页按官方大纲组织知识点,并收录 2021–2026 年真题与样题。

科目代码
24
考试时长
120分钟 · 上机
题型分值
40选择 + 60操作
考试环境
Visual C++ 2010
学习版

选择题 40 分中含 公共基础知识 10 分;操作题 60 分 = 程序填空题 18 分 + 程序修改题 18 分 + 程序设计题 24 分。

01C 语言概述01 / 14
01

C 语言概述

理论 · 选择题为主

大纲要求:C 程序的结构、main 函数、注释、标识符命名规则、程序的开发流程。

最小可运行的 C 程序(必须默写)

C#include <stdio.h>            /* 预处理命令:引入标准输入输出库 */

int main(void)                  /* main 函数:程序入口,有且仅有一个 */
{
    int a = 10, b = 20;         /* 变量:先定义,后使用 */
    int sum;
    sum = a + b;                /* 每条语句以分号结尾 */
    printf("sum = %d\n", sum);  /* 注释不参与编译 */
    return 0;
}

C 程序的开发流程(必背)

hello.c 源程序
↓ 编译
hello.obj 目标文件
↓ 链接(连接库函数)
hello.exe 可执行文件
↓ 运行
输出结果

必懂概念清单

  • 程序从 main 函数开始执行
  • 一个程序有且仅有一个 main 函数
  • 语句以分号 ; 结尾
  • 注释 /* *///,不能嵌套
  • C 程序的基本组成单位是函数
  • 函数可以嵌套调用,不能嵌套定义
  • C 语言区分大小写
  • 每行可以有多条语句
考点:标识符规则——由字母、数字、下划线组成,第一个字符不能是数字, 不能使用关键字(如 intcase)。printfscanf 是库函数名,可以作标识符。
02数据类型与运算符02 / 14
02

数据类型与运算符

选择题高频 · ★★★★★

大纲要求:基本数据类型、常量与变量、运算符与表达式、类型转换。这是选择题出题密度最高的一章。

基本数据类型

类型关键字字节(常见)说明
整型int4还有 short(2)、longunsigned
字符型char1本质是小整数,可参与算术运算
单精度float4约 7 位有效数字
双精度double8约 16 位有效数字

常量的写法(易错点集中)

C/* 整型常量:三种进制,注意——没有二进制写法! */
12        /* 十进制 */
012       /* 八进制:以 0 开头,等于十进制 10 */
0x12      /* 十六进制:以 0x 开头,等于十进制 18 */

/* 实型常量 */
3.14   .5   5.   1.2e3    /* e 前必须有数字,e 后必须是整数 */

/* 字符常量与字符串常量 */
'a'   '\n'   '\x41'       /* 占 1 字节 */
"abc"                     /* 占 4 字节:a b c \0 */
易错:C 语言没有二进制常量(0b101 非法);'a' 占 1 字节,"a" 占 2 字节;1e2 合法,e21e2.5 非法。

常用转义字符

写法含义写法含义
\n换行\\反斜杠本身
\t水平制表\'单引号
\0空字符(串尾)\"双引号
\101八进制转义 → 'A'\x41十六进制转义 → 'A'

运算符与优先级(速查)

类别运算符必考要点
算术+ - * / %% 两侧必须为整数;5/2=2;5.0/2=2.5;-5/2=-2(向零取整)
自增自减++ --前置:先加后用;后置:先用后加
关系> < >= <= == !=结果为 1(真)或 0(假);=== 别混
逻辑! && ||短路求值:a && b 中 a 为假则不算 b
位运算& | ^ ~ << >>按二进制位运算,如 5|3=7、5&3=1、5^3=6
赋值= += -= *= /= %=结合性自右向左;a=b=c=5 合法
条件? :max = (a>b) ? a : b;
逗号,依次求值,整个表达式取最后一个的值
求字节sizeofsizeof(int)=4;是运算符不是函数
优先级口诀:括号最高 → 单目 → 算术 → 移位 → 关系 → 位与或异 → 逻辑 → 条件 → 赋值 → 逗号。 记不住就加括号,但读程序题必须按这个顺序算

类型转换

Cint i = 3.9;              /* 自动转换:舍去小数 → i = 3(不是四舍五入) */
double d = (double)5 / 2;  /* 强制转换 → 2.5 */
/* 自动提升方向:char/short → int → unsigned → long → float → double */
03输入输出03 / 14
03

输入输出

printf/scanf · ★★★★★

大纲要求:格式化输入输出、字符输入输出。printf 和 scanf 是操作题中出现率最高的库函数,格式符必须一一对应。

printf 格式符速查

格式符用途示例输出
%d十进制整数printf("%d", 123);123
%f小数(默认 6 位)printf("%f", 3.14);3.140000
%.2f保留 2 位小数printf("%.2f", 3.14159);3.14
%c单个字符printf("%c", 'A');A
%s字符串printf("%s", "hi");hi
%o / %x八进制 / 十六进制printf("%x", 255);ff
%u无符号十进制printf("%u", 10);10
%%输出 % 本身printf("100%%");100%

附加格式:%5d 宽度 5 右对齐(左补空格)、%-5d 左对齐、%5.2f 宽度 5 精度 2。

scanf 注意事项(每年必考)

Cint a;  float x;  char s[20];

scanf("%d", &a);          /* 普通变量前必须加取地址符 & */
scanf("%d%f", &a, &x);    /* 输入时用空格分隔:12 3.5 */
scanf("%d,%d", &a, &b);   /* 格式串有逗号,输入也必须输逗号 */
scanf("%s", s);           /* 数组名本身就是地址,不加 & */
易错:scanf 中 %f 对应 float、%lf 对应 double; %c 会把空格和回车也读进去(连续输入字符要小心残留回车)。

字符输入输出

Cchar c;
c = getchar();          /* 读一个字符(含回车) */
putchar(c);             /* 输出一个字符 */
gets(s);                /* 读一行字符串(可含空格) */
puts(s);                /* 输出字符串并换行 */

亲手试一试 · printf 格式符演示

 LIVE DEMO — printf 格式符模拟器
OUTPUT

格式符与输出项个数、类型必须一一对应——这是读程序题的高频出题点。

04选择结构04 / 14
04

选择结构

if / switch · ★★★★

大纲要求:if 语句的三种形式、嵌套 if、switch 语句、条件运算符。

Cif (score >= 90)       printf("A");
else if (score >= 80)  printf("B");
else                   printf("C");

/* 条件运算符(唯一的三目运算符) */
max = (a > b) ? a : b;

/* switch:表达式只能是整型或字符型 */
switch (grade) {
    case 'A': printf("优"); break;
    case 'B': printf("良"); break;
    default : printf("中");
}
必背易错点:① case 后只能是整型/字符型常量且互不相同; ② 漏写 break 会继续向下"贯穿"执行;③ if(x=5) 是赋值,恒为真; ④ else 总是与它前面最近的、未配对的 if 配对(缩进不代表配对关系)。
05循环结构05 / 14
05

循环结构

操作题核心 · ★★★★★

大纲要求:for、while、do-while 三种循环,break 与 continue,循环嵌套。所有操作题都建立在循环之上。

三种循环对比

forwhiledo-while
执行顺序先判断后执行先判断后执行先执行后判断
最少执行次数0 次0 次1 次
适合场景次数已知次数不定至少执行一次
Cint i, sum = 0;
for (i = 1; i <= 100; i++)   /* 初值; 条件; 步进 */
    sum += i;                /* 1+2+…+100 = 5050 */

i = 1;
while (i <= 100) { sum += i; i++; }

do { sum += i; i++; } while (i <= 100);   /* 注意末尾分号! */

break 与 continue

Cfor (i = 1; i <= 10; i++) {
    if (i % 2 == 0) continue;  /* 跳过本次循环体,进入下一次循环 */
    if (i > 7) break;          /* 终止整个循环 */
    printf("%d ", i);          /* 输出:1 3 5 7 */
}

经典必刷题型:判断素数

isPrime —— 操作题、填空题双高频
Cint isPrime(int n)
{
    int i;
    if (n < 2) return 0;
    for (i = 2; i * i <= n; i++)     /* 只需试除到 √n */
        if (n % i == 0) return 0;    /* 找到因数 → 不是素数 */
    return 1;                        /* 没有因数 → 是素数 */
}

思路:素数 = 只能被 1 和自身整除。设一个标志位或直接 return,是填空题最爱挖空的位置。

其他必须会写的经典循环

  • 累加 ∑ 与累乘 n!(初值 0 / 1)
  • Fibonacci 数列:1 1 2 3 5 8…
  • 水仙花数:153 = 1³+5³+3³
  • 最大公约数:辗转相除法
  • 九九乘法表(双重循环)
  • 统计位数 / 逆序输出整数
  • 求数组最大值 / 最小值 / 平均值
  • 判断回文串
细节:do {…} while(条件); 末尾有分号for(;;)while(1) 都是死循环;循环体内修改循环变量是常见的"输出几行"考题。
06数组06 / 14
06

数组

操作题核心 · ★★★★★

大纲要求:一维数组、二维数组的定义/初始化/引用,数组与循环结合的常用算法(排序、查找、逆置、移动)。

定义与初始化

Cint a[5] = {1, 2, 3, 4, 5};   /* 下标范围 0 ~ 4 */
int b[5] = {1, 2};            /* 未初始化的元素自动为 0 */
int c[]  = {1, 2, 3};         /* 长度自动确定为 3 */

int m[2][3] = {{1,2,3},{4,5,6}};  /* 二维数组:按行存放 */
m[1][2] = 6;                      /* 第 2 行第 3 列 */
必背:下标从 0 开始;定义时长度必须是常量,引用时下标可以是变量; C 语言不检查下标越界(a[5]、m[2][3] 都能编译通过但结果不可预料)——选择题常考"下面哪个引用是错误的"。

经典必刷:冒泡排序(填空题最爱)

Cvoid sort(int a[], int n)
{
    int i, j, t;
    for (i = 0; i < n - 1; i++)            /* 共 n-1 趟 */
        for (j = 0; j < n - 1 - i; j++)    /* 每趟少比一次 */
            if (a[j] > a[j + 1]) {         /* 前大后小则交换 */
                t = a[j]; a[j] = a[j+1]; a[j+1] = t;
            }
}

其他高频算法

  • 求最值:if (a[i] > max) max = a[i];
  • 数组逆置:首尾交换 for (i=0; i<n/2; i++) swap(a[i], a[n-1-i])
  • 插入 / 删除元素、数组元素移动(操作题常客)
  • 杨辉三角、矩阵转置(二维数组)
07函数07 / 14
07

函数

操作题核心 · ★★★★★

大纲要求:函数定义/声明/调用、参数传递、递归、变量的作用域与生存期。操作题的三大题型全部围绕"函数"展开。

定义、声明与调用

Cint add(int x, int y)     /* 形参 */
{
    return x + y;
}

int main(void)
{
    int s = add(3, 5);      /* 实参:把 3、5 的值复制给形参 */
    return 0;
}

递归(选择题年年考)

Clong fac(int n)                 /* n 的阶乘 */
{
    if (n <= 1) return 1;       /* 递归出口:必须有! */
    return n * fac(n - 1);      /* 自己调用自己 */
}
/* fac(4) = 4*fac(3) = 4*3*fac(2) = 4*3*2*fac(1) = 24 */

变量的作用域与生存期

变量作用域生存期要点
局部变量所在函数/复合语句内函数调用期间不同函数中同名互不影响
全局变量定义处到文件末尾整个程序运行期间与局部变量同名时局部优先
static 局部函数内整个程序运行期间只初始化一次,值保留到下次调用
必背:① 函数不能嵌套定义,但可以嵌套调用; ② 值传递是单向的——形参改变不影响实参,想改变实参必须传地址(见指针章); ③ 函数若无 return 语句,类型应写 void
08指针08 / 14
08

指针

重中之重 · ★★★★★

大纲要求:指针的定义与引用、指针与数组、指针作函数参数。指针是二级 C 区分度最大的考点,操作题离不开它。

基本用法

Cint a = 10;
int *p = &a;         /* p 存放 a 的地址;此处 * 表示"指针" */

*p = 20;             /* 此处 * 表示"解引用",等价于 a = 20 */
printf("%d %d", a, *p);   /* 输出 20 20 */

指针与数组(核心中的核心)

Cint a[5] = {1,2,3,4,5}, *p;
p = a;                    /* 等价于 p = &a[0],数组名 = 首地址 */

/* 以下四种写法完全等价,都表示 a[2] */
a[2]      *(a + 2)        p[2]        *(p + 2)

传地址:让函数真正改变外面的变量

Cvoid swap(int *x, int *y)
{
    int t = *x;
    *x = *y;
    *y = t;
}
/* 调用:swap(&a, &b); —— 传地址,a、b 真正交换 */
/* 错误:swap(a, b);   —— 传值,只交换了形参 */
必背易错:int *p; *p = 10; 是错的——p 没指向任何地址(野指针); ② *p++ 等价于 *(p++):取值后指针后移,a 不变; ③ (*p)++ 才是 a 自增;④ 数组名是地址常量,不能 a++
09字符串09 / 14
09

字符串

字符数组 · ★★★★

大纲要求:字符数组与字符串的关系、字符串结束标志、常用字符串处理函数、手动实现字符串算法。

字符串的存储(结束标志 '\0')

Cchar s[10] = "hello";   /* 总共占 10 字节,有效 5 + \0 */
char t[]  = "hello";    /* 长度自动为 6(含 \0) */
下标012345
内容'h''e''l''l''o''\0'

常用字符串函数(需 #include <string.h>

函数功能返回值 / 说明
strlen(s)求长度不含 '\0';"hello" → 5
strcpy(s1, s2)复制把 s2 复制到 s1(s1 必须足够大)
strcat(s1, s2)连接把 s2 接到 s1 末尾
strcmp(s1, s2)比较相同返回 0;s1>s2 返回正值;s1<s2 返回负值

手动实现(操作题高频)

求长度 · 逆序 —— 填空/设计题经典
Cint myLen(char s[])            /* 求字符串长度 */
{
    int i = 0;
    while (s[i] != '\0') i++;
    return i;
}

void reverse(char s[])          /* 字符串逆置 */
{
    int i = 0, j = myLen(s) - 1;
    char t;
    while (i < j) {
        t = s[i]; s[i] = s[j]; s[j] = t;
        i++;  j--;
    }
}
高频陷阱:strlen("abc\0def") = 3(遇 '\0' 即结束); 对 char s[]="abcdef"sizeof(s)=7 而 strlen(s)=6; 判断字符串相等要用 strcmps1 == s2 比较的是地址
10结构体与文件10 / 14
10

结构体与文件

操作题常考 · ★★★★

大纲要求:结构体类型的定义与使用、typedef、链表概念、共用体、文件的基本读写操作。

结构体

Cstruct Student {
    int    num;
    char   name[20];
    float  score;
};

struct Student s1 = {1001, "Tom", 90.5};
struct Student *p = &s1;

s1.num        /* 结构体变量用 . 访问成员 */
p->num        /* 指针用 -> 访问,等价 (*p).num */

typedef struct Student STU;   /* 类型别名 */
STU s2;

链表结点(了解结构即可)

Cstruct Node {
    int data;
    struct Node *next;    /* 指向下一个结点 */
};
/* 删除 head 之后的结点:head->next = head->next->next; */

文件操作

CFILE *fp;
fp = fopen("data.txt", "r");   /* 打开失败返回 NULL */
if (fp == NULL) return;
/* …… 读写 …… */
fclose(fp);                      /* 用完必须关闭 */
打开方式含义文件不存在时
"r"只读打开失败(返回 NULL)
"w"只写新建;已存在则清空原内容!
"a"追加新建
"r+" / "w+" / "a+"读写同上对应规则
"rb" / "wb"二进制读写配 fread / fwrite 使用

常用读写函数

  • fgetc(fp) / fputc(ch, fp) 字符
  • fgets(s, n, fp) / fputs(s, fp) 字符串
  • fscanf(fp, "%d", &x) / fprintf(fp, "%d", x)
  • fread / fwrite 二进制块读写
必背:feof(fp) 读到文件末尾返回非 0fgetc 读到末尾返回 EOF(即 -1)。 忘记 fclose 是操作题常见扣分点。
11编译预处理11 / 14
11

编译预处理

概念与宏 · ★★★

大纲要求:宏定义(不带参 / 带参)、文件包含。预处理在编译之前进行纯文本替换。

C#define PI 3.14159              /* 不带参宏:末尾不写分号! */
#define S(x) ((x) * (x))         /* 带参宏:参数和整体都要加括号 */

#include <stdio.h>                /* 尖括号:到系统目录找 */
#include "myfun.h"                /* 双引号:先到用户当前目录找 */

printf("%f", S(3));               /* 编译前替换为 ((3)*(3)) → 9.000000 */
经典陷阱:若定义 #define MUL(x) x*x,则 MUL(2+3) 展开为 2+3*2+3 = 11(不是 25!)。宏只做文本替换,不做计算、不管优先级。 规范写法必须给参数加括号:((x)*(x))
12公共基础知识12 / 14
12

公共基础知识

选择题 10 分 · 别丢

虽然只有 10 分,但属于系统复习后比较容易拿到的分数,不要忽略。

数据结构
  • 栈(后进先出)/ 队列(先进先出)
  • 线性表 / 树 / 二叉树
  • 二叉树性质:叶子结点 n0 = n2 + 1
  • 查找(二分查找 O(log₂n))/ 排序
程序设计基础
  • 算法:有穷性、确定性、可行性
  • 时间复杂度 / 空间复杂度
  • 结构化设计:顺序、选择、循环
软件工程
  • 软件生命周期
  • 需求分析 → 概要设计 → 详细设计 → 测试 → 维护
  • 黑盒测试 / 白盒测试
数据库基础
  • 数据模型 / 关系数据库
  • 关系 / 元组 / 属性 / 主键
  • E-R 图:实体—联系
13备考优先级13 / 14
13

按重要性排序复习

不要平均用力
优先级内容说明
★★★★★指针 · 数组 · 函数 · 循环结构操作题 60 分的核心,程序设计题几乎必考
★★★★字符串 · 结构体 · 文件 · 输入输出程序填空、程序修改的高频素材
★★★数据类型与运算符 · 选择结构 · 预处理选择题高频,表达式求值必须练熟
★★★公共基础知识10 分,系统复习易拿分
核心闭环:读程序写结果 → 程序填空(补表达式)→ 程序修改(改 2 处错误)→ 程序设计(独立写函数)。 二级 C 的操作题本质就是 循环 + 数组 + 指针 + 函数 的组合运用——把这四样练到肌肉记忆,60 分就稳了。
14真题题库14 / 14
14

真题与样题 · 2021–2026

点击选项即判分

收录 2021–2024 年考生回忆版真题、2025 年官方样题,以及依据最新大纲编写的 2026 模拟预测题。 选择题点击选项立即判分;操作题点击「查看参考答案」展开解析。

已作答 0 题 | 答对 0
2021程序填空题考生回忆版
给定程序中,函数 fun 的功能是:计算 n!(n 的阶乘)。例如 n=5 时结果为 120.000000。请在三处下划线填入正确内容,使程序完整得出正确结果。
Cdouble fun(int n)
{
    double f = ___(1)___;      /* 填:1(或 1.0) */
    int i;
    for (i = 1; ___(2)___; i++)  /* 填:i <= n */
        ___(3)___;               /* 填:f *= i (或 f = f * i) */
    return f;
}
解析:累乘器初值必须是 1(写成 0 结果恒为 0);循环条件 i <= n 保证最后一项不漏; 累乘用 f *= i。这三个空是"初值—条件—累乘"经典三连挖空。
2021程序修改题考生回忆版
给定程序 MODI1.C 中函数 fun 的功能是:计算 s = 1/1 + 1/2 + 1/3 + … + 1/n 的值(例如 n=10 时 s=2.928968)。程序中有两处错误(/****found****/ 之后),请改正。
Cdouble fun(int n)
{
    double s = 0.0;
    int i;
    for (i = 1; i < n; i++)        /* found:应改为 i <= n */
        s = s + 1 / i;             /* found:应改为 1.0 / i */
    return s;
}
解析:1/i 中两边都是 int,结果为整数除法(除 i=1 外全为 0),必须写成 1.0/i(double)1/i;② i < n 漏加了最后一项 1/n,应改为 i <= n。 "整数除法丢小数"与"循环边界差一"是修改题最经典的两种错误。
2021程序设计题考生回忆版
编写函数 fun,其功能是:将两个两位正整数 a、b 合并成一个整数放在 c 中。合并方式:将 a 的十位和个位依次放在 c 的千位和十位上,b 的十位和个位依次放在 c 的百位和个位上。例如 a=45、b=12 时,调用后 c=4152。
Cvoid fun(int a, int b, long *c)
{
    *c = (a / 10) * 1000      /* a 的十位 → 千位 */
       + (b / 10) * 100       /* b 的十位 → 百位 */
       + (a % 10) * 10        /* a 的个位 → 十位 */
       + (b % 10);            /* b 的个位 → 个位 */
}
解析:拆位用整除 /10 取十位、取余 %10 取个位; 注意形参 c 是指针,结果要通过 *c 带回主函数。验证:4000+100+50+2 = 4152 ✓。
2022单项选择题真题精选
以下选项中,不能用作用户标识符的是?
答案 D。case 是关键字,不能作标识符。C 语言区分大小写,Double 不是关键字;scanf 是库函数名,可以用作标识符;下划线开头的 _123 合法。
2022单项选择题真题精选
若有定义 int a=3, b=2, c=1;,以下选项中错误的赋值表达式是?
答案 A。赋值号左边必须是变量,(b=4) 是赋值表达式,不能再被赋值。a=b=c+1 因结合性自右向左而合法。
2022单项选择题真题精选
设有定义 int k=0;,以下四个表达式中,与其他三个表达式值不相同的是?
答案 A。k++ 是后置自增:表达式的值是自增前的 0;其余三个表达式的值都是 1。后置"先用后加"是每年必考的陷阱。
2022单项选择题真题精选
已知大写字母 A 的 ASCII 码值为 65,字符变量 c 中存有一个大写字母。要将它转换为对应的小写字母,正确的表达式是?
答案 C。小写字母比对应大写字母大 32,即 'a' - 'A' = 32,所以 c - 'A' + 'a' 正确。B 方向反了(那是小写转大写),D 符号错误。
2023单项选择题真题精选
若有定义 int m[]={5,4,3,2,1}, i=4;,下列对 m 数组元素的引用中错误的是?
答案 C。m[0]=5,m[5] 越界(合法下标是 0~4)。A 中 m[3]=2 合法;B 即 m[4]=1;D 中 m[4]=1,再取 m[1]=4 合法。数组下标越界是高频考法。
2023单项选择题真题精选
若有定义 char s1[]="abcdef", s2[]={'a','b','c','d','e','f'};,则下列叙述正确的是?
答案 B。用字符串常量初始化时系统自动在末尾补 '\0',s1 占 7 字节;用字符逐个初始化时不会补 '\0',s2 占 6 字节。
2023单项选择题真题精选
设有定义 int a=1, *p=&a;,下列语句中不能使 a 的值变为 2 的是?
答案 C。*p++ 按 ++ 的优先级高于解引用的结合顺序解析为 *(p++):先取 *p 的值,然后指针 p 后移,a 不变。D 中括号强制先解引用,a 自增。
2023单项选择题真题精选
有以下程序段,输出结果是?
int x=3; do { printf("%d,", x-=2); } while (!(--x));
答案 B。第一次循环:x=3-2=1,输出 1;--x 得 0,!0 为真,继续。第二次:x=1-2=-2,输出 -2;--x 得 -3,!(-3) 为假,退出。注意 do-while 至少执行一次。
2024单项选择题题库精选
关于 static 局部变量,下列叙述正确的是?
答案 B。static 局部变量存放在静态存储区,生存期为整个程序运行期间,只初始化一次,函数调用结束后值不丢失——"统计函数被调用次数"的题就靠它。
2024单项选择题题库精选
设有定义 struct S { int x; int y; } d[2]={{1,2},{3,4}};,则表达式 d[1].y - d[0].x 的值是?
答案 C。d[1] = {3,4},所以 d[1].y = 4;d[0].x = 1;4 - 1 = 3。结构体数组的成员访问是结构体章节的标准考法。
2024单项选择题题库精选
若 fp 是指向某文件的指针,当已读到文件末尾时,函数 feof(fp) 的返回值是?
答案 B。feof(fp):读到文件末尾返回非 0(真),否则返回 0。注意区分:fgetc 读到末尾返回的是 EOF(-1)。循环读文件的经典写法:while(!feof(fp))
2024程序设计题考生回忆版
编写函数 fun,其功能是:求出 1~1000 之内能被 7 或 11 整除、但不能同时被 7 和 11 整除的所有整数,依次存入数组 a 中,个数通过形参 n 返回。
Cvoid fun(int a[], int *n)
{
    int i, k = 0;
    for (i = 1; i <= 1000; i++)
        if ((i % 7 == 0 || i % 11 == 0) && i % 77 != 0)
            a[k++] = i;
    *n = k;
}
解析:"能被 7 或 11 整除"用 ||,"不能同时整除"即不是 77 的倍数 i % 77 != 0; 个数通过指针 *n 带回。"筛选类"程序设计题的通用套路:循环 + 条件筛选 + 计数器。
2025单项选择题官方样题
有以下函数定义,调用 f(4) 的返回值是?
int f(int n) { if (n==1) return 1; return n * f(n-1); }
答案 C。这是递归求阶乘:f(4)=4×f(3)=4×3×f(2)=4×3×2×f(1)=4×3×2×1=24。120 是 5!,别数错层数。
2025单项选择题官方样题
表达式 5 | 3 的值是?
答案 C。按位或:0101 | 0011 = 0111 = 7。同组常考:5&3=1(按位与),5^3=6(按位异或),5<<1=10(左移一位相当于乘 2)。
2025单项选择题官方样题
调用 strcmp(s1, s2),当两个字符串相同时,返回值是?
答案 B。strcmp 相等返回 0,s1>s2 返回正值,s1<s2 返回负值。判断相等要写 strcmp(s1,s2)==0,不能写 s1==s2(那比较的是地址)。
2026单项选择题模拟预测
有以下宏定义 #define MUL(x) x*x,则表达式 MUL(2+3) 的值是?
答案 B。宏展开为 2+3*2+3 = 11。想得到 25 必须定义 #define MUL(x) ((x)*(x))。宏只做文本替换、不做计算——这是预处理章头号陷阱。
2026单项选择题模拟预测
链表结点定义为 struct Node { int data; struct Node *next; };,head 指向首结点。要删除 head 之后的那个结点(该结点存在),正确的语句是?
答案 A。让首结点的 next 跳过第二个结点直接指向第三个结点,即完成"摘链"。B 只移动了 head 指针,什么都没删;C 会形成自环。
2026单项选择题模拟预测
有以下程序,输出结果是?
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}}, i, s=0;
for (i=0; i<3; i++) s += a[i][2-i];
printf("%d", s);
答案 C。累加的是副对角线:a[0][2]=3、a[1][1]=5、a[2][0]=7,3+5+7=15。(本题主对角线 1+5+9 恰好也是 15。)"a[i][2-i] 求副对角线"是二维数组的经典套路。
2026程序修改题模拟预测
给定程序 MODI1.C 中函数 fun 的功能是:判断整数 m 是否为素数,若是返回 1,否则返回 0。程序中有两处错误(/****found****/ 之后),请改正。
Cint fun(int m)
{
    int k;
    for (k = 2; k <= m - 1; k++)
        if (m % k = 0)       /* found:应改为 m % k == 0 */
            return 0;
    return;                  /* found:应改为 return 1; */
}
解析:= 是赋值,判断相等必须写 ==——这是修改题出现率第一的错误; ② 函数返回类型为 int 且约定"是素数返回 1",空 return 无法返回整数,应写 return 1;