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

13 KiB
Raw Blame History

翁凯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 <名字> <值>,注意没有结尾的分号
    • 工作原理:预处理器在编译正式开始之前进行全文本替换
    • 替换规则:包括函数名在内的所有匹配都会被替换
    • 多行宏:值超过一行时,行末需要用\连接
    • 预定义宏:LINEFILEDATETIME、__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语言知识体系,这些笔记不仅帮助当时的学习,更成为了日后复习和深化的宝贵资源

推荐学习资源

翁凯老师网课链接

学习工具推荐

  • 编译器:推荐使用GCC或Visual Studio Code + C/C++扩展
  • 调试工具:GDB调试器,VS Code内置调试功能
  • 在线编程C语言网牛客网

学习时间安排建议

  • 初学者:建议每天1-2小时,完整学完需要2-3个月
  • 有编程基础:可以加快进度,重点关注C语言特有的概念如指针
  • 复习巩固:定期回顾之前的章节,温故而知新

常见问题解答

  1. Q: 指针太难理解怎么办? A: 多画内存图,理解地址和值的关系,从简单的例子开始

  2. Q: 程序编译出错怎么办? A: 仔细阅读错误信息,检查语法错误,注意分号、括号匹配

  3. Q: 如何提高编程能力? A: 多练习,多思考,尝试解决实际问题,参与编程竞赛

编译运行

# 编译单个文件
gcc filename.c -o output

# 运行程序
./output

注意事项

  • 部分代码可能需要在特定的编译器环境下运行
  • 建议使用GCC编译器进行编译
  • 注意中文编码问题,建议使用UTF-8编码