20年前,我曾经写过一本《C程序设计》(清华大学出版社出版) ,当时只是为了教学的需要。由于许多人反映C语言难学,我力图编写出一本容易入门、容易学习的教材,以解决教学中的困难。该书出版后,反映很强烈,不少人说,C语言原来是比较难学的,自从《C程序设计》出版后,C语言变得不难学了。该书已先后重印160多次,累计发行1100万册,平均每年发行60万册。成为广大初学者学习C语言的主要用书。这使我深受鼓舞和鞭策,我感受到广大读者的殷切期望,看到了计算机教育工作者身上的重任。
近年来,支持面向对象程序设计的C++语言迅速地在国内推广,不少高校开设了C++课程,由于C++涉及概念很多,语法比较复杂、内容十分广泛,不少人(尤其是非计算机专业的初学者)感到学习难度较大,难以入门。许多热情的读者希望我能在《C程序设计》的基础上,再写一本易于入门的《C++程序设计》,以帮助更多的初学者更顺利地迈进C++的大门。我花了两年时间,其间数易其稿,于2004年写成了《C++程序设计》一书,由清华大学出版社正式出版。该书出版后,受到各高校的欢迎,许多师生认为该书定位准确,概念清晰,深入浅出,取舍合理,以通俗易懂的语言对C++的许多难懂的概念作了透彻而通俗的说明,大大降低了初学者学习的困难程度,是一本初学者学习C++的好教材。
根据教学实践的需要,作者最近对该书进行了修订,出版《C++程序设计(第2版)》。与第1版相比,内容更加丰富,讲解更加清晰,学习更加容易。
要写好和教好C++程序设计,决不是一个纯技术问题,需要综合考虑多方面因素,作出合理的决策和安排。我调查了我国大学的程序设计课程的现状和发展趋势,了解了国内外C++的教学和使用情况,认真分析了学习者在学习过程中遇到的困难,研究了初学者的认识规律,并且参阅了国内外数十种有关C++的教材,形成了以下几点看法,并体现在本教材中。
(1) 教材必须准确定位,合理取舍内容。写书首先要弄清楚本书是为什么人写的,他们学习C++的目的是什么,应当学到什么程度。应当声明: 本书的对象不是C++软件开发专业人员,而是高校各专业(尤其是非计算机专业)的大学生,他们并无从事程序设计的实际经验,将来也不一定是C++的专业开发人员。众所周知,研发C++的初衷是为了解决大型软件开发中遇到的问题,提高软件的开发效率。只有参加过研制大型软件的人才能真正体会到C++的优越性,并善于利用C++的独特机制去进行软件开发。
大学生在学校学习期间学习C++的目的是了解面向对象程序设计方法,能够利用C++编写相对简单的程序,为以后进一步学习和应用打下良好的基础。不可能设想,通过几十个小时的学习,能使一个没有程序设计基础的人变成一个熟练的C++开发人员。应当有一个实事求是的分析和估计。因此,本书着力于使读者对C++的全貌和作用有基本的认识,用容易理解的方法讲清楚有关的基本概念和基本方法,而不去罗列C++语法中各种烦琐的细节。否则将会使篇幅过大(常见国外的书厚达近千页),而且会使读者感到枯燥无味,冲淡重点,主次不分。
(2) 需要选好学习C++的切入点。对于怎样介绍C++,国内外的教材有多种模式。有的不介绍基于过程的程序设计,一开始就直接介绍类和对象,有的先介绍基于过程的程序设计,然后介绍面向对象的程序设计,各有特点。作者认为: 不应当把基于过程和面向对象的程序设计对立起来,任何程序设计都需要用到过程化的知识。作为一个程序设计人员,要掌握过程化的程序设计,也要掌握面向对象的程序设计。以前,人们通过C语言学习过程化程序设计,再通过C++学习面向对象的程序设计。其实,C++并不是纯粹的面向对象的语言,它是一种混合语言。学习C++既可以编写过程化的程序,也可以编写面向对象的程序。在参考和比较国内外多种教材的基础上,作者确定了本书的结构。全书分为4部分: 第1部分介绍C++的基本知识和基本语法;第2部分介绍C++基于过程的程序设计;第3部分介绍C++基于对象的程序设计;第4部分介绍C++面向对象的程序设计。
许多教师的实践表明,以基于过程的程序设计作为切入点,从编写简单的程序开始,循序渐进,由基于过程到面向对象,逐步深入,比较符合读者的认识规律,每一步的台阶都比较小,学习难度不大,读者容易理解。
这样,人们既可以通过C语言学习基于过程的程序设计,也可以直接通过C++语言学习基于过程和面向对象的程序设计。读者可以根据需要选择。
(3) 设计合适的教材体系。C++程序设计涉及面向对象程序设计的理论、C++语言的语法以及算法3个方面的内容,其中每一方面都包含十分丰富的内容,都可以分别单独成书。显然在一本教材中深入、详细地介绍以上3个方面的知识是不可能的,必须把它们有机地结合起来,综合应用。不同的书对此采取不同的写法,侧重点有所不同,各有道理,也各有优缺点,适合于不同的读者。需要在教学实践中检验,取长补短,不断完善。
作者认为: 要进行C++程序设计,当然需要了解面向对象程序设计的有关概念,但是本课程毕竟不是一门面向对象程序设计的理论课程,在本书中不是抽象地介绍面向对象程序设计的理论,而是在介绍C++语言的特点和应用过程中自然地引出面向对象程序设计的有关概念,通过C++的编程过程理解面向对象程序设计方法。在面向过程的程序设计中,介绍有关的算法,引导读者思考怎样构造一个算法。编写程序的过程就是设计算法的过程。
要用C++编程序,最基本的要求是正确掌握和运用C++,由于C++语法复杂,内容又多,如果对它缺乏系统了解,将难以真正应用,编出来的程序将会错误百出,编译出错,事倍功半。本书的做法是全面而系统地介绍C++的主要特点和功能,引导读者由简而繁地学会编写C++程序。有了C++编程的初步基础后,再进一步提高,掌握更多更深入的算法。这样的方法可能符合大多数学习者的情况,降低了学习难度。
(4) 重要的是要建立清晰的概念。由于人们习惯于过程化的编程方法,在开始学习时往往对面向对象的原理和实现机制理解不深,而C++的语法现象繁多,作者认为,决不能使读者陷于语法细节的汪洋大海之中。如果逐个孤立介绍,学起来将枯燥无味。本书把面向对象程序设计划分为两个有机联系的阶段--基于对象的程序设计和面向对象的程序设计。从类和对象开始逐步深入地引出面向对象程序设计的各个概念以及用C++实现的方法。凡引入一个新的概念,都作了通俗而透彻的讲解,把来龙去脉交代清楚,讲清楚“这是什么”, “为什么需要它”, “怎样使用它”,并举例说明。使读者建立起清晰的概念,知其然也知其所以然,而不是盲目地照葫芦画瓢。对于C++的众多功能和语法细节,在初学阶段没有必要全部细讲,必须有所选择,合理取舍,抓住主要矛盾,不应追求深而全。本书是入门性、基础性的教材,任务是帮助读者顺利入门,打好基础。有了好的基础,以后根据需要再深入学习和实践,是不困难的。
(5) C++教材应当体现C++标准。C++是从C语言发展而来的,为了与C兼容, C++保留了C的许多用法,有不少人在编写C++程序时常沿用C的某些传统用法,例如把主函数定为void类型,无返回值;头文件带后缀.h;使用系统库时不使用命名空间等。但是,ANSI C++标准在一些方面有新的规定,例如要求主函数为int类型,如果程序正常执行则返回0值;系统头文件不带后缀.h;使用系统库时使用命名空间std;增加了字符串类型string等。
虽然C++仍然允许使用从C继承来的传统用法,但作者认为作为教材应提倡C++的新方法。应当引导大学生和所有读者从一开始就按照C++标准编写程序,养成C++的编程风格,而不是过多地迁就C的习惯。本书各章都是依据C++标准介绍的,同时也说明允许使用的C的用法。
在本教材中,程序的形式如下: #include <iostream> //头文件不带后缀.h
#include <string> //可以用字符串类型
using namespace std; //使用系统库时使用标准命名空间std
int main() //主函数为int类型
{
string str; //可以用string定义字符串变量str
return 0; //程序正常执行则返回0
}要引导学生学习标准C++,而不是仅仅学习依赖于某一特定环境下的“方言化”的C++。本书介绍的是标准C++,读者在学习过程中可以在不同的环境下运行自己的C++程序,但它们只是被当作编译器来使用。不应喧宾夺主,把过多的精力放在学习某一编译系统的具体细节上,学习的重点应当是C++本身。读者应能在不同的平台上(例如Windows环境和非Windows环境) 编译和运行C++程序。
(6) 努力化解难点,把复杂的问题简单化,使学习C++更容易。在写作过程中作者花了很大的精力去考虑怎样使读者易于接受和理解。作者一贯认为,教材编著者应当与读者将心比心,换位思考,要站在读者的立场上思考问题,帮助他们排除学习中的困难,要善于把复杂的问题简单化,而不应把简单的问题复杂化,要善于化解难点,深入浅出。一定不要难倒读者,更不应吓跑读者。我们的任务是要使“难”变成“不难”,循序渐进地引导初学者进入C++的大门。
在学习过程中不应被一大堆高深莫测的名词术语吓唬住,有些问题看起来很深奥,其实换一个角度解释就很容易理解,甚至用一个通俗的例子就可以把问题说清楚了。本书尽量用通俗易懂的方法和语言叙述复杂的概念,力求减少初学者学习C++的困难.
本书便于自学,即使没有老师讲解,读者也能看懂本书的大部分内容。这样,老师教学时就可以不必完全按照教材的内容和顺序详细讲解,而可以有选择地重点讲授,其余内容由学生自学。
(7) 按照教学的特点组织教材。不应当把教材写成手册,教材的任务是用读者容易理解的方法讲清基本的概念和方法,而手册的任务则是给出一个包罗万象的备查资料。
读者在学习时应重点掌握基本的概念和方法,以后若从事实际程序开发,遇到具体问题时,进一步学习或查阅一下手册即可。
本教材所举的程序,是从教学的角度考虑的,是为了帮助读者更好地理解和应用某一方面的教学内容而专门编写的,并不一定是实际应用的程序。一个实际的C++程序需要考虑许多因素,综合各部分知识,有许多注释行,而且一般是多文件的程序,篇幅较长,往往不适合作为教学程序。教学程序对问题作了简化,尽量压缩不必要的语句,减少注释行,篇幅一般不长,力求使读者能读懂程序。有些在专业人员看来很“幼稚”的程序,在学习者看来可能是一个很合适的教学程序。教材必须通俗易懂,使人能看懂。在初步掌握C++编程方法后,可以逐步使程序复杂些,长一些,更接近真实程序一些。在学完本课程后,最好完成一个实际的应用程序,以提高实际应用的能力。
(8) 学习本教材可以有两个入口: 未学过C语言的读者从第1章学起;已学过C语言的读者可以从第8章学起。由于C++是从C语言发展而来的,它保留了C语言的大部分内容。本书第1~7章介绍的内容主要是C++从C语言继承来的部分,因此,学过C语言的读者可以跳过这几章,而直接学习第8章。但最好在学习第8章之前,简单浏览一下前7章,以对C++与C的异同有所了解。尤其应看一下前7章中带星号()的部分,它们是C++对C语言的发展,是C语言中没有的。
由于《C程序设计》一书已比较成熟,读者反映很容易看懂,因此本书前7章主要是根据《C程序设计》一书进行改写的。这样,把C语言和C++很自然地衔接起来,无论学过C语言还是未学过C语言的读者都会感到本教材容易入门,易于学习。
(9) 教材要考虑配套,形成纵深。程序设计是一门实践性很强的课程,只靠听课和看书是学不好的。衡量学习好坏的标准不是“懂不懂”,而是“会不会干”。因此必须强调多编程,多上机实践。考虑到不同学校、不同专业、不同读者对学习C++有不同的要求,因此要提供配套用书,不同的读者可以根据要求选用。
本书有两本教学参考书,均由清华大学出版社出版。
(1)《C++程序设计题解与上机指导(第2版)》。提供主教材各章中的全部习题解。由于教材的篇幅有限,有些很好的例子无法在教材中列出,我们把它们作为习题,希望读者自己完成,教师也可以从中选择一些习题作为例题讲授。学生除了完成教师指定的习题外,最好把习题解答中的程序全部看一遍,以更好地理解C++程序,扩大眼界,启迪思路,丰富知识,增长能力。在《C++程序设计题解与上机指导(第2版)》中,还介绍在两种典型的环境下运行C++程序的方法,一种是Windows环境下的Visual C++ 6.0,一种是GCC, GCC是自由软件,不必购买。GCC可以在Windows环境下使用,也可以在非Windows环境(如DOS, UNIX, Linux)下使用。此外,书中还给出上机实践任务,要求学生完成若干次上机实践。
(2) 《C++程序设计实践指导》。这是为学习主教材后进一步深入学习的读者准备的,目的是提高编程能力。有的专业对学生使用C++编程有一定要求,可以在学完课程后,安排一段集中的时间进行一次编程实践,相当于课程设计。该书内容包括: 怎样编写C++应用程序;提供若干个不同规模的实际的C++应用程序供分析阅读;安排并指导学生完成1~2个C++应用程序。经过这样的训练,学生的实际能力将会有较大的提高。
本书由谭浩强著,谭亦峰和薛淑斌参加了教学研讨、收集材料、调试部分程序等工作。全国高等院校计算机基础教育研究会以及全国各高校老师几年来对本书的编写始终给予了热情的支持,清华大学出版社对本书的出版十分重视,使本书在短时间内得以出版。对一切曾经鼓励、支持和帮助过我的领导、组织、专家、朋友和读者,在此谨表示真挚的谢意。
本书肯定会有不妥甚至错误之处,诚盼专家和广大读者不吝指正。
2011年3月于清华园
