第1章 引言 1
1.1 计算机与程序设计语言 2
1.1.1 程序存储思想 2
1.1.2 程序设计语言的发展 3
1.2 C语言的发展简史 4
1.2.1 C语言的起源 4
1.2.2 C语言的发展 5
1.2.3 C语言的特点 6
1.3 第一个C程序 6
1.3.1 编辑源程序 7
1.3.2 编译、链接和运行 7
1.3.3 程序开发周期 8
1.4 剖析一个简单的程序 9
1.5 简单程序举例 12
习题 14
第2章 简单C程序设计 17
2.1 内存与变量 18
2.1.1 内存 18
2.1.2 变量 18
2.1.3 整数类型 19
2.1.4 变量的声明和使用 20
2.1.5 赋值运算 21
2.2 格式化输入输出函数 22
2.2.1 格式化输出函数Printf() 22
2.2.2 格式化输入函数scanf() 24
2.3 浮点类型 26
2.3.1 浮点类型 26
2.3.2 浮点数据的输出 27
2.3.3 浮点数据的输入 27
2.3.4 常量 28
2.4 基本运算符 30
2.4.1 算术运算 30
2.4.2 类型转换 32
2.5 计算两点间的距离 33
2.5.1 常用数学函数 34
2.5.2 计算整数的位数 35
习题 35
第3章 分支结构 37
3.1 if控制语句 38
3.1.1 if...else语句 38
3.1.2 伪代码 39
3.1.3 缺省else子句的if语句 40
3.1.4 关系运算 41
3.1.5 复合语句 42
3.1.6 条件表达式 44
3.2 逻辑运算 45
3.2.1 逻辑运算符的运算规则 45
3.2.2 逻辑运算符的优先级和结合性 46
3.2.3 判断闰年 47
3.3 判断字母大小写 49
3.3.1 字符类型 49
3.3.2 字符型数据的输入输出 50
3.3.3 复合赋值语句 51
3.4 用嵌套的if语句实现多分支结构 51
3.5 用switch语句实现多分支结构 53
3.5.1 switch语句的一般形式 53
3.5.2 break在switch中的灵活运用 55
3.5.3 四则运算(加强版) 57
3.5.4 浮点数据 60
3.6 运算符与表达式 62
习题 63
第4章 循环结构 65
4.1 循环控制原理 66
4.2 while循环语句 67
4.3 for循环语句 68
4.3.1 for语句的基本格式 68
4.3.2 for语句的注意事项 70
4.3.3 自增自减运算符 71
4.3.4 最大值 74
4.3.5 极限常量 75
4.4 求数列的和 76
4.5 输出阶乘表 80
4.5.1 类型溢出问题 81
4.5.2 逗号运算符及其表达式 82
4.5.3 计算数列a,aa,aaa,…的前n项和 83
4.6 标记控制的循环 85
4.6.1 再谈while语句 86
4.6.2 字符的分类统计 88
4.6.3 计算n的位数 89
4.6.4 do语句 90
4.7 循环中的break和continue 90
4.7.1 循环中的break 90
4.7.2 循环中的continue 92
4.8 多重循环与goto语句 94
4.8.1 多重循环 94
4.8.2 goto语句 97
4.9 多实例测试 98
4.10 表达式的求值顺序与副效应 103
习题 104
第5章 函数 109
5.1 模块化程序设计 110
5.2 函数的基本概念 111
5.2.1 求最大值 111
5.2.2 函数的定义 112
5.2.3 函数原型 114
5.2.4 return语句 115
5.2.5 函数的调用 116
5.2.6 按值传递机制 117
5.3 使用函数编写程序 118
5.3.1 素数表 118
5.3.2 验证哥德巴赫猜想 119
5.3.3 组合数 120
5.4 变量的存储类型 121
5.5 局部变量和外部变量 123
5.5.1 局部变量 123
5.5.2 静态局部变量 124
5.5.3 外部变量 125
5.6 函数的递归调用 126
5.6.1 递归的基本思想 126
5.6.2 最大公约数 127
5.6.3 最近共同祖先 128
习题 129
第6章 数组 131
6.1 一维数组 132
6.1.1 一维数组的定义和引用 132
6.1.2 一维数组初始化 133
6.1.3 数组元素的查找 136
6.1.4 在有序序列里插入新元素 137
6.1.5 比较交换排序 138
6.2 数组作为函数参数 140
6.3 一维数组应用举例 144
6.3.1 去重处理 144
6.3.2 字母使用频率统计 146
6.3.3 集合的合并——利用有序关系简化问题 147
6.3.4 二分搜索 150
6.4 二维数组 151
6.4.1 二维数组的定义和引用 151
6.4.2 二维数组的初始化 151
6.4.3 杨辉三角 152
6.4.4 二维数组做函数参数 154
6.5 二维数组应用举例 156
6.5.1 图像转换 156
6.5.2 判断偶数矩阵 157
6.5.3 日期计算 159
习题 160
第7章 字符数组与字符串 163
7.1 字符型数据 164
7.1.1 字符型数据的存储 164
7.1.2 转义序列 165
7.1.3 字符数据的输入问题 166
7.1.4 处理字符的函数 167
7.2 字符数组与字符串 168
7.2.1 统计空格 169
7.2.2 字符数组的初始化 169
7.2.3 字符串的输入输出 170
7.2.4 统计单词个数 171
7.3 常用字符串函数 172
7.3.1 string.h中的字符串处理函数 172
7.3.2 stdio.h中的字符串函数 175
7.4 字符串应用举例 177
7.4.1 DNA序列的编码 177
7.4.2 多个二进制数排序 178
7.4.3 最大值(多种进制) 180
7.4.4 将一个十进制整数转换为二进制输出 181
7.5 字符串数组 182
7.5.1 字符串排序 182
7.5.2 前缀判断 184
习题 186
第8章 指针 187
8.1 什么是指针 188
8.1.1 计算机内存的使用 188
8.1.2 指针的概念 189
8.2 指针变量的声明和初始化 190
8.2.1 指针变量的声明 190
8.2.2 指针变量的初始化 190
8.2.3 指针和数据类型 191
8.3 指针的基本运算 192
8.4 指针作为函数的参数 193
8.5 一维数组与指针 198
8.5.1 指针的算术运算和关系运算 198
8.5.2 指针和数组的关系 200
8.5.3 数组作函数参数的本质 203
8.6 指针与const限定符 204
8.7 指针与字符串 207
8.7.1 字符串常量 207
8.7.2 使用指针处理字符串 208
8.7.3 字符数组与字符指针 212
8.8 用指针实现内存动态分配 213
8.8.1 使用malloc()函数为数组分配内存 214
8.8.2 释放动态分配的内存 214
8.8.3 其他动态内存分配函数 215
习题 216
第9章 结构 219
9.1 结构定义 220
9.1.1 使用结构的原因 220
9.1.2 定义结构类型和结构变量 221
9.1.3 初始化结构变量 222
9.1.4 将一个结构作为另一个结构的成员 223
9.1.5 访问结构成员 223
9.1.6 使用typedef定义数据类型 224
9.2 结构数组与指针 227
9.2.1 结构数组 227
9.2.2 结构指针 229
9.2.3 用指针访问结构数组 230
9.3 结构与函数 232
9.3.1 结构作为函数的参数 232
9.3.2 结构指针作为函数参数 233
9.3.3 结构作为函数的返回值 234
9.3.4 结构应用举例 235
9.4 联合与枚举 237
9.4.1 联合 237
9.4.2 联合指针 239
9.4.3 联合的初始化 239
9.4.4 联合与结构 239
9.4.5 枚举 240
9.5 单链表 243
9.5.1 单链表类型定义 243
9.5.2 单链表的操作 244
习题 250
第10章 指针进阶 253
10.1 指针与二维数组 254
10.1.1 用一级指针访问二维数组 254
10.1.2 指向数组的指针 254
10.1.3 二维数组名 255
10.2 指针数组 257
10.2.1 动态申请和释放二维数组 258
10.2.2 用指针数组处理多个字符串 259
10.3 带参数的main()函数 263
10.4 指向函数的指针 265
习题 270
第11章 C预处理 271
11.1 预处理器的工作原理 272
11.2 预处理指令 273
11.3 #define预处理指令 273
11.3.1 符号常量 274
11.3.2 带参数的宏 274
11.4 文件包含 277
11.4.1 多文件程序 277
11.4.2 include指令 277
11.4.3 文件之间如何共享信息 277
11.5 条件编译 279
习题 281
第12章 文件 283
12.1 文件概述 284
12.1.1 一个简单的文件操作程序 284
12.1.2 C文件的分类 285
12.1.3 缓冲文件系统 285
12.1.4 文件指针 286
12.2 文件的打开和关闭 287
12.2.1 文件打开函数fopen() 287
12.2.2 文件关闭函数fclose() 289
1 2.2.3 输入输出重定向函数freopen() 289
12.3 文件的读写操作 290
12.3.1 字符读写函数fgetc()和fputc() 290
12.3.2 字符串读写函数fgets()和fputs() 292
12.3.3 格式化文件读写函数fscanf()和fprintf() 293
12.3.4 数据块读写函数fread()和fwrite() 294
12.4 文件的其他操作 295
12.4.1 文件定位函数 295
12.4.2 文件检测 296
12.5 文件应用实例 297
习题 307
第13章 计算思维与常用算法 309
13.1 模拟 310
13.1.1 校门外的树 310
13.1.2 约瑟夫问题 311
13.2 随机化算法 315
13.2.1 计算圆周率近似值 315
13.2.2 洗牌发牌模拟 317
13.3 空间换时间 320
13.3.1 筛选法求素数 320
13.3.2 验证哥德巴赫猜想(加强版) 322
13.3.3 分解素因数 324
13.4 递归 327
13.4.1 计算实数的整数幂 328
13.4.2 计算连通区域面积 328
13.5 贪心算法 330
13.5.1 活动安排问题 331
13.5.2 最优装载问题 333
13.6 动态规划算法 334
13.6.1 游戏币问题 335
13.6.2 最长单调序列 336
习题 338
附录 341
附录A 常用字符与ASCII代码对照表 342
附录B C语言中的关键字 343
附录C 运算符和结合性 344
附录D C库函数 345
附录E C99相对于C89的新特性(部分) 350
参考文献 351