出版者的话
译者序
序
前言
第一部分 计算机存储:内存和文件
第1章 程序的执行 2
1.1 编译 2
1.2 重定向输出 6
第2章 栈内存 7
2.1 值和地址 7
2.2 栈 8
2.3 调用栈 9
2.3.1 返回位置 9
2.3.2 函数实参 12
2.3.3 局部变量 14
2.3.4 值地址 15
2.3.5 数组 16
2.3.6 获取地址 17
2.4 可见度 17
2.5 习题 20
2.5.1 绘制调用栈I 20
2.5.2 绘制调用栈II 20
2.5.3 地址 21
2.6 习题解答 21
2.6.1 绘制调用栈I 21
2.6.2 绘制调用栈II 22
2.6.3 地址 22
2.7 在DDD(命令行调试程序)上检测调用栈 22
第3章 预防、检测及消除bug 26
3.1 开发软件≠编码 26
3.1.1 编程前 26
3.1.2 编程中 27
3.1.3 编程后 28
3.2 常见错误 28
3.2.1 未初始化变量 28
3.2.2 错误数组下标 28
3.2.3 错误数据类型 28
3.3 后执行式和交互式调试 28
3.4 生产代码与测试代码分离 29
第4章 指针 30
4.1 作用域 30
4.2 swap函数 31
4.3 指针 33
4.4 再论swap函数 37
4.5 类型错误 39
4.6 数组和指针 40
4.7 类型规则 43
4.8 指针运算 44
4.9 习题 47
4.9.1 swap函数1 47
4.9.2 swap函数2 48
4.9.3 swap函数3 48
4.9.4 swap函数4 48
4.9.5 swap函数5 49
4.9.6 15 552种变化 49
4.10 习题解答 50
4.10.1 swap函数1 50
4.10.2 swap函数2 50
4.10.3 swap函数3 51
4.10.4 swap函数4 51
4.10.5 swap函数5 51
第5章 编写和测试程序 52
5.1 不同的数组元素 52
5.1.1 main函数 52
5.1.2 areDistinct函数 53
5.1.3 编译和链接 54
5.1.4 make工具 55
5.2 使用Makefile测试 57
5.2.1 生成测试用例 58
5.2.2 重定向输出 58
5.2.3 使用diff去比较输出 58
5.2.4 添加测试到Makefile 59
5.3 无效的内存访问 60
5.4 使用valgrind检查内存访问错误 62
5.5 测试覆盖 64
5.6 限制内核大小 67
5.7 带有死循环的程序 67
第6章 字符串 69
6.1 字符数组 69
6.2 C语言中的字符串函数 72
6.2.1 复制函数:strcpy 72
6.2.2 比较函数:strcmp 73
6.2.3 寻找子字符串函数:strstr 73
6.2.4 寻找字符函数:strchr 74
6.3 理解argv 74
6.4 对子字符串计数 77
第7章 编程问题和调试 80
7.1 实现字符串函数 80
7.1.1 C语言库 80
7.1.2 头文件 80
7.1.3 mystring.h 82
7.1.4 创建输入和正确输出 82
7.1.5 Makefile 86
7.1.6 mystring.c 86
7.1.7 使用const 88
7.2 调试 89
7.2.1 找到死循环 90
7.2.2 找到无效内存访问 91
7.2.3 检测无效内存访问 92
第8章 堆内存 94
8.1 用malloc函数创建数组 94
8.2 栈和堆 96
8.3 返回堆地址的函数 98
8.4 C语言中的二维数组 99
8.5 指针和参数 101
第9章 使用堆内存的编程问题 104
9.1 对数组排序 104
9.1.1 生成测试输入和期望输出 104
9.1.2 重定向输入 105
9.1.3 整数排序 107
9.1.4 使用valgrind检测内存泄漏 110
9.2 使用qsort进行排序 111
9.2.1 qsort 111
9.2.2 比较函数 112
9.2.3 执行范例 114
9.2.4 对字符串排序 115
第10章 读写文件 118
10.1 通过argv传递一个文件名 118
10.2 读取文件 119
10.2.1 读取字符型:fgetc 119
10.2.2 读取整型:fscanf(...%d...) 121
10.3 写入文件 123
10.4 读写字符串 125
第11章 编程解决使用文件的问题 128
11.1 对文件中的整数进行排序 128
11.2 计算字符出现的次数 130
11.3 计算单词出现的次数 132
11.4 如何注释程序 134
第二部分 递归
第12章 递归 138
12.1 在限制条件下选取小球 138
12.1.1 双色球问题 138
12.1.2 三色球问题 139
12.1.3 附加限制条件 140
12.2 单行道 142
12.3 汉诺塔 143
12.4 计算整数分拆 145
12.4.1 计算“1”的个数 147
12.4.2 仅使用奇数进行分拆 148
12.4.3 使用递增数进行分拆 148
12.4.4 交替使用奇偶数进行分拆 149
12.4.5 整数分拆问题的推广 151
12.4.6 解决分拆问题的错误方法 151
第13章 递归函数 152
13.1 在限制条件下选取小球 152
13.2 单行道 155
13.3 汉诺塔 156
13.4 整数分拆 158
13.5 阶乘 159
13.6 斐波那契数列 161
13.7 利用gprof进行性能分析 165
第14章 整数分拆 167
14.1 堆内存和栈内存 168
14.2 追踪递归函数调用 176
14.3 约束条件下的分拆 178
14.3.1 仅使用奇数进行分拆 179
14.3.2 使用递增数进行分拆 179
14.3.3 交替使用奇偶数进行分拆 180
14.3.4 使用gprof和gcov查找性能瓶颈 180
第15章 使用递归解决问题 187
15.1 二分搜索 187
15.2 快速排序 189
15.3 排列组合 195
15.4 栈排序 198
15.4.1 例子1 199
15.4.2 例子2 199
15.4.3 例子3 199
15.4.4 例子4 199
15.4.5 可排序栈 200
15.5 追踪递归函数 203
15.6 一个存在错误的递归函数 205
第三部分 结构
第16章 程序员可定义数据类型 208
16.1 结构体和对象 208
16.2 作为实参传递对象 212
16.3 对象和指针 214
16.3.1 返回一个对象 216
16.3.2 对象和malloc 216
16.4 构造函数和析构函数 218
16.5 结构中的结构 224
16.6 二进制文件和对象 226
第17章 使用结构的编程问题 230
17.1 个人信息库排序 230
17.2 压缩十进制数位 235
17.2.1 数制 235
17.2.2 用1字节表达2个十进制数位 236
17.2.3 位运算 236
17.2.4 压缩和恢复十进制 239
17.2.5 十进制压缩编程 239
17.3 二进制文件和指针 243
第18章 链表 245
18.1 可扩展类型 245
18.2 链表 246
18.3 链表的插入 246
18.4 链表的查找 248
18.5 从链表中删除 249
18.6 打印链表 252
18.7 链表的销毁 253
第19章 使用链表的编程问题 256
19.1 队列 256
19.2 数字排序 256
19.3 稀疏数组 257
19.4 单链表反转 262
第20章 二叉搜索树 264
20.1 二叉搜索树 265
20.2 二叉搜索树的插入 266
20.3 二叉搜索树的搜索 269
20.4 二叉搜索树的遍历 269
20.5 二叉搜索树的删除 272
20.6 二叉搜索树的销毁 274
20.7 主函数main 274
20.8 链接器Makefike 275
20.9 不同的二叉树结构 275
第21章 线程并行编程 278
21.1 并行编程 278
21.2 多任务处理 278
21.3 POSIX线程 279
21.4 子集和 280
21.4.1 生成测试实例 281
21.4.2 字典顺序处理 283
21.4.3 多线程处理 287
21.5 多线程处理过程的交叉运行 289
21.6 线程同步 293
21.7 阿姆达尔定律 295
第四部分 应用
第22章 寻找迷宫出口 298
22.1 迷宫的文件格式 298
22.2 读取迷宫文件 299
22.3 迷宫结构体 303
22.4 逃跑策略 306
22.5 策略的实现 308
22.5.1 canMove函数 308
22.5.2 getOut函数 309
22.5.3 打印访问过的位置 313
第23章 图像处理 316
23.1 图像结构体 316
23.2 图像处理 321
23.2.1 图像像素和颜色 321
23.2.2 处理函数 322
23.2.3 应用一个颜色滤波器 322
23.2.4 图像颜色反转 324
23.2.5 边缘检测 324
23.2.6 颜色均衡 326
第24章 霍夫曼压缩 329
24.1 例程 329
24.2 编码 330
24.2.1 计算频率 330
24.2.2 按频率排序 332
24.2.3 构建编码树 334
24.2.4 创建编码本 342
24.2.5 压缩文件 346
24.2.6 位压缩 349
24.3 解码 353
附录A Linux 370
附录B 版本控制 373
附录C 集成开发环境 376
索引 385
· · · · · · (
收起)