Files
Serendipity 93c16edb5a 更新MD文件路径引用
- 修正主README.md中的所有路径引用,使其与当前文件结构一致
- 更新翁凯C语言学习指南链接路径
- 更新五子棋AI项目文档链接路径
- 更新数据结构学习文档链接路径
- 修正编译说明和学习模块使用指南中的目录路径
- 改进五子棋README.md的编译运行说明,增加Windows和Linux/macOS的分平台指导
- 确保所有文档链接和路径引用都能正确工作
2025-10-17 10:52:27 +08:00

282 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 翁凯C语言学习代码
本目录包含了翁凯老师C语言课程的学习代码,按章节组织,涵盖了C语言的各个重要知识点。
## 📚 学习笔记亮点
本代码库的一大特色是在每个C文件中都包含了**详细的学习笔记和注释**!这些笔记记录了学习过程中的重要概念、理解要点和实践心得,是非常宝贵的学习资源。
### 🌟 重点推荐的笔记文件
以下文件包含了特别详细和深入的学习笔记,强烈建议重点学习:
- **第4章** `函数的定义和使用.c` - 函数概念的完整解析
- **第5章** `数组的例子:冒泡排序.c` - 数组操作和算法思维
- **第6章** `指针变量:记录地址的变量.c` - 指针核心概念详解
- **第7章** `字符串.c` - C语言字符串本质深度剖析
- **第8章** `结构类型.c` - 结构体完整知识体系
- **第9章** `宏定义.c` - 预处理器工作原理深度解析
- **第10章** `文件输入输出.c` - 文件操作标准模式
### 📝 笔记特色
- **概念解释清晰**:每个重要概念都有详细的文字说明
- **实例丰富**:结合具体代码示例进行解释
- **重点突出**:用注释标记出容易出错和需要注意的地方
- **系统性强**:按照知识点的逻辑关系组织笔记内容
- **实用性高**:包含实际编程中的技巧和最佳实践
## 目录结构
### 第1章 - 基础入门
- `average math.c` - 平均数计算
- `guess.c` - 猜数游戏
- `位数.c` - 数字位数计算
- `倒序排列.c` - 数字倒序排列
### 第2章 - 循环与算法
- `coin.c` / `coin2.c` - 硬币问题
- `n的阶乘.c` / `n的阶乘2.c` / `n的阶乘3.c` - 阶乘计算的不同实现
- `sum.c` / `sum2.c` / `sum3.c` - 求和算法
- `最大公约数.c` / `最大公约数2.c` / `最大公约数(辗转相除法).c` - 最大公约数算法
- `正序分解整数.c` / `正序分解整数2.c` / `正序分解整数3.c` / `正序整数分解4.c` - 整数分解
- `素数判断.c` / `素数判断2.c` / `素数判断3.c` - 素数判断算法
### 第3章 - 数据类型与运算
- `a的连续和.c` - 连续求和
- `n项求和.c` - n项求和
- `九九乘法表.c` - 乘法表生成
- `字符类型.c` - 字符类型操作
- `念数字.c` - 数字转文字
- `整数的格式化.c` - 整数格式化输出
- `整数类型表示数的范围.c` 系列 - 整数类型范围测试
- `条件运算和逗号运算.c` - 运算符使用
- `水仙花数.c` - 水仙花数计算
- `浮点数的范围与精度.c` / `浮点数的输入和输出.c` - 浮点数操作
- `猜数游戏.c` - 猜数游戏实现
- `类型转换.c` - 数据类型转换
- `约分最简分式.c` - 分数约分
- `给定条件的整数集.c` - 条件筛选
- `统计素数并求和.c` - 素数统计
- `逃逸字符.c` - 转义字符使用
- `逻辑运算.c` - 逻辑运算符
### 第4章 - 函数
- `从函数的返回值.c` - 函数返回值
- `函数原型.c` - 函数声明
- `函数嵌套递归.c` - 递归函数
- `函数求和.c` - 函数实现求和
- `函数的其它细节问题.c` - 函数细节
- `函数的定义和使用.c` - **函数基础** 📝
> **学习笔记**:详细解释了函数的概念、作用和调用方式
> - 函数作用:避免重复代码的封装,可以重复使用
> - 函数组成要素:具备函数名、参数列表、参数类型、返回值类型
> - 函数调用:使用函数名和函数参数进行调用
> - 函数原型:void num_sum(int begin, int end) 详细解析
- `参数传递.c` - 参数传递机制
- `本地变量.c` - 局部变量
### 第5章 - 数组
- `二维数组.c` - 二维数组基础
- `二维数组中的鞍点.c` - 鞍点查找
- `二维数组:矩阵运算.c` / `二维数组:矩阵运算2.c` - 矩阵运算
- `初试数组.c` - 数组入门
- `定义数组.c` - 数组定义
- `对称矩阵.c` - 对称矩阵判断
- `数组来统计个数.c` - 数组统计
- `数组的例子:冒泡排序.c` - **冒泡排序算法** 📝
> **学习笔记**:深入分析了素数筛选和数组赋值的核心概念
> - 素数筛选算法:从x=2开始,将2x、3x、4x直到ax<n的数标记为合数,重复此过程
> - 数组赋值方法:详细说明了直接赋值和循环赋值两种方式
> - 重要提醒:数组不能像普通变量一样直接赋值
- `数组的例子:素数.c` / `数组的例子:素数2.c` - 素数筛选
- `数组的运算.c` - 数组基本运算
- `杨辉三角.c` - 杨辉三角生成
- `矩阵对应位置元素相加.c` - 矩阵加法
- `矩阵对角线的和.c` - 对角线求和
- `矩阵的应用.c` - 矩阵应用
- `矩阵的最大值.c` - 矩阵最值
- `转置矩阵.c` - 矩阵转置
### 第6章 - 指针
- `函数指针.c` - 函数指针使用
- `动态内存分配.c` - 内存动态分配
- `取地址计算:&运算符取得变量的地址.c` - 地址运算
- `指针与const:指针本身和所指的变量都可能const.c` - const指针
- `指针与数组.c` - 指针数组操作
- `指针函数.c` - 返回指针的函数
- `指针变量:记录地址的变量.c` - **指针变量基础** 📝
> **学习笔记**:系统性地解释了指针的核心概念和使用方法
> - 指针变量定义:变量的值是内存的地址,与普通变量存储实际值不同
> - 访问地址变量:*p表示p指向的变量的值,*是单目运算符
> - 指针的双重用途:可以做右值也可以做左值(int k=*p; *p=k+1;
> - 实际应用:通过函数参数传递地址来修改变量值
- `指针数组.c` - 指针数组
- `指针的使用.c` - 指针基本使用
- `指针运算.c` - 指针运算
### 第7章 - 字符串
- `单字符的输入输出.c` - 字符I/O
- `字符串.c` - **字符串基础** 📝
> **学习笔记**:全面讲解了C语言字符串的本质和操作方法
> - 字符串定义:以0(即\0)结尾的一串字符,0和'0'不同
> - 字符串长度:0标志字符串的结束,计算长度时不包含结尾0
> - 存储方式:字符串以数组形式存在,分为数组和指针两种形式
> - 字符串常量:"Hello"会被编译器变成一个字符数组放在某处,长度为6
> - 重要特性:C语言的字符串是以字符数组的形态存在的
> - 标准库:string.h包含很多处理字符串的函数
- `字符串中找字符.c` - 字符查找
- `字符串中找字符串2.c` - 字符串查找
- `字符串函数strcmp.c` - 字符串比较
- `字符串函数strcpy.c` - 字符串复制
- `字符串函数strlen.c` - 字符串长度
- `字符串变量.c` - 字符串变量
- `字符串数组.c` / `字符串数组2.c` - 字符串数组
- `字符串的输入输出.c` - 字符串I/O
- `字符串输出回文字.c` - 回文字符串
### 第8章 - 结构体
- `动态链表.c` - 动态链表实现
- `枚举.c` - 枚举类型
- `类型定义.c` - 类型定义
- `结构与函数.c` / `结构与函数2.c` - 结构体与函数
- `结构中的结构3.c` - 嵌套结构体
- `结构类型.c` - **结构体类型** 📝
> **学习笔记**:详细阐述了结构体的定义、使用和操作方法
> - 作用域:在函数内/外定义结构体的区别和使用范围
> - 定义方式:三种不同的结构体定义语法和应用场景
> - 结构成员:使用.运算符访问结构体成员(如today.day)
> - 结构运算:结构体可以直接赋值、取地址,也可以传递给函数
> - 结构指针:使用&运算符获取结构体地址,通过指针访问成员
> - 初始化:pl = (struct point){5, 10} 的复合字面量语法
- `联合.c` - 联合类型
### 第9章 - 高级特性
- `全局变量.c` - 全局变量
- `声明.c` - 变量声明
- `大程序.c` - 大型程序组织
- `头文件.c` - 头文件使用
- `宏定义.c` - **宏定义** 📝
> **学习笔记**:深入解析了C语言预处理器和宏定义的工作原理
> - 预处理指令:以#开头的是编译预处理指令,不是C语言的成分
> - 宏定义语法:#define <名字> <值>,注意没有结尾的分号
> - 工作原理:预处理器在编译正式开始之前进行全文本替换
> - 替换规则:包括函数名在内的所有匹配都会被替换
> - 多行宏:值超过一行时,行末需要用\连接
> - 预定义宏:__LINE__、__FILE__、__DATE__、__TIME__、__STDC__等
> - 调试技巧:gcc --save-temps 可以查看预处理结果
- `带参数的宏.c` - 带参数宏
- `返回指针的函数.c` - 返回指针函数
- `静态本地变量.c` - 静态局部变量
### 第10章 - 文件操作
- `二进制文件.c` - 二进制文件操作
- `文件输入输出.c` - **文件I/O** 📝
> **学习笔记**:系统介绍了C语言文件操作的标准方法
> - 核心函数:FILE* fopen()用于打开文件,fclose()用于关闭文件
> - 文件读写:fscanf()和fprintf()用于格式化文件读写
> - 标准代码模式:先检查文件是否成功打开,再进行操作,最后关闭文件
> - 错误处理:使用if(fp)检查文件打开是否成功,失败时给出提示
- `格式化输入输出.c` - 格式化I/O
### 第11章 - 位运算
- `位段.c` - 位段操作
- `位运算的例子.c` - 位运算示例
- `按位运算.c` - 按位运算
- `移位运算.c` - 移位运算
### 第12章 - 可变数组
- `可变数组.c` - 可变数组基础
- `可变数组的数据访问.c` - 数据访问
- `可变数组的缺陷.c` - 缺陷分析
- `可变数组的自动增长.c` - 自动增长机制
### 第13章 - 链表
- `链表.c` - 链表基础
- `链表的函数.c` - 链表函数
- `链表的删除.c` - 链表删除操作
- `链表的搜索.c` - 链表搜索
- `链表的清除.c` - 链表清理
## 学习建议
### 学习路径
1. **按章节顺序学习**:建议按照1-13章的顺序逐步学习,每章的知识点都有递进关系
- 第1-3章:打好基础,理解C语言的基本语法和数据类型
- 第4-5章:掌握函数和数组,这是编程的核心概念
- 第6-7章:深入理解指针和字符串,C语言的精髓所在
- 第8-9章:学习结构体和高级特性,提升编程能力
- 第10-13章:掌握文件操作、位运算和动态数据结构
2. **动手实践**:每个代码文件都可以独立编译运行,建议亲自编译执行理解代码逻辑
- 不要只看代码,一定要亲自编译运行
- 尝试修改代码中的参数,观察运行结果的变化
- 在代码中添加printf语句,跟踪程序执行流程
3. **对比学习**:同一知识点的多个实现版本可以对比学习,理解不同的实现思路
- 比如阶乘的三种实现方式,体会递归与循环的区别
- 素数判断的多种算法,理解算法优化的思路
- 最大公约数的不同算法,感受数学与编程的结合
4. **扩展练习**:在理解基础代码的基础上,可以尝试修改和扩展功能
- 为程序添加输入验证和错误处理
- 优化算法的时间复杂度和空间复杂度
- 结合多个知识点创建综合性项目
### 个人学习感想
通过学习翁凯老师的C语言课程,我深刻体会到:
- **循序渐进的重要性**:C语言的学习不能急于求成,每个概念都需要充分理解和练习
- **实践出真知**:光看代码是不够的,必须亲自动手编写和调试程序
- **基础决定高度**:指针、数组、函数这些基础概念掌握得越扎实,后续学习越轻松
- **思维方式的转变**:从面向过程的思维到结构化编程思维的转变是关键
- **调试能力的培养**:学会使用调试工具和技巧,这是程序员必备的技能
- **📝 笔记记录的价值**:在学习过程中认真记录笔记,将抽象概念用自己的话重新表述,这个过程极大地加深了对知识点的理解。每当回顾这些笔记时,都能快速回忆起当时的学习状态和理解程度
- **💡 知识体系的构建**:通过在代码中添加详细注释和概念解释,逐步构建起了完整的C语言知识体系,这些笔记不仅帮助当时的学习,更成为了日后复习和深化的宝贵资源
### 推荐学习资源
#### 翁凯老师网课链接
- **中国大学MOOC平台**[程序设计入门——C语言](https://www.icourse163.org/course/ZJU-199001)
- **翁凯老师个人主页**[浙江大学计算机学院](https://person.zju.edu.cn/wengkai)
- **课程配套资料**:建议结合视频课程和本代码库一起学习
#### 学习工具推荐
- **编译器**:推荐使用GCC或Visual Studio Code + C/C++扩展
- **调试工具**:GDB调试器,VS Code内置调试功能
- **在线编程**[C语言网](https://www.dotcpp.com/)、[牛客网](https://www.nowcoder.com/)
### 学习时间安排建议
- **初学者**:建议每天1-2小时,完整学完需要2-3个月
- **有编程基础**:可以加快进度,重点关注C语言特有的概念如指针
- **复习巩固**:定期回顾之前的章节,温故而知新
### 常见问题解答
1. **Q: 指针太难理解怎么办?**
A: 多画内存图,理解地址和值的关系,从简单的例子开始
2. **Q: 程序编译出错怎么办?**
A: 仔细阅读错误信息,检查语法错误,注意分号、括号匹配
3. **Q: 如何提高编程能力?**
A: 多练习,多思考,尝试解决实际问题,参与编程竞赛
## 编译运行
```bash
# 编译单个文件
gcc filename.c -o output
# 运行程序
./output
```
## 注意事项
- 部分代码可能需要在特定的编译器环境下运行
- 建议使用GCC编译器进行编译
- 注意中文编码问题,建议使用UTF-8编码