第1篇 程途启步 2
第1单元 简单程序设计 2
1.1 C语言程序主框架 2
1.1.1 用伪代码描述的简单计算器程序算法 2
1.1.2 将伪代码描述的算法逐步细化为C程序 2
1.2 数据类型与数据形式 3
1.2.1 数据类型 3
1.2.2 程序中的数据形式及其引用方式 4
1.3 标识符与声明 6
1.3.1 标识符 6
1.3.2 声明 6
1.3.3 变量的声明与初始化 7
1.4 操作符 8
1.4.1 赋值操作符与赋值表达式 8
1.4.2 算术操作符与算术表达式 8
1.4.3 操作符的优先级与结合性 9
1.5 函数 9
1.5.1 函数及其应用过程 10
1.5.2 函数调用与函数返回 11
1.5.3 函数定义 11
1.5.4 局部变量 12
1.5.5 函数声明 14
1.5.6 main()函数 15
1.5.7 函数库、头文件与文件包含命令 15
1.6 格式化输入/输出函数 16
1.6.1 printf()函数的基本用法 16
1.6.2 scanf()的基本用法 17
1.7 C程序的编译与执行 19
1.7.1 C语言程序的编译与连接 19
1.7.2 程序中的错误和异常 20
1.7.3 程序测试 22
1.7.4 设计用户友好的程序 23
习题1 23
第2单元 选择程序设计 27
2.1 可选择计算类型的计算器程序算法分析 27
2.1.1 主函数的算法分析 27
2.1.2 计算函数calculate()的算法分析 28
2.1.3 判等操作符与关系操作符 28
2.2 if-else型选择结构 29
2.2.1 用if-else结构实现的calculate()函数 29
2.2.2 if-else结构的应用特点 30
2.2.3 良好的程序书写风格 32
2.3 选择结构的程序测试 34
2.3.1 白箱测试法 34
2.3.2 等价分类法 35
2.4 字符类型 38
2.4.1 ASCⅡ码 38
2.4.2 char类型的基本特点 39
2.4.3 转义字符 39
2.4.4 字符的输入/输出 40
2.5 浮点类型 41
2.5.1 浮点类型取值范围与表数精度 41
2.5.2 浮点类型变量和字面量 42
2.5.3 浮点类型数据的操作 42
2.6 switch型选择结构 43
2.6.1 基于整数值匹配的选择结构——switch结构 43
2.6.2 一个字符分类程序 44
2.6.3 用switch结构实现的calculate()函数 47
2.6.4 switch结构与if-else结构的比较 48
习题2 49
第3单元 重复程序设计 56
3.1 可连续计算的计算器程序的算法分析 56
3.1.1 主函数初步算法 56
3.1.2 主函数算法细化 56
3.1.3 重复结构的C语言实现途径 57
3.2 while结构 57
3.2.1 while结构的基本机理 57
3.2.2 使用while结构的可连续计算的计算器主函数 57
3.2.3 逗号操作符 59
3.3 do-while结构 59
3.3.1 do-while结构的基本机理 59
3.3.2 使用do-while结构的可连续计算的计算器程序主函数 60
3.4 for结构 60
3.4.1 for结构的基本机理 60
3.4.2 使用for结构的可连续计算的计算器程序主函数 61
3.4.3 计数型重复结构 62
3.4.4 复合赋值操作符与增值、减值操作符 66
3.5 重复结构的程序测试 67
3.5.1 基于路径覆盖的重复结构测试 67
3.5.2 边值分析法与重复结构测试 67
3.5.3 基于因果分析的程序测试 68
3.6 在重复体内控制重复过程 71
3.6.1 跳出当前层控制结构语句break 72
3.6.2 提前结束当前重复体语句continue 72
3.6.3 实例:求素数 72
习题3 74
第2篇 组织数据 86
第4单元 同类型数据的聚合类型:数组 86
4.1 一维数组 86
4.1.1 数组的特点 86
4.1.2 数组的定义 87
4.1.3 数组初始化 87
4.1.4 访问下标变量 89
4.2 二维数组 90
4.2.1 二维数组的概念 90
4.2.2 二维数组的初始化 91
4.2.3 访问二维数组元素 92
4.3 字符串 93
4.3.1 字符串字面量 93
4.3.2 字符串变量 94
4.3.3 字符串的输入/输出 95
4.3.4 字符串操作库函数 98
习题4 102
第5单元 描述一类对象属性的聚合类型:结构体和共用体 107
5.1 结构体类型与结构体变量 107
5.1.1 结构体类型及其定制 107
5.1.2 结构体变量的声明与初始化 108
5.1.3 结构体变量及其分量的应用 109
5.2 用结构体数组存储一组学生信息 111
5.2.1 结构体数组的定义与初始化 111
5.2.2 结构体数组元素的访问 112
5.3 共用体类型 114
5.3.1 共用体类型的定制与共用体变量的定义 114
5.3.2 共用体类型与结构体类型的比较 115
5.3.3 共用体变量的应用 117
习题5 118
第6单元 指针 124
6.1 指针类型与指针变量 124
6.1.1 指针=基类型+地址 124
6.1.2 同类型指针间的赋值与判等操作 126
6.1.3 指针的递引用 127
6.1.4 悬空指针、空指针与void指针 128
习题6.1 129
6.2 数组的指针形式 131
6.2.1 数组名与指向数组元素的指针 131
6.2.2 指向数组元素指针的加减运算 133
6.2.2 指针与字符串 135
6.2.3 二维数组与指针 137
习题6.2 139
6.3 指向结构体变量的指针与链表 142
6.3.1 指向结构体类型变量的指针 142
6.3.2 链表及其特点 142
6.3.3 构建链表 144
习题6.3 146
6.4 动态存储分配 146
6.4.1 申请需要的存储空间 147
6.4.2 释放一个指针指向的存储空间 149
6.4.3 修改一个指针指向的存储空间大小 149
6.4.4 构建动态链表 150
习题6.4 154
第3篇 构建算法 156
第7单元 基础算法 156
7.1 穷举 156
7.1.1 搬砖问题 156
7.1.2 推断名次 159
习题7.1 163
7.2 迭代与递推 168
7.2.1 用二分迭代法求方程在指定区间的根 168
7.2.2 猴子吃桃子 171
7.2.3 用辗转相除法求两个正整数的最大公因子 173
习题7.2 176
7.3 递归 180
7.3.1 阶乘的递归计算 180
7.3.2 汉诺塔 182
习题7.3 185
第8单元 计算机模拟 187
8.1 随机问题模拟 187
8.1.1 产品随机抽样 187
8.1.2 用蒙特卡洛法求π的近似值 190
习题8.1 192
8.2 基于步长的模拟 192
8.2.1 事件步长法——中子扩散问题 192
8.2.2 时间步长法——盐水池问题 194
习题8.2 198
第9单元 数据处理 201
9.1 排序 201
9.1.1 直接选择排序 201
9.1.2 冒泡排序 203
习题9.1 206
9.2 查找 206
9.2.1 穷举查找 206
9.2.2 二分查找 207
习题9.2 208
第4篇 语海探幽 210
第10单元 算术数据类型及其转换 210
10.1 C数据类型概览 210
10.2 整数类型 211
10.2.1 有符号整数类型与无符号整数类型 211
10.2.2 标准整数类型与扩展整数类型 211
10.2.3 整数类型的极值宏 212
10.2.4 char类型 213
10.2.5 枚举 214
10.2.6 _Bool类型 216
10.3 浮点类型 216
10.3.1 浮点类型的值特性 216
10.3.2 浮点数据的舍入模式 217
10.3.3 浮点数据的求值特性 217
10.3.4 IEEE 754标准 218
10.3.5 关于浮点数的判等操作 218
10.3.6 _Complex类型和_Imaginary类型 218
10.4 数据类型转换 219
10.4.1 普通算术转换——提升拉齐规则 219
10.4.2 传送转换——与目的类型一致原则 221
10.4.3 数据的显式类型转换规则 222
10.4.4 数据类型转换注意事项 222
习题10 226
第11单元 C语言中的常量 229
11.1 字面量 229
11.1.1 整数字面量的表示和辨识 229
11.1.2 浮点类型字面量的表示和辨识 230
11.1.3 复合字面量 231
11.2 宏 232
11.2.1 宏定义 232
11.2.2 使用宏应当注意的几点 233
11.2.3 带参宏定义 234
11.3 const类型限定符 237
11.3.1 用const限定变量 237
11.3.2 用const限定数组 238
11.3.3 用const限定函数参数 239
11.3.4 用const限定指针 239
11.3.5 在多文件程序中共享一个const定义 240
习题11 241
第12单元 C程序中变量的访问属性 247
12.1 变量访问属性的概念 247
12.1.1 变量的存储类型与生存期 247
12.1.2 标识符的作用域 248
12.1.3 标识符的链接属性 249
12.2 C语言程序实体的存储类型 249
12.2.1 C程序中的局部变量 250
12.2.2 外部变量的定义与声明 251
12.2.3 初始化 255
习题12 256
第13单元 操作符、表达式与语句 261
13.1 操作符与表达式 261
13.1.1 算术操作符 261
13.1.2 逻辑表达式 262
13.1.3 位操作符 262
13.1.4 条件表达式 265
13.1.5 增值表达式和减值表达式 265
13.1.6 下标表达式与指针的加减操作 266
13.1.7 赋值操作 267
13.1.8 左值表达式 268
13.2 操作符的副作用与序列点 270
13.2.1 操作符的副作用与透明引用 270
13.2.2 基于序列点的副作用不叠加表达式规则 272
13.2.3 函数的副作用 274
13.3 语句 274
13.3.1 表达式语句、空语句和复合语句 274
13.3.2 控制语句 275
13.3.3 跳转语句 276
13.3.4 关于分号(;)的说明 276
习题13 276
第14单元 函数 280
14.1 函数参数 280
14.1.1 现代C语言函数参数不能空 280
14.1.2 C语言函数调用中的值结合 280
14.1.3 指针类型参数 282
14.2 函数定义与函数声明 289
14.2.1 函数定义 289
14.2.2 函数声明 290
14.3 内联函数 291
14.3.1 内联函数的概念 291
14.3.2 C99的内联函数定义 291
14.3.3 gcc的内联函数定义 292
14.3.4 内联函数的限制 292
习题14 292
第15单元 输入/输出 297
15.1 格式化输出函数printf() 297
15.1.1 printf()格式参数结构 297
15.1.2 printf()基本格式符 297
15.1.3 长度修饰符 298
15.1.4 域宽与精度说明 299
15.1.5 前缀修饰符 299
15.2 格式化输入函数scanf() 301
15.2.1 scanf()指针参数 301
15.2.2 scanf()格式参数结构 302
15.2.3 数值数据的输入控制 304
15.2.4 scanf()与输入缓冲区 305
15.2.5 字符型数据的输入控制 306
15.2.6 scanf()的停止与返回 309
15.3 C语言的文件操作 310
15.3.1 文件及其分类 310
15.3.2 FILE类型及其指针 312
15.3.3 C语言文件操作的一般过程 313
15.3.4 文件操作程序示例 316
习题15 318
附录 324
附录A C语言关键字 324
附录B C语言运算符的优先级和结合方向 324
附录C 编译预处理命令 325
C.1 宏定义 325
C.2 文件包含 326
C.3 条件编译 326
附录D C标准库头文件 326
附录E C语言常用标准库函数 327
E.1 数学函数 327
E.2 字符函数和字符串函数 328
E.3 输入/输出函数 329
E.4 动态内存分配函数 331
E.5 退出程序函数 331
E.6 数值转换函数 331
E.7 时间和日期函数 332
参考文献 333