图书前言

第二版前言

《C++程序设计教程(第二版)习题及解答》是主教材《C++程序设计教程(第二版)》的配套书。由于第二版主教材对第一版做了根本性的改版,《C++程序设计教程(第二版)习题及解答》也与第一版大相径庭,其涉及的知识面更广,内容更多,从易到难的幅度更大,所以其解答也相应更详尽、具体。同时,它也是对《C++程序设计教程(第二版)实验指导》一书内容的对照和补充。

撰写意图

本书从习题练习出发,引导读者从机器运行的角度来思考问题,以编写出能够实战的程序代码。

C++主教材虽然涉及一些数学方法描述的算法,但是它终究不是一本算法书,所以只在简单明了的情况下,偶尔表现一下算法技巧。习题解答也沿袭了主教材的这一著述原则,在代码和解答中,侧重表现C++语言的描述技巧,而无长篇大论展开算法描述之意图。因此,所有的解答都不是晦涩难懂的。如果对解答的代码颇感新奇,那就是作者在充分运用C++语言的特性,贯彻作者强调启发性的意图。

习题解答的另一个目的是让读者明白,大量的撰写和调试代码,是优秀程序员的必然经历。要让代码不但能正确运行,而且还要运行得出色,这个能力很大一部分是基于测试和调试技术。学会了自己控制整个开发平台,自己制作测试数据,自己调试各种代码,本身便是具有了一定程度的对新开发软件的学习能力。语言逻辑表达能力只是解决程序结构和框架的问题,但是能力的更现实体现是如何将正确的程序得以在某个平台上测试和运行。虽然最终是要展开编程中的数学逻辑(即算法)研究,但是,不会调试和测试对编程能力的提高将是一个很大的障碍。

每个习题解答都先将练习目的摆明,然后直奔主题,介绍解答思路。虽然习题解答的描述在结构上比较自由,但都是从要害上着手。有些习题还给出了设计指导和框架图示,目的是给读者更多的编程思路。解答展开了许多编程的细节和经验,这些经验在纯粹看书学习中也许很难消化成为自己的编程能力,只有自己亲身体验,才能把握。这一方面是想让读者更深入地理解实验之重要性,另一方面,由于有些习题已经演变成了《C++程序设计教程(第二版)实验指导》一书中的内容,所以本习题解答还旨在帮助读者强化实践         能力。

编写形式

本书按主教材每章后面的全部习题为素材,逐一进行解答。由于每章的学习内容侧重点不同,或重方法,或重分析,或重理解、重实践等,要求不一,目的不一,所以在撰写习题解答和按从易到难的顺序逐一展开的时候,也对其内容做了详略不等的描述。

习题解答多以代码和解释的形式展开,因而代码的风格和可读性至关重要。本书的代码风格沿袭了主教材的代码风格。函数、类型和结构定义,全局数据描述、编译指令描述都予以区别,循环控制按锯齿形框架分层,代码结构力呈优雅,关键之处给予注释。因代码本身就是设计框架和动作流程的通俗展示,伴随着语言描述的细节,比之算法流程的逐条文字描述更显立体感和形象化。

主教材从贯穿全书的编程方法主线中频频诱导快乐学习心态,它以体系架构和学习引导为己任,而对语法却不拘小节,并不强调面面俱到。在习题解答中,还涉及主教材中并没有提及的一些基本编程技术、资源和知识。例如,介绍和使用了一些C函数库、STL技术和相关技术手段。这一方面是对主教材的横向补充,同时也拓展了一些C++的新颖知识。

本书在叙述到基本编程(第5~7章)阶段时,便需要更多的编程经验。其中,有选择地重点介绍第6章的练习8,正是为了揭示C++内部特性,授之以独到的编程心得。该练习介绍了测试数据制作、各种编程策略之代码演变、细节优化以及各个编译器性能差异之比较。在方法介绍中,刻意关注代码在运行时间和空间代价上的互偿性。所有表现不同特点的代码,其版本有数十个之多。除此之外,在第13章的抽象类中,还演绎了一个面向对象的程序设计,融概念设计和系统实现为一体,并注重面向对象设计的实现细节,对动态链接库的实现方法进行了多角度的讨论。

