图书前言

前言

  计算机是人类集其智慧之大成的杰作,是脑力劳动机械化、自动化的成功典范。在当今及未来,计算机都是科技进步、社会发展不可或缺的得力助手。然而计算机——这个神通广大的人造精灵的一举一动全都是靠人来掌控的。

  掌控计算机用的是计算机语言程序。计算机程序设计语言——尤其现代高级语言的出现和发展是计算机科学中最富于智慧的成就之一。计算机程序设计语言是人为制订的一整套功能近乎完美的算法思想表达体系和计算机行为规范准则。学会一门计算机语言便是掌握了一种掌控计算机的本领。

  C++从C语言进化而来,是C语言的超集,它同时吸收了许多著名语言最优秀的特征。C++新增加的特点和机制体现了它对高级抽象的支持,它是一门适合各种应用的计算机程序设计高级语言。C++既支持面向过程程序设计,又支持面向对象程序设计。它既适合作为教学及训练的计算机语言(适合作为大学相关专业第一门程序设计课程的语言进行学习),又能胜任大型软件开发,特别是众人集体开发大型软件。C++是众多学习程序设计和从事软件开发人员的首选语言。

  在计算机专业课程体系中,高级语言程序设计课程具有基础性和工具性。通过该课程的学习,读者应该达到以下三个基本目标,并为进一步学习数据结构等课程或进行应用开发作准备。

  (1) 掌握C++语言的基本语法规则;

  (2) 掌握基本的程序设计技术规范;

  (3) 建立朴素的算法设计思维模式。

  全书共分16章,第1章为导论,第2~8章为面向过程程序设计,第9~16章为面向对象程序设计。本书第1~14章由李青编写,第15~16章由周美莲编写,周美莲调试并测试了书中的大部分程序。全书由李青统稿。

  书中的全部程序源代码均适用于MinGW Developer Studio 2.05和Microsoft Visual C++ 6.0集成开发环境。需要这些源代码及本书的电子教案者可直接向清华大学出版社索取。作者推荐读者在互联网上下载MinGW Developer Studio 2.05集成开发环境。它是一种可运行于Windows操作系统下的C++应用程序集成开发环境,其中含GCC编译器,可在互联网上自由下载并发布它。

  本书的特点

  (1) 详略得当

  本教材将函数的概念分散到各章节,并在第6章给出函数调用及返回时的栈操作过程描述;强调多文件结构;强化引用的概念和用法、弱化了指针(尤其是多级指针)并提倡对指针的封装和屏蔽;突出对象的构造(特别是对象的复制构造、析构)和重载赋值运算符;强调多态性和虚析构函数的重要性。本书不介绍STL(标准模板类库)。

  特别增加的单向链表类模板(第12.2节)将对读者继续学习《数据结构》有一定的帮助。所介绍的自定义String类(第13.3节)将使读者对C-字符串、类string有更深的理解。书中的一些趣味程序具有一定的设计技巧,值得读者钻研。

  本书还照顾到程序设计竞赛练习的需要,在一些章节后专设有竞赛题型。这些题目难度不高,并给出了其中一些题目的解答全过程,目的是给读者提供一些读取输入数据、处理输出结果的简便方法。

  (2) 需求牵引

  本书的面向过程程序设计部分以程序中最活跃的变量设计为线索,通过所谓的“评委评分”案例程序的逐步扩充和优化引出C++的基本语法。即随着程序版本按“单变量→数组→堆数组→函数→链表”不断升级,教学内容从易到难逐步展开。这种“需求牵引”式方法有利于读者弄清为什么及怎样做的问题。

  面向对象程序设计部分朝着“与基本数据类型看齐”的目标逐步推进,并将“评委评分”程序的功能扩充至最强(参赛选手人数、评委人数皆可随时变动,并可轻松处理多场同时进行的比赛)。

  (3) 前后照应

  本书的取材及在内容编排上注重循序渐进、前后照应。第1章(导论)的主要目的是使读者大致了解计算机的工作原理;懂得信息数字化及其标准化的必要性;理解将数据分成各种基本类型的“无奈”;了解计算机内存字节地址编址的线性性和程序执行的时序性。第2章与第16章的“小学算术测验程序”相映成趣。章节(包括练习)中的前后引证,可使读者逐步加深对知识点的理解,达到融会贯通。

  (4) 科学规范

  本书尽量做到叙述严格条理清楚。严格区分“定义”与“声明(描述)”的含义,希望读者关注这一用词的区别。作者不仅注重程序的宏观结构,而且非常强调精致的技术细节。本书中的示例程序皆根据科学的设计原则进行设计,特别注重函数的形式参数类型、函数的返回类型。程序中回避那些难理解的表达式,避免因编译器不同而造成的编译障碍。本书中的程序完整,并且注重了许多容易被忽视的细节。这些程序都经过了多方面的测试,以保证程序的质量。例如,在第8章的链表程序中,既然假设所有结点皆为堆结点以便于删除结点、释放结点操作的统一性,那么插入结点时就应该申请新的堆空间,而不能武断地将结点直接链接进链表。

  笔者认为,仅仅为了解释某一语法现象而设计一些“纯粹”的语句不如将语法知识点放在一定的“语境”之中。因此,本书中的大部分示例程序均有其应用背景。这些示例程序能起到一定的示范作用,包括程序的书写格式,程序中的注解等。程序中的保留字一律排成粗体字;书中的反例程序则用加背景的方式排版,以引起读者的注意。

  致教师

  教师的主要任务是引导和教会学生如何学习。即教师应把握好如下关键点:引入概念、剖析难点、解答疑点、启发学生思考、指导学生归纳,尤其是引导学生养成良好的学习习惯和良好的程序设计风格(包括书写风格)。例如:在函数首部设计中,需要特别考虑引用型参数、考虑是否该加const保护;设计类时,是否应该提供复制构造函数、析构函数和重载赋值运算符,成员函数是否应该设计成常量成员函数等。教师要告诫学生:不要使用全局变量;提醒学生注意,开发程序常常是要与他人分工合作的,程序的最终用户也往往不是程序员自己。

  本书的主要内容一般可在两个学期共约80~100学时内讲完。书中带星号的部分供选讲或课外讨论。对于书中比较长的程序代码可由教师提出若干关键问题,让学生分小组讨论并报告。

  只需要或只准备学习C语言者也可以使用本教材前两个部分,它们与C语言几乎是相同的。不同之处(如:I/O,new,delete等)正是C语言的不足之处。因此,使用本教材本质上是在先学习C语言,再学面向对象程序设计。

  致读者

  本书的读者可能主要是大学低年级的学生。这一阶段的学生需要主动探索适合自己的学习方法──“学习怎样学习和学习怎样思考”。在教学活动中,学是矛盾的主要方面。作者强调学生自学能力的自我培养,因为一个合格的大学生应该有能力通过自学学会那些已经成熟的、并经过他人总结的知识。精读教材(逐字逐句、反复研读)是训练自学能力的有效方法。把握程序结构、精读具有一定长度的源代码是十分必要的。

  本书涉及的C++语法规定是容易接受的,并且可以通过课堂教学的方式了解这些语法机制的背景。然而学习C++语言的目的决不仅为了懂得一些规定、会用“排除法”做单项选择题。学习语言的目的是为了应用。与学习外国语一样,应该将知识点放在“语境”中,与计算机进行实际的“情景对话”。

  学生仅听老师讲而不加以练习是无法提高程序设计能力的,而且还可能导致越来越听不懂。读者应该抓紧一切机会在计算机上验证所学的语法,通过调试程序不断总结经验以逐步提高自己的程序设计能力。与有些课程不同,本课程实验课前的准备工作比课堂上课前的准备工作更加重要。

  学习程序设计语言需要多模仿、多上机练习。本书所设计的例题程序均有一定的代表性,读者在弄懂它们的基础上应该做到举一反三、触类旁通。

  读者即使有了本教材上的所有程序源代码,作者仍然建议读者自己按语句块地将一些源代码录入计算机并亲自进行调试(要按“意群”而非按行的顺序录入,即当录入到左花括号时,应立即换行输入右花括号,然后在其中插入语句块语句)。

  当一个人所编写的程序代码总行数达到一定数量时,其程序设计能力就自然会有质的提高,程序设计思想就自然而然地建立起来了。知识可以通过传授获取并积累,能力只能依靠自己勤练来提高。

  致谢

  本书是作者在总结多年教学经验的基础上逐步形成的。在长期的教学工作中,作者与本课程组的同仁丁德明、龚林娣、朱颖、牛志华等多位教师经常互相交流经验。本书的初稿承蒙他们的指点和试用,他们提出了许多宝贵的、富有建设性的意见均被作者采纳。在此,作者对他们的帮助表示衷心地感谢!

  作者十分感谢清华大学出版社,特别感谢魏江江先生的大力支持和帮助,他们为本书的策划、质量控制、出版等方面做出了卓有成效的贡献。

  由于作者的水平有限,本书难免存在疏漏和缺点,敬请广大读者批评指正。

  李  青   

  2008年11月