图书前言

第3版前言

(一)

这是一个信息时代。作为时代的宠儿,计算机在各行各业发挥着神奇的威力,而其灵魂来自程序设计。现在,程序设计不仅被视为计算机以及相关专业的看家本领,而且也成为这个时代文化的一部分,它所蕴含的逻辑思维给所有想开发脑力的人提供一种贴近时代的训练。为此,程序设计不仅作为计算机及其相关专业的必修课程被开设,而且几乎所有的理工科专业,甚至一些文科和艺术类专业也在开设。

屈指计算,程序设计课程已经开设半个多世纪了,但是教学效果却不尽如人意。因此,程序设计课程的改革成为课程改革的一个难点。笔者从20世纪80年代开始就将其作为自己努力的一个方向,不断进行探索。

最早进行的改革是将典型算法,如穷举、迭代、递归和一些软件工程的方法融入程序设计教学中。这些成果反映在笔者的第一本著作——《BASIC程序设计》(山西科学教育出版社,1985)中。之后,在这方面继续探索,在程序设计教学中进一步加入算法与数据结构的内容,以使学生得到更加系统的思维训练。这些探索成果总结在由笔者主笔、谭浩强主编的《BASIC程序设计教程》(高等教育出版社,1988)中。但是,这本书引入的算法和数据结构内容过多,尽管到了21世纪最初几年还有学校在使用它,但普遍反映其教学难度太大。

20世纪90年代中期,受国家考试中心邀请,笔者在NIT(国家信息技术考试)主持C模块的考试和教材编写。受CIT(剑桥信息技术测试)教材的启发,将程序测试加入到笔者编写的《程序设计(C语言)》(清华大学出版社,1999年)一书中,并且在这本书中将传统的语法体系改为问题体系。之后,在教学中不断修正,同时把改革扩展到面向对象程序设计(C++、Java)中。在C语言方面,笔者先后出版了《新概念C语言程序设计》(中国铁道出版社,2003)、《C语言程序设计案例教程》(清华大学出版社,2004)、《新概念C程序设计教程》(南京大学出版社,2007)、《新概念C语言教程》(中国电力出版社,2011)、《新概念C程序设计大学教程》(清华大学出版社,2012)、《新概念C程序设计(C99版)》。

经过几十年的摸索,一套全新的C程序设计教学改革的框架逐渐明朗:

* 实现从语法体系向问题体系的转变。

* 建立“程序设计 = 算法思维 + 语言艺术 + 工程规范”的知识和能力框架。

* 树立“以计算思维训练为核心,以能力培养为目标”的指导思想。

* 采用“前期以培养解题思路为主,语法知识够用就行;后期补充必要的语法细节”的教学策略。

* 按照“问题分析-设计代码-语法说明”线索进行局部安排。

令笔者欣慰的是,目前类似的书已经陆续问世,品种不断增加,这说明这支C语言程序设计教学改革的队伍在不断壮大。

(二)

C语言是一种高效、灵活、可移植、功能强大的程序设计语言。C语言从20世纪70年代初创立,迄今已半个多世纪还经久不衰,是程序设计语言历史上寿命最长的语言。