全书与主教材遥相呼应,仍然突出C++编程能力培养中的两个方面:一是全局把握抽象编程观,二是潜窥语言和系统内在特性。通过其丰富的技术展示,再一次表现了编程本质,亦突出了区别于其他同类书之特色。

代码说明

所有的代码都由作者撰写并调试。这一方面是说,代码解答不是为了解答而解答,而是在体现代码风格之个性的同时,给出注重实战的独特代码。代码中所使用的技巧与方法也许并不为人所知,但是,因为它们中许多都在acm.zjut.edu.cn的提交系统中,经过耗用时间、占用空间以及代码长度的较量而名列榜首,所以即使读者会写解决某个问题的代码,书中所给出的代码仍然能给读者以很好的参考。另一方面是说,代码调试的工作量浩大,书中每个习题都给出了至少一种经调试通过的参考代码。调试代码的工作甚至比撰写书稿更费时费力,有时为了找出更好的描述方法或者为了更准确地评价性能价值,还会将几种方法在不同调试环境中查看机器语言的中间结果。

习题解答的代码都是基于控制台运行环境,对于面向对象编程实践中的动态链接库也不例外。解答中均提供完整的可运行代码,目的是让读者获得整体感,便于对各种平台进行比较和自学。全部代码均经VC8、G++4、BCB6三种编译器调试通过,也就是强调了代码的C++标准性。它们均被做成电子文档,在清华大学出版社网站http://www.tup.tsinghua. edu.cn上供读者下载。

温馨告白

在本系列丛书主教材出版之后,许多学生和读者出于对学习的渴望,对本书的出版抱有厚望,从各个渠道与作者联系,索要本书的初稿,提出各种建议,这些都促成了本书的应时出版;“C++程序设计”作为省级精品课程来建设,学校领导的大力支持,保证了课程教学和教材建设的外部环境,使作者得以深入从事相关教学研究与实践,也促进了本书的撰写工作。

这里,特别感谢恩师王国东先生一直以来给予的细雨润物般的关怀、教诲和启迪。

本书因启动时间晚,所以迟至今日才与读者见面。本书撰写历时虽短,但还是把主教材中学习C++的重要问题和经验理了出来,把自己的风格和特色体现了出来。

描述问题的解答涉及C++语言、环境、标准、技巧、风格等各个方面。学习和研究角度不同,则看法和解决方法便不同,有些或许还可以做得更周全或更精彩,欢迎读者来信讨论。

作者电子邮件地址:qianneng@mail.hz.zj.cn

钱  能       

2009年秋于杭州自在居

第一版前言

学习程序设计方法,并且要实质性地提高编程能力,除了看书理解之外,有两个关键的因素:一个是做编程书面练习,一个是上机做实验。在初级程序设计的能力培养中,唯有多练,才能真正找到编程的感觉,才能培养出宝贵的编程经验。这些感觉和经验,一定程度上决定了日后成为什么样的计算机人才。所有计算机高级人才,都曾走过风风雨雨的编程历程。

本书既为那些想提高编程能力的初学者准备,又为设计、开发软件的程序员提供了编程方面的素材。书中共有习题67例,每个习题解答都是精选的讲课例子,对程序设计中存在的问题具有一定的代表性。有些解答还提供了不止一种方法。书中除了个别问答题外,全部解答都通过BC++5.0的调试和运行,并配有运行结果,以便读者在不同环境下运行       比较。

程序的解答可以各种各样,越吃透程序结构、吃透语言的内在含义和联系,就越能准确表达解决问题的方法,编制的程序也就越简练,对日后深入学习程序设计理论的领悟性也越高。读者可以先自己尝试解答,然后再参考书中解答。书中的解答与系列丛书《C++程序设计教程》中的习题具有相似性,可以起到提示和帮助读者解答教程中习题的作用。当然书中的解答并不一定是最优的,它们只是具有代表性而已。欢迎读者提出自己的见解,编出更高质量的程序。

虽然这只是迈出了一小步,但作者愿与程序设计爱好者们一起努力,在明年的再版中,更上一层楼。

作者的学生刘雪芬、沈雪飞和徐晓萍做了大量习题中程序的录入和调试工作,在此表示深深的感谢。