第一部分 C语言 1
第1章 C语言概述 1
1.1 C语言的起源 1
1.2 C是中级语言 1
目录 1
1.3 C是结构化语言 2
1.4 C是面向程序员的语言 4
1.5 编译和解释 4
1.6 C程序结构 5
1.7 库和链接 6
1.8 分别编译 7
1.9 编译C程序 7
1.11 术语 8
1.10 C的内存映象 8
第2章 C表达式 9
2.1 五种基本数据类型 9
2.2 修饰基本类型 9
2.3 标识符命名 10
2.4 变量 11
2.4.1 定义变量的位置 11
2.4.2 局部变量 11
2.4.3 形式参数 14
2.4.4 全局变量 15
2.5 修饰访问类型 16
2.5.1 const 16
2.6 说明存储类型 17
2.5.2 volatile 17
2.6.1 extern 18
2.6.2 static变量 19
2.6.3 register变量 21
2.7 变量初始化 22
2.8 常量 22
2.8.1 16进制和8进制常量 23
2.8.2 串常量 23
2.8.3 反斜线字符常量 23
2.9 操作符 24
2.9.1 赋值操作符 24
2.9.2 赋值中的类型转换 24
2.9.4 算术操作符 25
2.9.3 多重赋值 25
2.9.5 增量和减量 26
2.9.6 关系和逻辑操作符 27
2.9.7 位操作符 29
2.9.8 问号(?)操作符 32
2.9.9 指针操作符&和* 32
2.9.10 编译时操作符sizeof() 33
2.9.11 逗号(,)操作符 34
2.9.12 圆点(·)和箭头(—>)操作符 34
2.9.13 用作操作符的圆括号和方括号 35
2.9.14 优先级小结 35
2.10 表达式 35
2.10.2 表达式中的类型转换 36
2.10.1 求值顺序 36
2.10.3 强制类型转换 37
2.10.4 间隔和括号 37
2.10.5 C的紧凑表达手段 38
第3章 程序控制语句 39
3.1 C的真值和假值 39
3.2 选择语句 39
3.2.1 if 39
3.2.2 嵌套if 40
3.2.3 if-else-if梯次 41
3.2.4 代替if的? 42
3.2.5 条件表达式 44
3.2.6 switch 45
3.2.7 嵌套switch语句 48
3.3 循环语句 48
3.3.1 for循环 48
3.3.2 for循环的变形 49
3.3.3 无限循环 52
3.3.4 无循环体的循环 53
3.3.5 while循环 53
3.3.6 do-whilw循环 55
3.4 跳转语句 55
3.4.1 return语句 56
3.4.2 goto语句 56
3.4.3 break语句 56
3.4.4 exit()函数 57
3.4.5 continue语句 58
3.5 表达式语句 59
3.6 块语句 60
第4章 数组和串 61
4.1 一维数组 61
4.2 指向数组的指针 62
4.3 向函数传一维数组 62
4.4 串 63
4.5 二维数组 65
4.5.1 字符串数组 68
4.6 多维数组 69
4.7 指针的下标操作 69
4.8 数组初始化 71
4.8.1 无尺寸数组初始化 72
4.9 一担挑游戏 73
第5章 指针 76
5.1 什么是指针 76
5.2 指针变量 76
5.3 指针操作符 77
5.4 指针表达式 77
5.4.1 指针赋值 78
5.4.2 指针算术 78
5.4.3 指针比较 79
5.5 指针和数组 80
5.5.1 指针数组 81
5.6 多级间址 82
5.7 指针初始化 83
5.8 函数指针 84
5.9 动态分配函数 86
5.9.1 动态分配的数组 87
5.10 与指针有关的问题 89
第6章 函数 92
6.1 函数的一般形式 92
6.2 函数的作用域规则 92
6.3 函数的变元 93
6.3.1 值调用和引用调用 93
6.3.2 引用调用 94
6.3.3 用数组调用 94
6.4 main()的变元argc和argv 98
6.5 返回语句 100
6.5.1 从函数中返回 100
6.5.2 返回值 101
6.6 返回非整值的函数 102
6.7 函数原型 103
6.8 返回指针 104
6.9 void型函数 105
6.10 main()的返回值 106
6.11 递归 106
6.12 参数类型及数量可变的函数 107
6.13 参数声明的经典方法和现代方法 108
6.15.1 独立文件 109
6.15 库和文件 109
6.14.1 参数和通用程序 109
6.14.2 效率 109
6.14 实现问题 109
6.15.2 库 110
6.15.3 程序文件的最佳大小 110
第7章 结构、联合、枚举和用户定义类型 111
7.1 结构 111
7.1.1 引用结构成员 112
7.1.2 结构赋值 113
7.2 结构数组 113
7.2.1 通信录实例 114
7.3 向函数传递结构 119
7.3.1 向函数传结构成员 119
7.3.2 向函数传全结构 120
7.4 结构指针 121
7.4.1 声明结构指针 121
7.4.2 使用结构措针 121
7.5 结构中的数组和结构 124
7.6 位域 124
7.7 联合 126
7.8 枚举 128
7.9 用sizeof确保可移植性 129
7.10 typedef 130
第8章 控制台I/O 132
8.1 读写字符 132
8.1.2 代替getchar()的函数 133
8.1.1 getchar()的问题 133
8.2 读写串 134
8.3 格式化控制台I/O 136
8.4 printf() 136
8.4.1 打印字符和串 136
8.4.2 打印数值 136
8.4.3 显示地址 138
8.4.4 格式说明符%n 138
8.4.5 格式修饰符 138
8.4.6 最小域宽修饰符 138
8.4.7 精度修饰符 140
8.4.8 对齐输出 140
8.4.9 处理其他数据类型 140
8.5.1 格式说明符 141
8.4.10 修饰符*和# 141
8.5 scanf() 141
8.5.2 输入数值 142
8.5.3 输入无符号整数 142
8.5.4 用scanf()读单字符 142
8.5.5 用scanf()读串 143
8.5.6 输入地址 143
8.5.7 格式符%n 143
8.5.8 使用扫描集合 144
8.5.9 过滤多余空白符 144
8.5.10 控制串中的非空白符 144
8.5.13 忽略输入 145
8.5.12 格式修饰符 145
8.5.11 必须向scanf()传地址 145
第9章 文件I/O 146
9.1 ANSIC的I/O和UNIX C的I/O 146
9.2 C与C++I/O 146
9.3 流和文件 147
9.4 流 147
9.4.1 文本流 147
9.4.2 二进制流 147
9.5 文件 147
9.6 文件系统基础 148
9.6.1 文件指针 148
9.6.2 打开文件 149
9.6.5 读字符 150
9.6.3 关闭文件 150
9.6.4 写字符 150
9.6.6 使用fopen()、getc()、ptuc()和fclose() 151
9.6.7 使用feof() 152
9.6.8 用fputs()和fgets()处理串 153
9.6.9 rewind() 154
9.6.10 ferror() 155
9.6.11 删除文件 156
9.6.12 对流清仓 157
9.7 fread()和fwrite() 157
9.7.1 使用fread()和fwrite() 157
9.8 fseek()和随机存取I/O 162
9.9 fprintf()和fscanf() 163
9.10 标准流 164
9.10.1 控制台和文件I/O的关系 165
9.10.2 用freopen()重定向标准流 165
9.11 类UNIX文件系统 166
9.11.1 open() 167
9.11.2 creat() 167
9.11.3 close() 167
9.11.4 read和write 168
9.11.5 unlink() 169
9.11.6 用lseek()随机存取 169
10.1 C预处理程序 171
10.2 #define 171
第10章 C预处理程序和注释 171
10.2.1 定义类函数宏 172
10.3 #error 173
10.4 #include 173
10.5 条件编译指令 174
10.5.1 #if、#else、#elif和#endif 174
10.5.2 #ifdef和#ifndef 176
10.6 #undef 177
10.7 使用defined 177
10.8 #line 177
10.9 #pragma 178
10.10 预处理操作符#和## 178
10.12 注解 179
10.11 预定义宏 179
第二部分 C标准库 181
第11章 链接、库和首标文件 181
11.1 链接程序 181
11.1.1 分别编译 181
11.1.2 可重定位代码 182
11.1.3 覆盖链接 183
11.1.4 DLL链接 184
11.2 C标准库 184
11.2.1 库和目标码文件 184
11.3 首标文件 185
11.4 重新定义库函数 186
11.3.1 首标文件中的宏 186
第12章 I/O函数 187
第13章 串和字符函数 226
第14章 数学函数 245
第15章 时间、日期和其它与操作系统有关的函数 256
第16章 动态分配函数 290
第17章 显示和图形函数 305
17.1 PC显示模式 305
第18章 杂函数 327
第三部分 算法和应用 347
第19章 排序和查找 347
19.1 排序 347
19.1.1 排序算法的分类 347
19.1.3 气泡浮起排序 348
19.1.2 排序算法的评价 348
19.1.4 选择排序 351
19.1.5 插入排序 352
19.1.6 改进的排序 353
19.1.7 谢尔排序 353
19.1.8 快速排序 355
19.2 选择排序算法 357
19.3 对其它数据结构排序 357
19.3.1 对串排序 357
19.3 2 对结构排序 358
19.4 对随机访问的磁盘文件排序 359
19.5.3 对分查找 362
19.5.2 顺序查找 362
19.5.1 查找方法 362
19.5 查找 362
第20章 队列、堆栈、链表和树 364
20.1 队列 364
20.2 循环队列 368
20.3 堆栈 370
20.4 链表 374
20.5 单向链表 374
20.6 双向链表 378
20.7 通信录实例 382
20.8 二叉树 387
第21章 稀疏数组 394
21.1 链表方法 394
21.2 二叉树方法 397
21.1.1 链表方法的性能分析 397
21.2.1 二叉树方法的性能分析 399
21.3 指针数组方法 399
21.3.1 指针数组方法的性能分析 401
21.4 散列方法 401
24.4.1 散列方法的性能分析 404
21.5 决策 405
第22章 表达式分析和求值 406
22.1 表达式 406
22.2 表达式分解 407
22.3 表达式分析 409
22.4 简单分析程序 410
22.5 能处理变量的分析程序 415
22.6 递归下降分析中的语法检查 421
第23章 人工智能问题求解 423
23.1 表示和术语 423
23.2 组合爆炸 424
23.3 搜索技术 425
23.4 评价搜索技术 426
23.5 用图表示问题 426
23.6 深度优先搜索 428
23.6.1 深度优先算法的性能分析 436
23.7 宽度优先搜索 436
23.7.1 宽度优先搜索的性能分析 437
23.8 启发式搜索 437
23.9 登山搜索 438
23.9.1 登山搜索的性能分析 442
23.10 最小代价搜索 443
23.10.1 最小代价搜索的性能分析 444
23.11 选择搜索方法 445
23.12 寻找多重解 445
23.12.1 路径剪除 445
23.12.2 结点摘除 446
23.13 寻找“最优”解 451
23.14 一个例子 456
第24章 构造Windows 95框架 459
24.1 Windows 95程序设计概貌 459
24.2 Windows 95如何与用户的程序交互 460
24.1.4 菜单、工具条、状态条及对话框 460
24.1.3 位图 460
24.1.2 鼠标 460
24.1.1 桌面模式 460
24.3 Windows 95使用抢先式多任务方法 461
24.4 Win32 API:Windows API 461
24.5 窗口部件 462
24.6 Windows 95应用程序基础 463
24.6.1 WinMain() 463
24.6.2 窗口函数 463
24.6.3 窗口类 463
24.6.4 消息循环 463
24.6.5 Windows数据类型 464
24.7 Windows 95框架 464
24.7.1 定义窗口类 467
24.7.2 生成窗口 468
24.7.3 消息循环 470
24.8 窗口函数 471
24.9 使用定义文件 471
24.10 命名惯例 472
第四部分 C语言软件开发 473
第25章 汇编语言子程序接口 473
25.1 汇编语言接口 473
25.2 C编译程序的调用规则 474
25.3 Microsoft C/C++的调用规则 474
25.4 生成汇编码函数 474
25.4.1 简单汇编码程序 475
25.4.2 参数调用实例 479
25.4.3 代码和数据段的大模式 481
25.5 生成汇编码框架 482
25.6 使用asm 484
25.7 使用汇编码的时机 484
第26章 C语言软件工程 486
26.1 自顶向下设计 486
26.1.1 构造程序草案 486
26.1.2 选择数据结构 487
26.2 抗毁函数 488
26.3 使用MAKE 489
26.3.1 使用MAKE中的宏 492
26.4 使用集成的开发环境 493
27.1.1 增量和减量操作符 494
第27章 效率、移植和调试 494
27.1 效率 494
27.1.2 寄存器变量 495
27.1.3 指针和数组索引 497
27.1.4 函数的用法 498
27.2 移植 501
27.2.1 使用#define 501
27.2.2 对操作系统的依赖 502
27.2.3 数据大小的差异 502
27.3 调试 503
27.3.1 处理顺序错 503
27.3.2 指针问题 503
27.3.3 奇异语法错 505
27.3.5 越界错 506
27.3.4 出界错 506
27.3.6 函数原型遗漏 507
27.3.7 变元错 508
27.3.8 堆-栈冲突 508
27.3.9 一般调试理论 509
27.4 程序维护的艺术 509
27.4.1 改错 510
27.4.2 保护源代码 510
第五部分 C解释程序 511
第28章 C解释程序 511
28.1 解释程序的现实重要性 511
28.2 Little C说明 512
28.3 解释结构语言 513
28.2.1 一个重要的Little C约束条件 513
28.4 C的非正式理论 514
28.4.1 C表达式 515
28.4.2 求表达式的值 515
28.5 表达式分析程序 516
28.5.1 将源代码化为部件 516
28.5.2 Little C递归下降分析程序 521
28.6 Little C解释程序 531
28.6.1 解释程序预扫 532
28.6.2 main()函数 534
28.6.3 interp_block()函数 535
28.6.4 处理局部变量 547
28.6.5 调用用户定义的函数 548
28.6.6 为变量赋值 550
28.6.7 执行if语句 551
28.6.8 处理while循环 552
28.6.9 处理do-while循环 553
28.6.10 for循环 553
28.7 Little C库函数 554
28.8 编译和链接Little C解释程序 557
28.9 演示Little C 557
28.10 改进Little C 560
28.11 扩充Little C 561
28.11.1 增加新的C特征 561
28.11.2 增加附加特征 562