本书是介绍C++编程语言的同时,介绍并强调了软件工程的基本原理和面向对象编程。全书内容包括:函数和自顶向下设计基础、选择和循环结构、简单数据类型、输入和输出、结构化数据类型(数组和结构)、类和对象、数据建模、递归、指针、链接、栈、队列和树等。
本书可以作为大专院校计算机及相关专业的程序设计基础课程的教材,也可以作为C++语言程序设计的自学教材。
第1章 计算机、问题求解和程序设计简介
1.1 计算机概述
1.2 计算机硬件
1.3 计算机软件
1.4 高级语言程序的处理
1.5 软件开发方法
1.6 应用软件开发方法
1.7 计算机程序员的职业道德
第2章 C++综述
2.1 C++语言要素
2.2 保留字和标识符
2.3 数据类型和声明
2.4 可执行语句
2.5 C++程序的一般格式
2.6 算术表达式
2.7 交互模式、批处理模式和数据文件
2.8 常见的编程错误
第3章 函数和类的自顶向下设计
3.1 根据现有信息构建程序
3.2 库函数
3.3 自顶向下设计和结构图
3.4 没有参数的函数
3.5 带输入参数的函数
3.6 名称的作用域
3.7 通过类扩展C++:使用string类
3.8 常见编程错误
第4章 选择结构:if和switch语句
4.1 控制结构
4.2 逻辑表达式
4.3 if控制语句概述
4.4 带有复合选项的if语句
4.5 算法中的决策步骤
8.6 常见编程错误
第9章 数据结构:数组和结构
9.1 数组数据类型
9.2 数组元素的顺序访问
9.3 数组参数
9.4 读取部分数组
9.5 数组的查找和排序
9.6 算法分析:大0表示法
9.7 结构数据类型
9.8 结构作为操作数和参数
9.9 字符串作为字符数组(可选)
9.10 常见编程错误
第10章用户自定义类
10.1 定义和使用类
10.2 类的实现
10.3 类和对象的使用规则概述
10.4 类作为操作数和参数
10.5 分数类
10.6 圆类
10.7 简单字符串类
10.8 存款账户类
10.9 常见编程错误
第11章 数据抽象和面向对象设计
11.1 多维数组
11.2 结构数组
11.3 模板类
11.4 索引表抽象数据类型
11.5 实现索引表类
11.6 面向对象设计举例
11.7 运算符重载和友元
11.8 vector类
11.9 常见编程错误
第12章 递归
12.1 递归的本质
12.2 跟踪递归函数
12.3 数学递归函数
12.4 带有数组参数的递归函数
12.5 使用递归技术解决问题
12.6 常见编程错误
第13章 指针和动态数据结构
13.1 指针和new运算符
13.2 堆的操作
13.3 链表和list类
13.4 栈抽象数据类型
13.5 队列抽象数据类型
13.6 叉树
13.7 二叉查找树抽象数据类型
13.8 又查找树的效率
13.9 常见编程错误
附录A ASCII字符集
附录B 保留字和特殊字符
附录C C++库函数精选
附录D 运算符
附录E 继承和多态性简介
E.1 特殊化再分类
E.2 规范的再分类
E.3 评论
E.4 多态性
附录F 使用Visual C++
F.1 创建一个新项目
F.2 重新打开一个项目
F.3 使用调试器
F.4 创建多文件项目
附录G 使用C++Builder
G.1 建立一个新项目
G.2 在退出程序前查看控制台窗口
G.3 重新打开一个项目
G.4 使用调试器
G.5 创建多文件项目
奇数题答案
C++是当前商业软件开发的主流语言, 效率高而功能强大, 用它不仅可以进行面向过程程序设计, 而且可以进行面向对象程序设计. 然而, 很多关于C++的教材几乎完全介绍语言的语法, 而不注重编写程序所需的基本逻辑技能. 如果程序员仅仅学习C++的语法, 并不一定会成为优秀的面向对象程序员, 而是很容易用C++写出面向过程的代码.
本书作者在这一方面另辟蹊径, 一致地使用一个5步问题求解过程, 运用C++语言来介绍和强调软件工程和面向对象编程的基本原理. 同时有针对性地对这些原理进行了取舍, 使它们适合计算机科学新生的学习能力. 因此, 本书作为第一门问题求解与程序设计课的教材, 既适用于有一定编程基础的学生, 也适用于没有任何编程基础的学生. 全书内容包括:函数和自顶向下设计基础. 选择和循环结构及其编程策略. 简单数据类型. 输入和输出. 结构化数据类型(数组和结构). 类和对象. 数据建模. 递归. 指针. 链表. 栈. 队列和树等. 本书可以作为大专院校计算机及相关专业的程序设计基础课程的教材, 也可以作为C++语言程序设计的自学教材.
全书的翻译出版是集体工作的结晶. 施平安. 施惠琼. 施琳琼. 柳赐佳. 周莎莎. 黄山松. 戴寿杰. 余坦克. 汪阅东. 李树杰. 孙琳. 洪道金和陈学等负责全书的翻译工作, 蔡荣荣和陈建伟等负责全书的审校工作, 施金庭. 柳聿荫和王子兰负责全书的录入和排版工作. 全书最后由施平安负责统稿.
在翻译过程中, 我们对本书中出现的所有术语和难词难句都进行了仔细的推敲和研究, 然而有些方面在译者本人的研究领域中也不曾遇到过, 疏漏和争议之处在所难免, 望广大读者提出宝贵的意见.
Frank I. Friedman足坦普尔大学的计算机与信息科学系的教授, 已经任教28午. 他撰写了很多关于计算机科学教育的沦文, 并且已经(与ElliotB. Koffman)合著了8本关于结构化编程的书籍, 涉及FORTRAN, BASIC和C++语言. 他在珀德尤大学获得了计算机科学博士学位.
Elliot B. Koffnlan是坦普尔大学的计算机与信息科学系的教授, 前ACM SIGCSE的主席. 27年来, 他在Addison-Wesley出版了很多于Java, C++, C, Ada, Pascal, Modula-2和FORTRAN方面的书籍. 他在凯斯西部保留地大学获得了博士学位.
本教材适用于1到2个学期的问题求解和程序设计课, 既适合上过一学期其他程序设计语言课的学生, 也适合没有任何程序设计背景的学生. 但是, 学生的背景决定了介绍本书前面各章所需的时间和后面各章的介绍范围.
本书前几个版本代表了一个8年项目的巅峰, 该项目要求编写一门介绍软件工程和面向对象编程的基本原理和C++程序设计语言的入门级课程, 该项目得到了美国国家科学基金会的部分资助. 我们的主要目标是, 在第一门程序设计课程中推广和介绍程序设计与抽象的健壮原理. 在本书前面的章节中, 我们介绍了程序风格. 编档. 算法和数据结构. 面向过程模块化和面向数据模块化. 组件重用及程序验证等主题. 全书的核心是问题求解与软件设计过程:从问题分析开始, 一直到程序设计和编码.
本教材满足第一门程序设计课的目标, 遵循ACM/IEEE计算机课程2001(CS101和CS111)中描述的强制性的第一种方法. 因为它还介绍面向对象编程和C++标准模板库以及递归和动态数据结构, 所以也可以把它用作3学期序列中的第二门课程(CS102). 因为本书的第1章介绍了类并在第3章中使用了类, 所以在第1门程序设计课中也可以用本书来介绍初步的对象方法. 不过我们建议, 那样的话要提前学习第9章. 可以在学了第6章后的任何时候学习第9章.
第4版的特征
第4版完全符合C++的ANSI标准. 第2章介绍bool数据类型, 第3章介绍字符串类. 同时加入了几节关于容器的内容, 阐述了几个标准模板库类. 第11章介绍向量类和迭代器, 第13章介绍链表. 栈和队列类. 还在第9章增加了一节关于字符数组和C-风格字符串的新内容.
我们改进了这个最新版本的写作风格, 尽量使陈述过程简单化, 有助于学生更好地理解全书的内容. 我们在每章开头介绍了一些全新的本章目标, 并且更新了与主要计算机科学家的访谈记录. 兼顾面向对象方法和过程化方法
本书早在1. 3节就开始介绍面向对象概念和类. 2. 4节和3. 7节讨论了两个系统定义的类的使用:iostream和string, 并且在全书的大部分内容中都要涉及类和对象的使用.
教师关心的一个问题是数组. 结构和类型的相对介绍次序. 与前一版一样, 我们先介绍数组和结构(第9章), 然后介绍类的定义和编码(第10章). 一些教师可能喜欢颠倒讲解顺序, 这是完全可行的. 第10章关于类的内容, 只是在simpleString类的实现中使用了数组, 因此我们可以先忽略它, 或者推迟到介绍数组以后再学习simpleString类的实现.
在第11章中, 我们仍然强调类和数据模型的设计, 介绍了模板类. 一个索引表类. STL向量类. 友元函数和运算符重载. 我们还在第13章中使用了模板类, 讨论了动态数据结构:链表. 栈. 队列和树. 我们讨论了STL容器类和迭代器的使用, 还向学生说明了如何实现他们自己的类. 附录E提供了一个说明C++继承和虚拟函数机制的实例. 我们尽量在严格 以对象为主的编程方法和完全以过程为主的编程方法间寻找一条折衷路线. 我们同意对象第一的观点, 但不放弃算法组织和设计的基础. 对于学习第一门编程课的学生, 我们可以而且也应当向他们介绍过程化设计的基本要素. 我们的任务是在尽早注重数据建模. 重用和良好软件开发的其他基本原理下完成此任务. 软件工程和面向对象概念
本书说明了很多基本的软件工程和面向对象概念:用户定义的类型. 模型问题域中的实体及其关系. 最小接口(minimal interface). 高级聚合. 信息隐藏. 相关分离. 参数化组件和继承. 本书从一开始就强调抽象. 全书提供了很多完整的案例, 这些案例遵守一个标准的软件开发方法:从问题的规范和分析开始, 到初始设计阶段, 再到最终编码.
程序风格问题在整本书中给以了特别的总结介绍. 第3章按控制结构的顺序介绍了一个程序的概念, 然后在第4章(关于选择结构)和第5章(关于重复结构)作了更详细的讨论. 我们作出的在第一个学年的课程中介绍软件工程概念的决定, 在前面这些章节中可以明显地看出来. 我们尽量在入门课程的早期介绍函数和类:第3章和第6章介绍了函数, 第3章和第10章介绍了类的使用和定义. 我们还用几节讨论了测试. 调试和程序验证.
内容概述
从概念上讲, 本书分为3个部分. 第1章~第6章提供有关函数和自顶向下设计的入门知识, 详细介绍了选择和重复结构以及使用这些结构的程序设计策略. 良好的问题求解技能与有效的软件开发间的联系, 早在前3章就建立起来了. 前两章包含几节与问题求解有关的内容, 并且介绍了基于系统的问题求解方法的软件开发方法. 这些章节中概括的问题求解方法一致地应用于本书的所有其他案例研究中. 第2章还介绍了C++语言的基本要素, 其中两节讨论了抽象. 数据建模和面向对象编程. 第3章仍然强调问题求解技能, 讨论了自顶向下设计法和分而治之法. 第3章还讨论了程序组件的重用, 并提供了有关string类及其成员函数的附加细节.
第4章~第6章进一步说明了自顶向下过程化分解法. 第4章介绍决策结构, 第5章介绍循环结构. 在第6章中, 我们回顾了C++函数, 介绍了带输出参数的函数, 并提供了一个完整的案例研究来说明迄今已学的内容.
第7章~第9章介绍简单数据类型. 输入和输出. 结构化数据类型(数组和结构)和类. 第7章更为详细地讨论了简单数据类型, 包括有关数据抽象的追加评论以及简单数据类型间的内在区别和外在区别的描述. 第9章首次介绍了结构化类型(数组和结构). 第9章还讨论了简单的查找和排序算法, 举例说明了使用结构化类型作为函数参数.
第8章介绍外部文件输入/输出. 尽管此时学习外部文件看起来可能为时尚早, 但我们认为这样做是合适的. 程序不会凭空存在, 它们所操纵的数据通常来自外部, 并且它们产生的数据随后可能被其他程序使用. 因此, 让学生较早地接触一些与文件输入和输出有关的基本概念是重要的, 但前提是这种接触不会干扰其他基本思想的介绍. 当然, 到第8章时, 学生应该已经学过流输入和输出的基本知识, 并且起码使用过格式函数和输入/输出控制符(第5章).
如果学生在一学期编程课中学过另一门语言中的对等知识, 则可以较快地介绍第1章~第9章, 也许只要花5到6周时间. 如果学生几乎没有其他编程语言的背景, 则这些章节的介绍可能要花10到12周时间.
第10章和第11章介绍中级概念, 这些概念通常在CSl结束时或者在CS2开头进行介绍. 第10章介绍类和对象的定义和使用, 第11章重点介绍数据建模. 我们首先介绍多维数组和结构以及类的数组, 然后说明使用类模板和向量类扩展我们的建模能力.
第12章和第13章以一定的深度介绍更高级的主题:递归(第12章)和链表. 栈. 队列和树(第13章). 这些内容将在第一学年的第2个学期中介绍.
指针的介绍
指针只是在真正需要它们的地方做了介绍, 即在讨论动态数据结构时(第13章). 指针是C++语言的比较危险的. 相对不受保护的方面之一, 因此不需要成为一门入门课程的基本内容. 第13章开头讨论了new和delete运算符的使用, 以及堆中存储单元的分配和释放. 我们举例说明了动态数据结构的操作, 诸如简单链表. 栈. 队列和二叉树.
教学特征
一些教学特征也增强了本书作为教材的合适性. 这些特征如下:
● 一致地使用分析和设计辅助工具, 诸如数据需求表和程序结构图
● 节末自测练习和程序设计练习(书末提供了自测练习奇数题的参考答案)
● 章末自测练习(书中也提供了答案)
● 章末程序设计项目
● 许多例子和案例研究一致地贯彻从分析和设计到实现问题的求解方法
● 语法陈列包含每个新介绍的C++特征的语法和语义
● 程序风格和设计指南的总结
● 每章后面详细的语法错误和运行时错误讨论
● 本章回顾和复习题
附录
本书最后提供了几个附录, 概括了有关字符集. C++保留字和函数库(包括解释和具体章节)的信息. 还有说明继承和虚拟函数的附录. 关于Visual C++和Borland C++ Builder的附录.
辅助材料
所有读者都可以从www. aw. com/cssupport得到源代码.
有资格的教师能获得下列教师辅助材料(有关如何得到这些材料的信息, 请联系培生集团北京办事处):
(1)遵循本书结构的PowPoint幻灯片
(2)对本教材而言关键的实验作业
(3)教师手册及解答, 包括:
● 每章目标的陈述
● 书中的所有程序. 函数和类
● 自测练习偶数题的参考答案
● 关于所选程序设计项目的分析和设计的评论
● 精选程序设计项目的实现
● 考试样题
(4)题库由每章的简答题. 多选题和判惭题组成.