《从问题到程序——程序设计与C语言引论》(第2版)
前 言
裘宗燕 |
作为计算机科学教育的第一门专业课程,程序设计课程的重要性毋庸置疑。本书的目标是作为第一门程序设计课程的教材或入门自学读物,内容集中在如何理解程序语言,如何做程序,如何为在计算机领域中的进一步学习和工作做好准备上。 本书以 C 作为工具语言,讨论了基本程序设计的各方面问题。书中实例没采用常见的“提出问题,给出程序,加些解释”的简单三步形式,而是强调问题的分析和讨论,意在帮助读者认识程序设计的实质,理解从问题到程序的思考过程。书中尽可能详细地解释了与 C 语言和程序设计有关的各种问题,通过大量实例讨论了分析和分解问题,找出主要步骤,确定函数抽象,找出循环,选择语言结构,最后做出所需程序的过程。 程序设计应该注重系统性和科学性,有关研究的发展形成了程序的理论。入门书不可能深入介绍理论成果,但也要反映其精神,使初学者从开始就接触到程序的一些本质问题。本书特别强调问题的分析,将函数的概念尽可能前移,而后反复讨论,实例中也特别注重程序的功能分解。书中还介绍了一些深入的理论问题,如通过统计程序运行时间介绍计算的基本性质(复杂性),通过分析循环过程是否完成所需工作介绍“循环不变关系”的概念等,这是希望帮助读者了解更多情况,也作为思考程序的线索。 程序设计也是一种工程性工作,需要寻找可能的解决方案,评价不同方案并做出选择,还要对所做选择有清醒的认识(优点、缺点、倾向性或不足)。工程中通常没有完美的结果,更多是权衡和折中。程序设计也是如此。本书的许多实例包含较详细的分析讨论,不少实例给出了基于不同考虑形成的多种解法和性质比较,有时还指出其他可能性,提出了还可能如何看问题、如何做等,以帮助读者理解程序设计的真谛。书中还常给读者提出一些问题,希望读者发挥思维能力和主观能动性。书中练习也力图反映这些想法。 本书强调:编程问题没有需要记住的标准答案。由于对问题的不同考虑,设计中的不同选择,对同一问题可以得到许多合理而正确的不同程序。它们常常各有长短或各有侧重,或反映了对问题的不同认识。在这里应特别学习如何分析问题,如何把复杂问题分解为相对简单的部分,如何在可用功能中选择等。进而,还应该认清各种选择的后果,包括收获和损失。各种书籍(包括本书)里的程序不是“金科玉律”,只是作者对问题的一种理解,必然存在很多其他可能性。要学好程序设计,应该养成一种习惯:读程序时要特别注意思考作者的考虑和选择,分析其中哪些是合理而有价值的(或不合理无价值的),还可能有哪种选择,采纳其他选择可能得到什么(或失去什么)等。这样思考将使人受益无穷。当然,这并不是说书中示例不重要。 恰恰相反,因为程序设计中有许多可能选择,好的教科书应当给出好的分析和选择,供读者参考。入门书还应解释所做选择的理由,指出带来的问题(缺点和限制等)。正如本书书名所示,程序设计是“从问题到程序”的思考和工作过程。学好程序设计,既要发挥聪明才智,也需要细致认真、一丝不苟的工作态度。 考虑入门课程的需要,并没有一种语言具有无可比拟的优势,无论用什么语言教基本程序设计,都需要考虑其有利方面,处理其不利因素。本书选择C语言的主要理由是:C是使用最广的语言之一,包含了基本程序设计需要的主要机制,能满足课程的需要。学生可以用它完成练习,得到相关的知识积累和能力锻炼,还能掌握一种实用工具,作为后续课程学习的基础。C语言适合(也正在被)作为许多计算机专业课程的教学语言。 C 是很灵活的语言,用它写程序常需要了解一些细节,这是人们对用 C 作为基础课语言的主要疑虑。但另一方面,用C写程序可能得到对程序设计的更多认识。C 程序可以在较低层次上做,也可以在较高层次上做,学生需要理解程序设计中各种层次的问题。此外,许多语言从 C 借鉴了想法和表达形式,有些就是 C 的扩充和发展,C 语言知识对于进一步学习其他语言,包括未来的新语言都很有价值。 本书以程序设计为基本线索,也详细介绍 C 语言的各方面情况。这里强调的是如何认识程序、写程序、用 C 语言写程序,特别强调好的程序设计风格,强调“好的”C程序设计,强调通过函数抽象建立清晰结构的重要性,强调程序的良好结构、可读、易修改,也指出了多种不良编程习惯及其危害。历史原因使C成为一个不太严格的语言,如不注意,用 C 写的程序有可能隐藏一些不易发现的错误*。ANSI C 和 C99 倡导“好的” C 程序。本书坚持这一正确方向,讨论如何写出更可靠且不易包藏隐含错误的清晰、简洁、高效的 C 程序,通过实例说明应该如何写和不应该如何写。书中介绍了许多实用的 C 程序设计技术,详细解释了 C 语言的结构和机制,也尽量提供了一些背景说明。 本书包括如下各章和若干附录: 第 1 章,程序设计和C语言。介绍程序与程序语言的概念,C 语言的发展及其特点。用一个小例子介绍 C 程序形式,其加工和执行。最后介绍程序设计与开发过程。 第 2 章,数据与简单计算程序。讨论程序语言的许多最基本概念,包括:字符集、标识符和关键字,数据与类型,数据表示,运算符、表达式与计算过程,数学函数库的使用等。 第 3 章,变量、函数和流程控制。讨论程序设计的一些基本问题,包括语句与复合结构,变量及其使用,简单函数定义,逻辑条件的描述与使用等。最后介绍了几种基本控制结构。 第 4 章,基本编程技术。首先讨论循环程序设计的基本问题,通过一系列程序实例分析了循环的构造过程。此后介绍了 C 语言其他控制结构及其使用。 第 5 章,C 程序结构。讨论 C 语言的许多具有一般性的重要问题,主要是C程序结构,函数概念及有关的问题,预处理命令和预处理过程,递归的概念等。 第 6 章,顺序数据组织:数组。介绍数组概念、定义和相关程序设计技术。 第 7 章,指针的应用。介绍指针概念和指针变量的使用,指针与数组的关系,多维数组作为参数的通用函数,以及动态存储管理,类型定义,指向函数的指针等。 第 8 章,文件和输入输出程序设计。讨论了文件概念,与输入输出有关的各种问题,标准库的输入输出功能,以及输入输出的程序设计问题。 第 9 章,结构和复杂数据组织。介绍结构(struct)、联合(union)、枚举(enum)等数据定义机制的意义及在程序中的使用。随后简单介绍了链接结构的概念。 第 10 章,程序开发技术。介绍程序设计和开发的一般性问题和技术,分块开发等。 第 11 章,标准库。介绍标准库提供的各方面功能及其相关知识。 第 12 章,C99 导引。介绍 C99 的重要扩充,变长数组和标准库的几个新数值包。 最后是两个附录和进一步学习的建议。 本书以ANSI标准C语言为背景,参考了 C99 的新发展,内容不依赖任何具体 C 系统。读者可用任何符合标准的 C 系统作为编程环境,如国内常见的微机、工作站或其他计算机上的 C 系统。本书里的所有实例程序按 ANSI C 和 C99 标准书写,习题不涉及任何具体系统环境。读者可以用各种C系统作为学习工具,如国内使用较多的 TURBO C、VC 系统,一些公开的免费 C 语言系统(如普通微机上可用lcc、Dev-C++等)。
新版说明本书最早于1999年在北京大学出版社出版,2005 年在机械工业出版社重新出版时做了大幅度修改,反映了对许多问题的新认识。现在这个新版对内容和结构进行了全面修订,特别加强了针对近年日益受到业界和学术界重视的问题的讨论。C 语言系统和相关教育正在向 C99 标准转变,但本书并不强调这一转变,因为 C99 是 ANSI C 的一个合理扩充,任何好的 ANSI C 程序都是好的 C99 程序。本书前一版里的示例程序早已贯彻了 C99 的精神,符合 C99 标准。本版新增的第 12 章是上一版附录 C 的扩充和增强。这一版的主要修改包括:1.进一步贯彻了以程序设计的思想和技术为中心的编写思想。本书原本就不打算作为一本“考试用书”,其目标是培养有能力、有发展潜力的计算机程序工作者。这一基本想法在新版的内容和组织中得到了更好的反映。 2.书中各章的基本部分只介绍C语言中在一般程序设计里使用最广泛的重要内容,以便更集中地讨论相关的程序设计技术和方法。有关C语言一些细节问题的解释集中放在各章最后,单独列为一节。这种做法既避免了过多的语言细节干扰讨论的主干内容,也使课程教学内容的安排有了更多选择。 3.近年计算机的应用飞速发展,连接全世界大量计算机的互联网形成了一个全球性的信息环境,越来越多的计算机系统嵌入在各种机器、设备、仪器、交通工具、基础设施里。在这种大背景下,计算机系统的安全性变得越来越重要。与此同时,计算机软件的脆弱性带来的危害和威胁也越来越严重。程序的强健和安全是计算机系统安全的基础。但以往的编程教科书基本上不讨论程序安全性,不考虑程序输入或函数参数不满足需求时的程序行为问题。一些专家认为,计算机基础教育中的这种缺失是今天计算机系统脆弱的一个重要根源。本书大大加强了安全性方面的讨论,在讨论各种程序设计技术的同时,认真分析了相关C程序结构中的脆弱点和可能的编程缺陷,提出了提高程序强健性的技术手段。作者相信,这些讨论对于培养明天合格的计算机程序工作者是非常重要的。希望这一考虑能受到教授相关基础课程的老师和本书自学者的重视。 作者特别感谢北京大学理科试验班和数学学院参加相关课程学习的同学们和参加辅导工作的研究生们,他们的思考和问题给了作者许多启示,使作者更深入地理解了许多问题。作者还要感谢家人与同事多年的支持。华章公司有关人员为本书做了大量工作,在此致以特别的谢意。虽然本书凝结着作者多年的思考,但仍难免包含错误或不足,这些都由作者个人负责,也希望得到读者的指正和同行的宝贵意见。 裘宗燕 北京大学数学学院信息科学系 * 任何语言都有弱点。有句话说:“最好的语言也不能防止人写出坏程序。”这不是说语言不重要,而是说任何语言都有正确使用的问题。C在这方面的问题突出一点,读者应特别注意。 |
2011.12 |