十几年前,我曾经写过一本《C程序设计》 清华大学出版社出版 ,当时只是为了教学的需要。由于许多人反映C语言难学,我力图编写出一本容易入门、容易学习的教材,以解决教学中的困难。该书出版后,反映很强烈,不少人说:C语言原来是比较难学的,自从《C程序设计》出版后,C语言变得不难学了。该书已先后重印100多
近年来,支持面向对象程序设计的C++语言迅速地在国内推广,不少高校开设了C++课程,由于C++牵涉概念很多,语法比较复杂、内容十分广泛,不少人感到学习难度较大,难以入门。许多热情的读者多次向我提出,希望我能在《C程序设计》的基础上,再写一本易于入门的《C++程序设计》,以帮助更多的初学者更顺利地迈进C++的大门。我感到热情难却,责任重大,但由于工作和活动较忙,心有余而力不足,迟迟未能动笔。在各高校老师和出版社多次催促下,于2002年1月1日午夜开始动笔,写出了第一页。其后利用工作和活动的空隙断断续续地进行,2003年春季北京为防治非典(SARS)停止一切活动,使我有机会集中时间和精力,加速了进度。其间数易其稿,终于在2004年元旦前完成了第四稿。
要写好和教好C++程序设计,决不是一个纯技术问题,需要综合考虑多方面因素,作出合理的决策和安排。我调查了我国大学的程序设计课程的现状和发展趋势,了解了国内外C++的教学和使用情况,认真分析了学习者在学习过程中遇到的困难,研究了初学者的认识规律,并且参阅了国内外数十种有关C++的教材,形成了以下几点看法,并体现在本教材中。
1.教材必须准确定位,合理取舍内容。写书首先要弄清楚本书是为什么人写的?他们学习C++的目的是什么?应当学到什么程度?应当声明:本书的对象不是C++软件开发专业人员,而是高校各专业的大学生,他们并无从事程序设计的实际经验,将来也不一定是C++的专业开发人员。众所周知,研制C++的初衷是为了解决大型软件开发中遇到的问题,提高软件的开发效率。只有参加过研制大型软件的人才会真正体会到C++的优越性并善于利用C++的独特机制去进行软件开发。
大学生在学校学习期间学习C++的目的是了解面向对象程序设计方法,能够利用C++编写相对简单的程序,打下以后进一步学习和应用的基础。不可能设想,通过几十小时的学习,能使一个没有程序设计基础的人变成一个熟练的C++开发人员。应当有一个实事求是的分析和估计。因此,本教材着力于使读者对C++的全貌和作用有基本的认识,用容易理解的方法讲清楚有关的基本概念和基本方法,为读者以后进一步学习打下良好的基础,而不去罗列C++语法中各种烦琐的细节。否则将会使篇幅过大 常见国外的书厚达近千页 ,而且会使读者感到枯燥无味,冲淡重点,主次不分。
不应当把教材写成手册,教材的任务是用读者容易理解的方法讲清基本的概念和方法,而手册的任务则是给出一个包罗万象的备查资料。读者在掌握基本的概念和方法的基础上,在从事实际程序开发时遇到具体问题,查阅一下手册即可。
2.需要选好学习C++的切入点。怎样介绍C++,国内外的教材有多种模式,有的不介绍面向过程的程序设计,一开始就直接介绍类和对象,有的先介绍面向过程的程序设计,然后介绍面向对象的程序设计,各有特点。作者认为:不应当把面向过程和面向对象的程序设计对立起来,任何程序设计都需要用到面向过程的知识。作为一个程序设计人员,要掌握面向过程的程序设计,也要掌握面向对象的程序设计。以前,人们通过C语言学习面向过程的程序设计,再通过C++学习面向对象的程序设计。其实,C++并不是纯粹的面向对象的语言,它是一种混合语言。学习C++既可以编写面向过程的程序,也可以编写面向对象的程序。在参考比较国内外多种教材的基础上,作者确定了本书的结构。全书分为四部分:第一部分介绍C++基本知识和基本语法;第二部分介绍C++面向过程的程序设计;第三部分介绍C++基于对象的程序设计;第四部分介绍C++面向对象的程序设计。
许多教师的实践表明,以面向过程的程序设计作为切入点,从编写简单的程序开始,循序渐进,由面向过程到面向对象,逐步深入,比较符合读者的认识规律,每一步的台阶都比较小,学习难度不大,读者容易理解。
这样,人们既可以通过C语言学习面向过程的程序设计,也可以通过直接学C++去学习面向过程和面向对象的程序设计。读者可以根据需要选择。
3.设计合适的教材体系。C++程序设计牵涉到面向对象程序设计的理论、C++语言的语法以及算法等三个方面的内容,其中每一方面都包含十分丰富的内容,都可以分别单独成书。显然在一本教材中深入详细地介绍以上三个方面的知识是不可能的,必须把它们有机地结合起来,综合应用。不同的书对此采取不同的写法,侧重点有所不同,各有道理,也各有优缺点,适合于不同的读者。需要在教学实践中检验,取长补短,不断完善。
作者认为:要进行C++程序设计当然需要了解面向对象程序设计的有关概念,但是本课程毕竟不是一门面向对象程序设计的理论课程,在本教材中不是抽象地介绍面向对象程序设计的理论,而是在介绍C++语言的特点和应用过程中自然引出面向对象程序设计的有关概念,通过C++的编程过程理解面向对象程序设计方法。在面向过程的程序设计中,介绍有关的算法,引导读者思考怎样构造一个算法。编写程序的过程就是设计算法的过程。
要用C++编程序,最基本的要求是正确掌握和运用C++,由于C++语法复杂,内容又多,如果对它缺乏系统了解,将难以真正应用,编出来的程序将会错误百出,通不过编译,事倍功半。本书的做法是全面而系统地介绍C++的主要特点和功能,引导读者由简而繁地学会编写C++程序。有了C++编程的初步基础后,再进一步提高,掌握更多更深入的算法。这样的方法可能符合大多数学习者的情况,减少学习难度。
4.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的用法。在本教材中,程序的形式如下∶
#include <iostream>
5.引导学生学习标准C++,而不仅学习依赖于某一特定环境下的“方言化”的C++。本书介绍的是标准C++,读者在学习过程中可以在不同的环境下运行自己的C++程序,但它们只是被当作编译器来使用。不应当喧宾夺主,把过多的精力放在学习某一编译系统的具体细节上,学习的重点应当是C++本身。读者应当能够在不同的平台上 例如Windows环境和非Windows环境 编译和运行C++程序。
6.本教材力图使学习C++更容易。考虑到许多读者在学习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++程序设计题解与上机指导》。提供本教材各章中的全部习题解。由于教材篇幅有限,有些很好的例子无法在教材中列出,我们把它们作为习题,希望读者自己完成,教师也可以从中选择一些习题作为例题讲授,学生除了完成教师指定的习题外,最好把习题解答中的程序全部看一遍,以更好地理解C++程序,扩大眼界,启迪思路,丰富知识,增长能力。在《C++程序设计题解与上机指导》中,还介绍在两种典型的环境下运行C++程序的方法,一种是Windows环境下的Visual C++ 6.0,一种是GCC,GCC是自由软件,不必购买,随本书赠送。GCC可以在Windows环境下使用,也可以在非Windows环境(如DOS,Unix,Linus)下使用。此外书上还给出上机实践任务,要求学生完成若干次上机实践。
随本书赠送的光盘中包括教材中全部例题源程序,便于教师讲授,也便于学生在此基础上调研和修改程序,以学得更灵活深入。
2 《C++程序编程实践指导》。是为学习教材后进一步深入学习的读者准备的。目的是提高编程能力。有的专业对学生使用C++编程有一定要求,可以在学完课程后,安排一段集中的时间进行一次编程实践,相当于课程设计。本书内容包括:怎样编写C++应用程序;提供若干个不同规模的实际的C++应用程序供分析阅读;安排并指导学生完成1-2个C++应用程序。经过这样的训练,学生的实际能力将会有较大的提高。
此外,向使用本教材的教师免费提供讲课的电子演示文稿(素材),以节省教师备课时间。