第1章 C语言概述 1
1.1 C语言简介 1
1.1.1 C语言历史 1
1.1.2 C语言特点 1
1.2 C语言的关键字与标识符 2
1.2.1 字符集 2
1.2.2 标识符 2
1.2.3 关键字 3
1.2.4 预定义标识符 3
1.3 C程序基本结构 4
1.3.1 Hello World 4
1.3.2 数据对象 6
1.3.3 C程序的结构特点 8
1.4 C程序开发流程 9
1.4.1 头文件与源文件的编辑 9
1.4.2 源文件的编译 9
1.4.3 目标文件的链接 10
1.4.4 程序调试与执行 10
1.5 Turbo C 3.0上机环境与基本操作 10
1.5.1 Turbo C 3.0上机环境简介 10
1.5.2 文件的创建和保存 11
1.5.3 源文件的编辑 13
1.5.4 编译与链接 13
1.5.5 程序的执行 14
1.6 Visual C++ 6.0上机环境与基本操作 15
1.6.1 Visual C++ 6.0上机环境简介 16
1.6.2 文件的创建和保存 16
1.6.3 源文件的编辑 17
1.6.4 编译与链接 17
1.6.5 程序的执行 18
习题1 18
第2章 数据类型与数据对象 20
2.1 数据类型概述 20
2.2 整数类型 21
2.2.1 整数类型数据对象 21
2.2.2 整数类型的取值范围 22
2.3 实数类型 22
2.3.1 double类型的使用 22
2.3.2 float类型的使用 23
2.3.3 实数类型的取值范围 23
2.4 字符类型 24
2.4.1 字符类型的取值范围 24
2.4.2 字符类型数据对象的使用 25
2.5 常数 25
2.5.1 文字常数 26
2.5.2 符号常数 28
2.6 变量 30
2.6.1 变量的定义 30
2.6.2 变量的使用 30
2.6.3 变量的特征 31
2.6.4 变量的赋值 31
2.6.5 变量的初始化 33
2.7 常量 33
2.8 用户自定义类型 34
2.8.1 枚举类型 34
2.8.2 typedef关键字 35
习题2 36
第3章 运算与操作 37
3.1 表达式 37
3.1.1 操作数 37
3.1.2 操作符与表达式求值 37
3.2 算术操作符 38
3.2.1 基本算术操作符 38
3.2.2 递增递减操作符 38
3.3 赋值操作符 39
3.3.1 赋值操作符与赋值表达式 39
3.3.2 复合赋值表达式 40
3.4 表达式求值 41
3.4.1 表达式的一般求值规则 41
3.4.2 操作符的优先级与结合性 41
3.5 逗号操作符 43
3.6 混合运算与类型转换 43
3.6.1 隐式类型转换 43
3.6.2 显式类型转换 44
习题3 45
第4章 基本程序结构 46
4.1 语句与注释 46
4.1.1 简单语句 46
4.1.2 复合语句 46
4.1.3 空语句 47
4.1.4 注释 47
4.2 字符输入输出 47
4.2.1 字符数据对象的输出 48
4.2.2 字符数据对象的输入 48
4.3 格式化输出 49
4.3.1 printf函数的基本用法 49
4.3.2 格式描述符 49
4.3.3 输出精度与格式对齐 51
4.4 格式化输入 55
4.4.1 scanf函数的基本用法 55
4.4.2 取址操作符 57
4.4.3 输入时的场宽 57
4.5 程序的顺序结构 58
4.5.1 顺序结构示例 58
4.5.2 条件表达式 58
习题4 59
第5章 分支结构 61
5.1 逻辑值 61
5.2 关系操作符与关系表达式 61
5.2.1 关系操作符及其优先级 61
5.2.2 关系表达式 62
5.3 逻辑操作符与逻辑表达式 62
5.3.1 逻辑操作符及其优先级 63
5.3.2 逻辑表达式 63
5.3.3 复杂逻辑表达式 64
5.4 if分支结构 65
5.4.1 简单if分支结构 65
5.4.2 if-else语句 66
5.4.3 if-else if-else语句 67
5.5 switch分支结构 71
5.5.1 switch语句 71
5.5.2 break语句 73
5.6 分支结构的嵌套 75
5.6.1 if与switch结构的互相嵌套 75
5.6.2 if分支结构的多重嵌套 75
习题5 77
第6章 循环结构 79
6.1 循环结构概述 79
6.2 while循环 80
6.2.1 while语句 80
6.2.2 while循环示例 80
6.3 for循环 82
6.3.1 简单for循环 82
6.3.2 for循环与while循环的关系 83
6.3.3 复杂for循环 83
6.3.4 “更简单的”for循环 84
6.4 循环流程控制 85
6.4.1 break语句 85
6.4.2 continue语句 86
6.5 循环嵌套 87
6.6 程序结构化 88
6.6.1 程序结构化的基本概念 88
6.6.2 结构化程序设计的基本原则 88
6.6.3 理解程序的整体思路 89
6.6.4 自顶向下逐步求精 89
习题6 90
第7章 函数 92
7.1 函数调用 92
7.1.1 库函数的调用方法 92
7.1.2 函数原型 93
7.2 函数定义 94
7.2.1 函数定义的一般格式 94
7.2.2 函数的返回值 95
7.2.3 返回BOOL值的函数 96
7.3 函数参数 97
7.3.1 形式参数与实际参数 97
7.3.2 参数传递机制 98
7.3.3 函数调用栈框架 100
7.3.4 函数的嵌套调用 102
7.4 全局数据对象与局部数据对象 102
7.4.1 局部数据对象 102
7.4.2 全局数据对象 103
7.4.3 静态局部数据对象 104
7.5 函数与程序模块化 106
习题7 107
第8章 算法 108
8.1 算法概述 108
8.1.1 算法的基本概念 108
8.1.2 算法的基本特征 109
8.2 算法描述 110
8.2.1 伪代码 110
8.2.2 流程图 111
8.3 算法设计 114
8.3.1 最大公约数问题 115
8.3.2 素性判定问题 116
8.4 算法效率 117
8.4.1 最大公约数算法的效率 117
8.4.2 素性判定算法的效率 118
8.4.3 素性判定算法的除虫任务 119
8.4.4 效率!效率! 120
8.5 递归算法 121
8.5.1 递归函数的基本概念 121
8.5.2 递归函数设计 122
8.5.3 递归与循环 123
8.5.4 汉诺塔问题 124
8.5.5 递归算法设计的一般策略 126
习题8 128
第9章 程序组织 130
9.1 头文件与源文件 130
9.1.1 源文件 130
9.1.2 头文件 131
9.1.3 头文件的包含方法 131
9.1.4 头文件的包含测试 132
9.2 工程项目文件管理 133
9.2.1 Turbo C环境下的工程文件管理 133
9.2.2 Visual C++环境下的工程文件管理 135
9.3 常用标准库函数 138
9.3.1 stdio库 138
9.3.2 math库 138
9.3.3 ctype库 140
9.3.4 stdlib库 142
9.4 作用域与生存期 144
9.4.1 量的作用域与可见性 145
9.4.2 量的存储类与生存期 146
9.4.3 静态函数 147
9.4.4 声明与定义 147
9.5 多文件程序开发示例 148
9.5.1 单文件版本 148
9.5.2 多文件版本 153
习题9 157
第10章 数组 158
10.1 一维数组 158
10.1.1 一维数组数据对象的定义 158
10.1.2 一维数组的存储表示 159
10.1.3 一维数组数据对象的初始化 159
10.2 数组元素操作 160
10.2.1 数组元素的访问 160
10.2.2 数组元素的下标 161
10.3 数组与函数 162
10.3.1 一维数组作为函数参数 162
10.3.2 数组参数传递规范 165
10.4 多维数组 167
10.4.1 多维数组数据对象的定义 167
10.4.2 多维数组数据对象的初始化 167
10.4.3 多维数组的存储表示 168
10.4.4 多维数组元素的访问 168
习题10 170
第11章 结构体与共用体 171
11.1 结构体类型 171
11.1.1 结构体类型的定义 171
11.1.2 结构体类型的存储布局 172
11.1.3 结构体类型的嵌套 173
11.2 结构体变量 174
11.2.1 结构体变量的定义 174
11.2.2 结构体变量的初始化 175
11.3 结构体应用 175
11.3.1 结构体成员的访问 175
11.3.2 结构体与数组 177
11.3.3 结构体与函数 178
11.4 库与接口 179
11.4.1 有理数库 180
11.4.2 接口设计原则 184
11.5 共用体 184
11.5.1 共用体的基本概念 184
11.5.2 共用体成员的存储 185
11.5.3 结构体与共用体的嵌套 186
习题11 188
第12章 指针 189
12.1 指针变量 189
12.1.1 地址与值 189
12.1.2 指针变量的定义 190
12.1.3 指针变量的初始化 190
12.1.4 指针值NULL 191
12.1.5 指针数据对象与目标数据对象的访问 191
12.1.6 指针类型 194
12.2 指针与函数 195
12.2.1 指针作为函数参数 195
12.2.2 指针与常量 197
12.2.3 指针与函数返回值 199
12.3 指针操作 199
12.3.1 数据对象地址的计算 199
12.3.2 指针加减操作 200
12.3.3 指针递增递减操作 201
12.3.4 指针关系操作 202
12.4 指针与数组 203
12.4.1 指针作为函数参数 203
12.4.2 指针与数组的可互换性 206
12.4.3 多维数组作为函数参数 207
12.5 函数指针 208
12.5.1 函数指针的基本概念 208
12.5.2 函数指针类型 209
12.5.3 函数指针的使用方法 210
12.5.4 void*类型 210
12.6 查找与排序 211
12.6.1 排序 211
12.6.2 查找 214
习题12 216
第13章 字符串 218
13.1 字符数组 218
13.1.1 字符数组的定义 218
13.1.2 字符数组的初始化 218
13.1.3 字符数组的内部表示 219
13.2 字符指针 220
13.2.1 字符指针的定义与初始化 220
13.2.2 字符指针的内部表示 221
13.2.3 字符?\0? 222
13.2.4 字符指针与字符数组的差异 223
13.3 字符串与函数 223
13.3.1 字符串作为函数参数 223
13.3.2 字符串作为函数返回值 225
13.4 字符串库 226
13.4.1 字符串的长度 226
13.4.2 字符串的复制与合并 227
13.4.3 字符串的比较 228
13.4.4 字符串的查找 229
13.5 动态存储管理 229
13.5.1 内存分配概述 229
13.5.2 动态内存分配 230
13.5.3 动态内存释放 231
习题13 232
第14章 文件 233
14.1 文件的基本概念 233
14.1.1 什么是文件 233
14.1.2 文件类型 233
14.1.3 文件指针 234
14.2 文件函数 234
14.2.1 fopen函数 234
14.2.2 fclose函数 235
14.2.3 feof函数与EOF宏 236
14.2.4 ferror函数 236
14.2.5 fflush函数与fflushall函数 237
14.2.6 fseek函数 237
14.2.7 ftell函数 238
14.2.8 rewind函数 238
14.2.9 访问文件的基本策略 238
14.3 面向字符的文件读写操作 238
14.3.1 fputc函数与fgetc函数 238
14.3.2 面向字符的文件读写举例 239
14.4 面向文本行的文件读写操作 240
14.4.1 fputs函数与fgets函数 240
14.4.2 面向文本行的文件读写举例 241
14.5 格式化信息的文件读写操作 241
14.5.1 fprintf函数 241
14.5.2 fscanf函数 242
14.6 面向信息块的文件读写操作 244
14.6.1 fwrite函数与fread函数 244
14.6.2 面向信息块的文件读写举例 246
习题14 248
第15章 链表 249
15.1 指针与结构体 249
15.1.1 指针作为结构体的成员 249
15.1.2 指向结构体的指针 251
15.2 链表概述 252
15.2.1 链表的基本概念 252
15.2.2 链表与链表结点的表示 253
15.2.3 链表基本操作集 256
15.3 链表的创建与销毁 257
15.3.1 链表的创建 257
15.3.2 链表的销毁 258
15.4 结点的插入与删除 259
15.4.1 结点的插入操作 259
15.4.2 结点的删除操作 261
15.5 链表的遍历 262
15.5.1 链表结点数据的输出操作 262
15.5.2 使用函数指针实现链表遍历 263
15.5.3 链表库应用 264
习题15 266
参考文献 268