C 语言期末冲刺
+ CET-4 备考合集

60 天 · 每天 2 小时 · 可打印版
目标:C 语言期末 90+ | CET-4 500 分
适合对象:数学系大三
资料构成:C 语言学习资料 + CET-4 复习资料 + 60 天综合学习计划
打印建议:A4 双面,C 语言与英语分开装订
总索引

备考资料总索引

学习者:数学系大三 · C 语言期末冲刺 + CET-4 冲刺 周期:60 天 · 每天 2 小时 目标:C 语言期末 90+ | CET-4 500 分


文件清单

文件 内容 建议用途
01-C语言学习资料.md 9 阶段路线图、知识点七要素、速查表、错误对照表、代码规范、分级题库 + 答案、学生成绩管理系统项目 日常学习主教材
02-CET4复习资料.md 考试结构与得分策略、150 高频词 + 60 短语、听力/阅读/写作/翻译技巧、30 天 + 7 天计划、原创模拟题与解析、错题复盘 英语主教材
03-综合学习计划.md 60 天逐日计划表、每日执行清单、阶段自测表、FAQ、打印建议 执行与打卡

建议使用顺序

  1. 先读 03-综合学习计划.md 第一节,明确节奏。
  2. 每天照 03 文件第 2 节的表格执行,用第 3 节的清单打勾。
  3. 学习时翻 01(C 语言)和 02(英语)对应章节。
  4. 每阶段结束填 03 文件第 4 节的自测表。

核心结论速览

项 结论
C 语言最大风险 只看不敲 → 每天必须手打代码
C 语言必背模板 素数判定、冒泡排序、二分查找、指针 swap、自写 strlen、结构体排序、文件读写
英语最大瓶颈 词汇量(现约 1500–2000,四级需约 4500)
英语提分最快板块 仔细阅读(142 分)+ 听力篇章(142 分)
英语最易保底板块 写作 + 翻译(背模板即可拿 60%)
英语最该放弃 选词填空精练(仅 35.5 分,性价比最低)

合理假设汇总

项 假设
编译环境 Windows + Dev-C++ / VS Code + MinGW(C99/C11)
期末题型 选择、填空、程序阅读、程序填空、编程题
C 语言基础 会 printf/变量/if,数组/函数/指针不熟
英语基础 高考 70/150,词汇约 1500–2000
考试场次 60 天后最近一次四级
时间安排 每天 2 小时 = C 语言 1 小时 + 英语 1 小时
500 分拆解 写作 65 + 听力 165 + 阅读 205 + 翻译 65

若实际情况与此不同,只需在 03 文件的逐日计划表上做局部调整,整体框架不变。

第一部分 C 语言学习资料

C 语言学习资料(60 天期末冲刺版)

面向对象:数学系大三,学过一点 C,能写简单程序,目标期末 90+ 使用方式:先看每节的「最小必学」,全部掌握后再看「进阶拓展」。带 ⭐ 的是必考内容,🚀 是加分内容。


〇、阅读说明(必读)

0.1 本资料的标记系统

标记 含义 处理方式
⭐ 最小必学 必须会写、会改、会背
🚀 进阶拓展 期末想上 90 分再看
⚠️ 常见错误 考前必扫一遍
🐞 调试技巧 上机卡住时救命用
📝 本节练习 题号见附录 E 的答案

0.2 合理假设(信息不全时的默认设定)

