本书介绍了从C++面向过程编程到面向对象编程的技术方法,详细分析了C++的各种常用数据结构。\r\n\r\n 全书共15章。第1章介绍了计算机和编程的基础知识,为学习C++编程奠定理论基础。第2到第6章介绍了面向对象编程的各个方法步骤,目的是使初学者容易接受用C++语言分析和解决问题的思想方法。第7到10章讲解了面向对象编程的几个范畴的问题,如类、类函数和转换、继承、动态内存分配、I/O文件流等等,全面展示了C++的功能特性。第11到15章详细分析了C++的常用数据结构,对读者进一步提高编程能力有很大帮助。每一章中间和结尾都有大量的练习,供读者巩固知识或编程实践。附录部分提供了常用参考资料、Vc和C++ Builder简介、部分习题答案等。\r\n\r\n 本书适合广大C++语言学习者阅读,也可作为高校学生学习C++的教学参考书。对于广大C++程序员,书中丰富详尽的参考资料有很高的使用价值。\r\n
\r\n
第1章 计算机与程序设计简介 1 \r\n\r\n 1.1 硬件和软件 1 \r\n\r\n 1.1.1 计算机硬件 3 \r\n\r\n 1.1.2 硬件的发展 6 \r\n\r\n 1.1.3 计算机软件 \r\n\r\n 练习1.1 8 \r\n\r\n 1.2 编程语言 10 \r\n\r\n 1.3 问题解决与软件开发 11 \r\n\r\n 1.3.1 阶段一:开发与设计 13 \r\n\r\n 1.3.2 阶段二:编写文档 14 \r\n\r\n 1.3.3 阶段三:维护 15 \r\n\r\n 1.3.4 深入探讨开发与设计 16 \r\n\r\n 1.3.5 备份 16 \r\n\r\n 练习1.3 21 \r\n\r\n 1.4 算法 21 \r\n\r\n 练习1.4 24 \r\n\r\n 1.5 为对象做准备:面向对象的程序设计 25 \r\n\r\n 练习1.5 26 \r\n\r\n 1.6 深入探讨数字式存储的概念 29 \r\n\r\n 1.6.1 二进制补码 29 \r\n\r\n 1.6.2 字与地址 30 \r\n\r\n 1.7 常见编程错误 30 \r\n\r\n 1.8 章节回顾 31 \r\n\r\n 1.8.1 关键术语 31 \r\n\r\n 1.8.2 概要 31 \r\n\r\n 1.8.3 练习 32 \r\n\r\n \r\n\r\n 第一部分 C++面向过程的程序设计 35 \r\n\r\n \r\n\r\n 第2章 用C++解决问题 37 \r\n\r\n 2.1 C++简介 37 \r\n\r\n 2.1.1 main()函数 39 \r\n\r\n 2.1.2 cout对象 40 \r\n\r\n 练习2.1 42 \r\n\r\n 2.2 程序设计风格 44 \r\n\r\n 练习2.2 46 \r\n\r\n 2.3 数据值与算术运算 47 \r\n\r\n 2.3.1 整数值 47 \r\n\r\n 2.3.2 浮点数 48 \r\n\r\n 2.3.3 字符值 49 \r\n\r\n 2.3.4 转义序列 50 \r\n\r\n 2.3.5 算术运算 51 \r\n\r\n 2.3.6 整数的除法 53 \r\n\r\n 2.3.7 一元运算符 53 \r\n\r\n 2.3.8 运算符的优先级和结合性 54 \r\n\r\n 练习2.3 55 \r\n\r\n 2.4 变量与声明语句 57 \r\n\r\n 2.4.1 声明语句 58 \r\n\r\n 2.4.2 多重声明 60 \r\n\r\n 4.4.3 内存分配 62 \r\n\r\n 4.4.4 显示一个变量的地址 63 \r\n\r\n 练习2.4 65 \r\n\r\n 2.5 整数限定符 67 \r\n\r\n 2.5.1 数据类型转换 68 \r\n\r\n 2.5.2 确定存储长度 68 \r\n\r\n 练习2.5 69 \r\n\r\n 2.6 软件开发过程运用 70 \r\n\r\n 2.6.1 步骤一:分析问题 71 \r\n\r\n 2.6.2 步骤二:研究解决问题 71 \r\n\r\n 2.6.3 步骤三:方案的代码化 71 \r\n\r\n 2.6.4 步骤四:程序的测试与更正 72 \r\n\r\n 练习2.6 72 \r\n\r\n 2.7 注重解决问题 74 \r\n\r\n 2.7.1 问题一:钟摆 74 \r\n\r\n 2.7.2 问题二:直通电话网络 75 \r\n\r\n 练习2.7 76 \r\n\r\n 2.8 为对象做准备:关于“抽象”的简介 77 \r\n\r\n 2.9 常见编程错误 80 \r\n\r\n 2.10 章节回顾 81 \r\n\r\n 2.10.1 关键术语 81 \r\n\r\n 2.10.2 概要 81 \r\n\r\n 2.10.3 练习 82 \r\n\r\n \r\n\r\n 第3章 基础知识介绍 86 \r\n\r\n 3.1 赋值操作 86 \r\n\r\n 3.1.1 赋值的各种形式 89 \r\n\r\n 3.1.2 累加和 90 \r\n\r\n 3.1.3 计数 91 \r\n\r\n 练习3.1 93 \r\n\r\n 3.2 指定输出数的格式 96 \r\n\r\n 练习3.2 102 \r\n\r\n 3.3 利用数学库函数 104 \r\n\r\n 练习3.3 107 \r\n\r\n 3.4 用cin对象接收程序输入 109 \r\n\r\n 练习3.4 112 \r\n\r\n 3.5 const 限定符 115 \r\n\r\n 练习3.5 117 \r\n\r\n 3.6 注重解决问题 118 \r\n\r\n 3.6.1 问题一:酸雨 118 \r\n\r\n 3.6.2 问题二:指数函数的逼近 120 \r\n\r\n 练习3.6 123 \r\n\r\n 3.7 为对象做准备:程序性能衡量和面向对象技术 125 \r\n\r\n 3.7.1 程序性能的衡量 126 \r\n\r\n 3.7.2 转向面向对象技术 127 \r\n\r\n 练习3.7 128 \r\n\r\n 3.8 深入探讨错误 128 \r\n\r\n 3.8.1 编译时和运行时错误 128 \r\n\r\n 3.8.2 语法和逻辑错误 128 \r\n\r\n 3.9 常见编程错误 131 \r\n\r\n 3.10 章节回顾 131 \r\n\r\n 3.10.1 关键术语 131 \r\n\r\n 3.10.2 概要 132 \r\n\r\n 3.10.3 练习 133 \r\n\r\n \r\n\r\n 第4章 选择结构 137 \r\n\r\n 4.1 选择条件 137 \r\n\r\n 4.1.1 逻辑运算符 139 \r\n\r\n 4.1.2 数的精度问题 141 \r\n\r\n 练习4.1 142 \r\n\r\n 4.2 if-else语句 143 \r\n\r\n 4.2.1 复合语句 145 \r\n\r\n 4.2.2 代码块的作用范围 147 \r\n\r\n 4.2.3 单选择 147 \r\n\r\n 4.2.4 与if-else语句相关的问题 149 \r\n\r\n 练习4.2 150 \r\n\r\n 4.3 嵌套if语句 152 \r\n\r\n 练习4.3 157 \r\n\r\n 4.4 Switch语句 160 \r\n\r\n 练习4.4 163 \r\n\r\n 4.5 注重解决问题 164 \r\n\r\n 4.5.1 问题一:数据有效性检验 165 \r\n\r\n 4.5.2 问题二:解二次方程 166 \r\n\r\n 练习4.5 169 \r\n\r\n 4.6 为对象做准备:内部和外部 170 \r\n\r\n 4.6.1 抽象与封装 172 \r\n\r\n 4.6.2 代码重用的扩展 172 \r\n\r\n 练习4.6 173 \r\n\r\n 4.7 深入探讨程序测试 174 \r\n\r\n 4.8 常见编程错误 175 \r\n\r\n 4.9 章节回顾 176 \r\n\r\n 4.9.1 关键术语 176 \r\n\r\n 4.9.2 概要 176 \r\n\r\n 4.9.3 练习 178 \r\n\r\n \r\n\r\n 第5章 循环结构 181 \r\n\r\n 5.1 引言 242 \r\n\r\n 5.1.1 先判断循环与后判断循环 181 \r\n\r\n 5.1.2 固定计数循环与可变条件循环 181 \r\n\r\n 5.2 while 循环 183 \r\n\r\n 练习5.2 188 \r\n\r\n 5.3 交互式while 循环 189 \r\n\r\n 5.3.1 标记 195 \r\n\r\n 5.3.2 break语句与continue语句 196 \r\n\r\n 5.3.3 空语句 197 \r\n\r\n 练习5.3 197 \r\n\r\n 5.4 for循环 199 \r\n\r\n 练习5.4 205 \r\n\r\n 5.5 循环编程技术 208 \r\n\r\n 5.5.1 技术一:在循环中交互输入 208 \r\n\r\n 5.5.2 技术二:在循环中选择 208 \r\n\r\n 5.5.3 技术三:计算单变量函数 210 \r\n\r\n 5.5.4 技术四:交互式循环控制 212 \r\n\r\n 练习5.5 213 \r\n\r\n 5.6 嵌套循环 214 \r\n\r\n 练习5.6 216 \r\n\r\n 5.7 do-while循环 217 \r\n\r\n 练习5.7 219 \r\n\r\n 5.8 为对象做准备:对象建模技术 220 \r\n\r\n 5.8.1 对象图 221 \r\n\r\n 5.8.2 关系 223 \r\n\r\n 练习5.5 224 \r\n\r\n 5.9 常见编程错误 225 \r\n\r\n 5.10 章节回顾 225 \r\n\r\n 5.10.1 关键术语 225 \r\n\r\n 5.10.2 概要 226 \r\n\r\n 5.10.3 练习 227 \r\n\r\n \r\n\r\n 第6章 用函数实现模块化 231 \r\n\r\n 6.1 函数声明与参数声明 231 \r\n\r\n 6.1.1 函数原型 232 \r\n\r\n 6.1.2 调用一个函数 233 \r\n\r\n 6.1.3 定义一个函数 234 \r\n\r\n 6.1.4 语句的位置 237 \r\n\r\n 6.1.5 函数占位符 238 \r\n\r\n 6.1.6 带有空参数列表的函数 239 \r\n\r\n 6.1.7 缺省参数 240 \r\n\r\n 6.1.8 函数模板 240 \r\n\r\n 6.1.9 重用函数名(重载) 244 \r\n\r\n 练习6.1 245 \r\n\r\n 6.2 返回值 246 \r\n\r\n 练习6.2 251 \r\n\r\n 6.3 变量的作用范围 253 \r\n\r\n 6.3.1 范围解析运算符 256 \r\n\r\n 6.3.2 全局变量的误用 256 \r\n\r\n 练习6.3 257 \r\n\r\n 6.4 变量存储类型 259 \r\n\r\n 6.4.1 局部变量存储类型 260 \r\n\r\n 6.4.2 全局变量存储类型 263 \r\n\r\n 练习6.4 264 \r\n\r\n 6.5 使用引用参数的引用传递 265 \r\n\r\n 练习6.5 272 \r\n\r\n 6.6 递归 273 \r\n\r\n 6.6.1 数学递归 273 \r\n\r\n 6.6.2 计算是如何执行的 275 \r\n\r\n 6.6.3 递归和迭代 276 \r\n\r\n 练习6.6 277 \r\n\r\n 6.7 注重解决问题 277 \r\n\r\n 6.7.1 产生伪随机数 277 \r\n\r\n 6.7.2 问题一:模拟抛硬币 279 \r\n\r\n 6.7.3 问题二:编写一个HiLo游戏 281 \r\n\r\n 6.7.4 问题三:用蒙特卡洛模拟估计曲线下的面积 283 \r\n\r\n 练习6.7 287 \r\n\r\n 6.8 为对象做准备:动态OMT模型 290 \r\n\r\n 6.8.1 动态模型 290 \r\n\r\n 6.8.2 一个例子 292 \r\n\r\n 练习6.8 293 \r\n\r\n 6.9 常见编程错误 294 \r\n\r\n 6.10 章节回顾 294 \r\n\r\n 6.10.1 关键术语 294 \r\n\r\n 6.10.2 概要 294 \r\n\r\n 6.10.3 练习 295 \r\n\r\n \r\n\r\n 第二部分 C++面向对象的程序设计 303 \r\n\r\n \r\n\r\n 第7章 类的介绍 305 \r\n\r\n 7.1 C++中的抽象数据类型(类) 305 \r\n\r\n 7.1.1 抽象数据类型 305 \r\n\r\n 7.1.2 类的构造 307 \r\n\r\n 7.1.3 术语 313 \r\n\r\n 练习7.1 313 \r\n\r\n 7.2 构造函数 315 \r\n\r\n 7.2.1 构造函数和调用 316 \r\n\r\n 7.2.2 重载和内联构造函数 317 \r\n\r\n 7.2.3 析构函数 320 \r\n\r\n 练习7.2 321 \r\n\r\n 7.3 注重解决问题 321 \r\n\r\n 7.3.1 问题一:构造一个电梯对象 322 \r\n\r\n 7.3.2 问题二:汽油泵对象的仿真 326 \r\n\r\n 练习7.3 331 \r\n\r\n 7.4 常见编程错误 332 \r\n\r\n 7.5 章节回顾 332 \r\n\r\n 7.5.1 关键术语 332 \r\n\r\n 7.5.2 概要 332 \r\n\r\n 7.5.3 练习 333 \r\n\r\n \r\n\r\n 第8章 类的函数和转换 335 \r\n\r\n 8.1 赋值 335 \r\n\r\n 8.1.1 复制构造函数 338 \r\n\r\n 8.1.2 基础/成员初始化 340 \r\n\r\n 练习8.1 341 \r\n\r\n 8.2 类的其他特征 341 \r\n\r\n 8.2.1 类的作用范围 341 \r\n\r\n 8.2.2 静态类成员 343 \r\n\r\n 8.2.3 友元函数 346 \r\n\r\n 练习8.2 348 \r\n\r\n 8.3 运算符函数 349 \r\n\r\n 练习8.3 355 \r\n\r\n 8.4 用户的两种选择:operator()和operator[] 356 \r\n\r\n 练习8.4 359 \r\n\r\n 8.5 数据类型转换 359 \r\n\r\n 8.5.1 内置数据类型转换成内置数据类型 360 \r\n\r\n 8.5.2 内置数据类型转换成类 360 \r\n\r\n 8.5.3 类转换成内置数据类型 362 \r\n\r\n 8.5.4 类转换成类型 363 \r\n\r\n 练习8.5 366 \r\n\r\n 8.6 注重解决问题 367 \r\n\r\n 8.6.1 问题一:多个对象的汽油泵仿真 367 \r\n\r\n 8.6.2 问题二:重载插入( )和提取( )运算符 372 \r\n\r\n 练习8.6 375 \r\n\r\n 8.7 常见编程错误 376 \r\n\r\n 8.8 章节回顾 377 \r\n\r\n 8.8.1 关键术语 377 \r\n\r\n 8.8.2 概要 377 \r\n\r\n 8.8.3 练习 378 \r\n\r\n \r\n\r\n 第9章 继承和动态内存分配 381 \r\n\r\n 9.1 类的继承 381 \r\n\r\n 9.1.1 访问标志 383 \r\n\r\n 9.1.2 一个例子 283 \r\n\r\n 练习9.1 387 \r\n\r\n 9.2 多态性 387 \r\n\r\n 练习9.2 390 \r\n\r\n 9.3 this指针 391 \r\n\r\n 练习9.3 396 \r\n\r\n 9.4 注重解决问题 396 \r\n\r\n 9.4.1 问题一:对象的动态生成与销毁 396 \r\n\r\n 9.4.2 问题二:汽油泵的动态仿真 401 \r\n\r\n 练习9.4 405 \r\n\r\n 9.5 作为类成员的指针 406 \r\n\r\n 练习9.5 412 \r\n\r\n 9.6 常见编程错误 412 \r\n\r\n 9.7 章节回顾 413 \r\n\r\n 9.7.1 关键术语 413 \r\n\r\n 9.7.2 概要 413 \r\n\r\n 9.7.3 练习 413 \r\n\r\n \r\n\r\n 第10章 I/O文件流和数据文件 415 \r\n\r\n 10.1 I/0文件流对象和方法 415 \r\n\r\n 10.1.1 文件 415 \r\n\r\n 10.1.2 文件流对象和模式 416 \r\n\r\n 10.1.3 文件流的方法 417 \r\n\r\n 10.1.4 嵌入程序和交互输入的文件名 421 \r\n\r\n 10.1.5 关闭文件 423 \r\n\r\n 练习10.1 423 \r\n\r\n 10.2 读文件和写文件 424 \r\n\r\n 10.2.1 标准设备文件 429 \r\n\r\n 10.2.2 其他设备 429 \r\n\r\n 练习10.2 430 \r\n\r\n 10.3 文件的随机访问 431 \r\n\r\n 练习10.3 434 \r\n\r\n 10.4 将文件流作为函数的输入参数 434 \r\n\r\n 练习10.4 437 \r\n\r\n 10.5 注重解决问题 437 \r\n\r\n 10.5.1 问题一:花粉统计的单文件更新 437 \r\n\r\n 10.5.2 问题二:主文件/事务文件更新 442 \r\n\r\n 练习10.5 4446 \r\n\r\n 10.6 深入探讨iostream类库 448 \r\n\r\n 10.6.1 文件流传输机制 448 \r\n\r\n 10.6.2 iostream类库的组件 448 \r\n\r\n 10.6.3 iostream在内存中的格式 449 \r\n\r\n 10.7 常见编程错误 451 \r\n\r\n 10.8 章节回顾 451 \r\n\r\n 10.8.1 关键术语 451 \r\n\r\n 10.8.2 概要 451 \r\n\r\n 10.8.3 练习 453 \r\n\r\n \r\n\r\n 第三部分 数据结构 455 \r\n\r\n \r\n\r\n 第11章 数组 457 \r\n\r\n 11.1 一维数组 587 \r\n\r\n 11.2 数组的初始化 596 \r\n\r\n 11.3 用数组作为函数参数 599 \r\n\r\n 11.4 声明和使用二维数组 604 \r\n\r\n 11.5 注重解决问题 613 \r\n\r\n 11.6 查找和排序 621 \r\n\r\n 11.7 常见编程错误 644 \r\n\r\n 11.8 章节回顾 645 \r\n\r\n 第12章 650 \r\n\r\n 字符串 650 \r\n\r\n 12.1 字符串基础 651 \r\n\r\n 12.2 库函数 663 \r\n\r\n 12.3注重解决问题 673 \r\n\r\n 12.4 深入探讨CString类 680 \r\n\r\n 12.5 常见编程错误 684 \r\n\r\n 第13章 689 \r\n\r\n 地址. 指针和数组 689 \r\n\r\n 13.1 地址和指针 690 \r\n\r\n 13.2 数组名作为指针 701 \r\n\r\n 13.3 指针运算 709 \r\n\r\n 13.4 传递地址 713 \r\n\r\n 13.5 指针和字符串库函数 723 \r\n\r\n 13.6 字符串定义和指针数组 726 \r\n\r\n 13.7常见编程错误 731 \r\n\r\n 13.8 章节回顾 733 \r\n\r\n 第14章 736 \r\n\r\n 作为数据结构的记录 736 \r\n\r\n 14.1 单个记录 737 \r\n\r\n 14.2 结构体数组 743 \r\n\r\n 14.3 记录结构用作函数参数 747 \r\n\r\n 14.4 链表 754 \r\n\r\n 14.5 结构体动态内存分配 761 \r\n\r\n 14.6 注重解决问题 767 \r\n\r\n 14.7联合体 779 \r\n\r\n 14.8 常见编程错误 781 \r\n\r\n 14.9章节回顾 781 \r\n\r\n 第15章 785 \r\n\r\n 面向对象的堆栈和队列 785 \r\n\r\n 15.1 堆栈介绍 786 \r\n\r\n 15.2 动态链接堆栈的实现 795 \r\n\r\n 15.3 队列介绍 803 \r\n\r\n 15.4 动态链接队列的实现 811 \r\n\r\n 15.5 常见编程错误 820 \r\n\r\n 15.6 章节回顾 820 \r\n\r\n 附录 823 \r\n\r\n 附录A 824 \r\n\r\n 运算符优先顺序表 824 \r\n\r\n 附录B 827 \r\n\r\n ASCII字符编码 827 \r\n\r\n 附录C 833 \r\n\r\n 程序的输入. 编译和执行 833 \r\n\r\n 附录D 839 \r\n\r\n 输入. 输出和标准错误重定向 839 \r\n\r\n 附录E 842 \r\n\r\n 浮点数的存储 842 \r\n\r\n 附录F 845 \r\n\r\n 名称空间 845 \r\n\r\n 附录G 848 \r\n\r\n 标准模板库 848 \r\n\r\n 附录H 855 \r\n\r\n 使用 Visual C++ 6.0 855 \r\n\r\n 附录I 865 \r\n\r\n 使用C++ BuilderTM 865 \r\n\r\n 附录J 869 \r\n\r\n 附加性能 869 \r\n\r\n 附录K 881 \r\n\r\n 部分奇数编号习题的答案 881 \r\n
\r\n
对多数人来说, 要完全发挥像C++这样的复杂语言的全部潜能(包括面向过程和面向对象的特性), 就需要让自己的编程技巧从面向过程(procedural)逐渐改进到面向对象(object—oriented), 这正是本书所遵循的途径. 本书在编写时力图从教学和实际效果上做到尽快地转向彻底的面向对象的程序设计.
尽管我们现在是要从面向过程转变到完全面向对象, 对于C十十用户而言, 关于“在真正尝试面向对象的程序设计之前要学习多少面向过程的程序设计”这一问题仍然广泛地存在着各种各样的观点. 作为一个实际问题, 它会引发如下两种争论:面向对象的程序设计是应该在介绍C++语言中间就提及还是应该放在最后呢?
对于这个问题, 我个人的回答(同时也是本书坚持的)是来自于我的一个基本观点的:最终教会学生的不是大学的课本, 而是大学里的教授. 因此, 我编写的所有课本都从一个基本点出发, 即让课本成为教授们所使用的各种“主角”的“配角”. 用通俗的话来说, 就是课本要十分灵活, 以便那些采用了我的教材的教授们仍然可以按照他们各自的喜好来使用教材中的内容. 这一点是用以下方式来实现的.
第1章讲述了关于计算机的一些普及性知识, 用来帮助那些以往没有接触过计算机的读者. 除了这个章节, 其余章节讲述的都是C++的有关内容. 本书的第1部分讲解了基本的面向过程的程序设计语法. 流控制(now control), 以及有效实现C++的对象特性所需要的模块化问题. 这些关于面向过程的章节中都包含“为对象做准备”这部分内容, 这些内容可以用来帮助学员们开始从思想上向面向对象的开发与设计技术转变.
第1部分结束后, 第2部分和第3部分则分别介绍了面向对象的程序设计和数据结构, 这两个部分的先后次序是可以互换的. 这样, 如果想尽快学习面向对象的程序设计, 你可以按照正常的顺序来学习, 另一方面, 如果打算继续深入学习更多的面向过程的程序设计知识并将面向对象的程序设计放到最后, 你可以在阅读完第1部分后提前阅读第3部分, 最后再学习第2部分. 无论采取哪种方式, 第10章中介绍的内容在学习完第l部分后可以随时阅读.
各主题的机动性, 涉及面向过程的程序设计. 抽象数据类型以及继承等的总体上下文关系, 可以用下面的主题从属关系图来表示:
在使用本书时, 除了要求学生们了解基本的代数学以外, 没有任何其他要求. 第1章为有需要的学生介绍一些关于计算机的普及性知识. 在这个章节中, 我们大量使用了来自日常生活. 业务和技术领域的各种例子. 因此, 教师们可以针对特定的课程重点结合学生的实际来选择适用的素材.
根据本书第一版的读者建议和反馈, 第二版中加入了许多新的教学特性和素材. 最广泛的修改是将C++的ANSI规范结合到本书中了.
此外, 第二版所做的修改还包括:
包含了关于标准模板库(Standard Template Library)的内容,
包含了关于名称空间(namespace)的内容,
关于函数模板的部分添加了新内容,
添加了关于使用Visual C++ Version 6.0和C++Builder的信息,
将Date类从存储两位年份改为存储4位年份.
但是, 我们对第二版的基本要求仍然与第一版相同:所有的主题都以一种清楚. 明显和可以理解的方式来向那些初学者进行讲解. 基于这个目标, 第一版的核心组成部分在第二版中基本上没有进行改动. 这样, 除了根据ANSI标准做了修改的部分内容外, 第一版中所有的主题. 例子. 解释和图示在第二版中仍然可以找到.
本书的特点
1. 写作风格
我在自己的教学中总结出的最重要的一件事情就是无论一本教材写的是什么内容, 这些内容必须是学生们能够阅读的. 一旦教授站在了讲台上, 他选用的教材必须能够鼓励. 培养和帮助学生们获得和掌握课堂上讲述的内容. 我主要关心的(也是本书的特色之一)这本书是为学生们编写的. 这样, 我首先意识到, 作为要讲述的概念的载体, 写作风格是本书的一个重要和与众不同的方面.
2. 模块化
要编写出易于阅读和维护的代码, 模块化是一个基本的要求. C++生来就是一种模块化语言. 因此, 在本书的2. 1节中, 我较早地将C++的函数和模块联系在了一起, 并且贯穿在全书中. 在3. 3节中, 将参数传递到模块中的想法也较早地使用C++的函数库来加以实现. 通过这种造径, 学生们认识到函数和参数传递是程序设计中的一种固有的技术. 这种对模块的强调在第7章介绍面向对象的程序设计时得以延续和加强.
3. 软件工程
本书不仅仅是简单地向学生们介绍用C++进行程序设计, 还从面向过程和面向对象的角度出发, 讲解了软件工程的一些基础知识. 这是从1. 3节介绍软件的开发周期开始的, 紧随该小节之后是对一些算法的介绍和第一个“为对象做准备”部分. 在第2章中, 我们阐述了本书的核心主题, 它更正式地强调了解决问题的技术. 在这里, 我们突出了理解一个问题并选择和提炼出解决方案的重要性, 介绍了分析. 设计. 编写代码和代码测试之间的关系. 此外, 各章节中的“为对象做准备”部分介绍并巩固了面向对象的设计方法所需要的一些概念和技术.
4. 注重解决问题
从第2章开始, 每个章节都包含一个“注重解决问题”部分, 平均每个章节中会解决两个完整的问题. 每个应用程序都用于演示如何在一个完整的程序解决方案中有效地解决问题, 并分别使用面向过程和面向对象的设计方案加以实现.
5. 对引用(Reference)和指针(Pointer)的介绍
我以前编写的一本教材在介绍指针时所使用的方式独具特色, 该教材名为AFirstBookofC.它在讲解指针时先显示变量的地址, 然后用其他的变量来存储这些地址. 相对于同期出版的其他书籍中对指针进行间接描述的流行做法而言, 这种方式显得更有逻辑性. 更直观. 令我感到欣慰的是, 从那时起, 使用一个输出函数来显示地址成为讲解指针的一种标准方式. 尽管这种方式不再是我的教材中的独特之处, 我还是为它的表现感到骄傲并在这本教材中加以沿用. 引用的主要目的在于将其作为某函数的一个参数来使用, 本书的第6章对引用进行了讲解, 而在第13章中则对引用和指针做了比较.
6. 程序测试
本书中每个单独的C++程序都成功地在Borland公司的TurboC++编译器下通过编译和运行.
教学方法上的特色
为了帮助C++更易于成为必修课, 本书在教学方法上具有了以下特色:
1. 为对象做准备
由6个部分组成(分别包含在本书的前6个章节中), 其内容自成一体, 形成了一个关于面向对象程序设计的概念和设计技术的简短胁“迷你课程”. 这些部分可以在课程的最初阶段使用, 也可以在课程中讲述面向对象程序设计的阶段中作为浓缩素材使用.
2. 小结练习
本书中的每个章节都几乎包含大量的各种性质的技能培训和编程练习. 此外, 本书的附录K中还有所选择地对编号为奇数的习题给出了解决方案.
3. 伪代码描述
本书中着重使用了伪代码(pseudocode). 尽管书中也采用了许多流程图(flowchart)标号, 但是它们只用于从视觉上表现流控制的构成.
4. 常见编程错误和章节回顾
在每一章的结尾处都有关于常见编程错误的小节, 还有关于该章节中涉及的主要问题的一个回顾.
5. 注重解决问题
这些小节都含有两个完整的练习, 这两个练习引导学生经历问题确定. 分析. 解决方案的研究. 编写代码. 代码测试和代码调试. 通过各种应用程序的结合, 采用面向过程和面向对象方式, 这些经过仔细挑选的练习用来提高学生的兴趣, 并巩固程序开发的概念.
6. 浓缩和深入探讨
用多种方式对C++教学中的要点进行强调, 其中包括许多浓缩内容. 这些内容让教师为不同的学生和不同性质的C++课程采取不同的侧重点.
7. 知识要点
这些内容为一些常用和(或)较难理解的概念提供额外的简短说明, 例如抽象(abstraction). 左值(lvalue)和右值(rvalue). 值(value)与等式(identity). 标志(flag). 退出队列(dqueue)和流格式化(stream formatting)等.
8. 编程笔记
这些内容突出了其他可用的以及更先进的编程技术.
9. 背景点滴
为了让计算机科学的学习更有收获并增加素材的广度, 本书中穿插了这些小的背景资料. 这些资料利用历史. 传记和其他有趣的相关材料对技术性内容进行了补充.
10. C++快速参考
这个方便分的参考对C++的关键字. 运算符. 语句语法和类结构进行了汇总, 以便为学生提供简单而快速的参考.
11. 函数和头文件参考
这是一个关于C++的常用头文件. 库函数和格式标志的快速参考.
附录和补充材料
本书提供了一组在第一版基础上经过扩充的附录, 其中包括关于运算符优先. ASCII码. 程序的进入和汇编. I. O重定向. 浮点数存储和附加的C++特性等方面的内容. 而在第二版中新加入了关于命名空间. 标准模板库以及使用VisualC++和C++Builder开发环境输入和建立C++程序的有关附录.
此外, 我们还为使用本书作为教材的教师们提供了教师手册. 源代码和可下载的PowerPoint演示文档可以在http://www.brookscole.com/compsci/bronson/pddcpp上找到.
对PASCAL程序员的一点说明
用户从C和Pascal向C十十过渡现在已经十分明确了. 根据我的经验, C语言的3个基本特点同时也是C++的基础, 这在最初会给我们造成一些混淆, 因此我在这里要对这些特点做一个粗略的概括.
对于C和C++而言, 首先一个独特之处就是它们不依靠某种内建的布尔(Boolean)数据类型和能够得出某个确定数字值的测试表达式来进行判断. 因此, 以下的语法在C语言中是看不到的, 在C++也不常用.
相反, C和C++使用另外一种更有包容性的语法:
在这里, expression是任意一个可以得出数字值的表达式. 如果测试表达式得到的是一个非0的值, 它会将判断的结果视为true, 只有为0的值才会被视为false. 反之, 结果为true的关系表达式对应的数字值为1, 而结果为false的关系表达式对应的数字值为0.
C语言和C十十的第二个独特之处在于它们对指针的解释和使用. 在C++中, 一个指针就是一个变量, 该变量用来存储一个内存地址. 尽管指针变量主要是和间接寻址运算符(*)一起用来解除对某个指针的参照并获取想要得到的“指向”目标, C++的指针的用法要比Pascal的指针丰富得多. 这是因为一个指针变量的内容可以像任何其他的变量一样来显示和操作, 并且还支持指针的算术运算.
最后, C++在语句的位置安排上没有严格的规定. 从这个角度来说, C++中唯一真正的规定就是一个标识符在使用以前必须先进行声明. 尽管合理地安排语句的位置始终不失为一种良好的编程习惯, 但C++对于语句放置顺序的要求并没有Pascal那样严格.