第1章 程序设计与问题解决概述 1
1.1 程序设计概述 1
1.1.1 什么是程序设计 1
1.1.2 怎样编写程序 2
1.1.3 什么是算法 3
1.1.4 什么是程序设计语言 4
1.2 计算机如何运行程序 7
1.2.1 程序设计语言可以编写的指令类型 9
1.2.2 什么是软件维护 11
1.3 计算机里有什么 15
1.4 计算行业的行为准则与义务 19
1.4.1 软件盗版 19
1.4.2 数据的保密 19
1.4.3 计算机资源的使用 19
1.4.4 软件工程 20
1.5 问题求解方法 21
1.5.1 提出问题 21
1.5.2 寻找熟悉的内容 21
1.5.3 类比解决 22
1.5.4 方法-目标分析 22
1.5.5 分而治之 23
1.5.6 构建模块方法 23
1.5.7 合并解决方案 24
1.5.8 心理障碍:对开始的恐惧 24
1.5.9 用算法解决问题 25
1.6 小结 29
第2章 C++语法与语义及程序开发过程.31
2.1 C++程序的组成元素 31
2.1.1 C++程序结构 31
2.1.2 语法与语义 33
2.1.3 语法模板 34
2.1.4 为程序元素命名:标识符 36
2.1.5 数据和数据类型 37
2.1.6 为元素命名:声明 38
2.1.7 采取行动:可执行语句 42
2.1.8 超越最简主义:向程序添加注释 46
2.2 程序构造 47
2.2.1 程序块(复合语句) 49
2.2.2 C++预处理器 50
2.3 再说“输出” 55
2.3.1 生成空行 55
2.3.2 在一行内插入空格 56
2.3.3 特殊字符 56
2.4 程序输入、纠错和执行 57
2.4.1 输入程序 57
2.4.2 编译和运行程序 58
2.5 测试与调试 61
2.6 小结 62
第3章 数值类型、表达式和输出 63
3.1 C++数据类型概述 63
3.2 数值数据类型 64
3.2.1 整型 64
3.2.2 浮点类型 65
3.3 数值类型的声明 66
3.3.1 命名常量声明 66
3.3.2 变量声明 67
3.4 简单算术表达式 67
3.4.1 算术运算符 67
3.4.2 递增和递减运算符 70
3.5 复合算术表达式 70
3.5.1 优先级规则 70
3.5.2 隐式类型转换和显式类型转换 71
3.6 函数调用和库函数 75
3.6.1 返回值的函数 75
3.6.2 库函数 77
3.6.3 void函数 78
3.7 设置输出格式 78
3.7.1 整数和字符串 79
3.7.2 浮点数 81
3.8 其他string操作 85
3.8.1 length和size函数 85
3.8.2 find函数 86
3.8.3 substr函数 87
3.8.4 访问字符串中的字符:at函数 88
3.8.5 转换为小写和大写 88
3.9 测试与调试 92
3.10 小结 93
第4章 程序输入和软件设计过程 94
4.1 向程序输入数据 94
4.1.1 输入流和提取运算符(>>) 95
4.1.2 读取标记和换行符 97
4.1.3 用get函数读取字符数据 98
4.1.4 用ignore函数跳过字符 100
4.1.5 读取字符串数据 101
4.2 交互式输入/输出 103
4.3 非交互式输入/输出 105
4.4 文件输入和输出 105
4.4.1 文件 106
4.4.2 使用文件 106
4.4.3 运行时输入文件名 111
4.5 输入失败 113
4.6 软件设计方法 113
4.7 功能分解 114
4.7.1 模块 116
4.7.2 实现设计 116
4.7.3 有关设计的一种观点 119
4.8 测试与调试 123
4.9 小结 124
第5章 条件、逻辑表达式和选择控制结构 126
5.1 控制流 126
5.2 条件与逻辑表达式 128
5.2.1 bool数据类型 128
5.2.2 逻辑表达式 128
5.3 If语句 132
5.3.1 If-Then-Else形式 132
5.3.2 块(复合语句) 134
5.3.3 If-Then形式 136
5.3.4 常见错误 137
5.4 嵌套If语句 140
5.5 逻辑运算符 144
5.5.1 运算符的优先级 148
5.5.2 与浮点类型一起使用的关系运算符 150
5.6 判断I/O流的状态 151
5.7 测试与调试 157
5.7.1 问题求解阶段的测试:算法演练 157
5.7.2 实现阶段的测试 159
5.7.3 测试计划 162
5.7.4 在编译和执行期间自动执行的测试 163
5.8 小结 165
第6章 循环 166
6.1 While语句 166
6.2 循环的执行阶段 168
6.3 使用While语句的循环 169
6.3.1 计数控制的循环 169
6.3.2 事件控制的循环 171
6.3.3 循环子任务 176
6.4 如何设计循环 182
6.4.1 设计控制流 182
6.4.2 设计循环中的过程 183
6.4.3 循环退出 184
6.5 嵌套逻辑 184
6.6 测试与调试 202
6.6.1 循环测试策略 202
6.6.2 涉及循环的测试计划 202
6.7 小结 204
第7章 更多控制结构 205
7.1 Switch语句 205
7.2 Do-While语句 210
7.3 For语句 214
7.4 Break和Continue语句 219
7.5 选择循环语句的原则 220
7.6 更多C++运算符 221
7.6.1 赋值运算符和赋值表达式 222
7.6.2 递增和递减运算符 223
7.6.3 位运算符 223
7.6.4 强制转换操作 224
7.6.5 sizeof运算符 224
7.6.6 ?:运算符 224
7.6.7 运算符优先级 225
7.6.8 算术与关系表达式中的隐式类型转换 226
7.7 测试与调试 231
7.8 小结 232
第8章 函数 233
8.1 用void函数实现功能分解 233
8.1.1 使用函数的时机 234
8.1.2 模块为什么需要接口设计 234
8.1.3 设计接口 234
8.1.4 将模块写为void函数 235
8.2 回顾用户定义的函数 239
8.2.1 函数调用中的控制流 239
8.2.2 函数形参 240
8.3 void函数的语法与语义 241
8.3.1 函数调用 241
8.3.2 函数声明和定义 242
8.3.3 局部变量 243
8.3.4 Return语句 244
8.4 形参 246
8.4.1 值参数 246
8.4.2 引用参数 247
8.4.3 使用带有形参的表达式 253
8.4.4 关于实参列表和形参列表的最后一点提醒 254
8.4.5 将断言写为函数文档 255
8.5 测试与调试 265
8.6 小结 267
第9章 作用域、生存期及函数 268
9.1 标识符的作用域 268
9.1.1 作用域规则 270
9.1.2 变量声明与定义 272
9.1.3 命名空间 273
9.2 变量的生存期 275
9.3 接口设计 280
9.3.1 副作用 280
9.3.2 全局常量 282
9.4 返回值的函数 284
9.4.1 完整示例 286
9.4.2 布尔函数 289
9.4.3 接口设计与副作用 291
9.4.4 何时使用返回值的函数 292
9.5 赋值、实参传送、返回函数值中的类型转
换 293
9.6 测试与调试 302
9.7 小结 306
第10章 用户定义的数据类型 308
10.1 内置简单类型 308
10.1.1 数值类型 309
10.1.2 字符 310
10.2 用户定义的简单类型 311
10.2.1 Typedef语句 312
10.2.2 枚举类型 312
10.2.3 命名与匿名数据类型 319
10.3 简单数据类型与结构化数据类型 320
10.4 记录(Struct) 321
10.4.1 访问各个组成项 323
10.4.2 对struct的聚合操作 324
10.4.3 再谈struct声明 325
10.4.4 绑定相似项目 326
10.5 分层记录 328
10.6 union 330
10.7 指针 331
10.7.1 指针变量 332
10.7.2 指针表达式 334
10.8 引用类型 335
10.9 测试与调试 342
10.9.1 应对输入错误 342
10.9.2 涉及指针的调试 343
10.10 小结 344
第11章 数组 346
11.1 一维数组 346
11.1.1 声明数组 348
11.1.2 访问各个数组项 349
11.1.3 出界数组索引 351
11.1.4 在声明中初始化数组 352
11.1.5 数组聚合操作(的缺乏) 352
11.1.6 声明和访问数组的例子 353
11.1.7 在实参中传送数组 358
11.1.8 数组的注释 360
11.1.9 对数组使用typedef 363
11.1.10 指针表达式和数组 363
11.1.11 C风格的字符串 364
11.1.12 作为数组的字符串 364
11.1.13 C字符串操作 365
11.1.14 将C字符串转换为C++字符串 366
11.1.15 使用哪种字符串表示法 366
11.2 记录的数组 366
11.3 特殊的数组处理 370
11.3.1 子数组处理 370
11.3.2 具有语义内容的索引 372
11.4 二维数组 372
11.5 在实参中传递二维数组 375
11.6 处理二维数组 377
11.6.1 对行求和 377
11.6.2 修改后的对行求和 378
11.6.3 对列求和 379
11.6.4 初始化数组 380
11.6.5 打印数组 380
11.7 定义二维数组的另一种方法 382
11.8 多维数组 384
11.9 测试与调试 398
11.9.1 一维数组 398
11.9.2 复杂结构 399
11.9.3 多维数组 400
11.10 小结 401
第12章 类和抽象 402
12.1 抽象数据类型 402
12.2 C++类 405
12.2.1 实现成员函数 408
12.2.2 类、对象和成员 410
12.2.3 对对象的内置操作 411
12.2.4 类作用域 412
12.3 信息隐藏 413
12.3.1 用户编写的头文件 414
12.3.2 规格说明文件和实现文件 415
12.3.3 编译和链接多文件程序 419
12.4 什么是对象 421
12.5 类的设计原则 423
12.5.1 封装 423
12.5.2 抽象 425
12.5.3 提高可修改性、可重用性的设计 425
12.5.4 可变性 426
12.6 Name ADT 432
12.6.1 ADT的规格说明 433
12.6.2 实现文件 434
12.7 组合 436
12.8 UML图 440
12.8.1 绘制类的图 440
12.8.2 绘制类的组合关系图 441
12.9 测试与调试 446
12.10 小结 450
第13章 基于数组的列表 451
13.1 什么是列表 451
13.2 作为抽象数据类型的列表 452
13.2.1 改进职责 453
13.2.2 数据表示 454
13.2.3 示例程序 456
13.3 List ADT的实现 459
13.3.1 基本操作 459
13.3.2 插入和删除 460
13.3.3 顺序查找 460
13.3.4 迭代器 461
13.4 有序列表 465
13.4.1 基本操作 466
13.4.2 插入 466
13.4.3 顺序查找 468
13.4.4 二分查找 469
13.4.5 删除 472
13.5 类的有序列表 475
13.5.1 IsThere 476
13.5.2 Insert和Delete 477
13.6 再说UML图 479
13.7 测试与调试 488
13.8 小结 488
第14章 动态数据和链接列表 489
14.1 动态数据 489
14.1.1 分配动态数据 489
14.1.2 删除动态数据 491
14.1.3 常量和动态数据 494
14.2 顺序结构与链接结构 495
14.3 创建动态链接列表:练习示例 496
14.4 ADT列表的动态实现 501
14.4.1 创建一个空链接列表 502
14.4.2 向链接列表中插入 503
14.4.3 链接列表的遍历 504
14.4.4 从链接列表中删除 505
14.4.5 复位列表 507
14.4.6 获取下一项目 507
14.4.7 检查链接列表是否已满 507
14.4.8 搜索列表 507
14.5 析构函数和复制构造函数 511
14.5.1 析构函数 511
14.5.2 浅复制与深复制 511
14.5.3 复制构造函数 513
14.6 有序链接列表 515
14.6.1 插入(20) 516
14.6.2 插入(60)(从循环处开始) 517
14.6.3 插入(100) 518
14.6.4 从链接列表中删除 519
14.6.5 删除(30) 520
14.6.6 删除(50) 520
14.7 测试和调试 523
14.8 小结 524
第15章 继承、多态和面向对象的设计.525
15.1 面向对象的程序设计 525
15.2 继承 526
15.2.1 类比 527
15.2.2 继承和面向对象的设计过程528
15.2.3 由一个类派生另一个类 529
15.2.4 ExpandedEntry类的规格说明530
15.2.5 ExpandedEntry类的实现 531
15.2.6 构造函数执行顺序 535
15.3 动态绑定和虚函数 540
15.3.1 切去问题 540
15.3.2 虚函数 542
15.4 面向对象的设计 543
15.4.1 自由讨论 544
15.4.2 筛选 544
15.4.3 情景探究 545
15.4.4 职责算法 546
15.4.5 结语 546
15.5 实现设计 547
15.6 测试与调试 562
15.7 小结 563
第16章 模板、运算符重载和异常 564
16.1 模板类 564
16.1.1 定义类模板 565
16.1.2 实例化类模板 566
16.1.3 实现输入参数的另一种方式:const引用 568
16.1.4 程序代码的组织 568
16.1.5 一句提醒 573
16.2 泛型函数 574
16.2.1 函数重载 574
16.2.2 在类的外部定义函数模板 575
16.2.3 实例化函数模板 575
16.3 运算符重载 576
16.4 异常 579
16.4.1 throw语句 580
16.4.2 try-catch语句 581
16.4.3 非局部异常处理程序 583
16.4.4 重新抛出异常 585
16.4.5 标准异常 585
16.5 测试与调试 601
16.6 小结 602
第17章 使用标准模板库的数据结构简介 603
17.1 抽象数据结构与实现 603
17.2 其他线性结构 605
17.2.1 栈 606
17.2.2 队列 607
17.2.3 优先级队列 608
17.3 双向线性结构 609
17.3.1 双向列表 609
17.3.2 双端队列 609
17.4 STL简介 610
17.4.1 迭代器 611
17.4.2 vector模板 612
17.4.3 list模板 616
17.4.4 stack模板 618
17.4.5 queue模板 620
17.4.6 priority_queue模板 621
17.4.7 deque模板 622
17.5 非线性结构 632
17.5.1 二叉树 633
17.5.2 散列表 635
17.6 关联容器 637
17.6.1 set模板 637
17.6.2 map模板 640
17.7 测试与调试 652
17.8 小结 652
第18章 递归 654
18.1 什么是递归 654
18.2 使用简单变量的递归算法 657
18.3 汉诺塔 659
18.4 使用结构化变量的递归算法 662
18.5 使用指针变量的递归 668
18.5.1 按逆序输出动态链接列表 668
18.5.2 复制动态链接列表 670
18.6 选择递归还是迭代 673
18.7 测试与调试 679
18.8 小结 680
附录A 保留字 681
附录B 运算符优先级 682
附录C 标准库例程选编 683
附录D 阅读本书时使用标准化之前的C++版本 692
附录E 字符集 695
附录F 程序风格、格式设置和文档 697
附录G 浮点数补议 702
附录H 使用C字符串 709
附录I C++ char常量 715
· · · · · · (
收起)