项 假设 影响
教材标准 C99 / C11(支持 for 内定义变量、// 注释) 老式 VC6 可能需要调整写法
开发环境 Windows + Dev-C++ 或 VS Code + MinGW,也接受在线编译器 所有代码均可直接编译运行
期末题型 选择题 + 填空 + 程序阅读 + 程序填空 + 编程题 覆盖全部题型训练
当前水平 会 printf/变量/if,但数组、函数、指针不熟 前 3 天快速复习,第 4 天起按新知识学
学习时长 每天 2 小时,可拆成 1 小时 C + 1 小时英语 若某天偏向一侧,总周进度保持即可
编译环境中文 输出中文可能乱码 见 0.3 的编码处理

0.3 环境与中文乱码(10 分钟内搞定)

Dev-C++ 方案:工具 → 编译选项 → 勾选「编译时加入以下命令」填 -fexec-charset=GBK。

VS Code + MinGW 方案:终端执行 chcp 65001,或源码保存为 UTF-8 并加 system("chcp 65001");(需 #include <stdlib.h>)。

最保险方案:程序输出只用英文/数字,调试期不纠结中文,考试时按老师要求写。


一、学习路线图

1.1 九阶段总览

阶段 主题 建议天数 ⭐最小必学 🚀进阶拓展 验收标准
0 环境准备 1 编译运行、改错流程 命令行编译 能独立跑通 Hello World
1 入门 2–3 程序结构、printf/scanf 转义字符、格式控制 能写交互式小程序
2 语法基础 11 类型、运算符、if/switch、三种循环 位运算、逗号表达式 能写 20 行以内的逻辑题
3 函数 6 定义/调用、值传递、return 递归、递归优化 能拆分程序为多个函数
4 数组 6 一维/二维、遍历、最值、排序 冒泡优化、二分查找 能处理 100 个数据的统计
5 指针 8 */&、指针与数组、作参数 动态内存、多级指针 能写 swap、能改数组
6 字符串 6 字符数组、string.h 常用函数 自己实现 strlen/strcpy 能写统计/反转/比较
7 结构体 5 定义、数组、作参数 指针、嵌套、typedef 能存一批学生记录
8 文件操作 5 fopen/fclose、fscanf/fprintf 二进制、fseek 能存盘再读回
9 综合项目 10 模块划分、完整可运行系统 排序、查询、菜单优化 独立写出 200 行系统

1.2 60 天时间分配(C 语言部分 1 小时/天)

天数 阶段 C 语言任务
D1 阶段 0 装环境、跑通第一个程序
D2–D3 阶段 1 输入输出、变量、格式符
D4–D14 阶段 2 分支、循环、基础算法套路
D15–D20 阶段 3 函数、参数、递归
D21–D26 阶段 4 一维/二维数组、排序查找
D27–D34 阶段 5 指针全部
D35–D40 阶段 6 字符串与字符串函数
D41–D45 阶段 7 结构体
D46–D50 阶段 8 文件读写
D51–D60 阶段 9 + 真题 项目 + 期末真题三遍

1.3 每阶段的「过关测试」

能不看资料、30 分钟内独立写出 ⇒ 过关。写不出就退回上一阶段复习 1 天。


二、阶段 1|入门

2.1 程序结构与编译运行 ⭐

核心概念:C 程序由函数组成,有且只有一个 main 函数;main 是入口,程序从它第一行开始执行。

语法格式

#include <stdio.h>      /* 预处理:引入输入输出库 */

int main()              /* 主函数:返回 int */
{
    printf("Hello\n"); /* 语句必须以分号结尾 */
    return 0;           /* 返回 0 表示正常结束 */
}

运行结果

Hello

常见错误

现象 原因 修法
main must return int 之类的警告 写成 void main() 一律写 int main()
提示找不到 printf 忘了 #include <stdio.h> 加上
编译报 expected ';' 语句末尾漏分号 补 ;
程序一闪而过 双击运行 exe 用 IDE 的「运行」按钮,或末尾加 getchar();

🐞 调试技巧:编译错误只看第一条,改掉再编译;后面几十条报错常常是第一条的连锁反应。

📝 本节练习 1. 【基础】写一个程序,输出 Hello, C! 并换行。 2. 【基础】写一个程序,输出你的学号和姓名(分两行)。


2.2 printf 与 scanf ⭐

核心概念:printf 负责输出,scanf 负责输入。二者都靠格式符决定数据的类型。

语法格式

printf("格式字符串", 变量1, 变量2, ...);   /* 输出时可带变量 */
scanf("格式字符串", &变量1, &变量2, ...);  /* 输入时必须带 & */

常用格式符速查

格式符 类型 例子 输出
%d int printf("%d", 5) 5
%ld long printf("%ld", 5L) 5
%c char printf("%c", 'A') A
%s 字符串 printf("%s", "abc") abc
%f float/double printf("%f", 3.5) 3.500000
%.2f 保留 2 位小数 printf("%.2f", 3.14159) 3.14
%lf double(scanf 用) scanf("%lf", &x) —
%% 输出一个 % printf("100%%") 100%

示例代码

#include <stdio.h>
int main() {
    int age;
    double score;
    printf("请输入年龄和成绩:");
    scanf("%d %lf", &age, &score);
    printf("年龄=%d,成绩=%.1f\n", age, score);
    return 0;
}

运行结果(输入 20 88.5)

请输入年龄和成绩:20 88.5
年龄=20,成绩=88.5

常见错误

现象 原因 修法
输入后程序崩溃 scanf 漏了 & 变量前加 &(字符串数组名除外)
scanf 读不进值 格式符与类型不匹配(如 %d 读 double) 按类型选格式符
%f 输出乱码 用 %f 读 double scanf 读 double 要 %lf
读字符被跳过 前面回车残留在缓冲区 scanf(" %c", &c); 前面加空格

🐞 调试技巧:输入不进去时,先把 scanf 的返回值打出来:int r = scanf("%d", &x); printf("r=%d\n", r);,r==0 说明格式不匹配。

📝 本节练习 1. 【基础】输入长和宽,输出矩形面积。 2. 【基础】输入一个三位整数,输出它的百位、十位、个位数字。 3. 【提高】输入一个 double 半径,输出圆面积(保留 2 位小数,π 取 3.14159)。


三、阶段 2|语法基础

3.1 数据类型与变量 ⭐

核心概念:不同类型占不同内存、取值范围不同。选错类型会导致溢出或精度丢失。

类型 关键字 字节 大致范围 典型用途
整型 int 4 ±21 亿 计数、下标
短整型 short 2 ±3.2 万 节省内存
长整型 long long 8 ±9.2×10¹⁸ 大数(如斐波那契)
字符 char 1 −128~127 字符、ASCII
单精度 float 4 6~7 位有效数字 少用
双精度 double 8 15~16 位有效数字 默认用它存小数

语法格式

int a = 10;            /* 声明并初始化 */
double pi = 3.14159;   /* 小数默认算 double */
char ch = 'A';         /* 字符用单引号 */
const int MAX = 100;   /* 常量,不可修改 */

常见错误

现象 原因 修法
1/2 得 0 整数除法,结果截断 写 1.0/2 或 (double)1/2
大数变负数 超出 int 范围溢出 改用 long long,字面量加 LL
'A' 写成 "A" 双引号是字符串 字符用单引号

🐞 调试技巧:怀疑溢出时,把变量用 %d 换成 %lld 打印,并检查中间结果。

📝 本节练习 1. 【基础】用 sizeof 打印 int、double、char、long long 的字节数。 2. 【提高】输入一个秒数,输出「X 时 Y 分 Z 秒」。


3.2 运算符与表达式 ⭐

类别 运算符 要点
算术 + - * / % % 只能用于整数;除法要防截断
关系 > >= < <= == != == 是判断,= 是赋值(高频陷阱)
逻辑 && \|\| ! 短路求值:&& 左边假则右边不算
自增自减 ++ -- 前置先加后用,后置先用后加
赋值复合 += -= *= /= %= a += 2 等价 a = a + 2
三目 条件 ? 值1 : 值2 简易 if

运算符优先级(由高到低,记住前 6 档即可)

优先级 运算符
1 () []
2 ! ++ --(单目) (类型)
3 * / %
4 + -
5 < <= > >=
6 == !=
7 &&
8 \|\|
9 ?:
10 = += …

常见错误

写法 问题 正确
if (a = 5) 赋值,永远为真 if (a == 5)
if (0 <= x <= 10) 逻辑错误,恒为真 if (x >= 0 && x <= 10)
i++ 与 ++i 混用出 bug 求值顺序不清 拆成两行写

📝 本节练习 1. 【基础】输入两个整数,输出较大者(用三目运算符)。 2. 【提高】判断某年是否为闰年:(y%4==0 && y%100!=0) || y%400==0。


3.3 分支结构 if / switch ⭐

语法格式

/* if - else if - else */
if (score >= 90)       printf("优秀\n");
else if (score >= 60)  printf("及格\n");
else                   printf("不及格\n");

/* switch:只能用于 == 判断整型/字符 */
switch (op) {
    case '+': result = a + b; break;   /* 别忘 break! */
    case '-': result = a - b; break;
    default:  printf("非法运算符\n");
}

运行结果(输入 score = 85)

及格

常见错误

现象 原因 修法
switch 结果全跑一遍 漏写 break 每个 case 后加 break
switch 不编译 用了 float/字符串 只支持整数和字符
if 只执行一句 漏写花括号 养成永远加 {} 的习惯

🐞 调试技巧:分支不生效时,在 if 前把判断条件 printf 出来(如 printf("cond=%d\n", x>0);)。

📝 本节练习 1. 【基础】输入成绩,输出等级(A/B/C/D/F,五档)。 2. 【提高】简单计算器:输入 a op b,输出结果,处理除零。


3.4 循环结构 for / while / do-while ⭐

三种循环对比

循环 适用场景 是否至少执行一次
for 已知次数(计数循环) 否
while 次数未知,靠条件停 否
do-while 必须先做一次再判断 是

语法格式

for (int i = 1; i <= n; i++) { sum += i; }   /* 1+2+...+n */

int x;
while (scanf("%d", &x) == 1) { cnt++; }      /* 读到文件末尾自动停 */

int choice;
do {
    printf("1.输入 2.退出\n");
    scanf("%d", &choice);
} while (choice != 2);

运行结果(求 1 到 100 的和)

5050

常见错误

现象 原因 修法
死循环 循环变量没变化,或条件恒真 检查 i++ 与退出条件
循环次数多一次/少一次 边界写错(< vs <=) 用「跑 1 次、跑 n 次」两个特例验算
for 里改循环变量 逻辑混乱 循环体内不要动 i
累加变量没清零 上轮结果累加 sum = 0; 放在循环外、初始化处

🐞 调试技巧:在循环体第一行加 printf("i=%d\n", i);,看循环跑了几次、值怎么变。卡住立刻加打印,这是最快的手段。

📝 本节练习 1. 【基础】输出 1~100 中所有奇数。 2. 【基础】求 n!(n 由键盘输入,n ≤ 20,用 long long)。 3. 【提高】输出 1~1000 内所有水仙花数(三位数,各位立方和等于自身)。


3.5 循环嵌套与 break / continue ⭐

核心概念:break 跳出当前一层循环;continue 跳过本次剩余语句,进入下一次。

示例代码:九九乘法表

#include <stdio.h>
int main() {
    for (int i = 1; i <= 9; i++) {
        for (int j = 1; j <= i; j++)
            printf("%d*%d=%-4d", j, i, i * j);
        printf("\n");
    }
    return 0;
}

运行结果

1*1=1
1*2=2   2*2=4
1*3=3   2*3=6   3*3=9
...

🐞 调试技巧:嵌套循环出错时,把内层循环「冻结」——先只跑外层一次,确认内层输出正确,再放开。

📝 本节练习 1. 【基础】输出 5 行倒三角形星号(第 i 行 6−i 个 *)。 2. 【提高】输出 100 以内的全部素数,每行 5 个。


3.6 六大基础算法套路(期末必考)⭐

套路 模板要点 典型题
累加/累乘 sum=0 / p=1 初始化在循环外 求和、阶乘、e 的近似
计数 cnt++,注意条件位置 统计奇数个数
求最值 用第一个元素初始化,别用 0 找最大最小
穷举 多重循环 + if 筛选 鸡兔同笼、水仙花数
素数判定 试除到 i*i <= n 判断/打印素数
递推数列 用 a,b,c 滚动更新 斐波那契

素数判定模板(背下来)

int isPrime(int n) {
    if (n < 2) return 0;
    for (int i = 2; i * i <= n; i++)
        if (n % i == 0) return 0;
    return 1;
}

斐波那契模板

long long f1 = 1, f2 = 1, f3;
for (int i = 3; i <= n; i++) { f3 = f1 + f2; f1 = f2; f2 = f3; }
printf("%lld\n", n <= 2 ? 1LL : f3);

📝 本节练习 1. 【基础】求和:1 + 1/2 + 1/3 + ... + 1/n(用 double)。 2. 【提高】求 e 的近似值:1 + 1/1! + 1/2! + ... + 1/n!,直到最后一项 < 1e-6。 3. 【综合】鸡兔同笼:头 35、脚 94,求鸡兔各多少(穷举法)。


四、阶段 3|函数

4.1 函数定义、调用与返回 ⭐

核心概念:函数 = 一段可复用的代码。main 也是函数。

语法格式

返回值类型 函数名(参数类型 参数名, ...) {
    函数体;
    return 返回值;      /* void 函数可省略 */
}

/* 例 */
int add(int a, int b) { return a + b; }
void printLine() { printf("------\n"); }

示例代码

#include <stdio.h>
int add(int a, int b) { return a + b; }
int maxOf(int a, int b) { return a > b ? a : b; }

int main() {
    printf("%d\n", add(3, 5));
    printf("%d\n", maxOf(7, 2));
    return 0;
}

运行结果

8
7

函数声明(原型):如果函数定义在 main 之后,必须在 main 之前写原型:

int add(int a, int b);   /* 原型:只写类型和分号 */

常见错误

现象 原因 修法
提示函数未声明 定义在调用之后且无原型 加函数原型
返回值丢失 忘记 return 检查每条路径都有 return
类型不匹配警告 参数/返回值类型写错 对照原型检查

📝 本节练习 1. 【基础】写 int isEven(int n),判断偶数返回 1。 2. 【提高】写 double power(double x, int n),计算 x 的 n 次方(循环实现)。


4.2 参数传递:值传递 ⭐⭐(重点)

核心概念:C 语言只有值传递——函数内改形参,不影响实参。这解释了为什么 swap 必须用指针。

示例代码

#include <stdio.h>
void trySwap(int a, int b) { int t = a; a = b; b = t; }   /* 无效! */

int main() {
    int x = 1, y = 2;
    trySwap(x, y);
    printf("x=%d y=%d\n", x, y);
    return 0;
}

运行结果

x=1 y=2

正确写法(指针版,阶段 5 详解)

void swap(int *a, int *b) { int t = *a; *a = *b; *b = t; }
/* 调用: swap(&x, &y); */

📝 本节练习 1. 【基础】写函数求三个数的最大值。 2. 【提高】写函数 void splitTime(int total, int *h, int *m, int *s)。


4.3 递归 🚀

核心概念:函数调用自己。必须有终止条件,否则栈溢出。

long long fact(int n) { return n <= 1 ? 1 : n * fact(n - 1); }
int fib(int n) { return n <= 2 ? 1 : fib(n-1) + fib(n-2); }  /* 慢,n>40 别用 */

常见错误:忘终止条件 → 段错误 / 栈溢出;递归层次过深 → 程序崩溃。

📝 本节练习 1. 【提高】用递归求 1+2+...+n。 2. 【综合】用递归实现汉诺塔,输出每一步。


五、阶段 4|数组

5.1 一维数组 ⭐

核心概念:一段连续内存,存同类型数据;下标从 0 开始。

语法格式

int a[10];                          /* 声明 10 个 int,下标 0~9 */
int b[5] = {1, 2, 3, 4, 5};         /* 初始化 */
int c[5] = {0};                     /* 全部置 0 */
int d[] = {1, 2, 3};                /* 长度自动为 3 */

a[0] = 1;  a[9] = 100;              /* 访问 */

示例代码:求最值 + 平均值

#include <stdio.h>
int main() {
    int n, a[100], sum = 0, mx;
    scanf("%d", &n);
    for (int i = 0; i < n; i++) scanf("%d", &a[i]);
    mx = a[0];
    for (int i = 0; i < n; i++) {
        sum += a[i];
        if (a[i] > mx) mx = a[i];
    }
    printf("max=%d avg=%.2f\n", mx, (double)sum / n);
    return 0;
}

运行结果(输入 5 回车 3 7 1 9 4)

max=9 avg=4.80

常见错误

现象 原因 修法
越界没报错但结果诡异 a[n] 越界写坏别的变量 下标严格 < n
最值初始化成 0 全为负数时结果错 用 a[0] 初始化
平均值是整数 sum/n 整数除法 写 (double)sum/n
数组太大直接崩 局部数组过大耗尽栈 挪到全局,或减少大小

🐞 调试技巧:越界难查。用 #define N 5 定义长度,所有循环写 i < N,再用打印遍历确认。

📝 本节练习 1. 【基础】输入 n 个数,逆序输出。 2. 【提高】输入 n 个数,统计大于平均值的个数。


5.2 排序与查找 ⭐⭐

冒泡排序(必背)

for (int i = 0; i < n - 1; i++)
    for (int j = 0; j < n - 1 - i; j++)
        if (a[j] > a[j+1]) { int t = a[j]; a[j] = a[j+1]; a[j+1] = t; }

选择排序

for (int i = 0; i < n - 1; i++) {
    int k = i;
    for (int j = i + 1; j < n; j++) if (a[j] < a[k]) k = j;
    if (k != i) { int t = a[i]; a[i] = a[k]; a[k] = t; }
}

二分查找(要求数组已有序) 🚀

int binarySearch(int a[], int n, int key) {
    int low = 0, high = n - 1;
    while (low <= high) {
        int mid = (low + high) / 2;
        if (a[mid] == key) return mid;
        else if (a[mid] < key) low = mid + 1;
        else high = mid - 1;
    }
    return -1;
}

排序算法对比

算法 平均时间 稳定 代码量 期末出现率
冒泡 O(n²) 稳定 短 极高
选择 O(n²) 不稳定 短 高
插入 O(n²) 稳定 短 中
快速 O(n log n) 不稳定 长 低(加分)

📝 本节练习 1. 【基础】手写冒泡排序,输入 10 个数升序输出。 2. 【提高】在已排序数组中二分查找某数,输出下标或 -1。


5.3 二维数组 ⭐

int m[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};

for (int i = 0; i < 3; i++) {           /* 行 */
    for (int j = 0; j < 4; j++)         /* 列 */
        printf("%4d", m[i][j]);
    printf("\n");
}

常见错误:二维数组作函数参数时,列数必须写:void f(int a[][4], int rows)。

📝 本节练习 1. 【基础】求 3×4 矩阵所有元素之和。 2. 【提高】求矩阵的转置并输出。 3. 【综合】打印杨辉三角前 10 行。


5.4 数组作函数参数 ⭐

void printArray(int a[], int n) {        /* 传的是首地址,不是复制 */
    for (int i = 0; i < n; i++) printf("%d ", a[i]);
}
void sort(int a[], int n) { /* 修改会影响调用的数组! */ }

关键结论:数组传参 = 传地址 ⇒ 函数内修改会影响原数组;但 sizeof(a) 在函数内不再是数组总字节数(因为 a 退化为指针)。所以长度必须额外传参。

📝 本节练习 1. 【提高】写 void reverse(int a[], int n) 原地反转数组。 2. 【综合】写 int countChar(char s[], char c) 统计字符出现次数。


六、阶段 5|指针

6.1 指针是什么 ⭐⭐

核心概念:指针是存地址的变量。& 取地址,* 解引用(按地址取值)。

语法格式

int a = 10;
int *p = &a;        /* p 存 a 的地址 */
printf("%d\n", *p); /* 输出 10 */
*p = 20;            /* 通过 p 修改 a */
printf("%d\n", a);  /* 输出 20 */

必背三句

表达式 含义
&a 变量 a 的地址
p 指针变量里存的地址
*p 该地址上的值(等价于 a)

常见错误

现象 原因 修法
程序崩溃 用了未初始化的指针(野指针) 定义时立即赋值,或置 NULL
段错误 解引用 NULL 先判空
结果错乱 指针类型不匹配 类型与所指对象一致

🐞 调试技巧:printf("p=%p *p=%d\n", (void*)p, *p); 打印地址确认指向。

📝 本节练习 1. 【基础】用指针交换两个变量。 2. 【基础】用指针求数组最大值。


6.2 指针与数组 ⭐⭐

核心结论:数组名在表达式中等价于首元素地址。

写法 等价于 取到的值
a / &a[0] 首地址 —
a[i] *(a + i) 第 i 个元素
*(p + i) p[i] 第 i 个元素
p++ 指针后移一个元素 —

三种遍历写法(都要会读)

int a[5] = {1,2,3,4,5};
for (int i = 0; i < 5; i++)  printf("%d ", a[i]);      /* 下标法 */
for (int i = 0; i < 5; i++)  printf("%d ", *(a+i));    /* 指针偏移 */
int *p = a;
for (int i = 0; i < 5; i++)  printf("%d ", *p++);      /* 指针自增 */

📝 本节练习 1. 【提高】用指针遍历数组,输出最大值和下标。 2. 【提高】用指针实现字符串长度计算(不用 strlen)。


6.3 指针作函数参数 ⭐⭐(90 分必考)

价值:让函数能修改外部变量、能返回多个结果、能高效传递数组。

void swap(int *a, int *b) { int t = *a; *a = *b; *b = t; }

/* 返回最大值 + 下标(两个结果) */
int maxIndex(int a[], int n, int *idx) {
    int mx = a[0]; *idx = 0;
    for (int i = 1; i < n; i++) if (a[i] > mx) { mx = a[i]; *idx = i; }
    return mx;
}

📝 本节练习 1. 【提高】写 void minMax(int a[], int n, int *mn, int *mx)。 2. 【综合】写函数同时返回商和余数(divmod)。


6.4 动态内存 🚀

#include <stdlib.h>
int n; scanf("%d", &n);
int *a = (int *)malloc(n * sizeof(int));   /* 申请 */
if (a == NULL) return 1;                    /* 必查! */
for (int i = 0; i < n; i++) a[i] = i;
free(a);                                    /* 释放,别忘 */
a = NULL;                                   /* 防野指针 */
函数 用途
malloc(size) 申请 size 字节,返回 void*
calloc(n, size) 申请并清零
realloc(p, size) 扩容
free(p) 释放

常见错误:忘记 free 造成内存泄漏;free 后继续使用(悬垂指针);重复 free。

📝 本节练习 1. 【综合】动态申请 n 个 int,输入后排序输出,最后 free。


七、阶段 6|字符串

7.1 字符数组与字符串 ⭐

核心概念:C 没有字符串类型,用以 '\0' 结尾的字符数组表示。

char s1[] = "hello";       /* 长度 6:h e l l o \0 */
char s2[20] = "world";
char s3[] = {'h','i','\0'};  /* 手工加 \0 */
strcpy(s2, "abc");          /* 赋值用 strcpy,不能 s2 = "abc" */

常见错误

现象 原因 修法
输出乱码/多出字符 结尾缺 '\0' 手工加 '\0'
s = "abc" 报错 数组名不能赋值 用 strcpy(s, "abc")
数组越界 忘算 \0 的位置 长度预留 +1

📝 本节练习 1. 【基础】输入一个字符串,逐个字符打印(每行一个)。 2. 【基础】统计字符串中字母、数字、其他字符个数。


7.2 string.h 常用函数 ⭐⭐

函数 原型 作用 返回
strlen size_t strlen(char *s) 长度(不含 \0) 长度
strcpy char* strcpy(char *d, char *s) 复制 d
strncpy 同上 + n 复制前 n 个 d
strcat char* strcat(char *d, char *s) 拼接 d
strcmp int strcmp(char *a, char *b) 比较 <0 / 0 / >0
strchr char* strchr(char *s, char c) 找字符 位置或 NULL
strstr char* strstr(char *s, char *t) 找子串 位置或 NULL

示例代码

#include <stdio.h>
#include <string.h>
int main() {
    char a[50] = "Hello", b[] = "World";
    printf("%zu\n", strlen(a));          /* 5 */
    strcat(a, " ");
    strcat(a, b);
    printf("%s\n", a);                   /* Hello World */
    printf("%d\n", strcmp("abc", "abd"));/* 负数 */
    return 0;
}

运行结果

5
Hello World
-1

常用自写模板(考试爱考)

int myStrlen(char *s) { int n = 0; while (s[n]) n++; return n; }
void myStrcpy(char *d, char *s) { while ((*d++ = *s++)); }
void myReverse(char *s) {
    int n = strlen(s);
    for (int i = 0; i < n / 2; i++) { char t = s[i]; s[i] = s[n-1-i]; s[n-1-i] = t; }
}
int isPalindrome(char *s) {
    int i = 0, j = strlen(s) - 1;
    while (i < j) { if (s[i] != s[j]) return 0; i++; j--; }
    return 1;
}

📝 本节练习 1. 【提高】自己实现 strlen 和 strcpy。 2. 【提高】判断回文串。 3. 【综合】统计一句话中单词个数(空格分隔)。


7.3 字符串与指针 ⭐

char *p = "hello";          /* 指向字符串常量:只读,不能改 p[0] */
char s[] = "hello";         /* 数组:可修改 */
char *arr[3] = {"apple", "banana", "cherry"};  /* 指针数组存多串 */
for (int i = 0; i < 3; i++) printf("%s\n", arr[i]);

常见错误:char *p = "hi"; p[0] = 'H'; → 段错误(常量区只读)。

📝 本节练习 1. 【提高】用指针数组存放 5 个字符串,按字典序排序输出。


八、阶段 7|结构体

8.1 定义与使用 ⭐

struct Student {
    int id;
    char name[20];
    double score[3];
    double avg;
};

struct Student s1 = {2024001, "小明", {85, 90, 78}, 0};
struct Student s2;
s2.id = 2024002;
strcpy(s2.name, "小红");
printf("%d %s %.1f\n", s1.id, s1.name, s1.score[0]);

语法要点:成员访问用 .(变量)或 ->(指针)。

📝 本节练习 1. 【基础】定义 struct Point{double x,y;},求两点距离。 2. 【提高】定义 struct Date,判断日期是否合法。


8.2 结构体数组 ⭐

struct Student st[50];
int n; scanf("%d", &n);
for (int i = 0; i < n; i++)
    scanf("%d %s %lf", &st[i].id, st[i].name, &st[i].avg);

/* 按平均分降序排序 */
for (int i = 0; i < n-1; i++)
    for (int j = 0; j < n-1-i; j++)
        if (st[j].avg < st[j+1].avg) {
            struct Student t = st[j]; st[j] = st[j+1]; st[j+1] = t;
        }

📝 本节练习 1. 【提高】输入 n 个学生(学号、姓名、成绩),输出总分最高的学生。


8.3 结构体指针与 typedef 🚀

typedef struct Student {
    int id;
    char name[20];
} Stu;                 /* 之后可直接写 Stu 而不用 struct Student */

Stu s = {1, "Tom"};
Stu *p = &s;
printf("%d %s\n", p->id, p->name);   /* 指针用 -> */

📝 本节练习 1. 【提高】用结构体指针遍历结构体数组并输出。


九、阶段 8|文件操作

9.1 打开与关闭 ⭐

#include <stdio.h>
FILE *fp = fopen("data.txt", "r");
if (fp == NULL) { printf("打开失败\n"); return 1; }
/* ... 读写 ... */
fclose(fp);

打开模式表

模式 含义 文件不存在
"r" 只读 返回 NULL
"w" 只写(清空原内容) 新建
"a" 追加 新建
"r+" 读写 返回 NULL
"rb"/"wb" 二进制读写 同上

常见错误:路径写成 "C:\data.txt"(\d 被当转义)→ 用 "C:\\data.txt" 或 "C:/data.txt"。

📝 本节练习 1. 【基础】把 1~100 写入文件 nums.txt,每行一个。


9.2 文本读写 ⭐⭐

字符级:fgetc / fputc;字符串级:fgets / fputs;格式化:fscanf / fprintf。

/* 写入 */
FILE *fp = fopen("score.txt", "w");
fprintf(fp, "%d %s %.1f\n", 1, "Tom", 88.5);
fclose(fp);

/* 读取(按行) */
char line[256];
FILE *fr = fopen("score.txt", "r");
while (fgets(line, sizeof(line), fr) != NULL) printf("%s", line);
fclose(fr);

判断读到末尾:fscanf 返回 EOF 或读到的项数;fgets 返回 NULL。

📝 本节练习 1. 【提高】从文件读字符串,统计行数、字符数。 2. 【综合】把学生数组写入文件,再从文件读回并打印。


十、阶段 9|综合项目:学生成绩管理系统

10.1 需求

  1. 录入学生(学号、姓名、三门课成绩)并自动算总分、平均分。
  2. 显示全部学生(表格对齐)。
  3. 按总分排序(降序)。
  4. 按学号/姓名查询。
  5. 统计(最高分、最低分、平均分、及格率)。
  6. 保存到文件 / 从文件加载。

10.2 模块划分

模块 函数 职责
数据结构 struct Student 存放一条记录
输入 addStudent() 录入
输出 showAll() 显示
排序 sortByTotal() 降序
查询 findById() / findByName() 查找
统计 statistics() 汇总
文件 saveToFile() / loadFromFile() 持久化
菜单 menu() + main() 调度

10.3 参考代码(可直接编译运行)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX 100

typedef struct {
    int    id;
    char   name[20];
    double s[3];     /* 三门课 */
    double total;
    double avg;
} Student;

Student stu[MAX];
int n = 0;                    /* 当前学生数 */

/* ---------- 录入 ---------- */
void addStudent(void) {
    if (n >= MAX) { printf("已满\n"); return; }
    Student *p = &stu[n];
    printf("学号 姓名 成绩1 成绩2 成绩3: ");
    scanf("%d %s %lf %lf %lf", &p->id, p->name, &p->s[0], &p->s[1], &p->s[2]);
    p->total = p->s[0] + p->s[1] + p->s[2];
    p->avg   = p->total / 3.0;
    n++;
    printf("录入成功\n");
}

/* ---------- 显示 ---------- */
void showAll(void) {
    if (n == 0) { printf("暂无数据\n"); return; }
    printf("%-8s%-12s%-8s%-8s%-8s%-8s%-8s\n",
           "学号", "姓名", "科目1", "科目2", "科目3", "总分", "平均");
    for (int i = 0; i < n; i++)
        printf("%-8d%-12s%-8.1f%-8.1f%-8.1f%-8.1f%-8.2f\n",
               stu[i].id, stu[i].name, stu[i].s[0], stu[i].s[1],
               stu[i].s[2], stu[i].total, stu[i].avg);
}

/* ---------- 排序(按总分降序) ---------- */
void sortByTotal(void) {
    for (int i = 0; i < n - 1; i++)
        for (int j = 0; j < n - 1 - i; j++)
            if (stu[j].total < stu[j+1].total) {
                Student t = stu[j]; stu[j] = stu[j+1]; stu[j+1] = t;
            }
    printf("排序完成\n");
}

/* ---------- 查询 ---------- */
void findById(void) {
    int id; printf("请输入学号: "); scanf("%d", &id);
    for (int i = 0; i < n; i++)
        if (stu[i].id == id) {
            printf("%d %s 总分%.1f 平均%.2f\n",
                   stu[i].id, stu[i].name, stu[i].total, stu[i].avg);
            return;
        }
    printf("未找到\n");
}

/* ---------- 统计 ---------- */
void statistics(void) {
    if (n == 0) { printf("暂无数据\n"); return; }
    double sum = 0, mx = stu[0].total, mn = stu[0].total;
    int pass = 0;
    for (int i = 0; i < n; i++) {
        sum += stu[i].total;
        if (stu[i].total > mx) mx = stu[i].total;
        if (stu[i].total < mn) mn = stu[i].total;
        if (stu[i].avg >= 60) pass++;
    }
    printf("人数=%d 总分均值=%.2f 最高=%.1f 最低=%.1f 及格率=%.1f%%\n",
           n, sum / n, mx, mn, 100.0 * pass / n);
}

/* ---------- 文件 ---------- */
void saveToFile(void) {
    FILE *fp = fopen("students.txt", "w");
    if (!fp) { printf("保存失败\n"); return; }
    fprintf(fp, "%d\n", n);
    for (int i = 0; i < n; i++)
        fprintf(fp, "%d %s %.1f %.1f %.1f\n",
                stu[i].id, stu[i].name, stu[i].s[0], stu[i].s[1], stu[i].s[2]);
    fclose(fp);
    printf("已保存\n");
}

void loadFromFile(void) {
    FILE *fp = fopen("students.txt", "r");
    if (!fp) { printf("文件不存在\n"); return; }
    if (fscanf(fp, "%d", &n) != 1) { n = 0; fclose(fp); return; }
    for (int i = 0; i < n; i++) {
        fscanf(fp, "%d %s %lf %lf %lf", &stu[i].id, stu[i].name,
               &stu[i].s[0], &stu[i].s[1], &stu[i].s[2]);
        stu[i].total = stu[i].s[0] + stu[i].s[1] + stu[i].s[2];
        stu[i].avg   = stu[i].total / 3.0;
    }
    fclose(fp);
    printf("已加载 %d 条记录\n", n);
}

/* ---------- 主菜单 ---------- */
int main(void) {
    int choice;
    do {
        printf("\n===== 学生成绩管理系统 =====\n");
        printf("1.录入 2.显示 3.排序 4.查询 5.统计 6.保存 7.加载 0.退出\n");
        printf("请选择: ");
        if (scanf("%d", &choice) != 1) break;
        switch (choice) {
            case 1: addStudent();  break;
            case 2: showAll();     break;
            case 3: sortByTotal(); break;
            case 4: findById();    break;
            case 5: statistics();  break;
            case 6: saveToFile();  break;
            case 7: loadFromFile();break;
            case 0: printf("再见\n"); break;
            default: printf("无效选择\n");
        }
    } while (choice != 0);
    return 0;
}

10.4 扩展方向(拿高分用)

方向 要点
按姓名查询 用 strcmp 比较
打印成绩单到文件 fprintf 加表头
删除/修改 数组元素左移覆盖
多门课动态添加 结构体内用 double * + malloc

📝 项目练习 1. 【综合】实现「按姓名查询」。 2. 【综合】实现「按学号删除」,要求数组不出现空洞(左移覆盖)。 3. 【综合】增加「不及格科目名单」功能。


附录 A|C 语言语法速查表

A.1 数据类型与格式符

类型 声明 printf scanf 字节
int int a %d %d 4
long long long long a %lld %lld 8
char char c %c %c 1
float float f %f %f 4
double double d %f %lf 8
字符串 char s[20] %s %s n
指针地址 int *p %p — 8

A.2 常用标准库函数

头文件 函数 作用
stdio.h printf scanf 格式化输入输出
stdio.h fopen fclose fgets fprintf fscanf 文件
stdio.h getchar putchar 单字符
string.h strlen strcpy strcat strcmp strstr 字符串
math.h sqrt pow fabs ceil floor 数学
stdlib.h malloc free atoi rand srand abs 内存/转换/随机
ctype.h isalpha isdigit toupper tolower 字符判断

A.3 转义字符

转义 含义 转义 含义
\n 换行 \\ 反斜杠
\t 制表符 \' 单引号
\0 空字符(字符串结束) \" 双引号
\r 回车 %% 百分号

A.4 语法骨架模板

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 100

/* 函数原型 */
int f(int a);

int main(void) {
    /* 1. 定义变量 2. 输入 3. 处理 4. 输出 */
    return 0;
}

int f(int a) {
    return a * 2;
}

附录 B|常见编译错误 / 警告对照表

报错 / 警告(简写) 中文含义 原因 修法
expected ';' before ... 缺少分号 上一行末尾漏 ; 补分号
'x' undeclared 变量未声明 拼写错 / 未定义 检查拼写、补声明
undefined reference to 'xxx' 函数未定义 声明了没实现,或没链接 补实现
implicit declaration of function 隐式声明 没 include 头文件 加 #include
expected declaration or statement 花括号不配对 {} 少了 用缩进对齐检查
assignment makes pointer from integer 指针/整型混用 少了 * 或 & 检查类型
control reaches end of non-void function 函数可能无返回值 缺 return 每条路径都 return
format '%d' expects int, but arg is double 格式符类型不符 %d 打 double 改 %f
comparison between pointer and integer 指针与整数比较 漏了 * 加解引用
warning: unused variable 变量未使用 定义了没用 删掉或使用
array subscript is above array bounds 数组越界 下标超范围 检查循环边界
stray '\' in program 多余的转义 中文标点或 \ 换英文标点
invalid conversion from 'const char*' to 'char*' 字符串常量赋值 char *p = "x" 后改 改 char p[]
fopen: No such file or directory 运行时打不开 路径错 检查路径/用绝对路径
Segmentation fault 段错误 野指针/越界/空指针 打印地址、加边界检查

看报错三步法:① 只看第一条 ② 看行号定位 ③ 从该行往上找漏掉的符号。


附录 C|代码规范(期末卷面分)

C.1 命名规范

对象 规范 好例子 坏例子
变量 小写 + 下划线或小驼峰 student_count, maxScore a1, X
函数 动词开头 calcAverage, printAll f1, aa
常量/宏 全大写 MAX_SIZE, PI maxsize
结构体 大驼峰 Student, BookInfo s, struct1

C.2 书写规范

C.3 注释规范

/**
 * 计算平均分
 * @param a   分数数组
 * @param n   元素个数
 * @return    平均分,n<=0 时返回 0
 */
double average(int a[], int n) {
    if (n <= 0) return 0;
    int sum = 0;
    for (int i = 0; i < n; i++) sum += a[i];   /* 累加 */
    return (double)sum / n;
}

原则:注释解释「为什么」,而不是复述「写了什么」。

C.4 绝对不要做的事

❌ 禁止 ✅ 正确做法
if (a = b) if (a == b)
void main() int main(void)
数组下标从 1 开始 从 0 开始
用未初始化的变量 定义时初始化
忘记 fclose / free 成对出现
全局变量满屏 尽量用参数传递
中文标点写在代码里 全部英文标点
一屏塞 200 行不换行 拆分成小函数

附录 D|分级练习题库

题目按难度分为 基础 / 提高 / 综合 三档,答案与解析见附录 E。

D.1 基础题(必须全对)

编号 题目
J1 输入两个整数,输出它们的和、差、积、商。
J2 输入圆的半径,输出面积和周长(保留 2 位小数)。
J3 判断输入整数是奇数还是偶数。
J4 输入三个整数,输出最大值(要求用函数实现)。
J5 打印 1~100 之间所有能被 3 整除的数,每行 5 个。
J6 输入 n,求 1+2+…+n。
J7 输入 10 个数,输出最大值、最小值、平均值。
J8 输入一个字符串,逆序输出。
J9 判断一个整数是否为素数。
J10 求两个数的最大公约数(辗转相除法)。

D.2 提高题(90 分门槛)

编号 题目
T1 输入 n 个数,用冒泡排序升序输出。
T2 统计字符串中大写字母、小写字母、数字、其他字符的个数。
T3 判断一个字符串是否为回文。
T4 用指针实现两个变量交换,并解释为什么普通函数做不到。
T5 输入矩阵 3×4,求转置矩阵并输出。
T6 打印杨辉三角前 8 行。
T7 输出 1000 以内所有水仙花数。
T8 用结构体存 5 个学生,按平均分降序输出。
T9 统计一句英文中单词个数。
T10 从文件读入一组整数,排序后写回另一个文件。

D.3 综合题(冲刺满分)

编号 题目
Z1 实现简单通讯录:录入、查询、删除、保存到文件(结构体数组 + 函数模块化)。
Z2 输入 n 个整数(n 由键盘输入),用动态内存存数组,排序后输出,最后释放内存。
Z3 实现矩阵乘法:输入两个矩阵,判断维度是否匹配,输出乘积矩阵。
Z4 实现一个字符串函数库:myStrlen / myStrcpy / myStrcat / myStrcmp,并写测试。
Z5 统计一篇英文文本(从文件读)中每个单词出现的次数(假设单词用空格分隔,最多 100 个不同单词)。

附录 E|练习题答案与解析

说明:代码为参考实现,只要结果正确、思路合理即得分。

E.1 阶段练习答案(节选要点)

2.1 练习 1. printf("Hello, C!\n"); 2. 两个 printf,各带 \n。

2.2 练习 1.

double w, h; scanf("%lf %lf", &w, &h);
printf("%.2f\n", w * h);

2.

int n; scanf("%d", &n);
printf("%d %d %d\n", n/100, n/10%10, n%10);

解析:n/10%10 先除 10 去掉个位,再 %10 取十位。 3.

double r; scanf("%lf", &r);
printf("%.2f\n", 3.14159 * r * r);

3.1 练习 1. printf("%zu %zu %zu %zu\n", sizeof(int), sizeof(double), sizeof(char), sizeof(long long)); 2.

int t; scanf("%d", &t);
printf("%d时%d分%d秒\n", t/3600, t%3600/60, t%60);

3.2 练习 1. printf("%d\n", a > b ? a : b); 2. int leap = (y%4==0 && y%100!=0) || y%400==0;

3.3 练习 1.

if (s >= 90) puts("A");
else if (s >= 80) puts("B");
else if (s >= 70) puts("C");
else if (s >= 60) puts("D");
else puts("F");

2.

double a, b; char op;
scanf("%lf %c %lf", &a, &op, &b);
switch (op) {
    case '+': printf("%.2f\n", a + b); break;
    case '-': printf("%.2f\n", a - b); break;
    case '*': printf("%.2f\n", a * b); break;
    case '/': if (b == 0) puts("除零错误"); else printf("%.2f\n", a / b); break;
    default:  puts("非法运算符");
}

3.4 练习 1. for (int i = 1; i <= 100; i += 2) printf("%d ", i); 2.

int n; scanf("%d", &n);
long long p = 1;
for (int i = 1; i <= n; i++) p *= i;
printf("%lld\n", p);
  1. 解析:对 100~999 分解各位,a*a*a + b*b*b + c*c*c == n。

3.5 练习 1. for (int i = 1; i <= 5; i++) { for (int j = 0; j < 6 - i; j++) putchar('*'); putchar('\n'); } 2. 解析:外层 2~100,内层试除到 i*i<=n;用计数器 cnt 控制每行 5 个换行。

3.6 练习 1.

double s = 0; int n; scanf("%d", &n);
for (int i = 1; i <= n; i++) s += 1.0 / i;
printf("%.4f\n", s);
  1. 解析:用 term *= 1.0/i 累乘,while (term >= 1e-6) 累加。
  2. 解析:for (c = 0; c <= 35; c++) { r = 35 - c; if (2*c + 4*r == 94) printf("鸡%d 兔%d\n", c, r); }

4.1 练习 1. int isEven(int n) { return n % 2 == 0; } 2.

double power(double x, int n) {
    double r = 1;
    for (int i = 0; i < n; i++) r *= x;
    return r;
}

4.2 练习 1.

int max3(int a, int b, int c) { int m = a > b ? a : b; return m > c ? m : c; }
  1. 解析:*h = total/3600; *m = total%3600/60; *s = total%60;

4.3 练习 1. long long sumTo(int n) { return n <= 0 ? 0 : n + sumTo(n-1); } 2. 汉诺塔:hanoi(n, A, B, C) → hanoi(n-1,A,C,B); printf("%c->%c\n",A,C); hanoi(n-1,B,A,C);

5.1 练习 1. for (int i = n-1; i >= 0; i--) printf("%d ", a[i]); 2. 解析:先求和求平均,再遍历计数 if (a[i] > avg) cnt++;

5.2 练习 1. 见 5.2 冒泡模板。 2. 见 5.2 二分查找模板,注意数组需先升序排序。

5.3 练习 1. 双重循环累加所有 m[i][j]。 2. 转置:输出时交换下标 m[j][i]。 3. 杨辉三角:a[i][0]=a[i][i]=1; a[i][j]=a[i-1][j-1]+a[i-1][j];

5.4 练习 1.

void reverse(int a[], int n) {
    for (int i = 0; i < n/2; i++) { int t = a[i]; a[i] = a[n-1-i]; a[n-1-i] = t; }
}

2.

int countChar(char s[], char c) {
    int cnt = 0;
    for (int i = 0; s[i]; i++) if (s[i] == c) cnt++;
    return cnt;
}

6.1 练习 1. void swap(int *a, int *b) { int t = *a; *a = *b; *b = t; } 2.

int maxByPtr(int *a, int n) {
    int mx = *a;
    for (int i = 1; i < n; i++) if (*(a+i) > mx) mx = *(a+i);
    return mx;
}

6.2 练习 1. 解析:遍历时记录 mx 与 idx。 2. int len = 0; while (*p++) len++;

6.3 练习 1.

void minMax(int a[], int n, int *mn, int *mx) {
    *mn = *mx = a[0];
    for (int i = 1; i < n; i++) {
        if (a[i] < *mn) *mn = a[i];
        if (a[i] > *mx) *mx = a[i];
    }
}

2.

void divmod(int a, int b, int *q, int *r) { *q = a / b; *r = a % b; }

6.4 练习 1. 解析:malloc(n*sizeof(int)) → 输入 → 冒泡排序 → 输出 → free。

7.1 练习 1. for (int i = 0; s[i]; i++) printf("%c\n", s[i]); 2. 解析:isalpha / isdigit 分类计数(ctype.h)。

7.2 练习 1. 见 7.2 自写模板。 2. 见 7.2 isPalindrome。 3. 解析:遍历,遇到「非空格」且前一位是空格(或 i==0)时 cnt++。

7.3 练习 1. 解析:char *a[5] 存 5 串,冒泡用 strcmp(a[j], a[j+1]) > 0 交换指针。

8.1 练习 1. double d = sqrt(pow(p1.x-p2.x,2) + pow(p1.y-p2.y,2)); 2.

int isLeap(int y) { return (y%4==0 && y%100!=0) || y%400==0; }
int daysInMonth(int y, int m) {
    int d[] = {31,28,31,30,31,30,31,31,30,31,30,31};
    if (m == 2 && isLeap(y)) return 29;
    return d[m-1];
}

8.2 练习 1. 解析:遍历比较 total,用变量记录最优下标,最后打印。

8.3 练习 1. for (Stu *p = st; p < st + n; p++) printf("%d %s\n", p->id, p->name);

9.1 练习 1. FILE *fp = fopen("nums.txt","w"); for (int i=1;i<=100;i++) fprintf(fp,"%d\n",i); fclose(fp);

9.2 练习 1. 解析:while (fgets(line, sizeof line, fp)) { lines++; chars += strlen(line); } 2. 解析:saveToFile 后 loadFromFile,注意先重置 n=0。

10.4 项目练习 1. 遍历 + strcmp(stu[i].name, name) == 0。 2. 找到下标 k 后:for (int i = k; i < n-1; i++) stu[i] = stu[i+1]; n--; 3. 双重循环,任一科 < 60 就打印该生姓名与科目。

E.2 分级题库答案要点

D.1 基础题

编号 关键点
J1 注意除法前转 double:(double)a/b
J2 2*3.14159*r、3.14159*r*r,%.2f
J3 n % 2 == 0 ? "偶" : "奇"(或 if)
J4 三目嵌套或 max3 函数
J5 for(i=3;i<=100;i+=3) + cnt%5==0 换行
J6 公式 n*(n+1)/2 或循环
J7 最值用 a[0] 初始化,平均 (double)sum/n
J8 逆序循环输出
J9 见 3.6 素数模板
J10 while (b) { int t = a%b; a = b; b = t; } → a 即答案

D.2 提高题要点

编号 关键点
T1 冒泡模板 + 输入输出
T2 ctype.h 四个计数器
T3 双指针 i<j 比较
T4 值传递只复制形参;指针传地址才能改实参
T5 输出 m[j][i]
T6 递推式 a[i][j]=a[i-1][j-1]+a[i-1][j]
T7 分解百十个位,立方和比对
T8 结构体数组 + 冒泡(整体赋值交换)
T9 前一位是空格/开头 → 计数
T10 fscanf 读入到数组,排序,fprintf 写出

D.3 综合题要点

编号 关键点
Z1 结构体数组 + 菜单循环 + 文件读写;删除用左移覆盖
Z2 malloc → 排序 → free;malloc 后判 NULL
Z3 条件 A列数 == B行数;三重循环 C[i][j] += A[i][k]*B[k][j]
Z4 四个自写函数 + main 里对比标准库结果
Z5 二维数组 char words[100][30] + int cnt[100],逐个比对(strcmp)

附录 F|期末冲刺三遍法

遍数 时间 做法 目标
第一遍 考前 7 天 按本资料过一遍,抄写所有模板代码 全覆盖
第二遍 考前 3 天 只看「常见错误表 + 代码规范 + 速查表」 防丢分
第三遍 考前 1 天 手写冒泡/素数/字符串/结构体/文件 5 个模板 手感

考场策略:编程题先写框架注释(输入→处理→输出),再填代码;不会写完整算法也要把「能拿分的那几行」写上(变量定义、循环框架、输出格式)。卷面是给分点,空题零分。

第二部分 大学英语四级(CET-4)复习资料

大学英语四级(CET-4)60 天冲刺资料

面向对象:高考英语 70 分(满分 150),基础偏弱,目标 CET-4 达 500 分(总分 710) 核心判断:你的最大瓶颈是词汇量(现有约 1500~2000 词,四级要求约 4500 词)。 60 天的主要工作是「背单词 + 刷真题套路」,不是学语法理论。


〇、阅读说明

0.1 标记系统

标记 含义
⭐ 最小必学(不做就无法过线)
🚀 进阶拓展(冲 500+ 用)
⚠️ 高频陷阱
📝 练习

0.2 合理假设

项 假设
考试场次 60 天后最近一次四级考试(若为 12 月场次,计划直接套用)
现有词汇量 约 1500~2000 词
听力基础 高考听力丢分较多,能听懂单词但跟不上语速
每日英语时间 1 小时(与 C 语言各占 1 小时)
设备 手机背单词 App + 真题书/真题 PDF + 耳机
目标拆解 见 1.3

0.3 60 天英语总方针(一句话)

前 30 天:词汇为主、技巧为辅;后 30 天:真题为主、词汇为辅。


一、考试结构与得分策略

1.1 试卷结构(总分 710,总时长 125 分钟)⭐

部分 题型 题量 分值 占比 建议用时
一、写作 短文写作 1 篇 106.5 15% 30 分钟
二、听力 A 短篇新闻 3 篇 / 7 题 49.7 7% 25 分钟(整体)
B 长对话 2 篇 / 8 题 56.8 8% —
C 听力篇章 3 篇 / 10 题 142.0 20% —
三、阅读 A 选词填空 1 篇 / 10 题 35.5 5% 40 分钟(整体)
B 长篇阅读(匹配) 1 篇 / 10 题 71.0 10% —
C 仔细阅读 2 篇 / 10 题 142.0 20% —
四、翻译 汉译英段落 1 段 106.5 15% 30 分钟
合计 710 100% 125 分钟

单题分值速记:新闻/长对话 7.1 分/题,听力篇章 14.2 分/题,选词填空 3.55 分/题,长篇阅读 7.1 分/题,仔细阅读 14.2 分/题。

⚠️ 关键结论:听力篇章 + 仔细阅读,共 20 题 = 284 分(40%)。这两块是拿分的绝对主战场。

1.2 考试流程与时间管理 ⭐

写作 30 分钟 → 收答题卡 1 → 听力 25 分钟 → 收答题卡 2 → 阅读 40 分钟 + 翻译 30 分钟

⚠️ 听力结束立刻收答题卡 2,没有额外涂卡时间,必须边听边涂。

时间分配建议(阅读+翻译共 70 分钟)

顺序 内容 用时 理由
1 仔细阅读 2 篇 25 分钟 分值最高,先做状态好
2 长篇阅读匹配 15 分钟 分值中等
3 翻译 20 分钟 必须先做,留足时间
4 选词填空 10 分钟 分值最低,放最后

1.3 500 分目标拆解 ⭐

部分 满分 保底目标 冲刺目标 说明
写作 106.5 55 65 套模板 + 不跑题即可
听力 248.5 140 165 靠「篇章 + 长对话」拿分
阅读 248.5 180 205 提分最快,重点投入
翻译 106.5 55 65 完整成句 > 高级表达
合计 710 430 500 按冲刺目标即可达 500

分档判断你我该走哪条路

目标 策略
425(过线) 词汇 1500 核心词 + 仔细阅读 + 作文模板
500(你的目标) 词汇 2000 核心词 + 全部阅读题型 + 听力精听 + 翻译句型
550+ 加长难句训练、精听新闻、写作升级句式

1.4 得分策略:性价比排序 ⭐

优先级 板块 理由 60 天投入
★★★★★ 仔细阅读 分值 142,套路最固定 每天 1 篇
★★★★★ 词汇 决定一切板块 每天 40 词
★★★★☆ 听力篇章 单题 14.2,反复听可提分 每天 15 分钟
★★★★☆ 写作 + 翻译 模板化,最容易保底 每周各 2 篇
★★★☆☆ 长篇阅读 靠关键词定位,可速成 每周 2 篇
★★☆☆☆ 选词填空 分值最低,性价比最差 每周 1 篇

二、词汇:高频词 + 核心短语

2.1 背单词的最小必学法 ⭐

步骤 做法 时间
1 App 每天新词 40 + 复习昨日 25 分钟
2 只看「中文意思 + 一个搭配」,不背拼写(除写作词) —
3 睡前 5 分钟快速过一遍当天词 5 分钟
4 每周日用 30 分钟复盘本周 280 词 30 分钟

🚀 进阶:给高频词标「词根词缀」(如 con- 共同、-tion 名词后缀),一次记一串。

2.2 高频词表(四级阅读/听力反复出现)⭐

下列 150 词为近 5 年真题高频词,必须全部认识(认识即可,不必会拼)。

① 学术与论证类

单词 词性 释义 单词 词性 释义
significant adj. 重要的;显著的 evidence n. 证据
demonstrate v. 证明;展示 indicate v. 表明
assume v. 假定 conclude v. 得出结论
emphasize v. 强调 maintain v. 主张;维持
argue v. 主张;争论 impact n. 影响
factor n. 因素 tendency n. 趋势
phenomenon n. 现象 approach n./v. 方法;接近
principle n. 原则 concept n. 概念
hypothesis n. 假设 analysis n. 分析

② 经济与社会类

单词 词性 释义 单词 词性 释义
economy n. 经济 industry n. 工业;行业
consumer n. 消费者 purchase v./n. 购买
efficient adj. 高效的 competitive adj. 有竞争力的
employment n. 就业 income n. 收入
investment n. 投资 profit n. 利润
budget n. 预算 average adj./n. 平均的
decline v./n. 下降 increase v./n. 增加
benefit n./v. 利益;使受益 available adj. 可获得的
policy n. 政策 regulation n. 规章

③ 科技与教育类

单词 词性 释义 单词 词性 释义
technology n. 技术 digital adj. 数字的
device n. 设备 innovation n. 创新
automatic adj. 自动的 artificial adj. 人工的
research n./v. 研究 experiment n. 实验
academic adj. 学术的 curriculum n. 课程
graduate v./n. 毕业;毕业生 scholarship n. 奖学金
knowledge n. 知识 skill n. 技能
ability n. 能力 performance n. 表现;性能
efficient adj. 高效的 access n./v. 获取;通道

④ 环境与健康类

单词 词性 释义 单词 词性 释义
environment n. 环境 pollution n. 污染
climate n. 气候 resource n. 资源
energy n. 能源 waste n./v. 浪费
sustainable adj. 可持续的 protect v. 保护
disease n. 疾病 treatment n. 治疗
nutrition n. 营养 exercise n./v. 锻炼
mental adj. 精神的 physical adj. 身体的
stress n. 压力 recover v. 恢复
harmful adj. 有害的 healthy adj. 健康的

⑤ 情感与态度类(阅读态度题必考)

单词 词性 释义 单词 词性 释义
positive adj. 积极的 negative adj. 消极的
objective adj. 客观的 subjective adj. 主观的
indifferent adj. 漠不关心的 concerned adj. 担忧的
optimistic adj. 乐观的 pessimistic adj. 悲观的
critical adj. 批判的 supportive adj. 支持的
doubtful adj. 怀疑的 neutral adj. 中立的
enthusiastic adj. 热情的 cautious adj. 谨慎的
satisfied adj. 满意的 disappointed adj. 失望的

⑥ 动词高频(阅读题干 + 写作通用)

单词 释义 单词 释义
obtain 获得 provide 提供
require 需要 consider 考虑
improve 改善 reduce 减少
achieve 实现 affect 影响
involve 涉及 determine 决定
suggest 建议;暗示 replace 取代
encourage 鼓励 prevent 阻止
reveal 揭示 expand 扩大
compare 比较 rely on 依赖

2.3 核心短语 60 个 ⭐

短语 释义 短语 释义
at the same time 同时 in terms of 就……而言
as a result 结果 as a result of 由于
in addition 此外 in contrast 相反
for instance 例如 such as 例如
in general 总的来说 on average 平均而言
take measures to 采取措施 pay attention to 注意
be aware of 意识到 be responsible for 对……负责
be likely to 很可能 be able to 能够
make a difference 有影响 make sense 有意义
play a role in 在……中起作用 contribute to 促成;贡献
lead to 导致 result in 导致
result from 由……引起 account for 占;解释
focus on 专注于 depend on 依赖
give up 放弃 carry out 执行
put off 推迟 come up with 想出
look forward to 期待 take advantage of 利用
get rid of 摆脱 deal with 处理
cope with 应对 rather than 而不是
instead of 代替 more and more 越来越多
no longer 不再 by no means 决不
in other words 换句话说 to some extent 在某种程度上
keep in mind 记住 bear in mind 记住
be based on 基于 be related to 与……有关
be different from 与……不同 be similar to 与……相似
be familiar with 熟悉 be satisfied with 对……满意
be interested in 对……感兴趣 be good at 擅长
in advance 提前 at present 目前
so far 到目前为止 in the long run 从长远看
once in a while 偶尔 all in all 总的来说
on the one hand…on the other hand 一方面……另一方面 not only…but also 不仅……而且

2.4 🚀 进阶:同义替换表(四级阅读的核心)

阅读题几乎都是原文与选项的同义替换。背熟这张表等于拿到答案。

原文常见 选项替换
important significant / crucial / vital
many numerous / a large number of
because of due to / owing to
cause lead to / result in / give rise to
help assist / contribute to
stop prevent / prevent from
show demonstrate / indicate / reveal
think assume / believe / consider
difficult challenging / tough / demanding
quickly rapidly / swiftly
finally eventually / ultimately
about approximately / roughly
buy purchase
use utilize / employ

三、听力提分技巧

3.1 最小必学:三步法 ⭐

步骤 做法
预读 利用读题时间(Directions 播放时)先看选项,标出关键词
听见什么选什么 四级听力 70% 是「所听即所得」,选项中出现听到的原词/近义词优先选
抓信号词 听到 but / however / actually / in fact / the problem is → 答案就在后面

3.2 三大题型策略 ⭐

题型 题量 策略
短篇新闻 3 篇 7 题 开头 1~2 句 = 主旨题答案;数字、时间、地点是高频考点
长对话 2 篇 8 题 注意问答:问题问什么,回答就是答案;Why 题听 because
听力篇章 3 篇 10 题 顺序原则:题目顺序 = 原文顺序,跟着走不要跳

3.3 高频场景词(听到就知道在考什么)⭐

场景 高频词
校园 lecture, seminar, deadline, assignment, professor, library, tuition
求职 interview, resume, position, salary, apply for, experience
出行 flight, delay, board, gate, luggage, reservation, refund
餐饮 menu, order, bill, tip, reservation, dessert
医疗 appointment, symptom, prescription, clinic, medicine
购物 discount, receipt, refund, exchange, price, brand

3.4 ⚠️ 听力陷阱

陷阱 说明 应对
同音混淆 thirteen / thirty、desert / dessert 靠上下文和重音判断
否定漏听 can't 与 can 只差一个 t 注意助动词
转折陷阱 先肯定后否定 只信「转折后」的内容
数字运算 给两个数让你算 边听边记数字

3.5 🚀 精听法(每天 15 分钟,提分最快)

步骤 做法
1 听一遍,做题
2 对答案,不看原文再听一遍,找错在哪
3 看原文,圈出没听出来的词
4 跟读 2 遍(影子跟读)
5 隔天再听一次同一篇

一篇听力做 3 遍 > 三篇听力各做 1 遍。


四、阅读提分技巧

4.1 通用「定位四步法」⭐

步骤 做法
① 读题干 不读选项,圈出专有名词、数字、生僻词
② 回原文定位 按顺序原则在原文找题干关键词所在句
③ 读定位句 只精读定位句 + 前后各一句
④ 比对选项 找同义替换,排除「原文没说」和「过度推理」

4.2 三大题型打法

题型 分值 打法
选词填空 3.55/题 先做词性分类(n./v./adj./adv.),再看空格缺什么词性,最后从同词性里挑语义
长篇阅读(匹配) 7.1/题 先读 10 个题干圈关键词,再扫读原文段落首尾句匹配;一段可能对应多题
仔细阅读 14.2/题 用「定位四步法」;一题一段,顺序推进

4.3 选词填空词性判断表 ⭐

空格位置 需要的词性 例子
a/an/the ___ 名词 the development
___ + 名词 形容词 rapid growth
主语 + ___ + 宾语 动词 people enjoy life
动词 + ___ 副词 run quickly
be + ___ 形容词/过去分词 is important
to + ___ 动词原形 to improve

4.4 ⚠️ 阅读错误选项的 5 个特征 ⭐

类型 特征
无中生有 原文根本没提
偷换概念 换了个主体或范围(all ↔ some)
绝对化 must / never / always / only 往往是错的
过度推理 原文只说 A,选项推到 B
张冠李戴 把 B 的观点按到 A 头上

4.5 长难句拆解(🚀)

方法:找主干 → 找连词 → 逐段翻译。

The fact [that many students fail to finish their assignments on time]
suggests [that time management is a skill (that must be learned)].
层次 内容
主干 The fact suggests that…
同位语从句 that many students fail… (说明 fact 的内容)
宾语从句 that time management is a skill
定语从句 that must be learned(修饰 skill)

译文:许多学生无法按时完成作业这一事实表明,时间管理是一项必须学习的技能。


五、写作:三段式模板

5.1 评分要点 ⭐

维度 权重 要点
内容 高 不跑题,要点齐全
结构 高 三段式,逻辑连接词清晰
语言 中 语法基本正确 > 用词高级
卷面 中 字迹工整,不涂改

字数要求:120~180 词(建议写 150 词左右)。少写扣分,多写不加分。

5.2 万能三段式结构 ⭐

段落 功能 词数
第一段 现象引入 + 表明观点 35~45
第二段 理由/原因 2~3 条 + 例证 60~80
第三段 总结 + 建议/展望 35~45

5.3 模板 A:现象/议论文(最常用)⭐

Nowadays, ______ has become a topic of heated discussion among ______.
Some people believe that ______, while others argue that ______.
As far as I am concerned, ______.

There are several reasons accounting for my view. To begin with, ______.
Moreover, ______. Most importantly, ______. For example, ______.

In conclusion, ______. Therefore, it is high time that we ______.
Only in this way can we ______.

填充示例(题目:大学生是否应该做兼职)

Nowadays, whether college students should take part-time jobs has become a
topic of heated discussion among students and teachers. Some people believe
that part-time jobs waste valuable study time, while others argue that they
provide practical experience. As far as I am concerned, taking part-time jobs
is beneficial if properly arranged.

5.4 模板 B:图表/数据描述题 🚀

As is shown in the chart, ______ has changed greatly over the past few years.
The number of ______ increased from ______ to ______, while that of ______
decreased sharply.

Several factors may contribute to this trend. First, ______. Second, ______.
What's more, ______.

From my perspective, this trend will continue in the future. It is advisable
that we ______.

5.5 模板 C:书信/建议信 🚀

Dear ______,

I am writing to express my ______ about ______.

To begin with, ______. In addition, ______. I would also suggest that
______.

Thank you for your time. I am looking forward to your reply.

Yours sincerely,
Li Ming

5.6 高分句式库(每篇塞 2~3 个)⭐

功能 句式
引出话题 It is widely acknowledged that… / Recently, … has aroused wide concern.
表达观点 From my perspective,… / As far as I am concerned,…
列举理由 To begin with,… / Moreover,… / Last but not least,…
举例 For instance,… / A case in point is…
因果 This is mainly because… / As a result,…
转折 Nevertheless,… / On the contrary,…
强调 What matters most is… / It is … that…
建议 It is high time that we took measures to…
倒装(加分) Only in this way can we… / Not only does it …, but it also …
结尾 To sum up,… / In a word,…

5.7 ⚠️ 写作高频错误

错误 正确
I very like it. I like it very much.
There are many people thinks… There are many people who think…
Nowadays, with the development of society, people's life is more and more better. …people's lives are getting better and better.
全篇 I think 换成 From my perspective / In my opinion 交替
通篇简单句 每段至少 1 个从句或连接词

六、翻译:常用句型与技巧

6.1 评分要点 ⭐

完整、通顺、无重大语法错误 就能拿 60% 以上分数。不要为了高级而写错。

6.2 四步翻译法 ⭐

步骤 做法 示例
① 断句 把长句切成短句 「中国是一个有着悠久历史的国家,位于亚洲东部。」→ 两句
② 找主干 主 + 谓 + 宾 中国 + 是 + 国家
③ 补修饰 定语/状语后置 with a long history / located in East Asia
④ 润色 加连接词、换词 China is a country with a long history, located in East Asia.

6.3 核心句型库 ⭐

中文结构 英文句型
有……(存在) There is / There are / … has
是……的(强调) It is … that …
越来越…… more and more + adj. / increasingly + adj.
不仅……而且 not only … but also …
被……(被动) be + 过去分词
使……能够 enable sb. to do / make it possible to
随着…… With the development of … / As … develops
位于 be located in / lie in
由……组成 consist of / be made up of
起重要作用 play an important role in
被认为是 be regarded as / be considered as
据说/据报道 It is said / reported that …
原因是 The reason is that …
正因为如此 That is why …
为……提供 provide sb. with sth. / provide sth. for sb.

6.4 中国文化高频词(近 5 年必考)⭐

中文 英文 中文 英文
春节 the Spring Festival 中秋节 the Mid-Autumn Festival
端午节 the Dragon Boat Festival 元宵节 the Lantern Festival
长城 the Great Wall 故宫 the Palace Museum
丝绸之路 the Silk Road 四大发明 the Four Great Inventions
剪纸 paper cutting 书法 calligraphy
京剧 Peking Opera 儒家思想 Confucianism
筷子 chopsticks 茶文化 tea culture
高铁 high-speed rail 移动支付 mobile payment
共享单车 shared bikes 电子商务 e-commerce
一带一路 the Belt and Road 乡村振兴 rural revitalization

6.5 ⚠️ 翻译避坑

坑 说明
逐字翻译 「人山人海」≠ people mountain people sea,应译 huge crowds of people
时态混乱 历史事件用过去时,客观事实用现在时
主语缺失 「近年来,越来越多的人……」要补主语 people
冠词遗漏 可数名词单数前必须有 a/an/the
数字单位 万、亿要换算:10 万 = 100,000 / 1 亿 = 100 million

七、复习计划表

7.1 30 天复习计划(每日 1 小时)⭐

天数 词汇(30 min) 专项(30 min) 自测方式
D1 高频词 1–40 考试结构 + 时间分配 复述各部分分值
D2 41–80 听力三步法 + 1 篇新闻 精听 1 遍
D3 81–120 阅读定位四步法 + 1 篇仔细阅读 对答案看定位
D4 121–160 写作模板 A 背诵 + 写 1 篇 抄写模板
D5 161–200 翻译四步法 + 1 段翻译 对照参考译文
D6 复习 1–200 选词填空词性分类 + 1 篇 词性判断全对
D7 复盘周 1 + 小测 听力 1 篇 + 阅读 1 篇 记录正确率
D8 201–240 长篇阅读匹配技巧 + 1 篇 限时 15 分钟
D9 241–280 听力长对话 2 篇 精听
D10 281–320 仔细阅读 2 篇 限时 25 分钟
D11 321–360 写作模板 B + 1 篇 套模板
D12 361–400 翻译高频句型 + 1 段 背 10 个句型
D13 复习 201–400 听力篇章 1 篇 + 分析错因 错因分类
D14 复盘周 2 + 小测 半套真题(写作+听力) 估分
D15 401–440 仔细阅读 2 篇 限时
D16 441–480 听力新闻 3 篇 精听
D17 481–520 选词填空 2 篇 限时 10 分钟/篇
D18 521–560 写作模板 C + 1 篇 套模板
D19 561–600 翻译 2 段 限时 15 分钟
D20 复习 401–600 长篇阅读 1 篇 + 仔细阅读 1 篇 限时
D21 复盘周 3 半套真题(阅读+翻译) 估分
D22 601–700 听力长对话 + 篇章 精听
D23 701–800 仔细阅读 2 篇 限时
D24 复习 601–800 写作 1 篇 限时 30 分钟
D25 801–900 翻译 2 段 限时
D26 901–1000 长篇阅读 + 选词填空 限时
D27 复习 801–1000 听力 1 套 全真模拟
D28 全部错词 整套真题限时模拟 估分
D29 全部错词 错题复盘 逐题看解析
D30 高频词速刷 作文模板默写 + 翻译句型默写 默写检查

7.2 7 天冲刺计划(考前一周,每天 1.5 小时)⭐

天 任务 重点 自测
D-7 1 套完整真题(严格限时) 找短板 估分并定位弱项
D-6 听力专项:2 篇篇章 + 2 篇新闻精听 精听跟读 听写关键句
D-5 阅读专项:仔细阅读 4 篇 定位速度 每篇 ≤12 分钟
D-4 写作:默写 3 个模板 + 写 2 篇 模板熟练度 25 分钟成稿
D-5→D-4 翻译:中译英 4 段 句型套用 15 分钟成段
D-3 错题复盘:翻全部错题本 错误分类 重做错题
D-2 半套模拟(写作+听力+翻译) 时间分配 卡表执行
D-1 高频词 500 + 模板默写 记忆巩固 早睡,不熬夜
当天 提前 40 分钟到场,预读写作题 心态 —

7.3 每日 1 小时时间分配(可打印贴在桌上)

时段 时长 内容
早 15 min 背新词 40 个
午 10 min 复习昨日词
晚 30 min 专项训练(听力/阅读/写作轮流)
睡前 5 min 快速过当天词 + 默写 1 个句型

八、原创模拟题(附答案与解析)

说明:听力部分提供原文(当作音频听读材料),可让同学朗读或用 TTS 朗读后做题。

8.1 听力 Section A|短篇新闻(1 题)

Directions: Listen to the news report and choose the best answer.

听力原文(可朗读后作答)

A new study from a university in Australia suggests that people who walk
for about thirty minutes every day are less likely to develop heart
disease. The researchers followed more than five thousand adults for ten
years. They found that those who walked regularly had a twenty percent
lower risk of heart problems than those who did not. The team says the
result is important because walking is free and easy for most people.

Question: What does the new study find?

A. Walking can cure heart disease. B. Daily walking may reduce the risk of heart disease. C. People who walk are always healthier. D. Heart disease is caused by lack of sleep.

答案:B 解析:原文 "less likely to develop heart disease" 与选项 B 的 "reduce the risk of heart disease" 是同义替换。A 的 cure(治愈)过度;C 的 always 绝对化;D 无中生有。


8.2 听力 Section B|长对话(2 题)

听力原文

M: Hello, I'd like to book a room for two nights, please.
W: Certainly. When would you like to check in?
M: This Friday, the fifteenth.
W: Let me check... I'm sorry, sir, all our single rooms are fully booked
   that weekend. We only have double rooms left.
M: How much is a double room?
W: Two hundred and eighty yuan per night, including breakfast.
M: That's a bit expensive. Do you have any discount for students?
W: Yes, with a valid student card you can get twenty percent off.
M: Great. I'll take it.

Q1. What is the man doing? A. Booking a room B. Checking out C. Ordering food D. Asking for directions

Q2. How much will the man pay per night with a student card? A. 280 yuan B. 260 yuan C. 224 yuan D. 200 yuan

答案:Q1 A;Q2 C 解析: - Q1:首句 "I'd like to book a room" 直接给出答案(所听即所得)。 - Q2:280 × (1 − 20%) = 224。⚠️ 数字运算题,必须边听边记。


8.3 听力 Section C|听力篇章思路(1 篇)

篇章题顺序原则最强。下面的题目顺序 = 原文顺序。

听力原文(节选)

Sleep is more important than many students realize. Research shows that
teenagers need about nine hours of sleep every night, but most of them
get only six or seven. The main reason is that they stay up late using
smartphones. Lack of sleep can affect memory, mood, and even grades.
Experts suggest that students should put their phones away at least one
hour before going to bed. They also advise keeping a regular schedule,
even on weekends.

Q1. How many hours of sleep do teenagers need according to the passage? → 定位首段 "need about nine hours" → nine hours

Q2. What is the main reason for students' lack of sleep? → 定位 "The main reason is that they stay up late using smartphones" → using smartphones late at night

Q3. What do experts suggest? → 定位最后两句 "put their phones away at least one hour before going to bed" + "keeping a regular schedule" → Put phones away before bed and keep a regular schedule.

💡 听力思路总结

题目 定位句 技巧
Q1 第 2 句 数字题,听到就记
Q2 第 4 句 The main reason is 是信号词
Q3 最后 2 句 结尾常出 "建议" 题

8.4 阅读 Section C|仔细阅读(Passage + 5 题)

Passage

Many people believe that talent is something you are born with. However,
a growing body of research suggests that this view is too simple. In her
well-known study, psychologist Carol Dweck found that what matters most
is not talent itself but what she calls a "growth mindset" — the belief
that abilities can be developed through effort.

Dweck divided students into two groups. Those with a "fixed mindset"
believed that intelligence was unchangeable, while those with a "growth
mindset" believed that they could improve by working hard. When given
difficult problems, the second group kept trying, while the first group
gave up quickly. Over time, the students with a growth mindset performed
better in school.

This finding has important implications for education. Teachers and
parents should praise children for their effort rather than for being
"smart." Praising intelligence, Dweck warns, may make children afraid of
failure, because they do not want to lose the label of being clever.
Praising effort, on the other hand, encourages them to take on challenges.

Of course, a growth mindset is not a magic solution. Some researchers
point out that effort alone is not enough; students also need good
teaching and enough resources. Nevertheless, most educators now agree
that how students think about their own ability can make a real
difference.

Questions

  1. What does the "growth mindset" refer to according to Paragraph 1? A. Being born with great talent. B. Believing that ability can be improved through effort. C. Believing that intelligence never changes. D. Getting high grades without working hard.

  2. What happened when the two groups were given difficult problems? A. Both groups gave up immediately. B. The fixed-mindset group kept trying longer. C. The growth-mindset group kept trying while the other gave up. D. Neither group could solve the problems.

  3. What does Dweck suggest teachers and parents do? A. Praise children for being smart. B. Praise children for their effort. C. Give children easier problems. D. Compare children with each other.

  4. Why may praising intelligence be harmful? A. It makes children lazy. B. It makes children afraid of failure. C. It wastes teachers' time. D. It lowers children's grades directly.

  5. What is the author's attitude towards the growth mindset? A. Completely opposed. B. Doubtful and critical. C. Supportive but objective. D. Totally indifferent.

答案与解析

题号 答案 定位 解析
1 B 第 1 段末 "the belief that abilities can be developed through effort" 直接对应
2 C 第 2 段 "the second group kept trying, while the first group gave up quickly"
3 B 第 3 段 "praise children for their effort rather than for being 'smart'"
4 B 第 3 段 "may make children afraid of failure"
5 C 末段 肯定价值(make a real difference)+ 指出局限(not a magic solution),故为「支持但客观」

💡 技巧复盘:5 题全部顺序对应,且都能在原句找到同义替换。第 5 题是「态度题」,出现 "Nevertheless… now agree" 这类让步+结论结构时,答案通常是「客观/支持」而非极端态度。


8.5 阅读 Section A|选词填空

Word Bank

A. avoid B. balance C. beneficial D. constantly E. damage
F. effectively G. hours H. improve I. mental J. physical
K. protect L. reduce M. regular N. risk O. schedule

Passage(每空填一词,只选一次)

Modern students face a lot of pressure. Many of them study late into the
night and get very few ___(1)___ of sleep. This habit can seriously
___(2)___ their health. Doctors point out that both ___(3)___ and
physical health depend on good sleep. To stay healthy, students should
keep a ___(4)___ daily ___(5)___ and go to bed at the same time every
day. They should also ___(6)___ using smartphones before bed. Exercise
is another ___(7)___ habit, because it can ___(8)___ stress and
___(9)___ students from illness. In short, a good ___(10)___ between
study and rest is the key to success.

答案与解析

空 答案 词性判断 解析
1 G. hours few + 名词复 few hours of sleep 睡眠时间少
2 E. damage can + 动词原形 damage one's health 损害健康
3 I. mental ___ and physical 并列形容词 mental and physical health
4 M. regular a + 形容词 + 名词 regular daily schedule 规律的日程
5 O. schedule a + adj + 名词 daily schedule 每日作息
6 A. avoid should + 动词原形 avoid doing sth. 避免做某事
7 C. beneficial another + 形容词 + 名词 beneficial habit 有益习惯
8 L. reduce can + 动词原形 reduce stress 减轻压力
9 K. protect can + v + sb from protect sb. from 保护……免受
10 B. balance a + 形容词 + 名词 a good balance 良好的平衡

未使用:D. constantly、F. effectively、H. improve、J. physical、N. risk

⚠️ 注意第 3 空已用 mental,physical 是干扰项(形容词但后面必须是名词且语义要匹配)。


8.6 写作

题目

Directions: For this part, you are allowed 30 minutes to write a short
essay on the importance of time management for college students. You
should write at least 120 words but no more than 180 words.

参考范文(约 150 词)

Nowadays, whether college students can manage their time well has become
a topic of heated discussion. As far as I am concerned, time management
is one of the most important skills for university students.

There are several reasons accounting for my view. To begin with, college
life is far freer than high school, and students have to arrange their
own study and activities. Without a clear plan, many of them waste hours
on short videos and games. Moreover, good time management helps students
balance study, exercise and rest, which is beneficial to both their
mental and physical health. Most importantly, the habit of planning
ahead will benefit them in their future careers.

In conclusion, time management deserves serious attention. Therefore, it
is high time that we made a daily schedule and stuck to it. Only in this
way can we make the most of our college years.

范文亮点(考试时尽量模仿)

亮点 原文
高级句式 whether … has become a topic of heated discussion
连接词 To begin with / Moreover / Most importantly
从句 which is beneficial to both their mental and physical health
倒装结尾 Only in this way can we make the most of our college years.

自测标准:词数 120~180、三段式齐全、用了 ≥2 个连接词、无严重语法错误 ⇒ 得分 65+。


8.7 翻译

题目:将下面一段话译成英文。

中国的茶文化历史悠久。茶不仅是一种饮品,也是中国文化的重要
组成部分。如今,越来越多的年轻人开始喜欢喝茶,茶馆在全国各地
随处可见。喝茶有助于人们放松身心,增进交流。

参考译文

Tea culture in China has a long history. Tea is not only a kind of
drink, but also an important part of Chinese culture. Nowadays, more and
more young people are beginning to enjoy drinking tea, and tea houses
can be seen everywhere across the country. Drinking tea helps people
relax and improve communication with each other.

逐句解析

中文 参考句式 要点
历史悠久 has a long history 主谓宾最简结构
不仅……而且 not only … but also … 高分句型
重要组成部分 an important part of 固定表达
越来越多 more and more 高频短语
随处可见 can be seen everywhere 被动语态
有助于…… helps sb. (to) do help 后接动词原形或不定式

⚠️ 常见失分点:把「茶馆」译成 tea shop(应为 tea house)、漏掉「中国文化」的 of 结构、时态混乱。


九、错题复盘方法与考前冲刺

9.1 错题本建立法 ⭐

工具:一个本子或一张表格(按下面字段记录)。

字段 说明
日期 记录时间
板块 听力/阅读/写作/翻译
题号 定位用
我的答案 / 正确答案 对比
错因分类 ① 词汇不认识 ② 定位错 ③ 同义替换没认出来 ④ 语法不理解 ⑤ 粗心/时间不够
一句话教训 如「看到 however 要重读后半句」

9.2 错因归因表(决定你下一步该干什么)⭐

错因 出现比例高 立即行动
词汇不认识 高 把该词加入生词本,第二天必背
定位错误 中 重做该篇,标注定位句
同义替换没认出 中 抄进同义替换表
语法不理解 中 拆解该长难句
粗心/时间不够 低 限时训练

9.3 复盘三步法 ⭐

步骤 做法
① 重做 不看答案重做错题,看是否真会
② 归因 填 9.2 的表格,判断是「知识问题」还是「技巧问题」
③ 归档 知识问题 → 背;技巧问题 → 记规则

每周日复盘一次:统计本周错因分布,找出占比最高的那一类,下周专门补。

9.4 考前 3 天冲刺建议 ⭐

时间 做什么 不做什么
D-3 翻全部错题本,重做错题 不做新题
D-2 半套模拟,保持手感 不熬夜晚睡
D-1 默写 3 个作文模板 + 翻译句型 + 高频词速刷 不刷新难题
当天 提前到场,先看写作题目构思 不临时背新词

9.5 考场时间检查点 ⭐

时间节点 应该完成
开考 30 分钟 写作写完
听力结束 答题卡 2 全部涂完(边听边涂)
阅读+翻译共 70 分钟 仔细阅读 25 min → 匹配 15 min → 翻译 20 min → 选词 10 min

9.6 心态管理

第三部分 60 天综合学习计划

60 天综合学习计划(C 语言期末 + CET-4)

每天 2 小时 = C 语言 1 小时 + 英语 1 小时 目标:C 语言期末 90+,CET-4 500 分


一、总览

1.1 三阶段节奏

阶段 天数 定位 C 语言 英语
第一阶段 D1–D20 打地基 语法基础 + 函数 词汇 600 + 技巧入门
第二阶段 D21–D45 攻核心 数组/指针/字符串/结构体 词汇 1000 + 专项训练
第三阶段 D46–D60 冲刺提分 文件 + 项目 + 真题 词汇 1000 + 整套真题

1.2 每日固定结构(贴在桌上)

时段 时长 C 语言 英语
块 1 15 min 复习昨天代码(手打一遍) 背新词 40
块 2 40 min 学新知识点 + 敲代码 专项训练
块 3 5 min 记录错题/疑问 复习本日单词

规则:⭐ 每天必须敲代码,不能只看。看不懂的代码敲一遍就懂一半。

1.3 周节奏

周几 侧重
周一至周五 按计划推进
周六 C 语言综合练习(2 小时全给 C)
周日 英语整套/半套 + 周复盘(2 小时全给英语)

二、60 天逐日计划表

第 1 阶段:打地基(D1–D20)

天 C 语言任务(1h) 英语任务(1h) 当日自测
D1 装环境,跑通 Hello World,理解 main 高频词 1–40;读考试结构表 独立编译运行成功
D2 printf/scanf、格式符 词 41–80;听力三步法 + 1 篇新闻 写出交互式输入程序
D3 数据类型、sizeof、常量 词 81–120;阅读定位四步法 + 1 篇 说出 5 种类型字节数
D4 运算符、三目、优先级 词 121–160;写作模板 A 背诵 默写运算符优先级前 6 档
D5 if / else if / switch 词 161–200;翻译四步法 + 1 段 写五档成绩判定
D6 while / do-while 词复习 1–200;选词填空 1 篇 解释三种循环差异
D7 周练:分支 + 循环 10 题 周复盘 + 听力 1 篇 + 阅读 1 篇 记录正确率
D8 for 循环、循环嵌套 词 201–240;长篇阅读技巧 + 1 篇 打印九九乘法表
D9 break / continue 词 241–280;听力长对话 2 篇 说明两者区别
D10 累加/计数/最值套路 词 281–320;仔细阅读 2 篇(限时) 写求最值程序
D11 穷举法、素数判定 词 321–360;写作模板 B 默写素数函数
D12 递推(斐波那契) 词 361–400;翻译句型 10 个 写斐波那契前 20 项
D13 综合小练(10 道逻辑题) 词复习 201–400;听力篇章 1 篇 独立完成 8/10
D14 周测:写 3 个完整小程序 半套真题(写作 + 听力) 估分
D15 函数定义/调用/原型 词 401–440;仔细阅读 2 篇 写 add/max 函数
D16 值传递(重点理解) 词 441–480;听力新闻 3 篇 解释 swap 为什么失效
D17 多函数拆分程序 词 481–520;选词填空 2 篇 把上次程序拆成 3 个函数
D18 参数与返回值设计 词 521–560;写作模板 C 写「返回两个结果」的函数
D19 递归入门(阶乘/求和) 词 561–600;翻译 2 段 手写递归阶乘
D20 周测:函数综合 5 题 半套真题(阅读 + 翻译) 估分

第 2 阶段:攻核心(D21–D45)

天 C 语言任务(1h) 英语任务(1h) 当日自测
D21 一维数组定义、遍历 词 601–700;仔细阅读 2 篇 输入 10 数求最值
D22 数组求最值/求和/平均 听力长对话 + 篇章精听 写统计程序
D23 冒泡排序 阅读长篇匹配 1 篇 默写冒泡
D24 选择排序、插入排序 写作 1 篇(限时 30 min) 写两种排序
D25 二分查找 翻译 2 段 手写二分
D26 二维数组、矩阵操作 词复习 601–800;选词填空 1 篇 求矩阵和与转置
D27 数组作函数参数 听力精听 2 篇 写 reverse 函数
D28 周测:数组综合(含杨辉三角) 半套真题 估分
D29 指针概念、& 与 * 词 801–900;仔细阅读 2 篇 画内存图解释指针
D30 指针与数组等价关系 听力篇章 1 篇 三种遍历写法都写一遍
D31 指针作函数参数 长篇阅读 1 篇 写指针版 swap
D32 指针返回多个结果 写作 1 篇 写 minMax 函数
D33 指针与字符串 翻译 2 段 自写 strlen
D34 动态内存 malloc/free 词复习 801–1000 动态数组排序
D35 周测:指针综合 5 题 半套真题 估分
D36 字符数组与 '\0' 词 1001–1100;仔细阅读 2 篇 说出字符串长度计算
D37 string.h 全部函数 听力新闻 3 篇 用 6 个函数各写一例
D38 自写 strlen/strcpy/strcat 长篇阅读 1 篇 默写 3 个自写函数
D39 字符串统计、回文、反转 写作 1 篇 写回文判断
D40 单词统计、字典序排序 翻译 2 段 统计一句单词数
D41 周测:字符串综合 半套真题 估分
D42 结构体定义与使用 词 1101–1200;仔细阅读 2 篇 定义 struct Point
D43 结构体数组 听力篇章 1 篇 存 5 个学生
D44 结构体排序与查询 长篇阅读 1 篇 按总分排序
D45 结构体指针、typedef 词复习 + 写作 1 篇 用 -> 遍历

第 3 阶段:冲刺提分(D46–D60)

天 C 语言任务(1h) 英语任务(1h) 当日自测
D46 文件打开/关闭、路径 词 1201–1300;仔细阅读 2 篇 读写一个 txt
D47 文本文件读写(字符/行) 听力篇章 1 篇 统计文件行数
D48 fscanf/fprintf 格式化 翻译 2 段 学生数据存盘
D49 二进制文件(进阶) 写作 1 篇 解释两种文件差异
D50 文件综合练习 词复习 + 长篇阅读 1 篇 完整读写回程序
D51 项目:需求 + 数据结构设计 整套真题(严格限时 125 min) 估分 → 定弱项
D52 项目:录入 + 显示模块 听力精听(错题篇) 编译运行通过
D53 项目:排序 + 查询模块 阅读错题复盘 功能可跑
D54 项目:统计 + 保存模块 写作模板默写 功能可跑
D55 项目:加载 + 菜单整合 翻译 2 段 完整系统可运行
D56 项目优化 + 加 2 个扩展功能 整套真题 估分对比进步
D57 期末真题第 1 遍(限时) 错题本重做 记录错题
D58 期末真题第 2 遍(查漏) 听力 + 阅读专项 错题减少
D59 期末真题第 3 遍(背模板代码) 高频词速刷 + 模板默写 模板不查资料写
D60 只看速查表 + 错误对照表 + 代码规范 只看模板 + 句型 + 错题本 早睡,准备考试

三、每日执行清单(可打印,每天打勾)

3.1 C 语言部分 ☐

3.2 英语部分 ☐

3.3 今日总结 ☐

3.4 「三不」原则

❌ 不要 原因
只看不敲代码 看懂 ≠ 会写,考试是手写
一次背 200 个单词 记不住,第二天全忘
连续 3 天不碰英语 语感会掉,听力最先崩

四、阶段自测表

4.1 C 语言阶段自测(每阶段结束打分)

阶段 自测内容 达标标准 分值(0–10) 未达标怎么办
阶段 1 入门 独立写交互式输入输出程序 无错误运行 ___ 重做 2.1–2.2
阶段 2 基础 20 行内逻辑题 10 道 对 8 道 ___ 重做 3.4–3.6
阶段 3 函数 拆分程序为 3 个函数 无错误 ___ 重做第四阶段
阶段 4 数组 冒泡排序 + 矩阵转置 默写通过 ___ 重做第五阶段
阶段 5 指针 指针版 swap + 返回多结果 默写通过 ___ 重做第六阶段
阶段 6 字符串 自写 strlen/strcpy + 回文 默写通过 ___ 重做第七阶段
阶段 7 结构体 学生数组排序输出 无错误 ___ 重做第八阶段
阶段 8 文件 存盘再读回 无错误 ___ 重做第九阶段
阶段 9 项目 200 行系统独立完成 全部功能可用 ___ 拆分模块逐个实现

判定:总分 ≥ 81(9 项 × 9 分)→ 期末 90+ 有把握;< 63 → 需要补最弱的两项。

4.2 CET-4 阶段自测(每 10 天估分)

节点 自测内容 目标分 实际估分 差距分析
D10 听力 1 篇 + 仔细阅读 1 篇 正确率 50% ___ ___
D20 半套真题(写作+听力) 写作 55 / 听力 120 ___ ___
D30 半套真题(阅读+翻译) 阅读 160 / 翻译 50 ___ ___
D40 整套真题 总分 430 ___ ___
D50 整套真题 总分 470 ___ ___
D60 整套真题 总分 500 ___ ___

4.3 错因统计表(每周填一次)

周次 词汇不认识 定位错 同义替换没认出 语法不懂 粗心/时间 本周重点补
第 1 周
第 2 周
第 3 周
第 4 周
第 5 周
第 6 周
第 7 周
第 8 周

用法:哪一列数字最大,下周就把时间往那一列倾斜。


五、常见问题答疑(FAQ)

5.1 C 语言相关

Q1:我时间不够,C 语言能不能只看不敲? 不能。 期末考的是手写代码。看懂和写出之间差 3 倍时间。宁可少学一个知识点,也要把学过的敲熟。

Q2:指针太难了,能不能放弃? 不能全放弃。指针作函数参数(6.3 节)是期末必考,至少要把 swap、minMax 这两个模板背下来。多级指针、函数指针可以放。

Q3:编译报错太多,一个都没解决怎么办? 按附录 B 三步法:① 只看第一条 ② 看行号 ③ 从行号往上找漏掉的符号。90% 的报错是漏分号、少 include、括号不配对、漏 &。

Q4:程序能编译但结果不对,怎么查? 用「打印大法」:在可疑位置加 printf,把中间变量打出来。90% 的逻辑错误靠打印能定位。

Q5:期末题型怎么针对性准备?

题型 准备方法
选择题 背附录 A 速查表 + 附录 B 易错点
程序阅读 从 main 往下逐行模拟执行,用草稿纸记变量值
程序填空 先读注释和上下文,判断缺的是「变量/条件/语句」
编程题 先写注释框架(输入→处理→输出),再填代码
纠错题 重点查:= vs ==、;、下标越界、数组名赋值

Q6:数学系学 C 语言有优势吗? 有。算法思维(循环、递推、穷举)是数学的强项。你的短板是语法细节和上机熟练度,所以多敲。

5.2 英语相关

Q7:高考 70 分,60 天能到 500 吗? 可以,但必须靠策略:放弃「全都会」,主攻「性价比高的板块」。具体就是: - 词汇:只背 2000 核心词(不背 4500 全表) - 阅读:只练仔细阅读 + 长篇阅读(选词填空放弃精练) - 写作 + 翻译:背模板套用 - 听力:只做精听,不追求全懂

Q8:单词背了就忘怎么办? 正常现象。用「间隔重复」:当天 + 次日 + 第 4 天 + 第 7 天各看一次。App 会自动帮你排,关键是每天都要打开。

Q9:听力完全听不懂怎么办? 先降级:从真题听力原文开始,边看原文边听,听熟了再不看原文。听不懂就听 3 遍,还不懂看原文——逐句精听一篇,胜过泛听十篇。

Q10:作文写不出来怎么办? 背模板 + 换词。三段式模板背熟,把题目话题词填进去。60 天足够背 3 个模板,考试时 20 分钟就能成稿。

Q11:翻译最怕什么? 怕不成句。宁可写 China has a long history. 这样的简单句,也不要写一个语法错误的复杂句。完整 > 高级。

Q12:要不要做市面上的模拟题? 只做真题。模拟题难度和出题思路经常偏。近 5 年真题(约 10 套)足够。

5.3 时间管理类

Q13:每天 2 小时实在抽不出来怎么办? 保底方案:C 语言 40 分钟 + 英语 40 分钟 + 复盘 10 分钟 = 90 分钟。宁可每天 90 分钟不间断,也不要「今天 4 小时、明天 0 小时」。

Q14:某天没完成计划怎么办? 不补昨天的,直接做今天的。 补旧账会打乱节奏。如果某阶段整体落后 3 天以上,就压缩「进阶拓展」内容,保住「最小必学」。

Q15:两门同时复习会互相干扰吗? 不会。反而有好处:C 语言练逻辑,英语练记忆,交替进行大脑不易疲劳。实在累就把两门分成早晚两段。

Q16:什么时候该停止学新内容? D51 之后停止学新知识,全部转为项目 + 真题 + 复盘。最后 10 天做新题收益极低,巩固已有内容收益最高。


六、打印建议

打印内容 用途 建议份数
03 文件第 2 节(60 天计划表) 贴墙上,每天打勾 1
03 文件第 3 节(每日执行清单) 每天一张 60
03 文件第 4 节(阶段自测表) 每阶段一张 8+6
01 文件附录 A/B/C 考前速查 1
02 文件第五、六节(模板 + 句型) 考前默写 1
02 文件第 8 节(模拟题) 限时作答 1

建议:整份资料用 A4 双面打印,C 语言和英语分开装订成两本,方便随手翻。


七、最后一句

60 天里最重要的一件事:每天都做,哪怕只做 1 小时。

计划表是路线,不是枷锁。落后了就调整,但不要停。 C 语言靠敲,英语靠背,两件事都没有捷径,但都有确定的回报。