作者简介
作者简介Programming: Principles and Practice Using C++, Second Edition你也许有理由问:“是一些什么人想要教我程序设计?”那么,下面给出作者的一些生平信息。Bjarne Stroustrup和Lawrence“Pete”Petersen合著了本书。Stroustrup还设计并讲授了面向大学一年级学生的课程,这门课程是与本书同步发展起来的,以本书的初稿作为教材。
Bjarne Stroustrup我是C++语言的设计者和初的实现者。在过去大约40年间,我使用C++和许多其他程序设计语言进行过各种各样的编程工作。我喜欢那些用在富有挑战性的应用(如机器人控制、绘图、游戏、文本分析以及网络应用)中的优美而又高效的代码。我教过能力和兴趣各异的人设计、编程和C++语言。我是ISO标准组织C++委员会的创建者,现在是该委员会语言演化工作组的主席。
这是我本入门性的书。我编著的其他书籍如《The C++ Pro-gramming Language》和《The Design and Evolution of C++》都是面向有经验的程序员的。
我生于丹麦奥尔胡斯一个蓝领(工人阶级)家庭,在家乡的大学获得了数学与计算机科学硕士学位。我的计算机科学博士学位是在英国剑桥大学获得的。我为AT&T工作了大约25年,初在著名的贝尔实验室的计算机科学研究中心——Unix、C、C++及其他很多东西的发明地,后来在AT&T实验室研究中心。
我现在是美国国家工程院的院士,ACM会士(Fellow)和IEEE会士。我获得了2005年度Sigma Xi(科学研究协会)的科学成就William Procter奖,我是首位获得此奖的计算机科学家。2010年,我获得了丹麦奥尔胡斯大学古老也富声望的奖项Rigmor og Carl Holst-Knudsens Videnskapspris,该奖项颁发给为科学做出贡献的与该校有关的人士。2013年,我被位于俄罗斯圣彼得堡的信息技术、力学和光学(ITMO)国立研究大学授予计算机科学荣誉博士学位。
至于工作之外的生活,我已婚,有两个孩子,一个是医学博士,另一个在进行博士后研究。我喜欢阅读(包括历史、科幻、犯罪及时事等各类书籍),还喜欢各种音乐(包括古典音乐、摇滚、蓝调和乡村音乐)。和朋友一起享受美食是我生活中必不可少的一部分,我还喜欢参观世界各地有趣的地方。为了能够享受美食,我还坚持跑步。
关于我的更多信息,请见我的网站www.stroustrup.com。特别是,你可以在那里找到我名字的正确发音。
Lawrence“Pete”Petersen2006年年末,Pete如此介绍他自己:“我是一名教师。近20年来,我一直在德州农工大学讲授程序设计语言。我已5次被学生选为优秀教师,并于1996年被工程学院的校友会选为杰出教师。我是Wakonse优秀教师计划的委员和教师发展研究院院士。
作为一名陆军军官的儿子,我的童年是在不断迁移中度过的。在华盛顿大学获得哲学学位后,我作为野战炮兵官员和操作测试研究分析员在军队服役了22年。1971年至1973年期间,我在俄克拉荷马希尔堡讲授野战炮兵军官的高级课程。1979年,我帮助创建了测试军官的训练课程,并在1978年至1981年及1985年至1989年期间在跨越美国的九个不同地方以首席教官的身份讲授这门课程。
1991年我组建了一个小型的软件公司,生产供大学院系使用的管理软件,直至1999年。我的兴趣在于讲授、设计和实现供人们使用的实用软件。我在乔治亚理工大学获得了工业管理学硕士学位,在德州农工大学获得了教育管理学硕士学位。我还从NTS获得了微型计算机硕士学位。我在德州农工大学获得了信息与运营管理学博士学位。
我和我的妻子Barbara都生于德州的布莱恩。我们喜欢旅行、园艺和招待朋友;我们花尽可能多的时间陪我们的儿子和他们的家庭,特别是我们的孙子和孙女Angelina、Carlos、Tess、Avery、Nicholas和Jordan。”
令人悲伤的是,Pete于2007年死于肺癌。如果没有他,这门课程绝对不会取得成功。
前言
前 言Programming: Principles and Practice Using C++, Second Edition
该死的鱼雷!全速前进。
——Admiral Farragut程序设计是这样一门艺术,它将问题求解方案描述成计算机可以执行的形式。程序设计中很多工作都花费在寻找求解方案以及对其求精上。通常,只有在真正编写程序求解一个问题的过程中才会对问题本身理解透彻。
本书适合于那些从未有过编程经验但愿意努力学习程序设计技术的初学者,它能帮助读者理解使用C++语言进行程序设计的基本原理并获得实践技巧。本书的目标是使你获得足够多的知识和经验,以便能使用最新、最好的技术进行简单有用的编程工作。达到这一目标需要多长时间呢?作为大学一年级课程的一部分,你可以在一个学期内完成这本书的学习(假定你有另外四门中等难度的课程)。如果你是自学的话,不要期望能花费更少的时间完成学习(一般来说,每周15个小时,14周是合适的学时安排)。
三个月可能看起来是一段很长的时间,但要学习的内容很多。写第一个简单程序之前,就要花费大约一个小时。而且,所有学习过程都是渐进的:每一章都会介绍一些新的有用的概念,并通过真实应用中的例子来阐述这些概念。随着学习进程的推进,你通过程序代码表达思想的能力——让计算机按你的期望工作的能力,会逐渐稳步地提高。我绝不会说:“先学习一个月的理论知识,然后看看你是否能使用这些理论吧。”
为什么要学习程序设计呢?因为我们的文明是建立在软件之上的。如果不理解软件,那么你将退化到只能相信“魔术”的境地,并且将被排除在很多最为有趣、最具经济效益和社会效益的领域之外。当我谈论程序设计时,我所想到的是整个计算机程序家族,从带有GUI(图形用户界面)的个人计算机程序,到工程计算和嵌入式系统控制程序(如数码相机、汽车和手机中的程序),以及文字处理程序等,在很多日常应用和商业应用中都能看到这些程序。程序设计与数学有些相似,认真去做的话,会是一种非常有用的智力训练,可以提高我们的思考能力。然而,由于计算机能做出反馈,程序设计不像大多数数学形式那么抽象,因而对多数人来说更易接受。可以说,程序设计是一条能够打开你的眼界,将世界变得更美好的途径。最后,程序设计可以是非常有趣的。
为什么学习C++这门程序设计语言呢?学习程序设计是不可能不借助一门程序设计语言的,而C++直接支持现实世界中的软件所使用的那些关键概念和技术。C++是使用最为广泛的程序设计语言之一,其应用领域几乎没有局限。从大洋深处到火星表面,到处都能发现C++程序的身影。C++是由一个开放的国际标准组织全面考量、精心设计的。在任何一种计算机平台上都能找到高质量的、免费的C++实现。而且,用C++所学到的程序设计思想,大多数可直接用于其他程序设计语言,如C、C#、Fortran以及Java。最后一个原因,我喜欢C++适合编写优美、高效的代码这一特点。
本书不是初学程序设计的最简单入门教材,我写此书的用意也不在此。我为本书设定的目标是——这是一本能让你学到基本的实用编程技术的最简单书籍。这是一个非常雄心勃勃的目标,因为很多现代软件所依赖的技术,不过才出现短短几年时间而已。
我的基本假设是:你希望编写供他人使用的程序,并愿意认真负责地以较高质量完成这个工作,也就是说,假定你希望达到专业水准。因此,我为本书选择的主题覆盖了开始学习实用编程技术所需要的内容,而不只是那些容易讲授和容易学习的内容。如果某种技术是你做好基本编程工作所需要的,那么本书就会介绍它,同时展示用以支持这种技术的编程思想和语言工具,并提供相应的练习,期望你通过做这些练习来熟悉这种技术。但如果你只想了解“玩具程序”,那么你能学到的将远比我所提供的少得多。另一方面,我不会用一些实用性很低的内容来浪费你的时间,本书介绍的内容都是你在实践中几乎肯定会用到的。
如果你只是希望直接使用别人编写的程序,而不想了解其内部原理,也不想亲自向代码中加入重要的内容,那么本书不适合你,采用另一本书或另一种程序设计语言会更好些。如果这大概就是你对程序设计的看法,那么请同时考虑一下你从何得来的这种观点,它真的满足你的需求吗?人们常常低估程序设计的复杂程度和它的重要性。我不愿看到,你不喜欢程序设计是因为你的需求与我所描述的软件世界之间不匹配而造成的。信息技术世界中有很多地方是不要求程序设计知识的。本书面向的是那些确实希望编写和理解复杂计算机程序的人。
考虑到本书的结构和注重实践的特点,它也可以作为学习程序设计的第二本书,适合那些已经了解一点C++的人,以及那些会用其他语言编程而现在想学习C++的人。如果你属于其中一类,我不好估计你学习这本书要花费多长时间。但我可以给你的建议是,多做练习。因为你在学习中常见的一个问题是习惯用熟悉的、旧的方式编写程序,而不是在适当的地方采用新技术,多做练习会帮助你克服这个问题。如果你曾经按某种更为传统的方式学习过C++,那么在进行到第7章之前,你会发现一些令你惊奇的、有用的内容。除非你的名字是Stroustrup,否则你会发现我在本书中所讨论的内容不是“你父辈的C++”。
学习程序设计要靠编程实践。在这一点上,程序设计与其他需要实践学习的技艺是相似的。你不可能仅仅通过读书就学会游泳、演奏乐器或者开车,必须进行实践。同样,你也不可能不读写大量代码就学会程序设计。本书给出了大量代码实例,都配有说明文字和图表。你需要通过读这些代码来理解程序设计的思想、概念和原理,并掌握用来表达这些思想、概念和原理的程序设计语言的特性。但有一点很重要,仅仅读代码是学不会编程实践技巧的。为此,你必须进行编程练习,通过编程工具熟悉编写、编译和运行程序。你需要亲身体验编程中会出现的错误,学习如何修改它们。总之,在学习程序设计的过程中,编写代码的练习是不可替代的。而且,这也是乐趣所在!
另一方面,程序设计远非遵循一些语法规则和阅读手册那么简单。本书的重点不在于C++的语法,而在于理解基础思想、原理和技术,这是一名好程序员所必备的。只有设计良好的代码才有机会成为一个正确、可靠和易维护的系统的一部分。而且,“基础”意味着延续性:当现在的程序设计语言和工具演变甚至被取代后,这些基础知识仍会保持其重要性。
那么计算机科学、软件工程、信息技术等又如何呢?它们都属于程序设计范畴吗?当然不是!但程序设计是一门基础性的学科,是所有计算机相关领域的基础,在计算机科学领域占有重要的地位。本书对算法、数据结构、用户接口、数据处理和软件工程等领域的重要概念和技术进行了简要介绍,但本书不能替代对这些领域的全面、均衡的学习。
代码可以很有用,同样可以很优美。本书会帮你了解这一点,同时理解优美的代码意味着什么,并帮你掌握构造优美代码的原理和实践技巧。祝你学习程序设计顺利!
致学生到目前为止,我在德州农工大学已经用本书教过几千名大一新生,其中60%曾经有过编程经历,而剩余40%从未见过哪怕一行代码。大多数学生的学习是成功的,所以你也可以成功。
你不一定是在某门课程中学习本书,本书也广泛用于自学。然而,不管你学习本书是作为课程的一部分还是自学,都要尽量与他人协作。程序设计有一个不好的名声——它是一种个人活动,这是不公正的。大多数人在作为一个有共同目标的团体的一份子时,工作效果更好,学习得更快。与朋友一起学习和讨论问题不是“作弊”,而是取得进步最有效同时也是最快乐的途径。如果没有特殊情况的话,与朋友一起工作会促使你表达出自己的思想,这正是测试你对问题理解和确认你的记忆的最有效方法。你没有必要独自解决所有编程语言和编程环境上的难题。但是,请不要自欺欺人——不去完成那些简单练习和大量的习题(即使没有老师督促你,你也不应这样做)。记住:程序设计(尤其)是一种实践技能,需要通过实践来掌握。如果你不编写代码(完成每章的若干习题),那么阅读本书就纯粹是一种无意义的理论学习。
大多数学生,特别是那些爱思考的好学生,有时会对自己努力工作是否值得产生疑问。当你产生这样的疑问时,休息一会儿,重新读一下前言,读一下第1章和第22章。在那里,我试图阐述我在程序设计中发现了哪些令人兴奋的东西,以及为什么我认为程序设计是能为世界带来积极贡献的重要工具。如果你对我的教学哲学和一般方法有疑问,请阅读引言。
你可能会对本书的厚度感到担心。本书如此之厚的一部分原因是,我宁愿反复重复一些解释说明或增加一些实例,而不是让你自己到处找这些内容,这应该令你安心。另外一个主要原因是,本书的后半部分是一些参考资料和补充资料,供你想要深入了解程序设计的某个特定领域(如嵌入式系统程序设计、文本分析或数值计算)时查阅。
还有,学习中请耐心些。学习任何一种重要的、有价值的新技能都要花费一些时间,而这是值得的。
致教师本书不是传统的计算机科学导论书籍,而是一本关于如何构造能实际工作的软件的书。因此本书省略了很多计算机科学系学生按惯例要学习的内容(图灵完全、状态机、离散数学、乔姆斯基文法等)。硬件相关的内容也省略了,因为我假定学生从幼儿园开始就已经通过不同途径使用过计算机了。本书也不准备涉及一些计算机科学领域最重要的主题。本书是关于程序设计的(或者更一般地说,是关于如何开发软件的),因此关注的是少量主题的更深入的细节,而不是像传统计算机课程那样讨论很多主题。本书只试图做好一件事,而且计算机科学也不是一门课程可以囊括的。如果本书被计算机科学、计算机工程、电子工程(我们最早的很多学生都是电子工程专业的)、信息科学或者其他相关专业所采用,我希望这门课程能和其他一些课程一起进行,共同形成对计算机科学的完整介绍。
请阅读引言,那里有对我的教学哲学、一般方法等的介绍。请在教学过程中尝试将这些观点传达给你的学生。
ISO标准C++C++由一个ISO标准定义。第一个ISO C++标准于1998年获得批准,所以那个版本的C++被称为C++98。写本书第1版时,我正从事C++11的设计工作。
……