第1版前言
随着计算机应用领域的不断扩大、应用层次的不断加深,社会对计算机软件的需求急剧增长,这就导致了软件的规模不断扩大、复杂程度不断提高。如何设计出大量的满足用户需求的高质量软件是软件工作者所面临的严峻挑战。
作为计算机软件主要表现形式的计算机程序不同于其他程序(如音乐会程序),它是由计算机来执行的,这就使得计算机程序的编制(程序设计)不能完全以人的思维模式和习惯来进行,它往往要受到计算机解决问题的方式和特点的限制。除此之外,要编制出解决各种问题的程序,程序设计者往往还需要了解与问题领域有关的知识。这些都给程序设计带来一定的难度。
从程序设计的发展历史来看,程序设计经历了从采用低级语言到采用高级语言、从过程式到面向对象、从以编码为中心到面向软件生存周期的软件工程的发展过程。这一过程体现了人们对程序设计活动的不断认识和改进的过程,特别是从过程式程序设计到面向对象程序设计的发展,体现了人们对以自然的方式来描述和解决问题的需求,它使得解题过程更接近于人的思维方式。
有人认为程序设计是一门艺术,而艺术基于的是人的灵感和天赋。对于一些小型程序的设计而言,上述说法可能有一些道理。但是,对于大型、复杂的程序设计问题,灵感和天赋是不能很好地解决问题的,几十年的程序设计实践已证明了这一点。不可否认,程序设计需要灵感和天赋,它们往往在程序的一些局部设计上发挥着作用。但从总体上讲,程序设计是一门科学,它是有规律和步骤可循的。通过对程序设计的基本思想、概念和技术的学习,再加上必要的训练和实践,程序设计的规律和步骤是可以掌握的,这正是本书的主旨所在。本书强调准确的程序设计基本概念、良好的程序设计风格和对编程能力的训练与培养。
程序设计与程序设计语言(编程语言)密不可分。一方面,程序设计的结果必须要用一种能被计算机理解的程序语言表示出来才能在计算机上执行。另一方面,所采用的程序设计语言也会影响程序设计的方式。本书之所以选择C++语言作为编程语言,首先是因为C++语言是从C语言扩充而来的,它保留了C语言的所有语言成分,而C语言是一种流行的高级语言,很多人都在用C语言编写实际的程序。其次,C++支持大部分基本的程序设计思想、概念和技术,其中包括对过程式及面向对象两种程序设计范式的支持。最后,与其他高级语言相比,C++语言具有灵活和高效等特点,这使得一些程序设计思想、概念和技术能够更好地实现。关于C++语言是否适合作为介绍程序设计时的编程实现语言,目前存在不同的看法。持赞成意见的人认为C++对“做事”的方式限制较少,能充分发挥使用者的主观能动性和创造性,是“真正的”程序员使用的语言;而持反对意见的人则认为C++语言太灵活,会使初学者感到无所适从。本书以介绍基本的程序思想、概念和技术为主旨,C++服务于这个主旨,在掌握了基本的程序思想、概念和技术之后,初学者在使用C++语言时就能够做到有的放矢,设计出具有良好风格的程序。本书对C++的一些特殊的、用于解决非主流的程序设计问题的成分和技巧不予重点介绍,特别地,本书对一些属于C++语言“文化”范畴的内容不予过分强调。
本书既适合程序设计的初学者使用,同时,对具有一些程序设计经验的人也有较高的参考价值。本书内容分为两大部分:第1章至第5章为第一部分,该部分主要对程序设计的一些基础知识以及过程式程序设计的基本内容进行介绍,其中包括计算机的工作模型、程序设计范式、简单数据的描述、常量、变量、操作符、表达式、流程控制、结构化程序设计、过程抽象(子程序)、递归函数以及复杂数据的描述等;第6章至第11章为第二部分,该部分重点介绍面向对象程序设计的基本内容,其中包括数据抽象(类/对象)、继承(类的复用)、类属类型(泛型)、输入/输出、异常处理以及事件驱动和基于MFC“文档-视”结构的面向对象的Windows应用程序框架等。
本书可以作为一学期的程序设计基础课程的教材,主要包括第1章到第5章的全部内容以及第6章的数据抽象基本思想和第9章的基于C语言标准函数库的输入/输出。需要说明的是,由于第1章到第5章主要是C语言支持的内容(除了输入/输出采用了更简洁的C++语言形式),因此本书同样适合以C语言作为实现语言的程序设计基础课程。如果读者已学过过程式程序设计(如C语言程序设计等)的基本内容,则本书也可作为一学期的面向对象程序设计课程的教材,重点介绍第6章到11章的内容。书中加“*”标记的节在初次阅读时可以跳过。
本书的编写和完成与很多人的帮助是分不开的。首先,要感谢郑国梁教授对本书编写工作的精心指导。在内容的选取、安排、用语的规范性等方面,郑老师都事无巨细地给予了考虑,并检查了全文(包括教程中的每个示例程序)。值得一提的是,作者编写本书所必备的专业知识和专业素质是在郑老师的长期熏陶下获得的,这些知识和素质使得作者能够完成本书的编写。其次,非常感谢尹存燕老师和戴新宇博士在本书习题的设计和文字易读性方面所做的大量工作;非常感谢孙明欣同学和周明同学对本书内容所做的检查工作,特别是对本书初稿中一些概念上的模糊与谬误、内容安排的合理性与易读性以及在遵守C++标准规范方面所提出的建议;感谢胡昊博士和徐锋博士,作者对一些基本概念的理解是在与他们就相关问题的讨论中获得的。最后,要感谢机械工业出版社的温莉芳对本书编写工作的鼓励和支持。
最后,要感谢我们的家人对本书编写工作的理解和支持,本书的编写占用了大量本应与他们共度的家庭欢乐时光。感谢所有支持和帮助过本书编写工作的人们。
由于作者水平有限,书中的错误和疏漏在所难免,恳请广大读者不吝指教,以便我们在今后的版本中进行改进。
陈家骏
南京大学计算机科学与技术系
chenjj@nju.edu.cn
郑滔
南京大学软件学院
zt@nju.edu.cn
2004年4月