世界著名的TIOBE编程语言社区排行榜是编程语言流行趋势的一个风向标,每月更新,其数据取样于互联网上有经验的程序员、商业应用、著名搜索引擎(如谷歌、MSN、雅虎等)的关键字排名、Alexa上的排名等。图0.1为其在2016年1月份发表的排行榜图,可以看出其他程序设计语言跌宕起伏,而C语言一直名列前茅。非但如此,多种位于前列的程序设计语言(如C++、Java、C#、Objective C等)都是以C语言为母体发展起来的。所以,学习程序设计从C语言开始是一种明智的选择。

图0.1  2016年1月份发表的TIOBE编程语言社区排行榜

当然,C语言也在不断发展之中。1978年美国电话电报公司(AT&T)的贝尔实验室正式发表了C语言。开发者B.W.Kernighan和D.M.Ritchie随即编写了著名的《The C Programming Language》一书,通常简称为《K&R C》,也有人称之为K&R C标准。但是,K&R C第一版在很多语言细节上不够精确。

1983年美国国家标准化协会(American National Standards Institute)制定了一个C语言标准并于同年发表,通常称之为ANSI C,并在此基础上不断修订,于1989年末提出了一个报告——[ANSI 89]。1990年,国际标准化组织ISO(International Organization for Standards)通过了此项标准,将其作为ISO/IEC 9899:1990国际标准,俗称C89或C90。

1995年,ISO修订C90,形成“1995基准增补1(ISO/IEC/9899/AMD1:1995)”,俗称C89修正案1或C95。1999年通过ISO/IEC 9899:1999,ISO对C语言标准进行了更重要的改变,俗称C99。2011年12月8号,ISO 发布了 C 语言的新标准——ISO/IEC 9899:2011,俗称C11。

但是,国内C程序设计教材多数还基于C89甚至更早的标准,这种落后使得教学脱离应用,与世界潮流很不合拍。因此当务之急是过渡到C99,这是编写本书的一个主要动机。在出版本书之前,笔者已经在清华大学出版社出版了《新概念C程序设计大学教程(C99版)》,本书在此基础上进一步完善而成。

目前支持C99并且简单易用的开发平台是DEV C++,它有两款,即Orwell Dev-C++和wxDev-C++。截止到本书定稿,Orwell Dev-C++的最新版本是5.7.0,wxDev-C++的稳定版本是7.4.2,它们的下载地址分别如下。 

http://bloodshed-dev-c.en.softonic.com/ 

http://sourceforge.net/projects/orwelldevcpp/?source=typ_redirect 

http://wxdsgn.sourceforge.net/ 

(三)

本书基于“以计算思维训练为核心,以能力培养为目标”的教学模式和“前期以培养解题思路为主,语法知识够用就行;后期补充必要的语法细节”的教学策略编写。全书共9单元可分为4个部分。

第1部分是针对C程序设计的初级训练:第1单元介绍进行C语言程序设计首先应当掌握的一些基本概念和方法;第2、3单元在第1单元的基础上介绍判断结构和重复结构,第4单元介绍穷举、迭代、递归和模拟,奠定算法基础。然而这个基础比较厚重,要想不冲淡突出程序设计思路的主体,又把这个厚重的基础语法讲清楚,在时间上,特别是在课时上是不允许的。为此,这3单元中都含有3个部分内容,即主体部分、知识链接和习题。在主体部分只从如何使用的角度介绍笔者所遇到的语法知识,把进一步的、较为系统的介绍放到知识链接中介绍。教师在讲授时可以以主体部分为主,参考知识链接部分;或者把知识链接部分作为学生课后的阅读材料使用。这样就可以解决学习内容厚重与教学学时有限之间的矛盾,也可以激发学生自学的热情,满足不同学生的学习需求。在这一部分还介绍了非常重要但在之前被忽略的一些语法知识,例如表达式的副作用以及序列点等。

第2部分是在第1部分的基础上进行数据类型的扩展,第5单元介绍数组,第6单元介绍3种可定制数据结构——构造体、共用体和枚举,第7单元介绍指针及其应用。

第3部分只有第8单元一个单元,介绍分治、回溯、贪心策略和动态规划,作为算法设计进阶,可以使读者的程序设计能力提升到较高水平。

第4部分用第9单元一个单元介绍一些可能用得着的有关内容,包括外部变量、内联函数、带参宏定义、文件和位操作。

这样的结构可以满足多种不同层次的教和学的需求:

以对程序设计作一般了解为目标者,可以重点学习第1部分,并对第2部分进行了解性学习;以掌握程序设计的基本方法为目标者,可以重点学习前两部分内容,对第3部分和第4部分进行了解性学习;以较深入掌握程序设计的方法为目标者,可以在熟练前两部分的基础上,进一步深入学习第3部分和第4部分。

(四)

为了便于不同角度的复习与训练,本书的习题中设置了5种栏目,即概念辨析、代码分析、探索验证、思维训练和开发练习。

“概念辨析”主要提供了一些选择题和判断题,旨在提高读者对基础语法知识的了解。

“代码分析”包括指出程序(或代码段)执行结果、改错和填空,旨在提高读者的代码阅读能力,因为读程序也是程序设计的一种基本训练。

“探索验证”主要用于提示或者指导学习者如何通过自己的上机验证来提高对语法知识的掌握,除了这个栏目中的习题以外,学习者最好能通过设计程序验证自己对于概念辨析栏目中的习题的判断是否正确。

“开发练习”是一种综合练习,应当要求学习者写出开发文档,内容主要包括问题(算法)分析、代码设计、测试用例设计、测试及调试结果分析等几个部分,重点应当放在问题分析、代码设计和测试用例的设计上,要把这些都做好,再上机调试、测试,不要什么还没有设计出来就去上机。

“思维训练”中给出了有一定难度的问题,只用于算法设计训练,不要求给出程序。这个栏目仅在第4、5、8三个单元设置。

为了有的放矢地进行一些重要专题的训练,第4、7、8三个单元的习题以大节为单位给出。

(五)

在本书的编写过程中,赵忠孝、张秋菊、张展为、张展赫、姚威、史林娟、戴璐、张友明、董兆军等人参与了部分工作。此外,本书初稿完成之后,还承蒙《品悟C—抛弃C程序设计中的谬误与恶习》一书的作者薛非先生为本书提出了许多宝贵的意见。

在本书即将出版之际,笔者由衷地感谢以上各位为本书所做的贡献,也要感谢在本书编写过程中参考过的有关资料的作者,包括一些网络佚名作者。同时,殷切地期待广大读者和同仁的批评与建议,让我们共同努力,把程序设计课程的改革做得更有实效。

                                                               张基温

                                                     2017年1月羊城小海之畔