《从问题到程序——程序设计与C语言引论》前言

裘宗燕


作为计算机科学教育的第一门专业课程,程序设计课程的重要性是毋庸置疑的。本书的目标是作为第一门程序设计课程的教材或入门自学读物,介绍如何理解程序语言,如何学习程序设计,如何为计算机领域中的进一步学习和工作做好准备。

本书以C作为讨论程序设计的语言,讨论了基本程序设计的各方面问题。书中给出程序实例时没有采用常见"提出问题,给出解答,再加点解释"的简单三步形式,而是增加了许多对问题的分析和讨论,以帮助读者认识程序设计过程的实质,理解从问题到程序的思考过程。书中还尽可能详尽地解释了许多与C语言和程序设计的有关问题。

程序构造过程应该有充分的科学性,要有对程序实现过程的科学认识。有关研究的发展形成了程序的理论。入门书不可能讨论有关的理论成果,但必须反映其精神实质,使初学者从开始就看到程序的一些本质性问题。本书特别强调问题的分析和分解,很早就介绍了函数抽象的概念,而后不断有进一步讨论,实例中也特别注意这方面问题。书中一些地方还通过实例介绍了一些更深入的理论问题,如通过对程序运行时间的统计,介绍计算过程的基本性质(复杂性);通过分析循环过程是否完成了所需工作,介绍"循环不变关系"的概念和意义等。当然,这些只是希望帮助读者了解一些情况,作为思考程序问题的线索。

程序设计也是一种工程性的工作,需要分析问题,寻找可能的解决方案,在各种方案中做评价和选择,还要对所做选择有清醒认识(优点和缺点,是否在某些方面有所偏向或不足)。工程中通常没有完美的选择,更多的是权衡和折衷,在程序设计里也是如此。本书的许多实例包含了比较详细的分析过程,常对一个问题给出多个解答,比较它们的优劣,有时还指出其他可能性:还可以如何看问题,还可能如何做等等。书中还常给读者提出一些问题,希望读者发挥自己的思维能力和主观能动性。各章练习也试图反映这些想法。

本书希望强调一种观点:程序问题并没有需要记住的标准答案。由于分析问题时的不同考虑,设计过程中的不同选择,人们对同一问题会得到许多合理而正确的不同程序。这些程序常常各有长短,可能各有侧重,也可能反映了对问题的不同认识。在学习中应该特别注意如何分析问题,如何把复杂问题分解为相对简单的部分,如何在可用的功能中做出选择等。这里的每一步都可能产生分支,我们应该认清各种选择的后果,包括收获和损失。

各种书籍(包括本书)给出的程序并不是"金科玉律",它们不过是作者对问题的理解和分析的结果,实际上还有很多可能性。要学好程序设计,我们应该养成这样的习惯:在看程序时,应该特别注意分析其中隐含着作者的哪些考虑和选择?其中哪些是合理而有价值的(或不合理无价值的)?还可能有什么选择?沿其他选择做下去可能得到什么(或失去什么)等。这样思考将使我们受益无穷。当然,这并不是说书中的示例不重要。恰恰相反,因为程序设计中有许多选择可能,书中应当给出好的分析和选择,供读者参考。入门书籍还应该说明选择的理由,指出采取这些选择带来的问题(缺点、限制等)。

正如本书的书名所言,程序设计是"从问题到程序"的思考和工作过程。要很好地完成程序设计,我们既要充分发挥聪明才智,还要有细致认真、一丝不苟的工作态度。即使将来不从事程序工作,从这一课程中得到的锻炼也可能很重要。

从作为入门语言的角度看,没有一种语言具有无可比拟的优势,使用时都需要考虑其有利方面,也要克服其不利因素。选择C作为入门语言的主要理由有:C是使用最广的语言之一,包含了基本程序设计需要理解的主要机制,能满足讨论程序设计问题的需要。学生可以用它完成练习,得到有关的知识积累和能力锻炼,还能掌握一种实用工具,也能作为后续课程学习的基础。C语言适合(也正在)作为计算机领域许多课程的教学语言。

C是一种很灵活的语言,用它写程序常需要了解一些细节,这是人们对用C作为基础课语言的主要疑虑。从另一方面看,通过用C做程序设计,也可能得到对程序设计的更多认识。C程序可以在比较低的层次上做,也可以在较高层次上做,学生可能从中了解更多有关程序设计过程的问题。此外,许多语言从C借鉴了一些想法和表达形式,有些就是C的扩充和发展,C语言知识对于进一步了解其他语言,包括未来的新语言都很有价值。

