图书前言

第2版前言

本书是专为高职高专学生编写的,介绍怎样使用C语言进行程序设计的教材。

近十多年,我国职业教育从层次走向类型,从政府主体走向多元参与,从规模扩张走向内涵发展,建成了全世界规模最大的职业教育体系。

优化类型定位,努力培养高素质、高水平的应用型人才,是国家和社会的迫切需要。教材建设也应当服务于这个目标。

程序设计是计算机工作者的一项基本功。C语言是在国内外被广泛学习和使用的一种计算机语言,受到广大计算机爱好者的喜爱。我国几乎所有的理工科大学都开设了C语言程序设计课程。

为了使C语言程序设计课程教学取得更好的效果,需要弄清楚以下几个问题。

一、 为什么要学习程序设计

计算机的本质是“程序的机器”,程序和指令的思想是计算机系统中最基本的概念。只有懂得程序设计,懂得计算机是怎样工作的,才能较深入地理解和应用计算机,才能较好地懂得怎样使计算机按照人们的意图进行工作。学习程序设计,能学习到计算机处理问题的方法,培养计算思维,培养分析问题和解决问题的能力。

通过学习程序设计,使学生具有程序设计的初步知识,具有编写程序的初步能力,知道软件开发的过程和特点,有利于在各专业领域的工作者在今后工作中,能够与程序开发人员沟通合作进行应用软件的开发工作。因此,高职高专学生学习程序设计是很有好处的。

具体地说,学习程序设计的目的有两个方面: ①学习用计算机解决问题的思路和方法; ②学习怎样用计算机工具去实现算法,即利用计算机去完成任务。

二、 C语言是基础而实用的语言 

进行程序设计,必须用计算机语言作为工具,否则只是纸上谈兵。可供选择计算机的语言有很多种且各有特点。C语言既是程序设计的基础,又非常实用。并不是每一种计算机语言都具有此特点,有的计算机语言实用,但不能作为基础语言(如FORTRAN);有的计算机语言可以作为基础语言,但实际应用不多(如Pascal)。C语言功能丰富、表达能力强、使用灵活方便、应用面广、目标程序效率高、可移植性好,既具有高级语言的优点,又具有低级语言的许多特点;既适合编写系统软件,又能方便地用来编写应用软件,是多年来在国内外使用较广泛的一种计算机语言。

