第1篇 程序的基石——数据 2
第1章 C语言概述 2
1.0 写在最前面的——如何使用本书 2
1.1 语言 3
1.1.1 “语言”的定义 3
1.1.2 计算机语言发展历程 4
1.1.3 C语言 4
1.2 编程方法 5
1.2.1 数据处理示例 5
1.2.2 第一步:分析问题 5
1.2.3 第二步:设想实现方法 5
1.2.4 第三步:编写程序代码 6
1.3 开发环境 7
1.3.1 电脑上的开发环境 7
1.3.2 手机上的开发环境 10
1.4 编写第一个C语言的程序 10
1.4.1 在电脑上编写第一个程序 11
1.4.2 在手机上编写第一个程序 15
1.5 EGE——简易图形库 16
1.6 如何学习C语言 17
1.6.1 技巧一:多看、多想、多练习 17
1.6.2 技巧二:多沟通、多扩展视野 18
1.7 小结 19
第2章 数据的表示 20
2.1 计算机中的数据表示 20
2.1.1 二进制 20
2.1.2 整数 21
2.1.3 小数 22
2.1.4 文本 24
2.1.5 练习 26
2.2 程序中的数据表示 26
2.2.1 整数 26
2.2.2 小数 30
2.2.3 文本 31
2.2.4 练习 33
2.3 数据的分类——数据类型 34
2.3.1 整数类型 34
2.3.2 浮点类型 35
2.3.3 字符类型 37
2.4 小结 37
2.5 习题 37
第3章 指代数据 39
3.1 为什么要指代数据 39
3.1.1 变化的数据 39
3.1.2 未知的数据 40
3.2 指代的名称 40
3.2.1 名称的命名规范 40
3.2.2 不能使用的名称——关键字 41
3.3 让名称更有效——见名知意 41
3.3.1 不使用拼音命名 41
3.3.2 英文命名方式 42
3.4 指代数据需要考虑的问题 43
3.4.1 范围 43
3.4.2 精度 43
3.5 程序中的指代 44
3.5.1 从问题中找到需要指代的数据 44
3.5.2 如何在程序中指代 45
3.6 特殊的指代——不变的量 46
3.6.1 为什么要指代不变的量 46
3.6.2 常数 47
3.6.3 常量 47
3.7 小结 48
3.8 习题 48
第2篇 程序的本质——处理数据 52
第4章 运算符和表达式 52
4.1 关联变量和数据 52
4.1.1 引入“=” 52
4.1.2 变量的初始化 53
4.1.3 表达式 54
4.1.4 类型匹配 54
4.1.5 练习 57
4.2 运算符一览 57
4.3 算术运算符 58
4.3.1 概述 58
4.3.2 除法“/” 61
4.3.3 取余“%” 62
4.3.4 练习 64
4.4 复合运算符 64
4.4.1 概述 64
4.4.2 复合运算符出现的意义 65
4.4.3 优先级 65
4.4.4 练习 66
4.5 自增自减运算符 66
4.5.1 概述 66
4.5.2 自增自减运算符出现的意义 67
4.5.3 优先级 68
4.5.4 练习 69
4.6 小结 69
4.7 习题 69
第5章 语句 70
5.1 输入输出I/O 70
5.1.1 格式化输入scanf() 70
5.1.2 scanf()的使用说明 71
5.1.3 其他输入方式 76
5.1.4 格式化输出printf() 77
5.1.5 printf()的使用说明 79
5.1.6 其他输出方式 81
5.1.7 练习 83
5.2 常见语句 85
5.2.1 赋值语句 85
5.2.2 空语句 85
5.2.3 复合语句 86
5.3 变量的作用域 86
5.3.1 局部变量 87
5.3.2 全局变量 88
5.3.3 练习 89
5.4 语句执行顺序 89
5.4.1 代码手段 89
5.4.2 工具手段 91
5.4.3 流程图 93
5.5 小结 93
5.6 习题 94
第6章 选择结构 95
6.1 顺序执行遇到的麻烦 95
6.1.1 顺序执行的程序 95
6.1.2 无法顺序执行 96
6.1.3 设想解决方案 97
6.2 条件判断依据 97
6.3 构建单一条件 98
6.3.1 关系运算 98
6.3.2 左右操作数类型不一致 99
6.3.3 关系运算符优先级 100
6.3.4 练习 102
6.4 构建多个条件 102
6.4.1 逻辑运算 102
6.4.2 逻辑运算符优先级 104
6.4.3 短路的逻辑运算符 105
6.4.4 练习 106
6.5 构建选择路径之if 107
6.5.1 流程图 107
6.5.2 if结构 107
6.5.3 if-else结构 110
6.5.4 if嵌套结构 112
6.5.5 练习 121
6.6 构建选择路径之switch 122
6.6.1 switch结构 122
6.6.2 比较if结构和switch结构 127
6.6.3 练习 129
6.7 小结 130
6.8 习题 130
第7章 循环结构 132
7.1 重复执行的语句 132
7.1.1 什么是重复执行 132
7.1.2 执行2~3次 133
7.1.3 执行有限次 133
7.1.4 执行不确定次 134
7.2 for循环 135
7.2.1 概述 135
7.2.2 逗号表达式 136
7.2.3 循环执行相同的语句 137
7.2.4 循环执行类似的语句 139
7.2.5 练习 142
7.3 其他循环 144
7.3.1 while循环 144
7.3.2 do-while循环 146
7.3.3 不同循环机制间的比较 147
7.3.4 练习 150
7.4 跳出循环 152
7.4.1 continue语句 152
7.4.2 break语句 154
7.4.3 goto语句 157
7.4.4 练习 160
7.5 循环中的循环——嵌套 161
7.5.1 嵌套实例一 161
7.5.2 嵌套实例二 164
7.5.3 嵌套实例三 166
7.5.4 练习 167
7.6 小结 167
7.7 习题 168
第8章 函数 172
8.1 循环无法解决的重复 172
8.1.1 循环的经典应用和局限 172
8.1.2 循环结构无法解决的重复问题 173
8.1.3 练习 174
8.2 完全重复——无参函数 175
8.2.1 定义无参函数 175
8.2.2 函数的返回值 176
8.2.3 使用无参函数 176
8.2.4 返回值的类型转换 177
8.2.5 函数多return语句处理 179
8.2.6 声明无参函数 180
8.2.7 函数体中的变量 181
8.2.8 练习 183
8.3 不完全重复——有参函数 186
8.3.1 定义有参函数 186
8.3.2 声明有参函数 188
8.3.3 练习 190
8.4 函数体中有函数 192
8.4.1 调用其他函数——嵌套函数 192
8.4.2 调用函数本身——递归函数 195
8.4.3 练习 203
8.5 库函数 205
8.5.1 如何使用库函数 205
8.5.2 文件包含的扩展应用 206
8.5.3 两种包含方式的不同 207
8.5.4 分类 209
8.5.5 库函数应用示例——猜大小 210
8.5.6 练习 214
8.6 小结 215
8.7 习题 215
第3篇 处理大量数据 222
第9章 同类型数据的集合——数组 222
9.1 大量数据的处理 222
9.2 基本数组 223
9.2.1 定义数组 223
9.2.2 使用数组 225
9.2.3 初始化数组 225
9.2.4 为数组赋值 227
9.2.5 数组的简单应用 228
9.3 数组排序 232
9.3.1 冒泡排序 232
9.3.2 选择排序 235
9.3.3 练习 238
9.4 二维数组 240
9.4.1 二维数组的本质——嵌套的数组 240
9.4.2 定义二维数组 241
9.4.3 使用二维数组 242
9.4.4 初始化二维数组 242
9.4.5 特殊的初始化方式 243
9.4.6 为二维数组赋值 244
9.4.7 二维数组的应用 244
9.4.8 练习 246
9.5 多维数组 247
9.6 小结 249
9.7 习题 249
第10章 指针 252
10.1 指针及其使用 252
10.1.1 指针是什么 252
10.1.2 定义指针变量 252
10.1.3 为指针变量赋值 254
10.1.4 通过指针访问数据 255
10.1.5 使用scanf()给指针赋值 256
10.1.6 练习 257
10.2 处理所指向的数据 258
10.2.1 四则运算 258
10.2.2 自增自减运算 258
10.2.3 指向常量的指针 259
10.2.4 定义指针为常量 260
10.3 指向一维数组的指针 262
10.3.1 为指针赋数组数据的地址 262
10.3.2 使用数组名为指针赋值 263
10.3.3 指向数组的指针的加减运算 264
10.3.4 指向同一数组的指针 264
10.3.5 指向二维数组的指针 266
10.4 保存指针的数组 269
10.4.1 定义指针数组 269
10.4.2 二维数组的特性 270
10.4.3 练习 271
10.5 指针在函数中的应用 273
10.5.1 指针作为函数参数 274
10.5.2 指针作为函数返回值 276
10.5.3 指向函数的指针 278
10.5.4 练习 281
10.6 二级指针 284
10.6.1 概述 285
10.6.2 在二维数组中的应用 286
10.6.3 练习 287
10.7 小结 288
10.8 习题 288
第11章 结构 292
11.1 结构概述 292
11.1.1 为什么要有结构 292
11.1.2 结构的构造及其变量的赋值 294
11.1.3 使用typedef简化结构类型名 297
11.1.4 练习 298
11.2 结构的使用 300
11.2.1 结构与指针 300
11.2.2 结构与数组 303
11.2.3 结构与函数 305
11.2.4 练习 308
11.3 结构的应用——链表 311
11.3.1 结构的成员是指向本结构的指针 312
11.3.2 数组与链表 314
11.3.3 链表概述 316
11.3.4 创建动态链表 317
11.3.5 练习 324
11.4 链表操作 327
11.4.1 插入结点到链表 327
11.4.2 删除链表中的结点 336
11.4.3 链表操作综合应用 341
11.4.4 练习 349
11.5 小结 354
11.6 习题 354
第12章 联合与枚举 356
12.1 结构遇到的困扰 356
12.1.1 引起困惑的小示例 356
12.1.2 困惑什么 357
12.1.3 设想的解决方案 358
12.2 联合概述 358
12.2.1 构造联合类型 358
12.2.2 定义联合类型的变量 359
12.2.3 引用联合类型变量成员 360
12.2.4 联合类型变量的赋值 360
12.2.5 练习 361
12.3 联合类型变量的特殊性 361
12.3.1 通过示例来发现 362
12.3.2 数据去哪儿了 362
12.3.3 看似不相干的成员变量 362
12.3.4 总结:联合类型变量的特殊性 363
12.3.5 解决结构遇到的困惑 364
12.3.6 练习 368
12.4 联合类型变量的简单使用 369
12.4.1 使用于函数的联合类型变量 369
12.4.2 指向联合类型变量的指针 371
12.5 枚举 372
12.5.1 枚举概述 373
12.5.2 枚举类型的使用 375
12.5.3 枚举类型应用 378
12.5.4 练习 382
12.6 小结 382
12.7 习题 383
第13章 字符串 387
13.1 概述 387
13.1.1 了解字符串 387
13.1.2 字符串数据的存储 387
13.1.3 字符串的赋值 389
13.1.4 练习 390
13.2 字符串的输出和输入 391
13.2.1 字符串的输出 391
13.2.2 字符串的输入 392
13.2.3 练习 394
13.3 指向字符串的指针 396
13.3.1 指针操作 396
13.3.2 二维字符数组与字符指针数组 398
13.3.3 main()的参数 399
13.3.4 练习 404
13.4 常见的字符串操作 405
13.4.1 “赋值” 405
13.4.2 “加法” 406
13.4.3 修改 407
13.4.4 “比较” 408
13.4.5 其他操作 410
13.4.6 练习 415
13.5 小结 420
13.6 习题 420
第14章 文件 422
14.1 两个亟待解决的问题 422
14.1.1 不得不再次运行程序 422
14.1.2 不得不重新输入数据 423
14.2 文件概述 424
14.2.1 文件 424
14.2.2 存储为文件的数据形式 425
14.2.3 程序读写文件数据的过程 425
14.3 文件的打开和关闭 427
14.3.1 操作文件前的准备 427
14.3.2 打开文件 428
14.3.3 关闭文件 432
14.3.4 练习 433
14.4 文件读写操作 435
14.4.1 必备基础知识 435
14.4.2 写入数据 436
14.4.3 读取数据 442
14.4.4 解决问题一:避免再次运行程序 449
14.4.5 练习 450
14.5 辅助功能 452
14.5.1 位置指针重定位 452
14.5.2 检测文件操作状态 457
14.5.3 解决问题二:避免重新输入数据 460
14.5.4 练习 465
14.6 二进制文件的位操作 468
14.6.1 位操作需求 468
14.6.2 实现位操作的方法——位运算 470
14.6.3 位运算符的使用方法 471
14.6.4 位操作实现 478
14.6.5 练习 483
14.7 小结 485
14.8 习题 485
第15章 预编译 490
15.1 概述 490
15.1.1 预编译指令 490
15.1.2 练习 490
15.2 宏 491
15.2.1 为什么需要宏 491
15.2.2 不带参数的宏 492
15.2.3 带参数的宏 496
15.2.4 取消宏 499
15.2.5 标准宏对象 499
15.2.6 练习 500
15.3 条件编译 502
15.3.1 为什么需要条件编译 502
15.3.2 #if指令 503
15.3.3 #ifdef指令 504
15.3.4 #ifndef指令 505
15.3.5 练习 505
15.4 文件包含 506
15.4.1 概述 506
15.4.2 定义自己的库函数 507
15.4.3 总结 512
15.5 小结 512
15.6 习题 512