本书以程序设计为基本线索,同时深入介绍了C语言各方面的情况。这里强调的是如何认识程序、写程序和用C写程序。通过实例讨论了问题的分析和分解,找出主要步骤,确定函数抽象,找出循环,选择语言结构,最后写出程序的过程。不少实例给出了在不同考虑下可能形成的多种解法,以帮助读者理解程序设计的真谛。

书中特别强调好的程序设计风格,强调"好的"C程序设计:反复讨论了通过函数抽象建立清晰结构的重要性,特别关注程序的良好结构、可读、易修改,也尽可能指出了一些不良程序设计习惯及其危害。历史原因使C成为一个不太严格的语言,如果不注意,用C写的程序有可能隐藏一些不易发现的错误*。ANSI C标准倡导了一套写"好的"C程序写法。本书坚持这一正确方向,讨论了如何写出更可靠、不易包藏隐含错误的清晰、简洁、高效的C程序,通过实例说明了应该如何写和不应该如何写。书中还介绍了一些实用的C程序设计技术,详细解释了C语言的各种结构和机制,尽可能地提供了一些背景说明。

本书包括如下各章和若干附录:

第一章
程序设计与C语言。介绍程序与程序语言的概念,C语言的发展及其特点。用一个小例子介绍C程序形式,其加工和执行。最后介绍程序设计与开发过程。
第二章
数据对象与计算。讨论程序语言的许多最基本概念,包括:字符集、标识符和关键字,数据与类型,数据表示,运算符、表达式与计算过程,数学函数库的使用等。
第三章
变量、函数和控制结构。讨论程序设计的一些基本问题,包括语句与复合结构,变量及其使用,简单函数定义,逻辑条件的描述与使用等。最后介绍了几种基本控制结构。
第四章
基本程序设计技术。首先讨论循环程序设计的基本问题,通过一系列程序实例分析了循环的构造过程。此后介绍了C语言其他控制结构及其使用。
第五章
C语言程序结构。讨论C语言的许多具有一般性的重要问题,主要是C程序结构,函数概念及有关的问题,预处理命令和预处理过程,递归的概念等。
第六章
数组。介绍数组概念、定义和使用,数组与函数的关系,两维和多维数组等。
第七章
指针。指针概念和指针变量的使用,C语言中指针与数组的关系,多维数组作为参数的通用函数。而后讨论了动态存储管理,类型定义,指向函数的指针等问题。
第八章
输入输出与文件。讨论了文件概念,与输入输出有关的各种问题,标准库的输入输出功能,以及输入输出的程序设计问题。
第九章
结构及其他数据机制。介绍结构(struct)、联合(union)、枚举(enum)等数据定义机制的意义及在程序中的使用。随后简单介绍了链接结构的概念。
第十章
程序开发。讨论程序设计和开发中的一般性问题和技术。包括分块开发问题等。
第十一章
标准库函数。介绍标准库提供的各方面功能及其相关知识。
最后有几个附录和一个比较详细的索引。

本书以ANSI标准C语言为背景,有关内容不依赖于任何具体C系统。读者可用任何符合ANSI C标准的C系统作为编程环境,如国内常见的微机上的各种C系统,工作站或其他计算机上的C系统。本书里的所有实例程序按ANSI C标准书写,习题也不涉及任何具体系统环境。读者可以采用各种C系统作为学习工具,例如国内使用较多的TURBO C系统,一些公开的免费C语言系统,如普通微机上可用lcc,Dev-C++等。

我特别感谢北京大学理科试验班和数学学院参加课程的同学们和参加辅导工作的研究生们,是他们的思考和问题给了我许多启示,使我更深入地理解了许多问题。我也要感谢我的家人与同事在这些年工作中给我的支持。

本书曾于1999年在北京大学出版社出版。这一新版对全书做了大幅度修改,反映了近年来我对许多问题的新认识,也使这个新版已经成为了另一本新书。由于机械工业出版社华章公司朋友们的大力支持,使得本书得以面世,我在这里向他们表示特别的谢意。虽然本书凝结着我多年工作和思考,但书中仍难免有或大或小的错误,这些都由我个人负责。希望读者能把发现的问题告诉我,也希望同行们对本书提出宝贵意见。

裘宗燕

北京大学数学学院信息科学系,2005年修订


2005.9