From 91e3438bfb2bd4534923e160984b141f376260dc Mon Sep 17 00:00:00 2001 From: LHY0125 <3364451258@qq.com> Date: Thu, 9 Oct 2025 20:49:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0README=E6=96=87=E6=A1=A3?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0GitHub=E9=93=BE=E6=8E=A5=E5=92=8C?= =?UTF-8?q?=E5=AE=8C=E5=96=84=E9=A1=B9=E7=9B=AE=E7=BB=93=E6=9E=84=E6=8F=8F?= =?UTF-8?q?=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 444 +++++++++++++++++++++++----------- 数据结构/README.md | 65 +++++ 数据结构/array_operations.exe | Bin 62270 -> 0 bytes 数据结构/结构体实现插入元素.c | 46 ++-- 翁凯C语言/README.md | 282 +++++++++++++++++++++ 5 files changed, 679 insertions(+), 158 deletions(-) create mode 100644 数据结构/README.md delete mode 100644 数据结构/array_operations.exe create mode 100644 翁凯C语言/README.md diff --git a/README.md b/README.md index f48ace5..4be0002 100644 --- a/README.md +++ b/README.md @@ -5,122 +5,98 @@ ## 项目结构 -### 📚 翁凯C语言/ -翁凯老师C语言课程的完整代码实现,按章节组织: +### 📚 翁凯C语言/ - 系统化学习路径 +翁凯老师C语言课程的完整代码实现,**每个文件都包含详细的学习笔记和注释**,是宝贵的学习资源: -- **第1章** - C语言入门 - - Hello World程序 - - 基础数学运算 - - 猜数游戏 - - 数组倒序排列 +#### 🌟 学习笔记亮点 +- **概念解释清晰**:每个重要概念都有详细的文字说明 +- **实例丰富**:结合具体代码示例进行解释 +- **重点突出**:用注释标记出容易出错和需要注意的地方 +- **系统性强**:按照知识点的逻辑关系组织笔记内容 +- **实用性高**:包含实际编程中的技巧和最佳实践 -- **第2章** - 循环与判断 - - 硬币兑换问题 - - 阶乘计算(多种实现) - - 求和算法 - - 最大公约数(辗转相除法) - - 整数分解 - - 素数判断 +#### 📖 章节内容(130+个代码文件) -- **第3章** - 数据类型与运算 - - 字符类型处理 - - 数字朗读程序 - - 九九乘法表 - - 水仙花数 - - 浮点数精度 - - 逻辑运算 - - 分式约分 +**基础入门阶段(第1-3章)** +- **第1章** - C语言入门:Hello World、数学运算、猜数游戏、数组倒序 +- **第2章** - 循环与算法:硬币问题、阶乘计算、求和算法、最大公约数、素数判断 +- **第3章** - 数据类型与运算:字符处理、九九乘法表、水仙花数、浮点数精度、逻辑运算 -- **第4章** - 函数 - - 函数定义与使用 - - 参数传递机制 - - 递归函数 - - 局部变量作用域 +**核心概念阶段(第4-6章)** +- **第4章** - 函数:函数定义与使用📝、参数传递、递归函数、局部变量 +- **第5章** - 数组:冒泡排序算法📝、矩阵运算、杨辉三角、素数筛选 +- **第6章** - 指针:指针变量基础📝、指针与数组、动态内存分配、函数指针 -- **第5章** - 数组 - - 一维数组操作 - - 二维数组与矩阵 - - 冒泡排序算法 - - 素数筛选 - - 杨辉三角 - - 矩阵运算 +**高级特性阶段(第7-9章)** +- **第7章** - 字符串:字符串基础📝、字符串函数、字符串数组、回文字符串 +- **第8章** - 结构体:结构类型📝、结构体与函数、动态链表、枚举类型 +- **第9章** - 程序结构:宏定义📝、全局变量、头文件使用、大型程序组织 -- **第6章** - 指针 - - 指针基础概念 - - 指针与数组 - - 动态内存分配 - - 函数指针 - - 指针数组 +**专业应用阶段(第10-13章)** +- **第10章** - 文件操作:文件输入输出📝、格式化读写、二进制文件处理 +- **第11章** - 位运算:按位运算符、移位运算、位段操作 +- **第12章** - 动态数据结构:可变数组实现、自动增长机制、数据访问优化 +- **第13章** - 链表:单向链表实现、链表函数封装、链表搜索算法 -- **第7章** - 字符串 - - 字符串基础操作 - - 字符串函数(strlen, strcpy, strcmp) - - 字符串数组 - - 回文字符串 +> 📝 标记的文件包含特别详细的学习笔记,强烈推荐重点学习 -- **第8章** - 结构体 - - 结构体定义与使用 - - 结构体与函数 - - 嵌套结构体 - - 动态链表 - - 枚举类型 - - 联合体 +详细学习指南请查看:[翁凯C语言学习指南](翁凯C语言/README.md) -- **第9章** - 程序结构 - - 全局变量 - - 静态变量 - - 头文件使用 - - 宏定义 - - 大型程序组织 +### 🎯 课上代码练习/ - 实战项目训练 +课堂实践代码,从基础练习到高级AI项目的完整实战训练: -- **第10章** - 文件操作 - - 文件输入输出 - - 格式化读写 - - 二进制文件处理 +#### 基础练习模块 +- **C语言初识**:Hello World和基础语法 +- **数值处理**:最大值查找、求和算法 +- **字符函数**:字符处理和转换 +- **条件判断**:逻辑控制结构 +- **BMI计算器**:实用工具开发 -- **第11章** - 位运算 - - 按位运算符 - - 移位运算 - - 位段操作 +#### 🎮 五子棋AI项目 - 高级算法实战 +**项目概述**:基于C语言实现的高级五子棋人机对战系统 -- **第12章** - 动态数据结构 - - 可变数组实现 - - 自动增长机制 - - 数据访问优化 +**核心技术特点**: +- **AI算法**:α-β剪枝优化的极小极大算法(3层搜索深度) +- **棋盘系统**:支持5x5到25x25的动态棋盘尺寸 +- **智能评估**:完整的棋型评估系统(活四、冲四、活三等) +- **游戏功能**:复盘系统、胜负判断、平局检测 +- **用户体验**:清晰的棋盘界面显示和交互 -- **第13章** - 链表 - - 单向链表实现 - - 链表函数封装 - - 链表搜索算法 - - 链表删除操作 - - 链表清除功能 +**算法亮点**: +- **防御策略**:优先检查玩家威胁棋型(活四、冲四、活三) +- **进攻策略**:使用极小极大算法计算最佳落子位置 +- **搜索优化**:α-β剪枝提升搜索效率,仅考虑已有棋子周围2格范围 +- **评分系统**:活四(100000分)、冲四(10000分)、活三(5000分)等分级评估 +- **位置奖励**:中心位置价值更高的启发式评估 -### 🎯 课上代码练习/ -课堂实践代码,包含基础练习和项目实战: +**技术实现**: +- **核心函数**:ai_move()决策、evaluate_pos()评估、dfs()搜索 +- **数据结构**:ChessPattern结构体记录棋型信息 +- **复盘系统**:完整记录每一步落子,支持逐步回放 -#### 基础练习(1.1.1 - 1.1.7) -- C语言初识 -- 数值处理(最大值、求和) -- 字符函数应用 -- 大小写转换 -- 条件判断 -- BMI计算器 +详细技术文档请查看:[五子棋AI项目完整文档](课上代码练习/五子棋/README.md) -#### 🎮 五子棋项目 -完整的五子棋人机对战系统,技术特点: -- **AI算法**:α-β剪枝优化的极小极大算法 -- **棋盘支持**:5x5到25x25可调尺寸 -- **智能评估**:完整的棋型评估系统 -- **游戏功能**:复盘系统、胜负判断 -- **用户体验**:清晰的界面显示 +### 📊 数据结构/ - 算法基础实现 +专注于基础数据结构的C语言实现,理论与实践相结合: -详细文档请查看:[五子棋项目README](课上代码练习/五子棋/README.md) +**核心内容**: +- **线性表**:数组基础操作和内存管理 +- **动态结构**:结构体封装的数据操作 +- **算法实现**:插入、删除、查找的时间复杂度分析 -### 📝 草稿/ -临时代码和实验性代码: -- 测试代码片段 -- 算法草稿 -- 文档模板 +**实现特色**: +- **内存安全**:完善的边界检查和错误处理 +- **用户交互**:友好的输入验证和错误提示 +- **代码组织**:模块化设计和函数封装 +- **交互界面**:完整的命令行菜单系统 + +**学习价值**: +- 掌握基本数据结构的实现原理 +- 理解算法的时间复杂度和空间复杂度 +- 培养安全编程和错误处理的意识 +- 为后续学习高级数据结构打下基础 + +详细学习指南请查看:[数据结构学习文档](数据结构/README.md) ## 技术栈 @@ -149,22 +125,93 @@ gcc "五子棋 copy 3.c" -o gomoku -lm ## 学习路径建议 -### 🔰 初学者路径 -1. **基础语法**:从翁凯C语言第1-3章开始 -2. **函数理解**:学习第4章函数概念 -3. **数组掌握**:重点练习第5章数组操作 -4. **指针突破**:深入理解第6章指针概念 +### 🔰 初学者路径(建议学习时间:2-3个月) -### 🚀 进阶路径 -1. **字符串处理**:第7章字符串操作 -2. **数据结构**:第8章结构体和第13章链表 -3. **文件操作**:第10章文件处理 -4. **项目实战**:五子棋AI项目 +**第一阶段:基础语法掌握(2-3周)** +1. **翁凯C语言第1-3章**:从Hello World到数据类型 + - 重点关注:变量定义、运算符、控制结构 + - 实践建议:每个代码文件都要亲自编译运行 + - 学习笔记:仔细阅读代码中的详细注释 -### 💡 高级应用 -1. **位运算优化**:第11章位操作 -2. **动态内存**:第12章可变数组 -3. **程序架构**:第9章大型程序设计 +**第二阶段:核心概念突破(3-4周)** +2. **函数理解**:翁凯C语言第4章 + - 📝 重点文件:`函数的定义和使用.c`(包含详细学习笔记) + - 理解函数的封装思想和参数传递机制 +3. **数组掌握**:翁凯C语言第5章 + - 📝 重点文件:`数组的例子:冒泡排序.c`(深入分析算法思维) + - 掌握一维、二维数组的操作方法 +4. **指针突破**:翁凯C语言第6章 + - 📝 重点文件:`指针变量:记录地址的变量.c`(系统性指针概念解析) + - 这是C语言的核心难点,需要多练习和理解 + +**第三阶段:基础实践(1-2周)** +5. **课上代码练习**:基础练习模块 + - 完成C语言初识到BMI计算器的所有练习 + - 巩固前面学到的语法和概念 + +### 🚀 进阶路径(建议学习时间:2-3个月) + +**第一阶段:高级特性学习(3-4周)** +1. **字符串处理**:翁凯C语言第7章 + - 📝 重点文件:`字符串.c`(C语言字符串本质深度剖析) + - 掌握字符串的本质和标准库函数 +2. **结构体应用**:翁凯C语言第8章 + - 📝 重点文件:`结构类型.c`(结构体完整知识体系) + - 理解自定义数据类型的重要性 +3. **程序结构**:翁凯C语言第9章 + - 📝 重点文件:`宏定义.c`(预处理器工作原理深度解析) + - 学习大型程序的组织方法 + +**第二阶段:数据结构基础(2-3周)** +4. **数据结构模块**: + - 学习线性表的基本操作 + - 理解时间复杂度和空间复杂度 + - 掌握安全编程和错误处理 +5. **动态数据结构**:翁凯C语言第12-13章 + - 可变数组和链表的实现 + - 动态内存管理 + +**第三阶段:文件和位运算(1-2周)** +6. **文件操作**:翁凯C语言第10章 + - 📝 重点文件:`文件输入输出.c`(文件操作标准模式) +7. **位运算优化**:翁凯C语言第11章 + - 理解底层数据表示和操作 + +### 💡 高级应用路径(建议学习时间:1-2个月) + +**项目实战阶段** +1. **五子棋AI项目**: + - **算法学习**:理解α-β剪枝和极小极大算法 + - **系统设计**:学习复杂项目的架构设计 + - **代码优化**:掌握搜索算法的优化技巧 + - **调试技能**:培养大型项目的调试能力 + +**深度学习建议** +2. **算法优化**: + - 研究五子棋AI的评估函数设计 + - 学习搜索算法的剪枝策略 + - 理解启发式算法的应用 +3. **系统编程**: + - 深入理解内存管理 + - 学习程序性能优化 + - 掌握跨平台编程技巧 + +### 📚 学习资源推荐 + +**在线课程**: +- [翁凯老师C语言MOOC课程](https://www.icourse163.org/course/ZJU-199001) +- 配合本代码库的详细学习笔记一起学习 + +**学习工具**: +- **编译器**:GCC或Visual Studio Code + C/C++扩展 +- **调试工具**:GDB调试器,VS Code内置调试功能 +- **在线练习**:牛客网、LeetCode(C语言版本) + +**学习方法**: +- **理论与实践结合**:每学一个概念都要编写代码验证 +- **笔记整理**:参考代码中的详细注释,整理自己的学习笔记 +- **项目驱动**:通过完整项目(如五子棋)来综合运用所学知识 +- **循序渐进**:不要跳跃式学习,每个阶段都要扎实掌握 ## 代码特色 @@ -186,34 +233,161 @@ gcc "五子棋 copy 3.c" -o gomoku -lm ## 项目亮点 -### 🎯 五子棋AI系统 -- **智能对战**:实现了具有挑战性的AI对手 -- **算法优化**:使用α-β剪枝提升搜索效率 -- **完整功能**:包含复盘、胜负判断等完整游戏体验 +### 📝 详细学习笔记体系 +- **130+个代码文件**:每个文件都包含详细的学习笔记和概念解析 +- **重点文件标注**:📝标记的文件包含特别详细的学习笔记 +- **概念深度解析**:将抽象概念用具体代码和注释进行详细说明 +- **学习路径清晰**:从基础语法到高级应用的完整知识体系 +- **实践价值高**:笔记内容结合实际编程经验和技巧 -### 📚 完整学习体系 -- **循序渐进**:从基础到高级的完整学习路径 -- **实战结合**:理论学习与项目实践相结合 -- **代码质量**:注重代码规范和最佳实践 +### 🎯 五子棋AI算法系统 +- **高级算法实现**:α-β剪枝优化的极小极大算法(3层搜索深度) +- **智能评估系统**:活四(100000分)、冲四(10000分)等分级评估 +- **搜索优化策略**:仅考虑已有棋子周围2格范围,中心位置奖励 +- **完整游戏功能**:复盘系统、胜负判断、平局检测 +- **技术文档详尽**:包含算法流程图、核心函数说明、实现细节 + +### 📊 数据结构实践基础 +- **理论实践结合**:基础数据结构的完整C语言实现 +- **安全编程示范**:完善的边界检查和错误处理机制 +- **交互系统完整**:友好的命令行界面和输入验证 +- **学习价值突出**:为后续学习高级数据结构和算法打下坚实基础 + +### 🚀 完整学习生态系统 +- **循序渐进**:从基础语法→核心概念→高级特性→项目实战的完整路径 +- **多维度学习**:理论学习、代码实践、项目开发、算法优化全覆盖 +- **代码质量高**:统一的编码规范、详细的注释、完整的错误处理 +- **实用性强**:每个模块都有明确的学习目标和实际应用价值 ## 使用说明 -1. **克隆仓库**: - ```bash - git clone https://github.com/LHY0125/Learn_C.git - cd Learn_C - ``` +### 📥 获取代码库 +```bash +git clone https://github.com/LHY0125/Learn_C.git +cd Learn_C +``` -2. **选择学习内容**: - - 基础学习:进入`翁凯C语言/`对应章节 - - 项目实战:进入`课上代码练习/五子棋/` - - 快速练习:查看`课上代码练习/`基础练习 +### 📚 学习模块使用指南 -3. **编译运行**: - ```bash - gcc 文件名.c -o 输出名 - ./输出名 - ``` +#### 1. 翁凯C语言系统学习 +```bash +# 进入翁凯C语言目录 +cd 翁凯C语言/ + +# 按章节学习,例如学习第4章函数 +cd 4/ +gcc "函数的定义和使用.c" -o function_demo +./function_demo + +# 查看学习笔记(重点推荐) +# 📝 标记的文件包含详细学习笔记,建议优先学习 +``` + +**学习建议**: +- 按照第1-13章的顺序逐步学习 +- 重点关注📝标记的文件,包含详细学习笔记 +- 每个代码文件都要亲自编译运行 +- 仔细阅读代码中的注释和概念解析 + +#### 2. 五子棋AI项目实战 +```bash +# 进入五子棋项目目录 +cd 课上代码练习/五子棋/ + +# 编译最新版本(推荐) +gcc "五子棋 copy 3.c" -o gomoku -lm + +# 运行游戏 +./gomoku + +# 游戏操作说明: +# 1. 输入棋盘尺寸(5-25,默认15) +# 2. 玩家输入坐标格式:行 列(如"8 8") +# 3. AI自动计算最佳落子位置 +# 4. 游戏结束后可选择查看完整复盘 +``` + +**技术学习重点**: +- 理解α-β剪枝算法的实现原理 +- 学习棋型评估系统的设计思路 +- 掌握搜索算法的优化策略 +- 研究AI决策函数的实现细节 + +#### 3. 数据结构基础实践 +```bash +# 进入数据结构目录 +cd 数据结构/ + +# 编译数组操作程序 +gcc "结构体实现插入元素.c" -o array_operations + +# 运行交互式程序 +./array_operations + +# 程序功能: +# - 动态数组插入操作 +# - 元素删除功能 +# - 数组查找操作 +# - 数组遍历显示 +# - 安全输入验证 +``` + +**学习重点**: +- 理解线性表的基本操作实现 +- 掌握时间复杂度和空间复杂度分析 +- 学习安全编程和错误处理技巧 +- 培养模块化设计思维 + +#### 4. 课堂基础练习 +```bash +# 进入课上代码练习目录 +cd 课上代码练习/ + +# 编译基础练习(以BMI计算器为例) +gcc "1.1.7 BMI.c" -o bmi_calculator +./bmi_calculator +``` + +### 🛠️ 编译说明 + +#### 基本编译命令 +```bash +# 单文件编译 +gcc filename.c -o output + +# 需要数学库的程序(如五子棋) +gcc filename.c -o output -lm + +# 调试模式编译 +gcc -g filename.c -o output +``` + +#### 常见编译问题解决 +```bash +# 中文编码问题(Windows) +gcc -fexec-charset=GBK filename.c -o output + +# UTF-8编码(推荐) +gcc -finput-charset=UTF-8 -fexec-charset=UTF-8 filename.c -o output +``` + +### 📖 学习路径推荐 + +**初学者(0基础)**: +1. 翁凯C语言第1-3章(基础语法) +2. 课上代码练习基础模块(巩固练习) +3. 翁凯C语言第4-6章(核心概念) +4. 数据结构基础实践(理解数据结构) + +**有基础学习者**: +1. 翁凯C语言第7-9章(高级特性) +2. 翁凯C语言第10-13章(专业应用) +3. 五子棋AI项目(算法实战) + +**进阶学习者**: +1. 深入研究五子棋AI算法优化 +2. 扩展数据结构实现(栈、队列、树等) +3. 参与开源项目贡献 ## 贡献指南 @@ -231,7 +405,7 @@ gcc "五子棋 copy 3.c" -o gomoku -lm ## 联系方式 -如有问题或建议,欢迎通过GitHub Issues联系。 +如有问题或建议,欢迎通过[GitHub Issues](https://github.com/LHY0125/Learn_C.git)联系。 --- diff --git a/数据结构/README.md b/数据结构/README.md new file mode 100644 index 0000000..613d415 --- /dev/null +++ b/数据结构/README.md @@ -0,0 +1,65 @@ +# 数据结构学习代码 + +本目录包含数据结构相关的C语言实现代码,专注于基础数据结构的学习和实践。 + +## 📁 文件列表 + +### 核心实现 +- `数组.c` - 数组基础操作实现 +- `结构体实现插入元素.c` - 基于结构体的动态数组实现 + - 包含插入、删除、查找等基本操作 + - 实现了安全的输入验证机制 + - 提供交互式命令行界面 + +### 可执行文件 +- `array_operations.exe` - 编译后的数组操作程序 + +### 记录文件 +- `records/` - 程序运行记录和测试数据 + +## 🎯 学习重点 + +### 数据结构概念 +- **线性表**:数组的基本操作和内存管理 +- **动态结构**:结构体封装的数据操作 +- **算法实现**:插入、删除、查找的时间复杂度分析 + +### 编程技巧 +- **内存安全**:边界检查和错误处理 +- **用户交互**:输入验证和友好的错误提示 +- **代码组织**:模块化设计和函数封装 + +## 🚀 快速开始 + +### 编译运行 +```bash +# 编译数组操作程序 +gcc 结构体实现插入元素.c -o array_operations + +# 运行程序 +./array_operations +``` + +### 功能特性 +- ✅ 动态数组插入操作 +- ✅ 元素删除功能 +- ✅ 数组查找操作 +- ✅ 数组遍历显示 +- ✅ 安全输入验证 +- ✅ 交互式菜单系统 + +## 📚 学习建议 + +1. **理论结合实践**:先理解数据结构的理论概念,再通过代码实现加深理解 +2. **逐步深入**:从基础的数组操作开始,逐步学习更复杂的数据结构 +3. **注重效率**:关注算法的时间复杂度和空间复杂度 +4. **安全编程**:重视边界检查和错误处理的重要性 + +## 🔗 相关资源 + +- [GitHub仓库](https://github.com/LHY0125/Learn_C.git) +- 更多C语言学习资源请参考上级目录的翁凯C语言教程 + +--- + +> 💡 **提示**:数据结构是编程的基础,掌握好基本的数据结构对后续学习算法和系统设计都非常重要。 \ No newline at end of file diff --git a/数据结构/array_operations.exe b/数据结构/array_operations.exe deleted file mode 100644 index be59a4189b8290831dc1b35c28cdec02245fc11c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62270 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 diff --git a/数据结构/结构体实现插入元素.c b/数据结构/结构体实现插入元素.c index 41d2b17..3342daa 100644 --- a/数据结构/结构体实现插入元素.c +++ b/数据结构/结构体实现插入元素.c @@ -74,17 +74,17 @@ int getInput(const char *prompt, int min, int max) { int value; char buffer[100]; - + while (1) { printf("%s", prompt); - + if (fgets(buffer, sizeof(buffer), stdin) != NULL) { // 尝试解析整数 char *endptr; value = strtol(buffer, &endptr, 10); - + // 检查是否为有效整数 if (endptr != buffer && (*endptr == '\n' || *endptr == '\0')) { @@ -165,15 +165,15 @@ int main(void) switch (choice) { case 1: // 插入元素 - { - char prompt[100]; - sprintf(prompt, "请输入要插入的位置 (0-%d): ", myArray.size); - position = getInput(prompt, 0, myArray.size); - value = getInput("请输入要插入的值 (-1000到1000): ", -1000, 1000); - insert(&myArray, position, value); - printf("插入操作完成!\n"); - } - break; + { + char prompt[100]; + sprintf(prompt, "请输入要插入的位置 (0-%d): ", myArray.size); + position = getInput(prompt, 0, myArray.size); + value = getInput("请输入要插入的值 (-1000到1000): ", -1000, 1000); + insert(&myArray, position, value); + printf("插入操作完成!\n"); + } + break; case 2: // 查找元素 value = getInput("请输入要查找的值 (-1000到1000): ", -1000, 1000); @@ -189,19 +189,19 @@ int main(void) break; case 3: // 删除元素 + { + if (myArray.size == 0) { - if (myArray.size == 0) - { - printf("错误:数组为空,无法删除元素!\n"); - break; - } - char prompt[100]; - sprintf(prompt, "请输入要删除的位置 (0-%d): ", myArray.size - 1); - position = getInput(prompt, 0, myArray.size - 1); - delete(&myArray, position); - printf("删除操作完成!\n"); + printf("错误:数组为空,无法删除元素!\n"); + break; } - break; + char prompt[100]; + sprintf(prompt, "请输入要删除的位置 (0-%d): ", myArray.size - 1); + position = getInput(prompt, 0, myArray.size - 1); + delete(&myArray, position); + printf("删除操作完成!\n"); + } + break; case 4: // 打印数组 printf("当前数组: "); diff --git a/翁凯C语言/README.md b/翁凯C语言/README.md new file mode 100644 index 0000000..a70370e --- /dev/null +++ b/翁凯C语言/README.md @@ -0,0 +1,282 @@ +# 翁凯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 - 数组赋值方法:详细说明了直接赋值和循环赋值两种方式 + > - 重要提醒:数组不能像普通变量一样直接赋值 +- `数组的例子:素数.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编码 \ No newline at end of file