第一部分 入门 1
第1章 计算机和系统 1
1.1 物理计算机 1
1.1.1 处理器 2
1.1.2 存储器 2
1.1.3 输入和输出设备 4
1.1.4 总线 5
1.1.5 网络 6
1.2 操作系统 7
1.3 语言 8
1.3.1 机器语言 8
1.3.2 汇编语言 8
1.3.3 高级语言 9
1.4 谨记的要点 11
1.4.1 主要概念 11
1.4.2 词汇 11
习题 11
第2章 程序与编程 13
2.1 什么是程序 13
2.1.1 算法 14
2.2 问题说明和分析 14
2.2.1 问题说明 15
2.2.2 设计测试计划 16
2.2.3 设计方案 17
2.3 开发环境 17
2.3.1 文本编辑器 18
2.3.2 翻译程序 19
2.3.3 连接程序 19
2.4 构造程序 19
2.4.1 创建一个源文件 20
2.4.2 编译程序并改正错误 21
2.5 执行和测试程序 22
2.5.1 执行程序 22
2.5.2 测试和验证 23
2.6 谨记的要点 25
2.6.1 主要概念 25
2.6.2 词汇 25
习题 25
第3章 基本概念 29
3.1 程序的组成 29
3.2 最简单的程序 30
3.3 变量、输入、输出和顺序 31
3.3.1 变量 32
3.3.2 输入和输出 32
3.3.3 读取和回显:使用C语言中的stdio库 34
3.4 简单计算 36
3.4.1 数字 36
3.4.2 赋值 36
3.4.3 常量 36
3.4.4 算术和公式 37
3.4.5 程序原型 37
3.4.6 进行计算的程序 38
3.5 流程控制 40
3.6 询问问题:条件语句 41
3.6.1 简单的if语句 41
3.6.2 if…else语句 43
3.6.3 系统if…else语句 45
3.6.4 应当使用哪一种if语句? 48
3.6.5 语法和布局的选择(选修专题) 48
3.7 循环和重复 49
3.7.1 计数循环 49
3.7.2 输入校验循环 51
3.8 应用 53
3.9 谨记的要点 57
3.9.1 主要概念 57
3.9.2 编程风格 58
3.9.3 难点和常见错误 58
3.9.4 新词汇和再次出现的词汇 59
习题 60
第二部分 计算 67
第4章 对象、类型和表达式 67
4.1 变量、常量和文字 67
4.1.1 变量 67
4.1.2 常量和文字 69
4.1.3 名称和标识符 70
4.1.4 类型 71
4.2 表达式和解析树 72
4.2.1 操作符和算元 73
4.2.2 优先级和括号 73
4.2.3 解析和解析树 74
4.3 算术、赋值和合并操作符 76
4.4 递增和递减操作符 78
4.4.1 解析递增和递减操作符 78
4.4.2 前缀操作符和后缀操作符(高级专题) 80
4.5 关系操作符 81
4.6 逻辑操作符 82
4.6.1 True和False 82
4.6.2 逻辑操作符的解析树 83
4.6.3 惰性计算法(高级专题) 84
4.7 样例:电压斜线上升 86
4.8 案例分析:使用解析树进行调试 89
4.9 谨记的要点 92
4.9.1 主要概念 92
4.9.2 编程风格 93
4.9.3 难点和常见错误 93
4.9.4 新词汇和再次出现的词汇 94
习题 94
第5章 使用函数和库 99
5.1 库 99
5.1.1 标准库 99
5.1.2 本地库 100
5.2 使用库 101
5.2.1 原型 101
5.2.2 函数调用 102
5.3 函数类型 105
5.4 用户自定义函数 106
5.4.1 定义void:void函数 106
5.4.2 定义一个double:double函数 108
5.5 数学库应用:二次方程的根 111
5.6 一个用户自定义函数:通过计算矩形总和实现的数值积分 114
5.7 谨记的要点 116
5.7.1 主要概念 116
5.7.2 编程风格 117
5.7.3 难点和常见错误 117
5.7.4 新词汇和再次出现的词汇 118
习题 118
第6章 进一步了解循环和判定 123
6.1 新的循环 123
6.1.1 for循环 123
6.1.2 do…while循环 126
6.1.3 循环中的break 126
6.1.4 循环continue(选修专题) 128
6.1.5 不完全循环 128
6.2 应用循环 129
6.2.1 计数循环 129
6.2.2 查询循环 131
6.2.3 输入验证循环 135
6.2.4 哨兵循环 136
6.2.5 计数哨兵循环 137
6.2.6 查找循环(选修专题) 140
6.2.7 延时循环(选修专题) 140
6.3 switch语句 142
6.3.1 语法和语义 142
6.3.2 一个应用程序 144
6.4 计数循环应用:用辛普森法则积分 147
6.5 应用哨兵循环:插值(选修专题) 152
6.5.1 程序设计 152
6.5.2 程序测试 156
6.6 谨记的要点 158
6.6.1 主要概念 158
6.6.2 编程风格 158
6.6.3 难点和常见错误 159
6.6.4 新词汇和再次出现的词汇 159
习题 160
第三部分 基本数据类型 167
第7章 使用数值类型 167
7.1 整型 167
7.2 C中的浮点类型 169
7.3 读写数值 170
7.3.1 整型输入 171
7.3.2 整型输出 171
7.3.3 浮点数输入 172
7.3.4 浮点数输出 172
7.4 操作整型数 175
7.4.1 整数除法和求模 175
7.4.2 应用整数除法和求模 177
7.5 计算中的混合类型(高级专题) 179
7.5.1 基本类型转换 179
7.5.2 类型转换运算和强制类型转换 181
7.5.3 类型转换图示 184
7.5.4 使用类型转换避免整数除法中的问题 185
7.5.5 混合类型算术运算应用程序:射弹问题 187
7.6 伪随机数 189
7.6.1 生成随机数 189
7.6.2 标准随机数生成器的优点 190
7.7 应用程序:猜数游戏 193
7.7.1 策略 193
7.7.2 玩游戏 193
7.8 谨记的要点 196
7.8.1 主要概念 196
7.8.2 编程风格 198
7.8.3 难点和常见错误 198
7.8.4 新词汇和再次出现的词汇 199
习题 200
第8章 数值问题及其解决 207
8.1 浮点数比较 207
8.1.1 可表示误差 207
8.1.2 有意义的比较 208
8.1.3 应用程序:巡航控制 209
8.2 计算误差(高级专题) 211
8.2.1 上溢 211
8.2.2 下溢 214
8.2.3 量级的阶和其他问题 215
8.3 可选应用程序:求方程的实数根 215
8.3.1 牛顿法 216
8.4 谨记的要点 221
8.4.1 主要概念 221
8.4.2 难点和常见错误 222
8.4.3 新词汇和再次出现的词汇 222
习题 223
第9章 程序设计 229
9.1 模块化程序 229
9.1.1 模块组织 229
9.2 函数间通信 232
9.2.1 函数界面 232
9.2.2 实参和形参 233
9.2.3 函数的返回结果 234
9.3 声明与调用的相似之处 235
9.3.1 检查原型和形参类型 235
9.3.2 回顾常见原型 236
9.3.3 格式形参名 236
9.3.4 函数语法:通用情况 238
9.3.5 形参次序 240
9.4 数据模块化 241
9.4.1 作用域和可视性 242
9.4.2 全局和局部名称 243
9.4.3 消除全局变量 245
9.5 函数调用图表 247
9.6 程序设计和结构 249
9.6.1 步骤 249
9.6.2 程序的层次开发 251
9.7 谨记的要点 258
9.7.1 主要概念 258
9.7.2 编程风格 258
9.7.3 难点及常见错误 259
9.7.4 新词汇和再次出现的词汇 260
习题 260
第10章 数组 267
10.1 数组 267
10.1.1 数组声明和初始化 267
10.1.2 数组尺寸(高级专题) 269
10.1.3 访问数组 270
10.1.4 下标越界错误(高级专题) 272
10.2 使用数组 272
10.2.1 数组输入 273
10.2.2 越界使用存储单元 274
10.3 平行数组 276
10.4 数组实参和形参 279
10.4.1 数组应用:测量统计 280
10.4.2 线性回归(选修专题) 285
10.5 谨记的要点 290
10.5.1 主要概念 290
10.5.2 编程风格 291
10.5.3 难点和常见错误 291
10.5.4 新词汇和再次出现的词汇 291
习题 292
第11章 字符数据和枚举类型 299
11.1 字符的表示方法 299
11.1.1 C语言中的字符类型 299
11.1.2 不同的解释 299
11.1.3 字符文字 300
11.2 字符的输入和输出 301
11.2.1 字符输入 301
11.2.2 字符输出 302
11.2.3 使用I/O函数 303
11.3 字符操作(高级专题) 305
11.3.1 字符就是极短的整数 305
11.3.2 赋值 306
11.3.3 比较字符 306
11.3.4 字符算术 307
11.3.5 其他字符函数 307
11.4 字符应用程序:改进后的处理循环 308
11.5 枚举类型 309
11.5.1 类型定义 310
11.5.2 枚举 310
11.6 谨记的要点 315
11.6.1 主要概念 315
11.6.2 编程风格 315
11.6.3 难点和常见错误 316
11.6.4 新词汇和再次出现的词汇 316
习题 317
第12章 指针介绍 323
12.1 指针概述 323
12.1.1 指针就是地址 323
12.1.2 指针操作 325
12.2 地址调用 327
12.2.1 地址参数 328
12.2.2 指针参数 328
12.2.3 更复杂的样例 330
12.2.4 函数返回多个结果 331
12.2.5 小结:从函数返回结果 335
12.3 应用:对分方法(高级专题) 335
12.4 谨记的要点 344
12.4.1 主要概念 344
12.4.2 编程风格 344
12.4.3 难点和常见错误 345
12.4.4 新词汇和再次出现的词汇 346
习题 346
第四部分 结构化数据类型 355
第13章 字符串 355
13.1 字符串的表达形式 355
13.1.1 字符串文字 355
13.1.2 字符串就是指向一个数组的指针 356
13.1.3 声明一个数组来得到字符串 358
13.1.4 数组与字符串 358
13.2 字符串I/O 360
13.2.1 字符串输出 360
13.2.2 字符串输入 362
13.2.3 其他字符串函数 365
13.2.4 字符串作为参数使用 365
13.3 String库 366
13.3.1 3个字符串工具(高级专题) 370
13.4 字符串数组 371
13.4.1 打印枚举代码 372
13.4.2 菜单数据结构 373
13.4.3 样例:售卖冰激凌 374
13.4.4 下标校验 377
13.4.5 menu_i()和menu_c()函数 377
13.5 字符串处理应用(选修专题) 378
13.5.1 口令校验和构建消息 378
13.5.2 菜单处理和字符串解析 383
13.6 应用程序:气压表 388
13.6.1 第1步:测试计划 388
13.6.2 第2步:主程序 389
13.6.3 第3步:气压表 389
13.6.4 第4步:work()函数 390
13.6.5 第5步:测试程序 391
13.7 谨记的要点 392
13.7.1 主要概念 392
13.7.2 编程风格 393
13.7.3 难点和常见错误 393
13.7.4 新词汇和再次出现的词汇 394
习题 395
第14章 结构化类型 405
14.1 声明 405
14.2 结构体的操作 407
14.2.1 结构体操作 407
14.2.2 在函数中使用结构体 409
14.2.3 结构体数组 411
14.2.4 比较两个结构体 413
14.2.5 合并各个部分 414
14.3 应用程序:矩形中的点 415
14.4 应用:Monte Carlo方法(选修专题) 424
14.4.1 问题描述、说明和测试 424
14.4.2 开发主程序 426
14.4.3 开发函数 427
14.4.4 测试、输出和估算 429
14.5 谨记的要点 430
14.5.1 主要概念 430
14.5.2 编程风格 430
14.5.3 难点和常见错误 431
14.5.4 新词汇和再次出现的词汇 431
习题 432
第15章 流和文件 441
15.1 流和缓冲区 441
15.1.1 I/O流 441
15.1.2 缓冲区 444
15.2 程序员自定义的流 445
15.2.1 定义和使用流 445
15.2.2 文件管理错误 447
15.3 输出流 447
15.3.1 输出函数 447
15.3.2 有文件中写入数据 448
15.4 输入流 451
15.4.1 输入函数 451
15.4.2 检测文件结尾 452
15.4.3 从文件读取数据 452
15.5 错误和异常 454
15.5.1 格式错误 455
15.5.2 文件处理错误 457
15.5.3 错误恢复 458
15.5.4 错误恢复的工具:cleanline() 458
15.5.5 使用scanf()的返回值 459
15.5.6 错误恢复的联合技术 460
15.6 文件应用程序:不做替换的随机选择 462
15.7 应用:测量扭矩(选修专题) 469
15.8 谨记的要点 473
15.8.1 主要概念 473
15.8.2 编程风格 474
15.8.3 难点和常见错误 475
15.8.4 新词汇和再次出现的词汇 476
习题 476
第16章 简单数组算法 483
16.1 查找数组数据结构 483
16.1.1 在表中查找 483
16.1.2 屏蔽 484
16.2 应用程序:筛选掉不合适的数据(选修专题) 488
16.2.1 Chauvenet算法 488
16.2.2 Chauvenet程序 491
16.2.3 I/O工具函数 494
16.2.4 识别“坏”数据 496
16.2.5 消除“坏”数据 497
16.3 选择排序 499
16.3.1 选择排序算法 499
16.3.2 主程序 500
16.3.3 开发write_file()函数 502
16.3.4 开发sort_data()函数 503
16.4 谨记的要点 507
16.4.1 主要概念 507
16.4.2 编程风格 507
16.4.3 难点和常见错误 508
16.4.4 新词汇和再次出现的词汇 509
习题 509
第17章 二维数组 515
17.1 嵌套循环:打印表 515
17.2 二维数组介绍 517
17.2.1 声明和内存分布 517
17.2.2 对二维数组使用typedef 518
17.2.3 矩阵 518
17.2.4 数组的数组 520
17.2.5 读写二进制矩阵数据 523
17.2.6 多维数组 524
17.3 应用:二维点坐标的变换 524
17.4 应用程序:图像处理 530
17.5 谨记的要点 536
17.5.1 主要概念 536
17.5.2 编程风格 536
17.5.3 难点和常见错误 537
17.5.4 新词汇和再次出现的词汇 537
习题 538
第18章 位运算 547
18.1 无符号整数和十六进制 547
18.1.1 无符号数和十六进制I/O 548
18.2 位操作符 551
18.2.1 掩码和屏蔽 552
18.2.2 移位操作符 554
18.2.3 例子:移位和屏蔽互联网址 555
18.3 应用程序:简单加密和解密 557
18.4 位段类型 560
18.4.1 位段应用:设备控制(高级专题) 563
18.5 谨记的要点 569
18.5.1 主要概念 569
18.5.2 编程风格 570
18.5.3 难点和常见错误 570
18.5.4 新词汇和再次出现的词汇 570
习题 571
第五部分 高级技术 579
第19章 动态数组 579
19.1 动态内存分配 579
19.1.1 整块存储空间分配 579
19.1.2 可清除的内存分配 581
19.1.3 动态释放内存 582
19.1.4 调整数组的大小 582
19.1.5 使用动态数组 584
19.1.6 动态字符串数组 585
19.2 使用动态数组:仿真 588
19.2.1 半无限平台上的瞬时热传导 588
19.2.2 仿真冷却过程 590
19.3 动态矩阵:指针数组(高级专题) 596
19.3.1 应用:高斯消元 596
19.3.2 高斯消元算法的实现 597
19.4 谨记的要点 607
19.4.1 主要概念 607
19.4.2 编程风格 608
19.4.3 难点和常见错误 609
19.4.4 新词汇和再次出现的词汇 609
习题 610
第20章 使用指针 615
20.1 指针--新老方法 615
20.1.1 指针声明和初始化 615
20.1.2 使用指针 617
20.1.3 指针的算术和逻辑运算 619
20.2 应用:指向函数指针的菜单(高级专题) 621
20.3 在数组中使用指针 623
20.3.1 扫描和哨兵 624
20.3.2 使用指针的输入输出函数 626
20.4 插入排序 628
20.5 谨记的要点 634
20.5.1 主要概念 634
20.5.2 编程风格 635
20.5.3 难点与常见错误 636
20.5.4 新词汇和再次出现的词汇 637
习题 637
第21章 递归 645
21.1 存储类别 645
21.1.1 自动存储类别 645
21.1.2 静态存储类别 645
21.1.3 外部存储类别(高级专题) 646
21.2 运行栈(高级专题) 647
21.2.1 栈帧 647
21.2.2 栈图表和程序追踪 648
21.3 迭代和递归 649
21.3.1 迭代的本质 649
21.3.2 递归的本质 650
21.3.3 尾部递归 650
21.4 一个简单的递归倒子 651
21.5 较复杂的例子:折半查找 653
21.6 快速排序 660
21.6.1 分割步骤:分部处理 665
21.6.2 可能的改进 669
21.7 谨记的内容 669
21.7.1 主要概念 669
21.7.2 编程风格 670
21.7.3 难点和常见错误 671
21.7.4 新词汇和再次出现的词汇 671
习题 671
第22章 编写通用程序 677
22.1 命令行实参 677
22.1.1 实参向量 677
22.1.2 实参解码 677
22.2 函数作形参 683
22.2.1 使用系统的qsort()函数 684
22.2.2 使用系统的bsearch()函数 686
22.3 谨记的要点 689
22.3.1 主要概念 689
22.3.2 编程风格 689
22.3.3 难点和常见错误 690
22.3.4 新词汇和再次出现的词汇 690
习题 691
第23章 模块化组织 695
23.1 建立模块化程序 695
23.1.1 模块化结构的文件管理 695
23.1.2 建立多模块程序 697
23.2 模块化应用程序:求方程的根 702
23.2.1 多模块应用程序的结构 702
23.2.2 待求解函数:热传导方程 703
23.2.3 roots程序包的主函数 705
23.2.4 Roots头文件 709
23.2.5 修改对分法 710
23.2.6 使用割线法 713
23.2.7 定义求根应用程序 718
23.3 谨记的要点 719
23.3.1 主要概念 719
23.3.2 编程风格 720
23.3.3 难点和常见错误 720
23.3.4 新词汇和再次出现的词汇 720
习题 721
附录A ASCII代码 725
附录B C操作符的优先级 727
附录C 关键字 729
C.1 预处理命令 729
C.2 控制字 729
C.3 类型和声明 729
C.4 C?保留字 729
C.5 按字母表顺序排序的C和C?保留字 730
附录D C操作符的高级特征 731
D.1 组合赋值操作符 731
D.2 对简便计算和忽略的深入了解 732
D.2.1 运算顺序和操作符的副作用 734
D.3 条件操作符 734
D.4 逗号操作符 736
D.5 总结 736
附录E 数值表示法和转换 739
E.1 数值系统和数值表示法 739
E.2 带符号和无符号整数 739
E.3 实数的表示法 740
E.4 数值转换 741
E.5 自测练习 743
附录F tools库 745
F.1 在程序中使用tools库 746
F.1.1 组织工程 746
F.1.2 在Visual c?环境下使用tools 747
F.1.3 在UNIX环境下使用tools 747
F.2 可移植性指令 748
F.3 在tools.h中声明并在tools.c中定义的函数 749
F.4 过程和流管理 749
F.4.1 错误处理函数 752
F.5 时间和日期函数 753
F.6 数值函数 754
F.7 字符串和菜单 755
附录G 标准C环境 757
G.1 嵌入工具 757
G.2 标准常量文件 757
G.3 标准库和main() 758
G.3.1 main()函数 758
G.3.2 字符和转换 758
G.3.3 数学 759
G.3.4 输入和输出 760
G.3.5 标准库 762
G.3.6 字符串 764
G.3.7 时间和日期 765
G.3.8 变长参数列表 766
G.4 未介绍的库 767
附录H 术语表 769
附录I 自测练习答案 779
1.1 第1章 779
1.2 第2章 779
1.3 第3章 779
1.4 第4章 780
1.5 第5章 781
1.6 第6章 781
1.7 第7章 783
1.8 第8章 784
1.9 第9章 785
1.10 第10章 787
1.11 第11章 788
1.12 第12章 789
1.13 第13章 792
1.14 第14章 794
1.15 第15章 795
1.16 第16章 796
1.17 第17章 797
1.18 第18章 799
1.19 第19章 800
1.20 第20章 802
1.21 第21章 803
1.22 第22章 805
1.23 第23章 806
1.24 附录E 808