第1章 计算机与程序设计概述 1
1.1 电子计算机的过去和现在 1
1.2 计算机硬件 2
1.2.1 存储器 3
1.2.2 中央处理器 6
1.2.3 输入/输出设备 6
1.2.4 计算机网络 7
1.3 计算机软件 9
1.3.1 操作系统 9
1.3.2 应用软件 10
1.3.3 计算机语言 10
1.3.4 执行程序 13
1.4 软件开发方法 14
1.4.1 软件开发方法 14
1.4.2 注意:失败是编程过程的一部分 16
1.5 应用软件开发方法 16
实例研究:英里到公里的转换 16
复习 18
快速测试 19
快速测试答案 19
复习题 19
第2章 C概述 20
2.1 C语言要素 20
2.1.1 预处理指令 20
2.1.2 预处理指令的语法展示 21
2.1.3 main函数 22
2.1.4 保留字 22
2.1.5 标准标识符 23
2.1.6 用户定义的标识符 23
2.1.7 大写和小写字母 24
2.1.8 程序风格:选择标识符名称 24
2.2 变量声明和数据类型 24
2.2.1 变量声明 24
2.2.2 数据类型 25
2.3 可执行语句 27
2.3.1 内存中的程序 27
2.3.2 赋值语句 27
2.3.3 输入/输出操作和函数 28
2.3.4 printf函数 29
2.3.5 scanf函数 31
2.3.6 return语句 32
2.4 C程序的一般形式 33
2.4.1 程序风格:程序中的空格 33
2.4.2 程序的注释 34
2.4.3 程序风格:使用注释 34
2.5 算术表达式 35
2.5.1 运算符/和% 36
2.5.2 表达式的数据类型 37
2.5.3 混合类型赋值语句 37
2.5.4 强制类型转换 38
2.5.5 具有多个运算符的表达式 38
2.5.6 用C语言编写数学公式 40
实例研究:对收集的硬币求值 41
2.6 在程序输出中格式化数值 44
2.6.1 格式化int型值 44
2.6.2 格式化double型值 45
2.6.3 程序风格:消除前导空白 46
2.7 交互模式、批处理模式和数据文件 46
2.7.1 输入重定向 46
2.7.2 程序风格:回显与提示符 47
2.7.3 输出重定向 47
2.7.4 程序控制的输入和输出文件 48
2.8 常见编程错误 49
2.8.1 语法错误 49
2.8.2 运行时错误 51
2.8.3 未检测到的错误 51
2.8.4 逻辑错误 53
复习 53
快速测试 54
快速测试答案 55
复习题 55
程序设计项目 56
第3章 函数的自顶向下设计 58
3.1 利用已有信息编程 58
实例研究:求圆的面积和周长 59
实例研究:计算一批平垫圈的重量 61
3.2 库函数 64
3.2.1 预定义函数和代码复用 64
3.2.2 使用灰色区分新结构 65
3.2.3 C库函数 65
3.2.4 本节目标 67
3.3 自顶向下设计和结构图 68
实例研究:画简单的图 68
3.4 无参函数 69
3.4.1 函数原型 70
3.4.2 函数定义 70
3.4.3 程序中函数的位置 72
3.4.4 程序风格:在含有函数的程序中使用注释 73
3.4.5 子函数和主函数的执行顺序 73
3.4.6 使用子函数的优点 74
3.4.7 显示用户指令 74
3.5 带输入参数的函数 75
3.5.1 带输入参数的void函数 76
3.5.2 带输入参数和单一结果的函数 77
3.5.3 程序风格:函数接口注释 79
3.5.4 带多个参数的函数 79
3.5.5 参数表一致性 80
3.5.6 函数数据域 81
3.5.7 使用驱动测试函数 81
3.6 常见编程错误 82
复习 82
快速测试 83
快速测试答案 84
复习题 84
程序设计项目 84
第4章 选择结构:if语句和switch语句 88
4.1 控制结构 88
4.2 条件 88
4.2.1 关系运算符和判等运算符 89
4.2.2 逻辑运算符 89
4.2.3 运算符优先级 90
4.2.4 短路求值法 92
4.2.5 用C语言表示条件 92
4.2.6 比较字符 93
4.2.7 逻辑赋值 93
4.2.8 条件取反 94
4.2.9 德摩根定理 95
4.3 if语句 96
4.3.1 有两个选项的if语句 96
4.3.2 只有一个选项的if语句 96
4.3.3 比较一个选项的if语句和两个选项的if语句 97
4.3.4 程序风格:if语句格式 98
4.4 具有复合语句的if语句 98
4.4.1 程序风格:编写具有复合语句的if语句 99
4.4.2 跟踪if语句 99
4.5 算法中的决策步骤 101
实例研究:水费问题 101
4.5.1 程序风格:在函数中使用一致的名称 106
4.5.2 程序风格:内聚函数 106
4.5.3 程序风格:使用常量宏来增强可读性和易维护性 107
4.6 解决更多问题 107
4.6.1 结构图中的数据流信息 107
4.6.2 使用子函数修改程序 108
实例研究:具有节约需求的水费问题 108
4.7 嵌套if语句和多选项决策 109
4.7.1 比较嵌套if和if序列 110
4.7.2 嵌套if的多选项决策形式 110
4.7.3 多选项决策中条件的顺序 111
4.7.4 程序风格:确认变量的值 113
4.7.5 具有多个变量的嵌套if语句 113
4.8 switch语句 116
4.9 常见编程错误 119
复习 120
快速测试 121
快速测试答案 123
复习题 123
程序设计项目 124
第5章 重复和循环语句 128
5.1 程序中的重复 128
5.2 计数循环和while语句 129
5.3 在循环中计算和或者乘积 131
5.3.1 程序风格:编写通用循环 133
5.3.2 计算一列数的乘积 133
5.3.3 复合赋值运算符 134
5.4 for语句 135
5.4.1 程序风格:格式化for语句 136
5.4.2 递增和递减运算符 136
5.4.3 1之外的递增和递减 138
5.4.4 显示值构成的表格 139
5.5 条件循环 140
程序风格:在子函数中执行循环处理 144
5.6 循环设计 144
5.6.1 标记控制循环 145
5.6.2 使用for语句实现标记循环 146
5.6.3 文件结束控制循环 147
5.6.4 错误数据上的无限循环 148
5.7 嵌套循环 149
5.8 do-while语句和标志控制循环 152
5.9 问题求解示例 154
实例研究:太阳能加热房的采集面积 154
5.10 如何调试并测试程序 159
5.10.1 使用调试器程序 159
5.10.2 不使用调试器进行调试 159
5.10.3 循环次数差1的错误 160
5.10.4 测试 160
5.11 常见编程错误 161
复习 162
快速测试 164
快速测试答案 165
复习题 165
程序设计项目 166
第6章 模块化编程 171
6.1 带简单输出参数的函数 171
6.2 带输入输出参数函数的多次调用 176
程序风格:首选的函数类型 179
6.3 名字的作用域 180
6.4 输出形参作为实参变量 181
6.5 由多个函数构成的程序 184
实例研究:普通分数的算术运算 184
6.6 程序系统的调试与测试 190
6.7 常见编程错误 192
复习 192
快速测试 193
快速测试答案 194
复习题 194
程序设计项目 195
第7章 简单数据类型 201
7.1 数值类型的表示与转换 201
7.1.1 数值类型的差异 201
7.1.2 数值的不精确性 203
7.1.3 数据类型的自动转换 203
7.1.4 数据类型的显式转换 204
7.2 字符类型的表示与转换 205
7.3 枚举类型 206
7.4 迭代近似 211
实例研究:求根的二分方法 212
7.5 常见编程错误 217
复习 217
快速测试 218
快速测试答案 219
复习题 219
程序设计项目 220
第8章 数组 225
8.1 声明和引用数组 225
8.2 数组下标 228
8.3 使用循环顺序存取 229
8.3.1 使用数组进行统计计算 230
8.3.2 程序风格:使用循环控制变量作为数组下标 232
8.4 将数组元素作为函数参数使用 232
8.5 数组参数 234
8.5.1 形参数组 234
8.5.2 和形参数组对应的实参 235
8.5.3 数组作为输入参数 236
8.5.4 返回数组结果 237
8.5.5 部分填充数组 239
8.5.6 栈 240
8.6 数组搜索和排序 243
8.6.1 数组搜索 243
8.6.2 数组排序 244
8.7 多维数组 246
8.7.1 多维数组的初始化 248
8.7.2 多维数组 248
8.8 数组处理示例 249
实例研究:销售数据分析 249
8.9 常见编程错误 255
复习 256
快速测试 257
快速测试答案 257
复习题 258
程序设计项目 258
第9章 字符串 264
9.1 字符串基础 264
9.1.1 声明并初始化字符串变量 264
9.1.2 字符串数组 265
9.1.3 使用printf和scanf进行输入/输出 265
9.2 字符串库函数:赋值和子串 268
9.2.1 字符串赋值 268
9.2.2 子串 270
9.3 较长的字符串:拼接和整行输入 274
9.3.1 拼接 274
9.3.2 字符和字符串的区别 275
9.3.3 输入一个完整的行 275
9.4 字符串比较 277
9.5 指针数组 279
9.6 字符操作 283
9.6.1 字符输入/输出 283
9.6.2 字符分析和转换 284
9.7 字符串到数值和数值到字符串的转换 286
9.8 字符串处理示例 290
实例研究:文本编辑器 291
9.9 常见编程错误 297
复习 298
快速测试 299
快速测试答案 300
复习题 301
程序设计项目 302
第10章 递归 305
10.1 递归的本质 305
10.2 跟踪递归函数 308
10.2.1 带返回值的递归函数的跟踪 308
10.2.2 void类型递归函数的跟踪 309
10.2.3 参数与局部变量栈 311
10.2.4 C中参数栈的实现 312
10.2.5 何时、如何跟踪递归函数 313
10.3 递归数学函数 314
10.4 带数组和字符串参数的递归函数 318
实例研究:找出字符串中的大写字母 318
实例研究:递归选择排序 320
10.5 用递归解决问题 322
实例研究:集合运算 322
10.6 递归的经典实例研究:汉诺塔 327
10.7 常见编程错误 331
复习 332
快速测试 332
快速测试答案 333
复习题 333
程序设计项目 334
第11章 结构体与共用体类型 337
11.1 用户自定义结构体类型 337
11.1.1 结构体类型定义 337
11.1.2 操作结构化数据对象的单个成员 339
11.1.3 运算符优先级回顾 339
11.1.4 操作结构体整体 340
11.1.5 程序风格:类型命名约定 340
11.2 结构体类型数据作为输入/输出参数 341
11.3 返回值为结构体类型的函数 345
11.4 用结构体类型解决问题 347
实例研究:用于复数的用户自定义类型 347
11.5 并行数组和结构体的数组 352
11.5.1 并行数组 352
11.5.2 结构体数组的声明 352
实例研究:通用计量转换 353
11.6 共用体类型(可选) 359
11.7 常见编程错误 363
复习 364
快速测试 365
快速测试答案 365
复习题 366
程序设计项目 367
第12章 文本文件和二进制文件的处理 372
12.1 输入/输出文件:回顾与进一步研究 372
12.1.1 键盘和屏幕作为文本流 372
12.1.2 换行与EOF 373
12.1.3 转义序列 373
12.1.4 printf的格式输出 373
12.1.5 文件指针变量 374
12.1.6 获取文件指针参数的函数 375
12.1.7 关闭文件 376
12.2 二进制文件 378
12.3 数据库查询 382
实例研究:数据库查询 382
12.4 常见编程错误 389
复习 390
快速测试 391
快速测试答案 391
复习题 392
程序设计项目 392
第13章 大型程序设计 395
13.1 使用抽象处理复杂问题 395
13.1.1 过程抽象 395
13.1.2 数据抽象 396
13.1.3 信息隐藏 396
13.1.4 可重用代码 396
13.2 个人库:头文件 397
13.2.1 头文件 398
13.2.2 头文件设计的忠告 399
13.3 个人库:实现文件 400
13.4 存储类 402
13.4.1 全局变量 403
13.4.2 static和register存储类 404
13.5 库中包含函数的修改 405
13.6 条件编译 407
13.7 函数main的参数 410
13.8 定义带参数的宏 411
13.8.1 在宏体中使用括号 413
13.8.2 在两行以上扩展宏 414
13.9 常见编程错误 415
复习 415
快速测试 417
快速测试答案 417
复习题 418
程序设计项目 418
第14章 动态数据结构 421
14.1 指针 421
14.1.1 作为函数参数的指针 422
14.1.2 表示数组和字符串的指针 422
14.1.3 指向结构体的指针 423
14.1.4 指针使用的小结 423
14.2 动态内存分配 424
14.2.1 访问动态分配的结构体成员 425
14.2.2 使用calloc动态分配数组 426
14.2.3 返回堆单元 426
14.3 链表 428
14.3.1 带指针成员的结构体 428
14.3.2 连接结点 429
14.3.3 链表的优点 431
14.4 链表运算符 432
14.4.1 遍历链表 432
14.4.2 获得输入表 434
14.4.3 在表中查询目标 435
14.4.4 避免跟踪NULL指针 435
14.5 用链表表示栈 436
14.6 用链表表示队列 438
14.7 有序表 443
实例研究:维护一个整数有序表 443
14.8 二叉树 451
14.8.1 二叉查找树 452
14.8.2 搜索二叉查找树 452
14.8.3 建立二叉查找树 454
14.8.4 显示二叉查找树 456
14.9 常见编程错误 458
复习 459
快速测试 460
快速测试答案 461
复习题 461
程序设计项目 462
第15章 使用进程和线程的多进程 464
15.1 多任务 464
15.1.1 串行程序设计和并行程序设计 464
15.1.2 分时多任务 465
15.1.3 抢占式多任务 465
15.1.4 时间片和并行 466
15.1.5 并发程序设计 467
15.2 进程 467
15.2.1 进程创建 467
15.2.2 进程等待 469
15.2.3 从进程中执行另一个程序 470
15.3 进程间通信和管道 471
15.3.1 管道 471
15.3.2 管道的用法 472
15.3.3 使用标准输入的进程间通信 473
15.3.4 父进程和子进程间通信举例 474
15.4 线程 476
15.4.1 线程的创建 477
15.4.2 线程的同步 478
15.4.3 互斥锁 479
15.4.4 死锁 481
15.5 线程举例 484
实例研究:生产者/消费者模型 484
15.6 常见编程错误 493
复习 493
C语言结构的复习 493
快速测试 494
快速测试答案 495
复习题 495
程序设计项目 496
第16章 关于C++ 497
16.1 C++控制结构、输入/输出以及函数 497
16.1.1 使用名字空间std 497
16.1.2 C++标准输入/输出 500
16.1.3 引用参数 500
16.1.4 输出格式化 502
16.2 C++对面向对象编程的支持 503
16.2.1 头文件complex.h 504
16.2.2 类名和构造函数 505
16.2.3 成员函数和运算符 506
16.2.4 实现文件complex.cpp 506
16.2.5 数据成员 509
16.2.6 输入/输出运算符重载 510
复习 512
快速测试 513
快速测试答案 514
复习题 514
程序设计项目 515
附录A 字符集 516
附录B ANSI C标准库 518
附录C C运算符 529
附录D 关于指针的更多信息 533
附录E ANSI C保留字 537
附录F ANSI C结构的参照指南 538