# 翁凯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编码