第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程序 7
1.3.1 编辑源程序 7
1.3.2 编译、链接和运行 8
1.3.3 程序开发周期 9
1.4 剖析一个简单的程序 9
1.5 简单程序举例 12
习题 14
第2章 简单C程序设计 17
2.1 温度转换 18
2.1.1 内存 18
2.1.2 变量 19
2.1.3 整数类型 19
2.1.4 变量的声明和使用 20
2.1.5 赋值运算 21
2.1.6 格式化输出函数printf() 22
2.2 使用浮点数进行温度转换 24
2.2.1 浮点变量类型 24
2.2.2 浮点数据的输出 25
2.2.3 常量 26
2.3 对任意华氏温度进行温度转换 27
2.3.1 用scanf()读入整型数据 28
2.3.2 用scanf()读入浮点数据 29
2.3.3 格式控制字符串中的普通字符 29
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 伪代码 39
3.1.2 关系运算 39
3.1.3 复合语句 41
3.2 双分支if语句 43
3.2.1 条件表达式 44
3.2.2 嵌套的if……else 45
3.2.3 逻辑运算符和逻辑表达式 46
3.3 判断字母大小写 48
3.3.1 字符类型 48
3.3.2 字符型数据的输入/输出 49
3.3.3 复合赋值语句 50
3.4 多分支if语句 50
3.5 switch语句 52
3.5.1 switch语句的一般形式 52
3.5.2 break在switch中的灵活运用 54
3.5.3 四则运算(加强版) 57
3.5.4 浮点数据 60
3.6 运算符与表达式 61
习题 63
第4章 循环结构 65
4.1 while循环语句 67
4.2 for循环语句 68
4.2.1 for语句的基本格式 68
4.2.2 for语句的注意事项 70
4.2.3 自增自减运算符 71
4.2.4 最大值 74
4.2.5 极限常量 75
4.3 求数列的和 76
4.4 输出阶乘表 80
4.4.1 类型溢出问题 81
4.4.2 逗号运算符及其表达式 82
4.4.3 计算数列a,aa,aaa,…的前n项和 83
4.5 标记控制的循环 84
4.5.1 再谈while语句 86
4.5.2 字符的分类统计 88
4.5.3 计算n的位数 89
4.5.4 do语句 89
4.6 break和continue 90
4.6.1 循环中的break 90
4.6.2 循环中的continue 92
4.7 多重循环与goto语句 94
4.7.1 多重循环 94
4.7.2 goto语句 96
4.8 多实例测试 97
4.9 表达式的求值顺序与副效应 102
习题 104
第5章 函数 107
5.1 模块化程序设计 108
5.2 函数的基本概念 109
5.2.1 求最大值 109
5.2.2 函数的定义 110
5.2.3 函数的调用 112
5.2.4 函数原型 113
5.2.5 return语句 114
5.2.6 按值传递机制 115
5.3 使用函数编写程序 115
5.3.1 素数表 116
5.3.2 验证哥德巴赫猜想 117
5.3.3 组合数 118
5.4 变量的存储类型 119
5.5 局部变量和外部变量 120
5.5.1 局部变量 121
5.5.2 静态局部变量 122
5.5.3 外部变量 123
5.6 函数的递归调用 124
5.6.1 递归的基本思想 124
5.6.2 最大公约数 125
5.6.3 最近共同祖先 125
习题 127
第6章 数组 129
6.1 一维数组 130
6.1.1 一维数组的定义和引用 130
6.1.2 一维数组初始化 131
6.1.3 数组元素的查找 134
6.1.4 在有序序列里插入新元素 135
6.1.5 比较交换排序 136
6.2 数组作为函数参数 138
6.3 一维数组应用举例 141
6.3.1 最佳校友奖 141
6.3.2 字母使用频率统计 143
6.3.3 集合的合并——利用有序关系简化问题 144
6.3.4 二分搜索 147
6.4 二维数组 148
6.4.1 二维数组的定义和引用 148
6.4.2 二维数组的初始化 148
6.5 二维数组应用举例 149
6.5.1 各门课的平均分 149
6.5.2 随机矩阵的最大值 151
6.5.3 日期计算 153
习题 154
第7章 字符数组与字符串 157
7.1 字符型数据 158
7.1.1 字符型数据的存储 158
7.1.2 转义序列 159
7.1.3 字符数据的输入问题 160
7.1.4 处理字符的函数 161
7.2 字符数组与字符串 162
7.2.1 统计空格 163
7.2.2 字符数组的初始化 163
7.2.3 字符串的输入/输出 164
7.3 常用字符串函数 165
7.3.1 string.h中的字符串处理函数 165
7.3.2 stdlih.h中的字符串转换函数 167
7.3.3 stdio.h中的字符串函数 168
7.4 字符串应用举例 169
7.4.1 统计单词个数 169
7.4.2 多个二进制数排序 171
7.4.3 最大值(多种进制) 172
7.4.4 将一个十进制整数转换为二进制输出 173
7.5 字符串数组 174
习题 175
第8章 指针 177
8.1 什么是指针 178
8.1.1 计算机内存的使用 178
8.1.2 指针的概念 179
8.2 指针变量的声明和初始化 180
8.2.1 指针变量的声明 180
8.2.2 指针变量的初始化 180
8.2.3 指针和数据类型 181
8.3 指针的基本运算 182
8.4 指针作为函数的参数 183
8.5 指针与const限定符 187
8.6 一维数组与指针 190
8.6.1 指针的算术运算和关系运算 190
8.6.2 指针和数组的关系 193
8.6.3 数组作函数参数的本质 195
8.7 返回值为指针的函数 197
8.8 指针与字符串 198
8.8.1 字符串常量 198
8.8.2 使用指针处理字符串 199
8.8.3 字符数组与字符指针 203
8.9 用指针实现内存动态分配 205
8.9.1 使用malloc()函数为数组分配内存 205
8.9.2 释放动态分配的内存 206
8.9.3 其他动态内存分配函数 206
习题 207
第9章 结构 211
9.1 结构定义 212
9.1.1 使用结构的原因 212
9.1.2 定义结构类型和结构变量 213
9.1.3 使用typedef定义数据类型 215
9.1.4 初始化结构体变量 215
9.1.5 将一个结构作为另一个结构的成员 216
9.1.6 访问结构成员 217
9.2 结构数组与指针 219
9.2.1 结构数组 220
9.2.2 结构指针 222
9.2.3 用指针访问结构数组 223
9.3 结构与函数 224
9.3.1 结构作为函数的参数 225
9.3.2 结构指针作为函数参数 226
9.3.3 结构作为函数的返回值 226
9.4 单链表 227
9.4.1 单链表类型定义 228
9.4.2 单链表的操作 228
9.5 联合与枚举 233
9.5.1 联合 233
9.5.2 联合指针 234
9.5.3 联合的初始化 235
9.5.4 联合与结构 235
9.5.5 枚举 236
习题 237
第10章 指针进阶 239
10.1 指针与二维数组 240
10.1.1 用一级指针访问二维数组 240
10.1.2 指向数组的指针 240
10.1.3 二维数组名 242
10.2 指针数组 244
10.2.1 动态申请和释放二维数组 244
10.2.2 用指针数组处理多个字符串 245
10.3 带参数的main()函数 249
10.4 指向函数的指针 251
习题 256
第11章 C预处理 257
11.1 预处理器的工作原理 258
11.2 预处理指令 259
11.3 #define预处理指令 259
11.3.1 符号常量 260
11.3.2 带参数的宏 260
11.4 文件包含 263
11.4.1 多文件程序 263
11.4.2 include指令 263
11.4.3 文件之间如何共享信息 263
11.5 条件编译 265
习题 267
第12章 文件 269
12.1 文件概述 270
12.1.1 一个简单的文件操作程序 270
12.1.2 C文件的分类 271
12.1.3 缓冲文件系统 271
12.1.4 文件指针 272
12.2 文件的打开和关闭 273
12.2.1 文件打开函数fopen() 273
12.2.2 文件关闭函数fclose() 275
12.2.3 输入/输出重定向函数freopen() 275
12.3 文件的读/写操作 276
12.3.1 字符读/写函数fgetc()和fputc() 276
12.3.2 字符串读/写函数fgets()和fputs() 278
12.3.3 格式化文件读/写函数fscanf()和fprintf() 279
12.3.4 数据块读/写函数fread()和fwrite() 280
12.4 文件的其他操作 281
12.4.1 文件定位函数 281
12.4.2 文件检测 282
12.5 文件应用实例 283
习题 294
第13章 计算思维与常用算法 295
13.1 模拟 296
13.1.1 校门外的树 296
13.1.2 约瑟夫问题 297
13.2 随机化算法 301
13.2.1 计算圆周率近似值 301
13.2.2 洗牌发牌模拟 303
13.3 空间换时间 306
13.3.1 筛选法求素数 307
13.3.2 验证哥德巴赫猜想(加强版) 308
13.3.3 分解素因数 310
13.4 递归 313
13.4.1 计算实数的整数幂 314
13.4.2 计算连通区域面积 315
13.5 贪心算法 317
13.5.1 活动安排问题 317
13.5.2 部分背包问题 319
13.6 动态规划算法 321
13.6.1 游戏币问题 321
13.6.2 最长单调序列 323
习题 324
附录 329
附录A 常用字符与ASCII代码对照表 330
附录B C语言中的关键字 331
附录C 运算符和结合性 332
附录D C库函数 333
附录E C99相对于C89的新特性(部分) 338
参考文献 339