欢迎使用本书。本书专为两个学期(CSl和CS2)的C++课程而设计,相信它一定能给广大教师和学生以耳目一新的感觉。本课程应作为计算机专业的基础课程。主要目的是激发所有学习程序设计者的学习兴趣,而没有考虑其目前已经达到何种水平。因为对学生的程序设计兴趣的培养和激发是他们学好本课程的关键因素。笔者已经成功地讲授了50多个学期的计算机专业程序设计课程,本书正是从这些课程的讲稿中不断改进、发展而来的最终成果。
《C++编程——数据结构与程序设计方法》一书,刚开始只是为笔者所在学校当时使用的一些程序设计教程所写的简单例题、习题以及大篇幅的代码举例的补充材料。很快,这本补充材料内容多得可以单独成为一本教科书。事实上,本书中所采用的编排方式和讲述方法,会使读者感到概念清晰,易于理解。本书的选材都经过反复推敲,易于学生接受。本书中选用的大多数例题,也都经过课堂上与同学们相互探讨。
无论从事何种职业,将知识在实际中运用才是最重要的。正如厨艺学习者要按照菜谱练习烹饪,小提琴初学者要练习音阶一样,程序设计的初学者一定要亲自动手编写代码来解决问题。本书并不是一本C++参考手册;我们不只是列出C++语法并给出例子,而是进一步揭示出隐藏在各种概念、思想之中的“为什么”。在每一章中,这种关键性的“为什么”的问题都将得以解答。这种方法成为学好C++语言的有效手段。只有让学生们明白“为什么”,才能激发起他们学习的兴趣。
一般来说,C++初学者需要先掌握一门其他的程序设计语言。但是,本书假定读者没有任何程序设计基础。然而,例如代数学等高等数学知识还是必需要具备的。
本书内容
C++语言是从C语言演化发展而来的。现在,它不仅只是作为软件行业广泛使用的一种程序开发语言,为数众多的大专院校已将C++作为第一门程序设计语言课程列在教学计划中。C++融合了结构化程序设计和面向对象程序设计两种方法,本书将分别阐述。
本书应在计算机专业分两个学期讲授,CS1和CS2。第一个学期讲授前12章或13章,其余部分应在第二学期讲授。
1998年7月,正式通过了ANSI/ISO标准C++。本书在主要讲述ANSI/ISO标准C++的同时,也将介绍怎样使用标准C++编写程序。虽然标准C++和ANSI/ISO标准C++大部分语法是相同的,但在本书第8章中还是对ANSI/ISO标准C++支持而标准C++不支持的一些特性做了讨论。
第1章简要回顾了计算机和程序设计语言的发展史。读者在迅速阅读本章之后可以了解一些计算机软、硬件方面的基础知识。本章也同时介绍结构化程序设计和面向对象程序设计的基本概念。
在完成第2章之后,读者将了解C++的一些基本知识,并可以着手编写一些涉及到计算的复杂程序。输入/输出是所有程序设计语言的基础。输入/输出在本章中简要介绍,并在第3章中详细讨论。
第4章和第5章将介绍用来改变程序执行顺序的控制结构。第6章和第7章将讲述用户自定义函数。建议没有任何程序设计基础的读者要在第6章和第7章中多下些功夫。第7章中使用大量举例帮助读者理解参数传递和标识符作用域的概念。
第8章将讨论用户自定义的简单数据类型(枚举类型)、ANSI/ISO标准C++的名字空间机制以及string类型。早期版本的C语言不支持枚举类型。枚举类型的用途十分有限,其主要作用是增加程序的可读性。本书的编排也充分考虑到这一点,读者可以在第一次阅读本书时略过枚举类型部分,并不会感到不连贯。枚举类型部分可以放在后面仔细阅读。
第9章将详细说明数组,第10章将介绍并讨论递归。
第11章将介绍结构。本书中介绍的结构与C语言中的结构极为相似。实际上,本章也可以略过,因为结构并不是后续章节所必须知道的预备知识。
第12章开始讲述面向对象程序开发技术(OOP),并介绍类。本章前一部分将介绍类的定义和使用,后一部分介绍抽象数据类型(ADTL本章也将指出为什么类成为C什中实现抽象数据类型的很自然的方法。第13章继续介绍面向对象程序设计(OOD)和面向对象程序开发的基础概念,并讨论继承和组成。本章解释了为什么类成为C++中实现抽象数据类型的一种很自然机制,并介绍C++是怎样支持面向对象程序开发的。本章同时也讨论了在解决具体问题时应该怎样去定义类。
第14章将详细讨论指针。在介绍指针的基础知识和怎样在程序中使用指针之后,本章着重讨论了含有指针类型数据成员类的特性,以及怎样避免由指针引起的错误。本章进一步指出了怎样利用动态数组存储和处理列表。本章同时还将讨论怎样通过虚函数来实现多态机制。
第15章继续讲述面向对象程序设计和面向对象程序开发,并将重点讨论C++的多态机制。本章具体地讨论了C++中的两种类型的多态机制——重载和模板。
第16章和第17章专门论述数据结构。第16章将详细讨论链表,第17章将讨论栈和队列。这两章所提供的程序代码对于该类型数据结构都是通用的。这两章充分使用了面向对象程序设计的基本概念。
第18章讨论了多种查找和排序算法。在指出这些算法原理的同时,本章还提供了关于这些算法执行效率的相关分析。算法分析使程序设计者能够在解决具体问题时知道应选用何种算法。本章同时介绍了多种排序算法,教师可以根据实际情况选择讲授其中的几种算法。
第19章介绍了二叉树。本章讨论和讲述了二叉树的基本性质和各种遍历算法。本章还介绍了一种特殊的二叉树——二叉查找树,介绍并举例说明了二叉查找树的查找、插入和删除算法。本章同时提供了二叉树的非递归遍历算法。为了增加遍历算法的灵活性,本书介绍了怎样构造和传递函数指针参数。
. 第20章讨论了图论中的一些算法。本章在介绍了图论中的一些基本术语后,讨论了图在计算机存储器中的表示方法;同时也讨论了最短路径和最小生成树等图的遍历算法。
C++自带了功能强大的类库——标准模板库(STL),其中的数据结构和算法可以有效地在应用程序中广泛使用。第21章详尽地讲述了标准模板库。在介绍了标准模板库三种基本的组成部分后,本章说明了在程序中该如何使用顺序容器;同时也讨论了栈和队列等具体容器。本章后半部分讲述如何在程序中使用各种标准模板库算法。本章的内容相当多,如果时间有限,教师可以只讲授顺序容器、栈类、队列类和其他一些算法。
附录A给出了C++中的保留字。附录B给出了C++中运算符的优先级和结合律。附录C给出了ASCII码字符集和EBCDIC码。附录D给出了C++中可以重载的运算符集。附录E给出了ANSI/ISO标准C++和标准C++头文件的习惯命名方法。附录F讨论了一些广泛使用的程序库和相应的标准C++的头文件名。通过运行附录G中的程序,可以知道所使用系统中的各种内置数据类型所占用的存储空间大小。附录H列出了深入学习C++语言所用到的参考资料。附录I给出了本书中部分习题的参考答案。
本书特点
本书中每一章都有如下特点,读者既可以在本书的指导下学习,也可以根据本人的实际情况选择性地学习:
●每章的“本章要点”简述了在本章中要详细讨论的C++程序设计概念。
●“注意”强调了各章节中的概念要点。
●375张插图详尽地解释了难于理解的概念。
●统一编号的例题可以帮助读者理解关键概念及相关程序代码。例题中的程序代码行编号以
便于参照,同时给出程序运行举例和代码行执行的结果和注释。
●.每章章尾的程序范例都是完整的程序代码。这些程序范例中包括输入、输出、问题分析和
算法设计,以及完整的程序代码清单。
●小结总结了每章的重要概念。
●练习用来巩固学习成果,并可以用来检查学生是否真正地理解了该章的主要内容。
●编程练习培养学生亲自动手编写C++程序的能力。
自始至终,本书在适当的时机引入相应的概念,便于学生学习。本书的写作风格不拘泥于形式,通俗易懂,很适于在课堂上讲授。在介绍重要概念之前,本书将解释为什么某些元素是必需的。然后,使用举例和小程序来讲述概念。
本书中每一章都有两种类型的程序。第一种是带有编号的范例(例如:例4.1),它们都是一些小程序,用来帮助理解重点概念。这种小程序的每一行代码都有编号,并给出了程序运行范例和逐行解释。
本书中提供了大量的程序范例,这些程序范例是本书的精髓。
本书中的程序都经过精心设计,便于读者理解。每一个程序范例都有问题分析和算法设计。然后,每一步算法都给出相应的C++程序代码。为了帮助学生提高解决问题的能力,这些程序代码详细地告诉读者怎样用C++程序设计语言实现程序设计的基本概念和基本思想。强烈建议读者仔细阅读程序范例,以便提高学习效率。
每一章后面的小结部分可以帮助读者巩固学习成果。在阅读每一章后,读者可以迅速地浏览本章的重点知识,然后使用后面提供的练习来测试学习效果。许多学生都将在考试前阅读小结中的要点,作为一种快速复习的方法。
本书提供的所有程序源代码都通过编译,保证符合ANSI/ISO标准C++和标准C++的标准。可以使用Microsoft码Visual C++6.0,Borland C++Builder5开发工具或是MetrowerksCode Warrior编译这些程序。
教学工具
教师可以在课堂讲授本书的同时使用下列辅助教学工具。这些辅助教学工具附在光盘中,教师可以根据书后所附的“教学支持说明”,向有关出版商索取。
电子教师手册 该教师手册包括以下内容:
●附加的授课资料,帮助教师做好课前准备,包括对授课内容的建议。
●每章后面练习的参考答案,包括编程练习。
ExamView 本书提供的ExamView是一套功能强大的考试软件包。教师可以使用它进行以下三种方式的考试:试卷式,(局域网)计算机上考试和Internet上考试。ExamView包括大量关于本书中涉及到的内容的试题,可帮助学生获得详细的学习指南。计算机上和Internet上的考试工具可以使学生们在自己的计算机上完成考试,并且可以节省教师的工作时间,因为这两种考试是计算机评分的。
PowerPoint幻灯片 本书的每一章都有相应的Microsoft PowerPoint幻灯片。这些幻灯片可以作为辅助教学工具在课堂上放映使用,也可以放在网络文件月盼器上供学生复习肘使用,还可以打印出来分发给学生。教师在授课时可以根据情况增加自己的幻灯片页面。
远程学习 Course Technology公司以在WebCT上提供在线教育服务而闻名,而黑板教学可以使学生们以最详尽、最大限度交互的方式进行学习。当教师为其部分课程提供网上教学方式时,不仅可以增加很多内容,如自测考题、相关连接和词汇表,更重要的是培养了学生了解21世纪获取重要信息资源的方法。希望各位教师能给其讲授的绝大多数课程同时提供在线教学和离线教学两种方式。如果需要进一步了解怎样为讲授的课程提供远程教学方式,请与所在地的Course echnology公司销售代表联系。
程序源代码 程序源代码同时以ANSI/ISO标准C++和标准C++种格式给出。它们既可以在网站www.course.com上获得,又可以在教学工具光盘(参见本书后面所附的“教学支持说明”)中获得。运行某些程序代码的输入文件也随源代码提供给读者。但是,运行程序时,这些输入文件需要存储在软盘并插入到计算机的软驱中。
解答文件 解答文件同时以ANSI/ISO标准C++和标准C++种格式给出。既可以在网站WWW.COurse.com上获得,又可以在教学工具光盘中获得。运行某些程序练习代码的输入文件也随源代码提供给读者。但是,运行程序时,这些输入文件需要存储在软盘并插入到计算机的软驱中。
致谢
许多人为本书的成功出版做出了重要贡献。在这里,笔者必须要向他们表示衷心感谢。首先,我要向William Newman博士表示感谢,他负责审校第二稿手稿,找出并改正错误,并且提出了大量的改进意见。必须要向我的学生们表示感谢,他们在我准备出版该书时主动地告诉哪些部分需要重新措辞以便于理解。要向长期以来不断支持本书出版项目的S.C.Cheng教授、John N.Mordeson教授和VasantRaval教授表示感谢。Randall L.Crist博士,他的办公室在我办公室的隔壁,在审校工作中随时帮我检查书稿,在这里向他表示感谢。必须要向Creighton大学技术转让办公室主任LeeI.Fenicle表示感谢,他积极地参与、支持此项工作,并在我感到灰心时不断地鼓励我。同时,也要向参加本书初稿审阅工作的那些不知名的工作人员表示衷心感谢,他们为本书的改进工作提出了许多宝贵意见。
在这里,向以下参加审阅的工作人员表示诚挚谢意。他们一丝不苟地审阅了本书当前版本的每一章节,并为本书的改进提出了宝贵意见。他们是:Wisconsin大学(位于RiverFalls)的Ahmad Abuheileh,North Carolina大学(位于Charlotte)的C. Michael Allen,Wisconsin大学(位于Milwaukee)的Paul Ambrose,Capitol学院的Julie Anderson,Kentucky大学的Carol Hannahs和Austin Com—munity学院的JudyScholl。此外,必须要向如下参加审阅本书的工作人员表示感谢,他们是:SLEdward's大学的James McGuffee和Austin Community学院的Thomas Murtagh。这些参加本书审阅的工作人员会认识到他们的建议没有被忽视。事实上,正是这些建议为本书的改进做出了重要贡献。感谢设计编辑Susan Gilbert,她认真编辑本书,并及时定版。如果没有高级编辑Jennifer Muroff的精心设计,本书也不会呈现在读者面前。在这里,要向Jennifer Muroff和制作编辑Aimee Poirier,以及Course Technology公司负责对代码进行认真测试的质量控制部门的工作人员表示诚挚的谢意。
本书献给我的父母!在他们祝福下本书得以顺利出版,我感谢他们。
最后,要感谢一直支持我工作的妻子Sadhana和女儿Shelly。特别是Shelly,在我编写本书遇到极大困难并感到万分沮丧的时候不断地鼓励我,并帮助我审阅修改的内容。Shelly总是能在我承担这种棘手的工作时为我带来欢乐。
欢迎读者对本书提出建议。建议可以发送至电子邮箱:malik@creighton.edu。