本书专门为计算机科学(CS1)C++课程而编写,为教师和学生学生提供了大量新内容。我们的主要目标是启发并激励所有学生学习编程的积极性。学习动机激发学习的兴趣,学习动机和兴趣是学生获得成功的关键因素。本书是50多个学期的成功编程教学课堂记录的综合和结晶。 本书首先介绍了一些简短示例、练习题和较长的编程示例,然后列举了一些大型编程示例,这些示例构成了本书的主要内容。实际上,本书根据学生的要求提供素材,简洁明了且具有较强的可读性。书中的大多数示例都来自于课堂上学生的交互练习。 不管从事任何职业,都必须进行不断的实践。学习烹饪的学员需要实践他们的食谱。刚开始学习小提琴的学生需要练习如何拉准音调。刚开始学习编程的学员必须实践解决问题和编写代码。本书并不是一本C++示例书。书中没有简单地列出C++语法,举出示例;而是仔细分析了所有概念背后的“原因”。对于首次介绍的每个主题,都会回答“原因”中的关键问题。这种技巧提供了学习C++的桥梁。学生只有理解“原因”后才能获得学习的兴趣。 过去,学习C++的初级编程人员需要了解另一种编程语言的工作原理。本书假设读者先前不具备任何编程经验。不过,学习本书,读者最好还是需要掌握一些适当的数学背景,例如高等数学的知识。 0.1 第2版中的更新 相对于第1版,本书有如下改进: ● 第2章中包括了创建C++程序的新章节。在学习了C++的基本元素后,读者可以快速学会如何编写C++程序。 ● 第5章中添加了各种示例,用于说明如何使用嵌套循环来获得所需的结果。 ● 在第7章中,为了便于阅读,添加了关于值参数和引用参数的章节。 ● 在第1版中,第10章中介绍了二维数组。在本书中,第9章中介绍了二维数组。因此,第9章现在包括一维数组和多维数组以及字符串。在第10章中,添加了排序算法、冒泡排序以及vector类的介绍。 ● 第1版中在第11章介绍了递归,本书则将其放在第17章介绍且独立成章,该章可以放在第10章后面的任何位置。 ● 在第12章中,介绍了类和数据抽象、UML图和各种面向对象的设计(OOD)的术语,例如存取器(accessor)函数和增变(mutator)函数。添加了关于类中静态成员的章节。 ● 第16章“异常处理”是新增的章节。这一章详细介绍了异常处理。 ● 在附录E中,扩展了文件I/O的介绍。在第3章中介绍过文件I/O后,该附录介绍了二进制和随机访问文件。 ● 新增的附录H介绍了标准模板库(STL)。 0.2 本书内容 编程语言C++从C语言发展而来,它不再是只针对行业内的语言。许多大学和学院使用C++作为首要的编程语言课程。C++结合了结构化编程和面向对象编程,本书将介绍这两种编程方式。 本书可以简单地划分为两个部分:结构化编程和面向对象编程。前11章组成了结构化编程部分;第12~19章组成面向对象编程部分。然而,前11章是后面学习面向对象编程部分的基础。 在1998年7月,ANSI/ISO标准C++被正式批准。本书主要关注ANSI/ISO标准C++。即使标准C++的语法和ANSI/ISO标准C++的语法非常类似,但第8章中讨论了一些ANSI/ISO标准C++的特性,这些特性不可用于标准C++中。 第1章简要回顾了计算机和编程语言的历史。读者可以快速浏览本章,并且熟悉计算机的一些硬件组成部分和软件组成部分。本章也描述了结构化编程和面向对象编程。 完成第2章的学习后,学生应该熟悉C++的一些基本原理,并且准备编写可以执行一些计算的复杂程序。输入/输出是任何编程语言的基础。第3章会详细介绍输入/输出。 第4章和第5章介绍了用于改变执行顺序流程的控制结构。第6章和第7章研究了用户定义的函数。对于不具备编程经验的读者,推荐在第6章和第7章上多花费点时间学习。提供了一些示例来帮助读者理解参数传递和标识符作用域的概念。 第8章讨论了用户定义的简单数据类型(枚举类型)、ANSI/ISO标准C++的命名空间机制以及字符串类型。C的早先版本没有包括枚举类型。枚举类型的使用范围非常有限;它们的主要目标是提高程序的可读性。本书按照如下方式编排:在第一次阅读时,读者可以跳过关于枚举类型的部分,而不会影响到连续性,后面如有需要可以回头浏览这一部分。 第9章详细讨论了数组。第10章描述了各种查找和排序算法,并且介绍了vector类。第11章介绍了记录(结构体)。本书中关于结构体的介绍类似于C中的结构体。这一章是可选章节;它并不是学习后面章节的先决条件。 第12章开始研究面向对象的编程(OOP),并且介绍了类。本章的前半部分显示了如何在程序中定义和使用类。本章的第二部分介绍了抽象数据类型(ADT)。本章显示了C++中的类如何作为实现ADT的自然方式。第13章继续讨论面向对象设计(OOD)和OOP的基本原理,并且讨论继承和组合。本章介绍了C++中的类如何提供用于OOD的自然机制,以及C++如何支持OOP。第13章也讨论了如何找出给定问题中的对象。 第14章详细研究了指针。介绍过指针以及如何在程序中使用它们后,本章重点介绍了具有指针数据成员的类的特性,以及如何避免它们。第14章也讨论了通过虚函数实现的一种多态性类型。 第15章继续研究OOD和OOP。本章还特别研究C++中的多态性,专门讨论了两种类型的多态性:重载和模板。 第16章是第2版的新增章节。本章详细讨论了异常处理。 第17章介绍并讨论了递归。第17章是第1版中的第11章。此外,这是一个单独的章节,因此可以在学习第10章后的任何时间研究这一章。 第18章和第19章专门研究了数据结构。第18章详细讨论了链表。第19章中则详细讨论栈和队列。这些章节中开发的编程代码具有一般性。这些章节有效使用了OOD的基本原理。 附录A列出了C++中的关键字。附录B显示了C++运算符的优先级和关联性。附录C列出了ASCII(美国信息交换标准码)和EBCDIC(扩充的二进制编码的十进制交换码)的字符集。附录D列出了可以重载的C++运算符。 附录E有两个目标。首先,详细讨论了二进制文件。然后描述了ANSI/ISO标准C++和标准C++中头文件的命名约定。附录F讨论了一些最广泛使用的库例程,并且包括了标准C++的头文件名。附录G中的程序输出系统上内置数据类型占用的内存大小。新增的附录H介绍了标准模板库,附录I则提供了书中部分练习题的答案。 0.3 如何阅读本书 可以通过各种方法使用本书。图1显示了各章节之间的相关性。 图1 各章节之间的相关性图表 在图1中,虚线表示前面的章节将在当前章节的一个部分中用到,并且不是学习下一个章节的先决条件。例如,第9章详细讨论了数组。在第11章和第12章中,分别显示了数组和结构体以及数组和类之间的关系。然而,如果在学习第9章之前就先学习第12章,则可以跳过第12章中处理数组的部分,而不会影响连续性。可以在研究第9章后再来学习这个特定的部分。 推荐读者按顺序阅读前7章。学习前7章后,如果读者希望尽早学习OOD和OOP,则可以在第7章后直接学习第12章。可以在学习第7章后的任何时间学习第8章。按顺序学习前7章后,一些学习方法如下: (1) 按如下顺序学习章节:9、10、11、12、13、14、15、16、17、18、19。 (2) 按如下顺序学习章节:9、12、14、15、13、17、18、19、10、16。 (3) 按如下顺序学习章节:12、9、10、14、15、13、17、18、19、16。 (4) 按如下顺序学习章节:12、9、14、15、13、17、18、19、10、16。 0.4 本书特色 自始至终,本书都按照指导学习的步调来介绍概念。本书的编写风格是简单和直观,类似于课堂上的教学风格。在介绍关键概念前,解释需要某些元素的原因。然后使用示例和较小的程序来描述概念。 每个章节有两种类型的程序。第一种类型是作为已编号示例(例如,示例4-1)的一部分的小程序,用于解释关键概念。在这些示例中,编程代码的每一行都加上了编号。然后逐行解释通过示例运行说明的程序。最后详细讨论每一行后面的基本原理。 编程示例构成本书的主要部分,设计得具有条理性,并且用户很容易掌握。每个编程示例都从问题分析开始,后面跟上算法分析。然后使用C++编码每个算法的每个步骤。除了教导解决问题的技术外,这些详细的程序还向用户显示了如何在实际的C++程序中实现相应的概念。强烈推荐学生非常仔细地研究编程示例,从而可以更有效地掌握C++。 每章末尾的快速回顾部分可强化所学的内容。阅读一章后,学生可以快速遍历这一章的重点部分,并且使用接下来的练习题测试自己。许多读者将快速回顾作为进行练习以回顾本章内容的简单方法。 本书使用ANSI/ISO标准C++编写、编译书中的所有源代码和解决方案,并且进行了质量保证测试。可以使用Microsoft Visual C++ 6.0、Microsoft Visual Studio .NET或Metrowerks CodeWarrior编写这些程序。 另外,为了方便学习,您可以直接从本书合作站点或www.tupwk.com.cn/ downpage上下载本书的源代码。 教学工具 当本书用于教学时可以利用下列补充材料,这些补充材料都放在一张光盘上。本书并未附带该光盘,但您可以参阅并填写本书后的“教辅材料申请表”,向汤姆森亚洲私人有限公司北京代表处索取该光盘。 电子教学手册。本书附带的教师手册包含以下内容: ● 备课的辅助教学材料,包括对授课主题的建议。 ● 所有各章末尾习题的答案,包括“编程练习”。 ExamView。本书附带的ExamView是一种强大的测试软件包,使用它,教师可以创建并管理笔试、机试(基于LAN)和Internet考试。ExamView包含与本书主题相配套的数百道试题,使学生可以定制一些包含了页面索引在内的详细的学习指南,以供进一步复习使用。这些基于计算机和Internet的考试组件使学生可以通过他们的计算机参加考试,由于每次考试后都能自动进行评分,因此节省了教师的时间。 PowerPoint演示文稿。本书为每章都提供了Microsoft PowerPoint幻灯片。这些幻灯片可作为教学辅助工具供课堂演示使用,使学生可以通过网络查看章节内容,或打印出来在课堂上分发。教师可以制作授课所需的其他主题的幻灯片。 远程教学。Course Technology的得意之作就是在WebCT和Blackboard及它自己的课程增强工具中提供了一些联机课程。当您将联机内容添加到课程中时,将为您添加下列多种功能:自我测试、链接、词汇表,最重要的是它提供了通向21世纪最重要信息资源的途径。无论其在联机还是脱机状态下,我们都希望学生能够充分利用这些课程。如果您想知道有关如何将远程教学引入课程的详细信息,请与当地的Course Technology销售代表联系。 源代码。可从站点上可以找到源代码。运行某些程序所需的输入文件也包含在这些源代码中。 习题答案文件。所有编程练习的习题答案文件可在中找到。运行某些程序所需的输入文件也包含在习题答案文件中。