第一部分 轻松入门 2
第1章 C语言编程环境搭建 2
1.1 编程工具选择 2
1.2 Dev-C++工具的下载与安装 2
1.3 创建一个C文件 5
1.4 编译一个C文件 7
1.5 改变字体大小的设置 9
第2章 初识C语言 11
2.1 掀起C语言的盖头来 11
2.2 写给女朋友的一封情诗 14
2.3 送你一束玫瑰花 14
2.4 绚丽的动画——女朋友数玫瑰 16
2.5 小结 19
2.6 练习 19
第3章 减少重复操作——循环语句 21
3.1 循环的描述——循环三要素 21
3.2 帮你计数的人——循环变量 22
3.2.1 变量的定义 22
3.2.2 变量的输出 23
3.3 循环是否达到终值 23
3.3.1 比较运算符 23
3.3.2 逻辑运算符 24
3.4 时刻变化着的循环——循环增量 25
3.5 三种循环语句 25
3.5.1 for循环语句 25
3.5.2 while循环语句 26
3.5.3 do-while循环语句 26
3.6 女朋友数玫瑰——循环版 27
3.7 几何图形有学问 29
3.7.1 实心长方形 29
3.7.2 空心长方形 30
3.7.3 直角三角形 31
3.7.4 菱形 31
3.8 数列求和也容易 32
3.9 送你999朵玫瑰花 33
3.10 三种循环语句的区别 36
3.11 死循环的各种写法 37
3.12 循环中的特殊情况——continue、break与goto 38
3.13 小结 40
3.14 练习 42
第4章 分情况处理——分支语句 43
4.1 爱情心理测试介绍 43
4.2 输入函数 43
4.3 分支语句 44
4.4 爱情心理测试 46
4.4.1 单次测试版 46
4.4.2 循环测试版 47
4.4.3 循环版本的问题 49
4.5 测测女朋友值多少钱 49
4.6 猜数游戏 52
4.7 猜数游戏的问题——随机数种子 53
4.8 石头剪刀布——猜拳游戏 54
4.8.1 单局猜拳游戏 54
4.8.2 多局猜拳游戏 55
4.9 多路开关好处多——switch语句 57
4.10 switch语句的运行过程 60
4.11 if-else语句的运行过程 62
4.12 年龄的秘密 65
4.13 小结 69
4.14 练习 70
第5章 制造自己的工具——函数 72
5.1 内容变化的重复 72
5.2 工欲善其事,必先利其器——函数的概念 73
5.3 造一把利器——函数的定义 74
5.4 女朋友数玫瑰——函数版 75
5.5 取回新产品——函数的返回值 76
5.6 函数注意事项 78
5.7 有用的定位函数 79
5.8 小球横向滚动 80
5.9 小球弹跳游戏 83
5.9.1 游戏界面绘制 83
5.9.2 小球移动反向逻辑 85
5.10 全局变量与局部变量 86
5.11 修改小球弹跳的速度 87
5.12 两个小球弹跳游戏 88
5.12.1 重复代码实现方式 88
5.12.2 函数版本实现方式 90
5.13 函数参数的传递机制 92
5.13.1 函数参数的值传递机制 92
5.13.2 程序调试(debug) 93
5.13.3 指针的概念 97
5.13.4 指针做函数参数 97
5.13.5 指针总结 99
5.14 小结 100
5.15 练习 101
第6章 封装相关数据——结构体 103
6.1 结构体的概念 103
6.2 小球弹跳的结构体版本 105
6.3 掷骰子游戏 106
6.3.1 游戏介绍与分析 106
6.3.2 画骰子边框 107
6.3.3 画骰子点数 107
6.3.4 画出骰子并提示玩家输入选择 109
6.3.5 骰子跳动与输赢判断 110
6.4 100个小球弹跳 112
6.4.1 数组的概念 112
6.4.2 100个小球弹跳 113
6.5 小结 114
6.6 练习 115
第7章 组合类型比较——数组与结构体 116
7.1 数组与结构体的区别 116
7.2 数组的常用操作 118
7.2.1 遍历数组 118
7.2.2 数组元素累加 118
7.2.3 数组添加元素 118
7.2.4 数组删除元素 119
7.2.5 寻找数组的最值 119
7.2.6 冒泡排序 120
7.2.7 冒泡排序改进 122
7.2.8 选择排序 122
7.3 猴子选大王 123
7.4 全民打飞机 125
7.4.1 游戏界面开发 125
7.4.2 画飞机 127
7.4.3 飞机移动 127
7.4.4 键盘操控飞机 128
7.4.5 设计子弹 129
7.4.6 子弹产生与消失 130
7.4.7 怪物的产生与消失 132
7.4.8 碰撞检测 134
7.5 小结 136
7.6 练习 136
第8章 数组的数组——二维数组 138
8.1 二维数组的概念 138
8.2 二维数组的初始化 139
8.3 一份成绩单 140
8.4 螺旋矩阵 141
8.5 练眼力 144
8.6 井字棋 146
8.6.1 游戏介绍与界面搭建 146
8.6.2 棋子信息存储 147
8.6.3 下棋逻辑设计 147
8.6.4 判断游戏结束逻辑 148
8.6.5 判断输赢逻辑 149
8.6.6 手动下棋操作 150
8.6.7 智能自动下棋逻辑 152
8.7 男女的婚姻匹配问题 153
8.7.1 问题描述 153
8.7.2 数据存储于初始化 154
8.7.3 算法描述 155
8.7.4 main函数实现 157
8.8 小结 158
8.9 练习 158
第9章 无处不在的字符串 160
9.1 字符串的概念 160
9.2 字符串的常用操作 161
9.3 字符串反转 163
9.4 字符串压缩算法 164
9.4.1 压缩逻辑设计 164
9.4.2 整数转字符串 165
9.5 删除重复字符 167
9.5.1 普通删除法 167
9.5.2 快速删除法 168
9.6 测测你的名字在古代是什么职位 169
9.7 自定义字符串的常用操作 170
9.8 小结 172
9.9 练习 172
第二部分 知识进阶 177
第10章 数据类型与变量 177
10.1 变量的定义与初始化 177
10.2 变量的大小 177
10.3 更多数据类型 178
10.4 各种类型的范围 179
10.5 变量在内存中的样子 180
10.6 类型的相互转换 181
10.7 数组变量及其大小 183
10.8 结构体变量及其大小 183
10.8.1 字符变量与int型变量在内存中的对齐方式 184
10.8.2 字符变量与double型变量在内存中的对齐方式 185
10.8.3 结构体内部变量的对齐方式 186
10.8.4 结构体的大小必须是最大对齐模数的整数倍 188
10.8.5 嵌套结构体的大小 189
10.8.6 结构体大小计算法则 190
10.9 指针变量及其大小 190
10.10 枚举变量及其大小 191
10.11 共用体变量及其大小 192
10.12 小结 194
10.13 练习 195
第11章 运算符 197
11.1 各种运算符 197
11.2 优先级与结合性 198
11.3 i++与++i 199
11.4 逻辑运算符的短路特性 200
11.5 位运算符 201
11.5.1 位运算符介绍 201
11.5.2 位运算符的应用 202
11.5.3 位运算与枚举类型 204
11.5.4 位段及其好处 205
11.5.5 位操作与位段综合应用 208
11.5.6 位段与共用体的综合应用 212
11.6 小结 213
11.7 练习 213
第12章 指针 215
12.1 指针是什么 215
12.2 各种类型指针 216
12.2.1 基本类型变量的指针 216
12.2.2 结构体变量的指针 216
12.2.3 共用体变量的指针 217
12.2.4 数组的指针 217
12.2.5 函数的指针 217
12.2.6 指针的指针 218
12.2.7 void指针 218
12.3 指针的运算 219
12.3.1 指针只能与整数做加减运算 219
12.3.2 相同类型的指针可以做减法与比较运算 221
12.4 指针与数组 221
12.4.1 数组名是一个指针 221
12.4.2 数组名与数组地址的区别 222
12.4.3 数组做函数参数就转化为指针 223
12.5 指针与字符串 225
12.6 指针与函数 226
12.6.1 函数指针 226
12.6.2 函数指针数组 227
12.6.3 指针作为函数参数 227
12.6.4 返回指针值的函数 228
12.7 指针与const修饰词 229
12.7.1 const修饰普通变量 229
12.7.2 const修饰指针变量 229
12.7.3 const修饰函数的形参 230
12.7.4 const与面试题 230
12.8 指针与链表 231
12.8.1 链表的概念 231
12.8.2 链表的构造 232
12.8.3 链表遍历 232
12.8.4 插入节点 233
12.8.5 删除节点 234
12.8.6 链表反转 236
12.8.7 遍历一次链表找到链表的中间元素 236
12.9 小结 237
12.10 练习 237
第13章 C程序是怎么使用内存的 241
13.1 程序的运行过程 241
13.2 全局变量 243
13.3 静态变量 246
13.4 字符常量 248
13.5 动态内存管理 249
13.5.1 malloc进行动态内存分配 249
13.5.2 把英文句子按单词反转 250
13.5.3 ealloc进行动态内存分配 253
13.5.4 realloc进行动态内存分配 254
13.5.5 可变长数组 255
13.5.6 malloc与free的基本原理 256
13.6 C程序运行的4个内存区域 257
13.7 递归函数与栈 258
13.7.1 递归函数的定义 258
13.7.2 递归函数的运行过程 259
13.7.3 递归函数的应用——全排列 260
13.7.4 递归函数的应用——快速排序法 262
13.8 小结 264
13.9 练习 264
第14章 编译预处理 268
14.1 C程序的编译过程 268
14.2 头文件中装的是什么 269
14.3 项目分多个文件 271
14.4 include命令 273
14.5 头文件的正规写法 276
14.6 define命令 277
14.6.1 字符串宏替换 277
14.6.2 空宏体的宏 278
14.6.3 宏常量与const常量的区别 278
14.6.4 带参数的宏 279
14.6.5 #define命令的注意事项 279
14.7 条件编译 280
14.8 typedef命令 281
14.9 typedef的定义过程 283
14.10 define与typedef的区别 284
14.11 小结 284
14.12 练习 285
第15章 文件处理 287
15.1 文件与流 287
15.2 访问文本文件 288
15.2.1 打开与关闭文本文件 288
15.2.2 写入文本文件 289
15.2.3 读取文本文件 290
15.2.4 为文件追加内容 291
15.2.5 其他读取文本文件的方法 292
15.2.6 其他写入文本文件的方法 293
15.2.7 文本文件读写的问题 295
15.3 文本文件与二进制文件的区别 295
15.4 块方式读写文件 296
15.5 文件定位与随机读写 297
15.6 随机读写应用 298
15.7 总结 300
15.8 练习 300
第三部分 项目进阶 302
第16章 贪吃蛇 302
16.1 游戏介绍 302
16.2 游戏元素设计 302
16.3 画游戏界面 303
16.4 产生食物 304
16.5 产生蛇 304
16.6 画蛇 305
16.7 游戏逻辑设计 305
16.8 检查方向 306
16.9 蛇游动逻辑 307
16.10 蛇吃食物 308
16.11 游戏结束判断 308
16.12 删除两节蛇的身体 310
16.13 反转蛇的身体 311
16.14 反转蛇的移动方向 311
第17章 俄罗斯方块 313
17.1 游戏介绍 313
17.2 方块设计 313
17.3 打印游戏界面 315
17.4 游戏界面的数据 316
17.5 主函数与头文件 316
17.6 方块的产生 317
17.7 方块的移动 318
17.8 判断方块下方是否有空 319
17.9 判断方块是否到顶部 321
17.10 键盘操控逻辑 322
17.11 左移方块 324
17.12 右移方块 325
17.13 翻转方块 325
17.14 消除方块 327
17.15 计算得分 329
17.16 翻转方块的问题 329
第18章 围住神经猫 332
18.1 游戏介绍 332
18.2 游戏元素设计 333
18.3 初始界面绘制 334
18.4 移动光标进行封堵操作 335
18.5 寻找每个点周围的点 338
18.6 猫随机移动 341
18.7 猫智能移动 343
18.8 广度搜索算法 343
18.9 回溯找猫的位置 345
附录 348