描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302503163丛书名: 清华计算机图书译丛
(2)编写体例适合教学,充分考虑到教学的进度和需要。
(3)图示讲解,一目了然;示例程序,精心设计。
(4)编程挑战极具可扩展性。
(5)练习题447道,复习题586道,挑战编程题304道,程序362个。
本书的知识体系完整,编写体例充分考虑了教学的需要,全书给出了思考题447道,复习与练习题586道,挑战编程题304道,完整程序362个,非常适合作为高等院校计算机及相关专业程序设计与数据结构的教材,也是精通C 程序设计的*用书。
第1章 计算机和编程简介 1
1.1 为什么要使用程序 1
1.2 计算机系统:硬件和软件 2
1.2.1 硬件 2
1.2.2 软件 5
1.2.3 思考题 6
1.3 程序和编程语言 6
1.3.1 程序的定义 7
1.3.2 编程语言 8
1.3.3 源代码、目标代码和可执行
代码 9
1.3.4 思考题 11
1.4 程序的组成 11
1.4.1 语言元素 11
1.4.2 代码行和语句 13
1.4.3 变量 14
1.4.4 变量定义 14
1.5 输入、处理和输出 15
思考题 15
1.6 编程过程 16
1.6.1 设计和创建程序 16
1.6.2 软件工程的定义 19
1.6.3 思考题 20
1.7 综合演练:显示个性化消息 20
1.7.1 复习和练习 21
1.7.2 编程挑战 23
第2章 C 简介 24
2.1 C 程序的部件 24
思考题 27
2.2 cout对象 27
2.3 #include指令 32
思考题 33
2.4 变量和赋值语句 33
2.5 常数 35
2.5.1 有时数字并不是数字 36
2.5.2 思考题 36
2.6 标识符 37
2.7 整型数据类型 39
2.7.1 整数和长整型常数 42
2.7.2 十六进制和八进制常数 43
2.7.3 思考题 43
2.8 浮点数据类型 44
2.8.1 浮点常数 45
2.8.2 将浮点值分配给整型变量 46
2.8.3 思考题 47
2.9 char数据类型 47
2.10 C string类 51
2.10.1 使用string类 51
2.10.2 思考题 52
2.11 bool数据类型 52
2.12 确定数据类型的大小 53
2.13 变量赋值和初始化详解 54
2.14 作用域 56
2.15 算术运算符 56
思考题 60
2.16 注释 60
2.16.1 单行注释 61
2.16.2 多行注释 61
2.17 编程风格 62
2.18 综合演练:笑脸! 63
2.18.1 复习和练习 64
2.18.2 编程挑战 68
第3章 表达式和交互 71
3.1 cin对象 71
3.1.1 输入多个值 74
3.1.2 思考题 76
3.2 数学表达式 77
3.2.1 运算符的优先级 79
3.2.2 关联性 80
3.2.3 用圆括号分组 80
3.2.4 将代数表达式转换为编程
语句 81
3.2.5 指数问题详解 81
3.2.6 思考题 83
3.3 数据类型转换和类型强制转换 85
3.3.1 类型强制转换 86
3.3.2 思考题 89
3.4 溢出和下溢 90
3.5 命名常量 91
思考题 93
3.6 多变量和组合赋值 94
3.6.1 组合赋值运算符 94
3.6.2 思考题 96
3.7 格式化输出 97
3.7.1 setprecision操作符 100
3.7.2 fixed操作符 103
3.7.3 showpoint操作符 104
3.7.4 left和right操作符 105
3.7.5 思考题 107
3.8 处理字符和字符串 107
3.8.1 输入字符串 108
3.8.2 输入一个字符 110
3.8.3 使用cin.get 110
3.8.4 混合使用cin >>和cin.get 112
3.8.5 使用cin.ignore 112
3.8.6 实用的string成员函数和
运算符 113
3.8.7 使用C字符串 115
3.8.8 为C字符串赋值 116
3.8.9 跟踪一个C字符串的大小 117
3.8.10 读取一行输入 119
3.8.11 思考题 120
3.9 更多数学库函数 120
3.10 随机数字 122
3.10.1 限制随机数的范围 125
3.10.2 思考题 125
3.11 关于调试:手动跟踪程序 126
3.12 Green Fields Landscaping案例
研究——第1部分 127
3.12.1 问题陈述 127
3.12.2 程序设计 128
3.12.3 程序 128
3.12.4 General Crates公司案例
研究 130
3.13 综合演练:单词游戏 130
3.13.1 复习和练习 132
3.13.2 编程挑战 137
第4章 条件选择 143
4.1 关系运算符 143
4.1.1 关系的值 144
4.1.2 真值和假值 145
4.1.3 思考题 147
4.2 if语句 148
4.2.1 编程风格和if语句 151
4.2.2 要注意的3个常见错误 151
4.2.3 真值详解 153
4.2.4 标记 154
4.2.5 整数标记 155
4.2.6 思考题 155
4.3 if-else语句 156
4.3.1 使用if 或if-else的时机 157
4.3.2 比较浮点数 159
4.3.3 思考题 161
4.4 if-else if语句 161
4.4.1 使用结尾else 166
4.4.2 思考题 167
4.5 菜单驱动程序 168
4.6 嵌套if语句 170
思考题 173
4.7 逻辑运算符 174
4.7.1 &&运算符 174
4.7.2 || 运算符 176
4.7.3 ! 运算符 178
4.7.4 布尔变量和?!运算符 179
4.7.5 逻辑运算符的优先级和
关联性 181
4.7.6 使用逻辑运算符检查数字
范围 182
4.7.7 思考题 182
4.8 验证用户输入 183
4.9 块和作用域详解 185
4.9.1 同名变量 186
4.9.2 思考题 187
4.10 字符和字符串详解 188
4.10.1 比较字符 188
4.10.2 比较string对象 189
4.10.3 测试字符 191
4.10.4 思考题 193
4.11 条件运算符 194
4.11.1 使用条件表达式的值 195
4.11.2 思考题 197
4.12 switch语句 197
4.12.1 在菜单驱动系统中使用
switch 203
4.12.2 思考题 205
4.13 枚举数据类型 206
思考题 209
4.14 关于测试和调试:验证输出结果 210
4.15 Green Fields Landscaping案例研
究——第2部分 212
4.15.1 问题陈述 212
4.15.2 程序设计 213
4.15.3 程序 214
4.15.4 Crazy A1的计算机商业
案例研究 216
4.16 综合演练:算命游戏 217
4.16.1 复习和练习 218
4.16.2 编程挑战 222
第5章 循环 228
5.1 循环介绍:while循环 228
5.1.1 while循环 228
5.1.2 while是一个预测试循环 230
5.1.3 无限循环 231
5.1.4 编程风格和while循环 232
5.1.5 思考题 234
5.2 使用while循环验证输入 235
5.3 递增和递减运算符 237
5.3.1 后缀和前缀模式 239
5.3.2 在数学表达式中使用递增
和递减运算符 241
5.3.3 在关系表达式中使用递增
和递减运算符 241
5.3.4 思考题 242
5.4 计数器 243
5.5 保持累计汇总 245
5.6 标记符号 247
思考题 248
5.7 do-while循环 249
5.7.1 toupper函数 251
5.7.2 与菜单一起使用do-while 252
5.7.3 思考题 254
5.8 for循环 254
5.8.1 for循环是一个预测试循环 257
5.8.2 避免修改for循环体中的
计数器变量 257
5.8.3 更新表达式的其他形式 258
5.8.4 定义for循环初始化表达式
中的变量 258
5.8.5 创建用户控制的for循环 258
5.8.6 在初始化和更新表达式中
使用多个语句 259
5.8.7 省略for循环的表达式或
循环体 260
5.8.8 思考题 260
5.9 关于软件工程:决定使用哪个
循环 261
5.9.1 while循环 261
5.9.2 do-while循环 262
5.9.3 for循环 262
5.10 嵌套循环 262
5.11 打破循环 265
5.11.1 在嵌套循环中使用break 266
5.11.2 continue语句 267
5.11.3 思考题 268
5.12 使用文件进行数据存储 269
5.12.1 文件类型 270
5.12.2 文件访问方法 271
5.12.3 文件名和文件流对象 271
5.12.4 为输入输出文件设置
程序 272
5.12.5 创建文件流对象并打开
文件 273
5.12.6 关闭文件 274
5.12.7 将数据写入文件 274
5.12.8 从文件读取数据 276
5.12.9 读取位置 278
5.12.10 让用户指定一个文件名 279
5.12.11 使用旧版本C 中的
c_str成员函数 280
5.12.12 检测文件的末尾 280
5.12.13 测试文件打开的错误 282
5.12.14 思考题 284
5.13 关于测试和调试:创建良好的
测试数据 284
5.14 Central Mountain Credit Union
案例研究 287
5.14.1 问题陈述 287
5.14.2 计算 287
5.14.3 变量 287
5.14.4 程序设计 288
5.14.5 详细伪代码 288
5.14.6 程序 289
5.14.7 测试程序 291
5.14.8 Lightening Lanes案例
研究 291
5.15 综合演练:多彩世界 291
5.15.1 复习和练习 294
5.15.2 编程挑战 299
第6章 函数 305
6.1 模块化编程 305
6.2 定义和调用函数 306
6.2.1 空函数 307
6.2.2 调用函数 307
6.2.3 思考题 313
6.3 函数原型 314
6.4 将数据发送到函数中 315
6.5 按值传递数据 320
思考题 322
6.6 使用return语句 323
6.7 从函数返回值 325
6.7.1 定义一个返回值函数 325
6.7.2 调用返回值函数 326
6.8 返回一个布尔值 330
思考题 332
6.9 在菜单驱动程序中使用函数 332
6.10 局部变量和全局变量 336
6.10.1 局部变量 336
6.10.2 局部变量生存期 338
6.10.3 使用形参值初始化本地
变量 338
6.10.4 全局变量 338
6.10.5 全局常数 340
6.10.6 具有相同名称的局部
变量和全局变量 342
6.11 静态局部变量 343
思考题 345
6.12 默认实参 346
6.13 使用引用变量作为形参 349
6.13.1 按引用传递实参和
按值传递实参的时机 353
6.13.2 将文件传递给函数 355
6.13.3 思考题 358
6.14 重载函数 359
6.15 使用exit()函数 364
思考题 365
6.16 桩模块和驱动模块 366
6.17 小乐透案例研究 369
6.17.1 问题陈述 369
6.17.2 程序设计 369
6.17.3 程序 371
6.17.4 High Adventrue Travel
Agency旅行社案例研究 374
6.18 综合演练:发光的南瓜灯 374
6.18.1 复习和练习 378
6.18.2 编程挑战 381
第7章 类和对象简介 388
7.1 抽象数据类型 388
7.1.1 抽象 388
7.1.2 在软件开发中使用抽象 389
7.1.3 抽象数据类型 389
7.2 面向对象编程 389
7.3 关于类的介绍 391
7.3.1 使用已经知道的类 391
7.3.2 创建自己的类 392
7.3.3 访问修饰符 393
7.3.4 private和public成员的
位置 393
7.4 创建和使用对象 394
7.4.1 访问对象的成员 395
7.4.2 访问器和设置器 396
7.5 定义成员函数 397
7.5.1 类成员函数的命名约定 399
7.5.2 避免陈旧数据 402
7.5.3 内联函数详解 402
7.5.4 思考题 403
7.6 构造函数 403
7.6.1 重载构造函数 407
7.6.2 默认构造函数 408
7.7 析构函数 409
思考题 410
7.8 私有成员函数 412
7.9 将对象传递给函数 415
7.9.1 常量引用形参 418
7.9.2 从函数返回一个对象 419
7.9.3 思考题 422
7.10 对象组合 422
思考题 425
7.11 关于软件工程:分离类规范、
实现和客户端代码 426
7.11.1 使用多个文件的优点 431
7.11.2 在类对象中执行输入
输出 432
7.11.3 思考题 432
7.12 结构 432
7.12.1 访问结构成员 433
7.12.2 显示和比较结构变量 435
7.12.3 初始化结构 436
7.12.4 嵌套结构 437
7.12.5 思考题 440
7.12.6 将结构传递给函数 441
7.12.7 从函数返回一个结构 443
7.12.8 思考题 444
7.13 枚举数据类型详解 445
7.13.1 在同一个语句中声明enum
数据类型并定义变量 445
7.13.2 将整数赋值给enum
变量 445
7.13.3 将枚举量赋值给int
变量 446
7.13.4 使用数学运算符改变
enum变量的值 446
7.13.5 使用枚举量输出值 446
7.13.6 使用枚举量控制循环 447
7.13.7 使用C 11中的强类型
enum 448
7.14 Home Software公司OOP案例
研究 449
7.14.1 私有成员变量 450
7.14.2 公共成员函数 450
7.14.3 类声明 450
7.14.4 withdraw会员函数 451
7.14.5 类接口 452
7.14.6 实现类 452
7.15 面向对象分析与设计介绍 456
7.15.1 寻找类 459
7.15.2 确定类的责任 462
7.15.3 这仅仅是个开始 465
7.15.4 对象的可重用性 465
7.15.5 面向对象与基于对象的
编程 465
7.15.6 思考题 465
7.16 屏幕控制 466
7.16.1 屏幕光标定位 466
7.16.2 创建一个屏幕输入表单 469
7.17 综合演练:溜溜球动画 471
7.17.1 复习和练习 473
7.17.2 编程挑战 479
第8章 数组 486
8.1 保存多个值的数组 486
8.2 访问数组元素 488
8.3 输入和显示数组内容 489
8.3.1 将数据从文件读入数组 491
8.3.2 将数组的内容写入文件 493
8.3.3 C 中没有数组边界检查 493
8.3.4 注意大小差一错误 495
8.3.5 思考题 496
8.4 数组初始化 497
8.4.1 从数组元素1开始 501
8.4.2 数组部分初始化 501
8.4.3 隐式数组大小 503
8.4.4 初始化变量的新方法 503
8.5 基于范围的for循环 504
8.6 处理数组内容 507
8.6.1 复制一个数组到另一个 509
8.6.2 比较两个数组 510
8.6.3 对数字数组中的值求和 511
8.6.4 查找数字数组中数值的
平均值 511
8.6.5 在数字数组中查找最高值
和最低值 512
8.6.6 部分填充数组 514
8.6.7 为什么要使用数组 515
8.6.8 处理字符串 517
8.7 使用并行数组 519
思考题 521
8.8 typedef声明 523
8.9 数组作为函数参数 523
8.9.1 使用const数组形参 529
8.9.2 一些有用的数组函数 529
8.9.3 思考题 532
8.10 二维数组 533
8.10.1 将二维数组传递给函数 537
8.10.2 对二维数组的所有元素
求和 539
8.10.3 对二维数组的行求和 539
8.10.4 对二维数组的列求和 540
8.11 三维或三维以上数组 541
思考题 543
8.12 矢量 544
8.12.1 定义和初始化矢量 545
8.12.2 存储和检索矢量中的值 546
8.12.3 使用C 11中基于范围
的for循环和vector 548
8.12.4 使用push_back成员
函数 549
8.12.5 确定矢量的大小 550
8.12.6 从矢量中删除元素 552
8.12.7 清理矢量 553
8.12.8 检测一个空矢量 554
8.12.9 矢量成员函数汇总 556
8.12.10 思考题 556
8.13 对象数组* 557
8.13.1 思考题 562
8.13.2 结构数组 563
8.13.3 思考题 566
8.14 National Commerce Bank案例
研究 567
8.15 综合演练:石头、剪刀、布 569
8.15.1 复习和练习 571
8.15.2 编程挑战 575
第9章 搜索、排序和算法分析 585
9.1 搜索算法简介 585
9.1.1 线性搜索 585
9.1.2 二分搜索 588
9.2 搜索对象数组 591
思考题 595
9.3 排序算法简介 595
9.3.1 冒泡排序 595
9.3.2 选择排序 599
9.3.3 思考题 604
9.4 对象数组排序 604
9.5 矢量排序和搜索 607
9.6 算法分析简介 609
9.6.1 计算问题和基本步骤 610
9.6.2 算法的复杂度 611
9.6.3 算法的最坏情况下的
复杂度 613
9.6.4 平均情况下的复杂度 615
9.6.5 渐近复杂度与大O表示法 615
9.6.6 思考题 617
9.7 案例研究 617
9.8 综合演练:秘密消息 617
9.8.1 复习和练习 622
9.8.2 编程挑战 623
第10章 指针 627
10.1 指针和地址运算符 627
10.2 指针变量 629
10.3 数组与指针之间的关系 632
10.4 指针的算术运算 637
10.5 初始化指针 638
第9版中的内容
新C 11标准
C 11是C 语言的最新标准。在该标准开发之初,它被称为C 0x版本。2011年8月,国际标准化组织(International Standards Organization,ISO)批准了该版本,新标准正式定名为C 11。绝大多数流行的C 编译器现在都已经支持该标准。
新的C 11标准包含了核心语言的新特性,并且拓展了C 标准程序库,但是,本书并不严格要求使用C 11编译器。本书在介绍C 11标准的新性能时,会在页边附加C 11的图标提示,没有该图标提示的程序仍然可以使用以前的编译器进行编译。
本书介绍的C 11主题
* 在第2章中介绍了auto关键字,它是一种简化复杂变量定义的方式。该关键字使得编译器可以从变量的初始化值推断出它的数据类型。
* 第2章还介绍了新的long long int和unsigned long long int数据类型以及LL常数后缀。
* 第5章介绍了如何将一个string对象直接传递给一个文件流对象的open成员函数,而不必调用c_str()成员函数。同时,也为使用早期编译器的读者保留了对于c_str()成员函数的使用介绍。
* 第7章介绍了强类型枚举enum。
* 在第8章介绍了基于范围的循环。这个新的循环机制会自动对数组、矢量或其他集合的每个元素进行迭代,无须使用计数器变量或下标。
* 第8章还介绍了初始化变量的新方式,演示了如何使用初始化列表来初始化一个矢量。
* 第10章介绍了智能指针,并且提供了新的独占指针unique_ptr和共享指针shared_ptr的多个应用实例,解释了如何使用它们安全地分配和使用动态内存,以及要使用智能指针的原因。
* 第10章还介绍了移动赋值运算符,以及nullptr关键字,该关键字现在是表示空指针的新标准方式。
* 第11章讨论了移动构造函数,并且深入介绍了移动赋值运算符,此外还介绍了Lambda表达式。
* 第12章介绍了C 11 string库中的新函数,讨论了新的重载函数to_string,它可以将数字值转换为string对象。
* 第15章介绍和演示了新的override关键字的使用,它可以防止难以察觉的覆盖错误。此外还介绍了final关键字,它可以防止虚成员函数被覆盖。
* 第16章介绍了新的C 11函数begin(c)和end(c),以指定集合c中的开头和末尾位置。
其他新变化
本书的教学方法和写作风格与以前的版本保持一致。除了上面介绍的新增?C ?11?标 准内容之外,还有许多其他方面的改进,使其更方便读者学习使用。
更新材料
整本书中的材料已更新,以反映技术和软件开发环境的变化。本书的知识介绍更加简洁明快,并且在介绍性编程教学中融入了最佳实践,因此,本书新增了大量图形或经过重新设计的插图,在各章还添加了很多新的或经过改写的示例程序,使全书内容更加丰富。
新资料
本书针对很多主题都添加了新的资料。除了上面介绍的使用C 11新特性的主题之外,新版还包括了对常数、随机数以及枚举数据类型等知识点的新修改,以及在设计类方面的改进资料。
新编程挑战
新版在每个章节都增加了新的编程挑战题目。
重组章节
为了提高读者的学习能力,新版对若干章节进行了重组。例如,在第5章关于循环的介绍中,现在已经重组为先让读者使用while循环进行更多的练习,然后再介绍do-while和for循环。在第6章关于函数的介绍中,已经重组了定义和调用函数、函数原型介绍和main函数等方面的内容。
本书的组织结构
本书以循序渐进的方式讲授有关C 的内容。每一章都涵盖了一系列主题,并且可帮助学生随着学习的进度而逐渐建立起完善的知识体系。虽然这些章节可以很轻松地按照现有顺序进行教学,但也有一定的灵活性。下面的依赖关系图(图P-1)提出了可能的教学顺序建议。
图P-1 本书内容依赖关系图
第1章介绍基础的硬件、软件和编程概念。如果已经掌握了这些主题的知识,则可以选择跳过本章。
第2~6章涵盖了基本的C 语法、数据类型、表达式、选择结构、重复结构和函数等。这些章的每一章都建立在前一章的基础上,应该按照所提出的顺序开展教学。
第7章介绍面向对象编程,它可以在第6章之后的任何时候进行学习,但必须在第11章之前。喜欢先引入数组概念的教师可以在第7章之前先讲授第8章。当然,8.13节(对象数组)需要先学习第7章才能讲授。
如图P-1所示,在本书的后半部分,可以按任何顺序学习第11~14章,第11章、第15章和第16章应该按顺序进行。对于希望在本课程中尽早介绍数据结构的教师,可以跳过第15章和第16章的高级面向对象编程知识,先讲授第17章(链表)、第18章(栈和队列)以及第19章(二叉树),但是它们必须安排在第14章(递归)之后。并且,在这种情况下,有必要忽略第17~19章中有关处理模板和标准模板库的部分。
各章内容概述
第1章:计算机和编程简介
该章提供了和计算机科学领域相关的基础知识和内容,涵盖了硬件、软件、操作系统、编程、解决问题和软件工程等多方面的基本概念。介绍了关键词、变量、运算符和标点符号等程序组件,以及层次结构图和伪代码等编程工具。综合演练部分向学生展示了如何使用cout语句创建个性化的输出消息。本章末尾的编程挑战可以帮助学生了解如何使用相同的基本输入、处理和输出结构来创建多个程序。
第2章:C 简介
该章旨在帮助学生初步了解C ,介绍了C 程序的基本部件、数据类型、变量和文本的使用、赋值语句、简单的算术运算、程序输出和注释等。该章介绍了C string类,并且从此处开始,本书将使用string对象作为处理字符串的主要方法。该章还引入了编程风格约定,建立了良好的编程风格示范,并且贯穿全书。综合演练部分则让学生可以玩简单的基于文本的图形游戏。
第3章:表达式和交互
在该章中,学生将学习编写输入和处理数字、字符和字符串数据的程序,也包括算术运算符的使用和数学表达式的创建,以及运算符的优先级等重点知识。该章还有一个专门的小节介绍调试方法以及如何手动跟踪程序。此外还包括使用随机数字、简单的输出格式设置、数据类型转换和强制转换,以及使用库函数处理数字等。综合演练部分向学生展示了如何创建一个简单的互动文字游戏。
第4章:条件选择
在该章中,学生将学习关系表达式,以及如何使用if、else和if-else if语句来控制程序的流程。此外也介绍了逻辑运算符、条件运算符和switch语句等。同时还提供了这些结构的应用示例说明,如菜单驱动的程序。该章还介绍了块和作用域的概念,并延续调试的话题,讨论了验证输出结果的问题。综合演练部分允许学生使用随机数字和分支语句来创建算命游戏。
第5章:循环
该章介绍了C 的重复控制机制。帮助学生了解while循环、do-while循环和for循环,以及各种控制它们的方法。这些方法包括使用计数器、用户输入、结束标记符号和到达文件末尾测试等。该章还提供了很多使用循环的应用程序,例如保持累计汇总和执行数据验证等。该章还增加了一个关于文件处理的小节。另外,在有关调试和测试的部分,介绍了如何创建良好的测试数据。该章综合演练部分向学生介绍了Windows命令,如何使用它们创建丰富多彩的输出,以及通过循环实现彩色显示。
第6章:函数
在该章中,学生将学习如何构建模块化程序,并了解为什么要进行模块化。该章首先介绍了void和值返回函数、形参传递等知识,强调了通过值传递和通过引用传递参数的区别。该章也介绍了变量作用域的概念,对局部变量、全局变量和静态局部变量进行了区分。此外还介绍和演示了函数重载操作。综合演练部分包括一个模块化的菜单驱动程序,强调函数的多样性,说明如何通过发送给它们的参数来控制其行为。
第7章:类和对象简介
该章开始关注面向对象的范例。学生们将学习如何定义自己的类以及如何创建和使用这些类的对象。该章详细介绍了哪些函数属于一个类,而哪些函数则属于使用这个类的客户端程序。良好的面向对象实践是先进行充分的讨论和模块化设计,例如通过仔细构建的读取器和设置器函数来保护成员数据,并隐藏客户端程序的类实现细节。一旦学生适应了使用类和对象,则可以深入探讨本章提供的面向对象分析和设计的主题。该章还介绍了有关枚举数据类型和结构的相关知识。在综合演练部分,学生们将学习使用屏幕控制技术来创建模拟溜溜球运动的动画。
第8章:数组
在该章中,学生将学习如何创建和使用单维和多维数组。该章提供了许多数组处理的例子,包括使用函数来计算数组中的总和、平均值、最高值和最低值等。该章还介绍了使用二维数组创建表、按行或按列分析数组数据等。此外还演示了使用并行数组的编程技巧,并向学生展示了如何使用数据文件作为输入源来填充数组。该章介绍了基于范围的for循环,它是遍历数组所有元素的简便方式。此外还引入了标准模板库矢量,并使之与数组进行比较,以加深学生的印象。关于对象数组和结构数组的内容被特意放在章节的末尾,这样方便教师跳过第7章而先讲授这一章,以后需要时再回来讲授该节。综合演练部分演示如何使用数组创建一个石头、剪刀、布游戏。
第9章:搜索、排序和算法分析
在本章中,学生将学习搜索存储在数组中的信息和排序数组(包括对象数组)的基本知识。该章涵盖了线性搜索、二分搜索、冒泡排序和选择排序算法,并加入了STL矢量搜索和排序的相关内容。该章还提供了算法分析的简要介绍,并向学生展示了如何确定两种算法中哪一种算法更有效。该章的综合演练部分使用了表格查找或搜索算法来编码和解码秘密消息。
第10章:指针
该章介绍了如何使用指针,主要内容包括指针算术、指针初始化、指针比较、指针和数组、指针和函数、动态内存分配、新的nullptr关键字等。另外还新增了有关智能指针的内容,介绍如何使用它们避免内存泄漏。综合演练部分演示了如何使用指针访问返回日历时间的库数据结构和函数。
第11章:类和面向对象编程详解
该章在第7章的基础上继续深入探讨了有关类和面向对象编程的相关内容。它涵盖了对象的继承、聚合和组合等有一定深度的内容,并说明了Is-a和Has-a的区别。该章内容还包括常量成员函数、静态成员、友元、按成员赋值、复制构造函数、对象类型转换运算符、转换构造函数、运算符重载、移动构造函数和移动赋值运算符等。此外还添加了一个新的章节,介绍函数对象和C 11的Lambda表达式。综合演练部分汇集了继承和转换构造函数的概念,以构建一个程序,该程序将数组的内容格式化为一个HTML表格,以便在Web站点上显示。
第12章:C字符串和string类详解
该章介绍了用于处理字符和C字符串的标准库函数,以及有关string类函数的资料,涵盖新的C 11中的string库、新的重载的to_string函数(将数字值转换为string对象)等。综合演练部分向学生展示了如何访问基于字符串的程序环境,以获取有关计算机和运行该程序的网络的信息。
第13章:高级文件和I/O操作
该章介绍了更多有关顺序访问文本文件和随机访问二进制文件的内容。讨论了以不同的模式打开文件的设置,以及读取和写入文件内容的多种方法。综合演练程序应用了该章介绍的许多技术,将两个文本文件合并成一个HTML文档,以便在Web上显示,并用不同的颜色来说明每个数据块来自哪个文件。
第14章:递归
该章定义和演示了递归。通过清晰的递归调用图示,讲解了递归的原理和用法,并讨论了递归应用程序。该章还提供了多种递归算法示例,包括计算阶乘的递归函数、递归找到最大公约数、递归执行二分搜索、使用QuickSort进行排序以及递归解决汉诺塔问题等。对于需要更多挑战的学生来说,还可以研究本章提供的穷举和枚举算法。综合演练部分使用递归来评估前缀表达式。
第15章:多态和虚函数
该章继续深入讨论类和面向对象编程,并介绍了一些更高级的概念,如多态和虚函数。此外还提供了抽象基类、纯虚函数、继承层次结构中的类型兼容性以及虚拟继承等方面的内容。综合演练部分说明了如何使用继承和多态来显示图形并使之产生动画。
第16章:异常、模板和标准模板库
该章介绍了如何使用异常来开发增强的错误捕获技术,然后讨论了如何使用函数和类模板来创建通用代码。最后,还介绍了由标准模板库(STL)提供的容器、迭代器和算法。综合演练部分使用了标准模板库中的各种容器来创建一款寓教于乐的儿童游戏。
第17章:链表
该章介绍使用链表所需的概念和技术。学生将首先了解链表抽象数据类型(ADT),然后学习如何创建和销毁链表,以及编写函数以插入、追加和删除结点,遍历链表和搜索特定结点的函数。此外还演示了链表类模板的使用。综合演练部分将面向对象编程的许多重要概念汇集在一起,通过将对象、继承、多态与STL的list类相结合,为一组图形制作 动画。
第18章:栈和队列
在该章中,学生将学习创建和使用静态栈、动态栈和队列。学生将了解到栈和队列的操作,以及每个抽象数据类型的模板。基于静态数组的栈使用异常处理机制来处理栈的溢出和下溢,该章提供了定义、抛出和捕获异常的真实而自然的例子。综合演练部分讨论了评估后缀表达式的策略,以及使用栈将后缀表达式转换为中缀表达式的方法。
第19章:二叉树
该章介绍了二叉树抽象数据类型并演示了许多二叉树操作,包括遍历树,插入、删除和替换元素,搜索特定的元素,以及销毁树。综合演练部分介绍了一个足够多样化的树结构来创建谱系树。
书中的附录
附录A:ASCII字符集?ASCII和扩展ASCII字符及其代码的列表。
附录B:运算符优先级和关联性?C 运算符的优先级和关联性列表。
附录C:思考题答案?该附录可以作为一个工具供学生参考。通过做思考题和比较自己的答案,学生可以判断自己对各章知识点的掌握程度。该附录包括本书所有思考题的 答案。
附录D:复习和练习奇数题的答案?学生可以用来评估自身对全书知识点的理解和掌握程度的另一个工具。
本书配套站点上的其他附录
附录E:面向对象编程简介?面向对象编程的概念和术语介绍。
附录F:在类设计中使用UML?统一建模语言(UML)类图的简要介绍及其使用示例。
附录G:多源文件程序?关于如何使用多个源文件创建、编译和链接程序的教程。包括使用函数头文件、类规范文件和类实现文件。
附录H:多重和虚继承?为已经熟悉单个继承的读者提供的多重和虚继承的C 概念的自助讨论。
附录I:头文件和库函数参考?本书中使用的C 库函数和头文件的参考。
附录J:命名空间?对命名空间及其用途的解释,提供了关于如何定义命名空间和访问其成员的示例。
附录K:C 强制转换和运行时类型标识?介绍了在C 中进行类型强制转换的不同方法和运行时类型标识。
附录L:传递命令行参数?介绍编写接受命令行参数的C 程序。本附录对于在UNIX或Linux等命令行环境下工作的学生非常有用。
附录M:二进制数字和位运算?二进制数字系统和C 位运算符的指南,以及整数的内部存储的教程。
附录N:流程图介绍?介绍流程图及其符号的教程。它包括处理顺序、选择、大小写、重复和调用其他模块。该附录中提供了本书若干个程序的示例流程图。
本书特色内容
核心概念:本书大部分章节内容都以核心概念的陈述开始,它总结了本章的重点思想或核心知识点。
示例程序:本书有超过350个完整的示例程序,每个程序设计为突出目前正在讨论的主题。在大多数情况下,这些都是实用示例。本书配套站点提供了这些程序的源代码,以便学生可以自己运行程序。
程序输出:在绝大多数示例程序之后,都有一个屏幕输出样本,向读者演示了程序应该如何起作用。
综合演练:这是一个特殊的部分,在每一章的最后都有,读者可以通过该演练做一些聪明而有趣的事情,进而更好地掌握本章的内容。
思考题:这是读者测试自己学习效用的工具,也有利于读者掌握学习要点。本书后面的附录C提供了所有关于思考题的答案。
注意:出现在书中的适当位置。这些简短的解释性文字对于厘清知识要点或阐释容易引起误解的内容很有帮助。
警告:对于某些C 特性、编程技术或做法提出警告,因为它们可能会导致程序出现故障或丢失数据。
案例研究:本书绝大多数章节都提供了模拟现实世界应用的案例研究,并且为每一个案例研究提供了完整的代码。在本书配套站点上提供了更多的案例研究。这些案例研究旨在强调它们所出现章节的主要知识点。
复习和练习:本书每一章都提供了一套完整而多样的复习和练习,如填空和简答题,可以检查学生对本章介绍内容的掌握程度。接下来是对分析和解决问题能力的练习,如算法工作台、预测输出结果和找出错误部分。每个章节还提供了一项软件技能练习,侧重于培养学生的沟通技能和团队协作能力。此外,本书后面的附录D提供了所有章节的复习和练习奇数题的答案。
编程挑战:本书每一章都提供了一组编程练习,旨在巩固学生对当前正在学习的知识要点和编程技巧的认识。在大多数情况下,这些挑战题目提出了现实世界中需要解决的 问题。
团队项目:本书有若干个团队编程项目,建议由一个学生团队完成。其中一个学生可以建立程序的用户界面,另一个学生负责写数学代码,还有一个学生负责设计和实现一个程序使用的类。这个过程类似于许多专业程序的开发方式,并且也鼓励课堂内的团队合作。
补 充 资 料
学生资源
以下项目可在www.pearsonhighered.com/cs-resources的Gaddis Series资源页面上获得:
* 本书包含的每个程序的完整源代码。
* 额外的案例研究及其完整的源代码。
* 本书附带的全套附录(包括若干个教程)。
* 访问本书配套站点上的视频教程。
* 下载大量编程环境和IDE的链接,包括Visual Studio Community Edition。
致??谢
本书的开发和出版获得了很多人的帮助。在此谨对以下评审人员提供的有益建议和专业知识表示衷心感谢。
主要内容:
5.1 循环介绍:while循环
5.2 使用while循环验证输入
5.3 递增和递减运算符
5.4 计数器
5.5 保持累计汇总
5.6 标记符号
5.7 do-while循环
5.8 for循环
5.9 关于软件工程:决定使用哪个循环
5.10 嵌套循环
5.11 打破循环
5.12 使用文件进行数据存储
5.13 关于测试和调试:创建良好的测试数据
5.14 Central Mountain Credit Union案例研究
5.15 综合演练:多彩世界
5.1 循环介绍:while循环
核心概念:循环是重复的程序的一部分。
在本书第4章中有几个程序是根据学生的数字成绩给出相应的字母评级。但是,如果一个班有20个学生,那么要为每一个学生评级该怎么办?岂不是要运行程序20次。如果可以简单地指示代码在一次运行中重复20次,那不就是很容易了吗?幸运的是,确实有一个机制可以做到这一点,那就是所谓的循环。
循环(Loop)是一个控制结构,它会导致语句或语句组重复。C 有3种循环控制结构:while循环、do-while循环和for循环。这些结构之间的区别是它们控制重复的方式。
5.1.1 while循环
while循环有两个重要组成部分:①进行true值或false值判断的表达式,②只要表达式为true就重复执行的语句或块。图5-1显示了while循环的一般格式,右侧流程图直观地描绘了其工作原理。
?
图5-1 while循环的语句结构及流程图
现在来看一看while循环的每个部分。第一行,有时称为循环头(Loop Header),由关键字while组成,后跟待测试的条件(Condition),括在括号中。条件由任何可被判断为true或false的表达式表示。接下来是循环体(Body of the Loop),它包含一个或多个C 语句(Statement)。
循环的工作原理如下:首先判断条件表达式的值,如果它是真的,则循环体中的每个语句都被执行;然后,再次测试条件。如果条件表达式仍然为true,则循环体中的每个语句将再次被执行。如此循环往复,直到条件表达式被判断为false。
请注意,与if语句一样,在有条件执行的主体中的每个语句都以分号结尾,但在括号中的条件表达式后面没有分号,这是因为while循环不完整,后面没有跟随的语句。而且,与if语句一样,当循环体包含两个或多个语句时,这些语句必须用大括号括起来。当循环的主体只包含一个语句时,可以省略括号。基本上,while循环就像是一个可以执行一遍又一遍的if语句。只要括号中的表达式为true,则有条件执行的语句将不断重复。
程序5-1使用了while循环打印“Hello”字符串5次。
程序5-1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// This program demonstrates a simple while loop.
#include
using namespace std;
int main()
{
int count = 1;
while (count<= 5)
{
cout << “Hello “;
count = count 1;
}
cout << “nThat’s all!n”;
return 0;
}
程序输出结果
Hello Hello Hello Hello Hello
That’s all!
现在来仔细看一看这个程序。在第7行中,整数变量count被定义并用值1初始化。在第9行中,while循环以下面的语句开头:
while (count<= 5)
该语句测试变量count以确定其值是否小于或等于5。因为它确实小于5,所以循环体(第11行和第12行)中的语句被执行:
cout << “Hello “;
count = count 1;
第11行中的语句将显示字符串“Hello”。第12行中的语句则给变量count加上1,使其值变成了2。这是循环体中的最后一个语句,因此在执行之后循环又一次开始。它再次测试表达式“count <= 5”,并且由于仍然为true,循环体中的语句将再次执行。该循环不断重复,直到变量count等于6,使表达式“count<= 5”为false,然后退出循环,如图5-2所示。
图5-2 while循环工作原理
循环的每一次执行称为迭代(Iteration)。以上示例中的循环将执行5次迭代,直至表达式“count <= 5”被测试并且发现为false,导致循环终止。然后程序继续执行该循环之后的语句。控制循环迭代次数的变量称为循环控制变量(Loop Control Variable)。在上面的例子中,count就是循环控制变量。
5.1.2 while是一个预测试循环
while循环是一个预测试(Pretest)循环。这意味着它会在每次迭代之前测试其状态。如果测试表达式为false,则循环将永远不会迭代。如果要确保一个while循环至少执行一次,则必须初始化相关的数据,使测试表达式一开始即为true。例如,注意程序5-1第7行中变量count的定义:
int count = 1;
count变量被初始化为值1。如果数字已经被初始化为大于5的值,则循环将永远不会执行,如下面的程序段所示:
int count = 6;
while (count <= 5)
{
cout << “Hello “;
count = count 1;
}
5.1.3 无限循环
除极少数情况外,循环必须包括一种终止方式。这意味着循环中的某些内容必须最终使测试表达式为false。在程序5-1中,当表达式“count <= 5”变为false时,循环停止。
如果循环没有停止的方式,则称为无限循环。无限循环将持续重复,直到程序中断,示例如下:
int count = 1;
while (count<= 5)
{
cout << “Hello “;
}
这是一个无限循环,因为它不包含更改count变量值的语句。每次测试表达式“count <= 5”时,count的值都是1。
小心分号
通过在while循环的第一行之后意外地放置一个分号也可以创建无限循环,示例如下:
int count = 1;
while (count <= 5); // 该分号是一个错误
{
cout << “Hello “;
count = count 1;
}
因为编译器在发现开始语句块的大括号之前看见了第一行末尾的分号,所以它会在分号的位置结束循环。尤其是它会将分号前面丢失的语句解释为空语句(null statement),也就是什么都不做的语句,然后将while语句和它后面的任何内容断开。对于编译器来说,整个循环看起来就像下面这样:
while(count<= 5);
这个while循环将持续执行空语句,当然它永远不会执行任何操作。该程序似乎“陷入迷惘”,因为没有任何屏幕输出,也不会显示任何活动。
不要忘记大括号
在编写循环语句时,如果有条件执行的语句是一个语句块,则不要忘记将所有的语句都包含在一组大括号中。如果大括号意外被忽略,则while语句有条件执行的仅仅是下一个语句,请看下面的代码示例:
int count = 1;
// 该循环忘记使用大括号
while (count <= 5)
cout << “Hello “;
count = count 1;
在这段代码中,只有一个语句,也就是cout语句,是在while循环的主体中。给变量count加1的语句不在循环体内,所以count的值保持为1,循环测试条件永远为true。循环将一遍又一遍地打印“Hello”字符串,直到用户停止程序。
不要混淆=与==
循环的另一个常见陷阱是,在打算使用==运算符时,却意外地使用了=运算符。例如,以下示例就是一个无限循环,因为作为循环条件的测试表达式每次都给remainder赋值为1,而不是测试remainder是否等于1:
while (remainder = 1) // 错误:条件表达式为赋值语句
{
cout << “Enter a number: “; cin >> num;
remainder = num % 2;
}
请记住,任何非零值都将被判断为true。
评论
还没有评论。