国内外许多专家认为,C语言是通用语言,有了C语言的基础后,以后过渡到任何一种语言(如C++、C#、Java)都不会困难。C语言被认为是计算机专业人员的基本功。

三、 怎样学习C语言程序设计

1. 准确掌握本课程的特点与定位

C语言程序设计不是一门理论课程,它有很强的应用性,要根据应用的需要来设计课程体系和取舍内容。学习好坏的标准不是“知道什么”,而是“会做什么”,应当强调培养应用能力。但是它又不同于高职高专一些技能性或工艺性的课程,C语言学习的过程不是简单的重复和模仿,“熟能生巧”,而是需要领会精神,掌握规律,开动脑筋,认真思考,有所创造,是充满思想活力的过程。学习的方法不是简单的“动手干”,而是要“动脑思考,动手实践”,实践包括编程和上机。学生领到开发任务后,首先要认真思考解题思路,设计最优算法,然后编写出高质量的程序,这是有创造性的智力劳动,是学习和培养科学思维的过程。

本书介绍了许多例题,并不是要求学生只是看懂和重复这些例题,而是要求学生学习解决问题的思路,从而能举一反三,能独立解决其他问题。

2. 正确处理好算法和语法的关系

程序设计有四个要素: ①算法是程序的灵魂; ②数据结构是加工的对象; ③语言是编程工具(算法要通过语言实现); ④要采用合适的程序设计方法。程序设计教学是否成功取决于能否将以上四个要素(尤其是算法与语言)紧密结合。

本书自始至终把四个要素自然而有机地结合,尤其是能正确处理好算法和语法的关系。算法和语法这二者都重要,不掌握算法就如同无头苍蝇,无从编程;不掌握语法就编不出能用的程序。学习程序设计应当把主要精力放在算法上,算法是活的,语法是死的。基本的语法规则是需要了解和掌握的,但是没有必要去死记那些烦琐的语法细节,用到时查一下就可以。程序看多了、编多了,自然就会正确使用语法规则。学习C语言程序设计,不要把重点放在死记语法规则上。

本书不是介绍语法的书籍,不是以语法为主线构建课程体系,也不是系统介绍算法的教材,而是从应用的角度出发, 以编程为目的和主线,由浅入深地介绍怎样用C语言处理问题。通过精心安排顺序,细心选择例子,由易而难选择算法,与此同时引入相应的语法规则,把算法和语法紧密结合,同步展开,步步深入,使学生易于学习。

具体的做法是: 每一章先举几个比较简单的例子,引入新的问题,接着介绍怎样利用C语言去解决比较简单的问题,然后循序渐进地介绍较深入的算法和程序,使学生在富有创意、引人入胜的编程中学会了算法,掌握了语法,领悟了程序设计的思想和方法。把枯燥无味的语法规则变成生动活泼的编程应用。

建议教师在讲授本书内容时,以程序为中心展开,着重讲清解题思路以及怎样用程序去实现它,不要孤立地介绍语法规则。可以在讲解程序时扼要地介绍有关的语法规则,请学生课后自己阅读,并通过上机实践掌握它。

 3. 采取新的教学思路和方法

以往的课程教学采取的方法是 “提出概念—解释概念—举例说明”的方式,著者在多年前根据课程特点提出了“提出问题—解决问题—归纳分析”这种新方式,不是先抽象后具体,先理论后实际,先一般后个别,而是由具体到抽象,由实际到理论,由个别到一般,由零散到完整。实践证明这种方法对广大计算机的初学者是成功的,可以收到事半功倍的效果。根据这个原则,我们创建了新的教学和教材体系,已在实践中证明效果很好。

在介绍每一个程序时,我们的做法是: 先提出任务目标,然后分析问题,探讨解题思路,构造算法,接下来才是根据算法编写程序,而不是先列出一个程序再解释程序。对每一个问题都按照“任务要求—解题思路—编写程序—运行结果—程序分析”等步骤展开。对每个求解的问题不仅给出程序,而且给出运行结果,使学生看到结果,便于学生对照分析。有些程序还包括对改进程序的讨论,这样学生在学习过程中就不会觉得抽象,而会觉得算法具体有趣,看得见,摸得着。

本书的叙述充满启发性,在程序分析中不断提出问题让学生思考,如“这是为什么?”“为什么要这样做?”“为什么这个方法是错的?”“还有什么更好的方法吗?”等,启发学生自己思考求解,培养他们独立思考的能力。对于需要学生注意的内容用说明、注意、提示、思考等标题以醒目的字体标注,从而引起注意,使学生的思路更加清晰,更容易接受和理解。

在各章中由浅入深地结合例题介绍各种典型的算法。对穷举、递推、迭代、递归、排序(包括比较交换法、选择法、起泡法)、矩阵运算、字符处理应用等算法做了详细的介绍,对难度较大的算法还做了清晰且详尽的分析。引导学生在拿到程序设计题目后,先考虑算法再编程,而不是坐下来就写程序,着力培养学生的科学思维能力及良好的编程习惯。 

4. 对有效地学习C语言程序设计的建议  

(1) 在学习开始时不要在语法细节上死记死抠。请记住: 重要的是学会编程序,而不是死记语法。一开始就要学会看懂程序,编写简单的程序,然后逐步深入。有一些语法细节需要通过长期的实践才能熟练地掌握。初学时,切忌过早地滥用C语言的某些容易引起歧义的细节(如不适当地使用++和--,就会出现一些“副作用”)。

(2) 不能设想今后一辈子只使用在学校里学过的某一种计算机语言。但是无论使用哪一种计算机语言进行程序设计,其基本思路和方法都是一样的,在大学里学哪一种计算机语言并不是一个很重要的原则问题。学会了一种计算机语言,可以很快地学会另一种计算机语言。因此,在学习时一定要学活用活,举一反三,掌握规律,学会算法,在以后需要时能很快地掌握其他的计算机语言来进行工作。

(3) 在学校学习阶段主要是学习程序设计的方法,进行程序设计的基本训练,打好将来进一步学习和应用的基础。学习程序设计课程时,应该把精力放在最基本、最常用的内容上,学好基本功。如果对学生有较高的程序设计要求,应当在学习完本课程后安排一次集中的课程设计环节,完成有一定规模的程序设计。

(4) 程序设计是一门实践性很强的课程,既要掌握概念,又要动手编程,还要上机调试运行,希望学生一定要重视实践环节,包括编程和上机,要既会编写程序,又会调试程序。对学生考核的方法不能采用标准题(是非题或选择题),而应当把重点放在编制程序和调试程序上。

(5) 使用哪一种编译系统并不是原则问题。程序编好以后,用哪一种编译系统进行编译都可以。如果有条件,可以了解和使用不同的编译环境。不同的编译系统,其功能和使用方法有些不同,编译时给出的信息也不完全相同,但基本方法大同小异。要在使用中积累经验,举一反三。

四、 本书的特点1. 本书的主要特点是概念清晰、通俗易懂(1)  概念清晰。本书对所有重要的概念都做了明确、清晰和透彻的阐述与分析,每引出一个概念,都明确讲清楚三点: ①它是什么?②它有什么用?③怎么用它去处理和解决问题。所有的概念都能从本书找到明确的说明。

(2) 通俗易懂。著者善于用通俗易懂的方法和语言阐明复杂的概念,而尽量少用深奥难懂的专业术语。不把简单的问题复杂化,而是使复杂的问题简单化。例如,“指针”是C语言的一个难点,许多人感到难以理解,但在本书中著者对“指针”的概念做了科学而通俗的说明,使人更容易理解,一看即懂。

2. 本书内容是根据高职高专的特点与要求确定的,适用于高职高专院校

在内容选取时,本书没有包括C语言中一些不常用的内容(如较复杂的输入/输出格式控制、指针较深入的部分、共用体类型、枚举类型、随机文件等。著者把它们作为提高的内容放入与本书的学习辅导一书中供学生选学),但是仍然保持了本书内容的系统性和完整性。由于本书通俗易懂,易于理解,因此,学生能够在有限的学时内学到更多的内容,达到更高的要求。著者认为应当保证高职教学的质量,不宜过分降低对高职学生学习的要求,否则他们掌握不了基本的编程方法。

3. 本书从有效学习程序设计的角度出发来构建教材体系

 本书不以理论知识来构建教材体系,也不以C语言的语法规则来构建教材体系,而是从怎样有效学习程序设计的角度出发来设计教材的内容,使学生从易到难、从简到繁、循序渐进地学会编程。著者在多年教学实践中对学生的情况有深入了解和研究,充分考虑学生的认知规律,构建了一个既科学又易学的教材体系,并精心设计教材体系,以程序设计为主导,降低门槛,分散难点,使每一章每一节的“台阶”都不大,很容易循序渐进,逐步深入。

4. 怎样使用本书

(1) 本书中的内容是基本的要求,希望学生能掌握。在每章的最后有本章小结,归纳本章的要点,尽量起到提纲挈领、画龙点睛的作用,以加深学生的学习印象。

本书内容较多,希望能安排足够的学时。前面几章难度较小,后面几章难度稍大,希望教学时能合理安排,统筹兼顾,防止前松后紧。尤其对“指针”部分要多花些时间和精力,使学生能真正理解并掌握。如果有少数学校学时实在不够,可以对第8章和第9章的内容做简单介绍,以使学生有一个初步了解,但不要跳过不学,这样在以后需要时再深入学习就不会感到困难。

(2) 本书便于自学。具有高中以上文化水平的人,即使没有教师讲解,也能基本上看懂本书的大部分内容,这样就有可能做到: 教师少讲,指定部分自学,保证上机实践。

(3) 为了满足学习能力较好的学生进一步提高的要求,我们另外出版了《C语言程序设计教程学习辅导》(ISBN 9787302556176)一书,其中的第二部分提供了学习本书各章时应进一步提高的内容,可供师生在教学中参考。

(4) 在本书每一章的最后都有习题,教师可从中选择一部分要求学生练习并完成。习题包括两类: 一类是程度适中,大多数学生是可以独立完成的;另一类是有一定难度,水平较高的学生可以完成其中一部分。如果学生感到无从下手,可以参考《C语言程序设计教程学习辅导》的第一部分“各章习题参考解答”。在该部分中提供了近100个问题的解答,实际上是提供了100个补充例题供师生参考。教师可以从中选一些作为补充例题在课堂上讲授,或指定学生自学,这样可以进一步提高教学水平。

希望大家善于利用《C语言程序设计教程学习辅导》中的“习题解答”和“提高部分”这两类资源。实际上我们提供的是一个多层面的教学体系,教师可以根据不同学校的教学要求、学生基础、学时情况等因素,把教材的基本内容、习题解答、提高部分、上机调试四者合理选用、有机组合,组成适合不同人群的教学方案,以取得更好的效果。

(5) 学习程序设计必须重视实践环节,至少保证上机实践的时间不少于课堂讲授的1/2,能增多一点时间更好。可以把课后指定要完成的作业与上机调试程序统一起来,完成作业后即上机调试程序。《C语言程序设计教程学习辅导》的第三部分“上机实践指南”可供上机实践时参考。

(6) 为了帮助更多的人学好C语言程序设计,本书著者之一、南京大学计算机基础教学部主任金莹教授以谭浩强所著的《C程序设计》一书为教材制作了慕课(MOOC),在爱课平台可以收看。《C程序设计》与本书的思路、体系和内容都是一致的,只是《C程序设计》的内容更多一些。本书的读者可以选择该慕课学习。

本书主要由谭浩强执笔,参加者有还有金莹教授和具有IT行业丰富实践经验的企业高级工程师。在本书编写过程中还征询了部分IT行业专家的意见。本书的编写和出版得到全国高校计算机基础教育研究会高职高专专业委员会和清华大学出版社的大力支持,得以在短时间内顺利出版,在此特向所有支持我们的朋友们表示由衷的谢意。

本书可能仍有缺点和不足,热切期望得到专家和读者的批评指正。 

谭浩强

2025年1月1日于清华园