第2版前言
本书第1版自2009年出版至今,已经历了5个年头。5年来我国高等教育发生了很大变化,各高校的程序设计教学也发生了深刻变化。“以程序设计为主”的教学思想已经被广泛接受,并正逐步深入到程序设计课程教师心中。5年来,“计算思维”的思想得到广泛的关注和认可,程序设计课程要培养学生的“计算思维”能力被广泛接受。“计算思维”不是狭义的计算机编程;而是运用计算机科学的基本概念进行问题求解、系统设计以及人类行为理解等涵盖计算机科学之广度的一系列思维活动;就如同读、写、算能力一样,是所有人必须具备的思维能力。正如Edsger W. Dijkstra所说:“我们所使用的工具深刻地影响着我们的思维方式和思维习惯,进而也将深刻地影响着我们的思维能力。”计算机技术的普及已经深刻地影响了现代人类生活的各个方面。本教材作为普通高等教育“十一五”国家级规划教材,经过多年的使用,在“以程序设计为主”和“培养学生计算思维能力”方面起到了积极作用,但也发现了部分问题。在这种形势下,有必要对第1版进行修订。本版继续保持了第1版的特色,更加明确了“以程序设计为主”和“培养学生计算思维能力”的教学宗旨;进一步提出以“计算思维”主导程序设计的教学思想。
本书以实际应用为背景,面向编程实践和求解问题能力的培养,以“案例驱动”不断引入相关知识点,随着案例的不断深入,将程序设计各相关知识点展现在读者面前,形成一条完整的知识链条。案例选取以学生接触最多的“成绩信息管理”为线索进行组织,且与实际应用紧密相连。在任务驱动式的叙述过程中,由浅及深、循序渐进地启发读者编写规模逐渐增大的程序,并将程序设计的思想和方法在不知不觉中融入程序的编写过程中,达到培养“计算思维”能力的目的。
本书注重对学生逻辑思维的训练,强调对思维过程的描述。书中所配大量例题都使用PAD图描述程序逻辑结构,而非直接使用代码讲解,使本书图文并茂。相比传统的流程图和NS图等,PAD图具有可见性好、结构唯一、易于编制、易于检查和易于修改等优点,更适合讲述程序设计,同时也避免了直接使用代码讲解算法的呆板和枯燥。使用PAD图帮助读者理解程序设计的逻辑思维方式、培养计算思维能力,最终达到举一反三、融会贯通地掌握程序设计的思想和方法。
本书以C语言作为工具,介绍计算思维方法和程序设计基本思想,但并不拘泥于C语言本身的语法,对C语言本身采取了“有所取、有所不取”的策略。对于那些常用的语言成分,直接与讲述程序设计方法有关的语言成分,穿插在程序设计过程中详细、准确地介绍。对于那些与程序设计方法联系不太紧要,但是还常用的部分,放在最后简单介绍。对于那些与讲述程序设计方法关系不太大,也不常用的部分则根本不涉及。这样做的目的是使读者在学习程序设计之后,不受编程语言限制,灵活应用这些思想和方法。
本书在内容编排上注重教材的易用性和普遍性,增加了对计算机、操作系统、开发环境等基础知识的介绍,使初学者能够在零基础的情况下尽快入门,并进行实际操作。同时书中增加了对关键点和注意事项的提示信息,方便快速查找,便于读者建立对全书知识点的列表,能够宏观掌握全书内容。每章之后都配有相关习题,全部为程序设计题目,供读者做练习和进一步提高使用。
本书程序采用统一的代码规范书写,并注重程序的健壮性,其目的是使读者从开始学习程序设计时就养成良好的程序设计习惯和风格,避免因程序书写不规范需要二次返工的尴尬情况,为日后实际应用打下坚实基础。
使用本书时一定要把握“以培养学生计算思维能力为宗旨”、“以培养学生程序设计能力为目标”这一原则,一定要以“程序设计为主线”,不要再回到“解释语言”的老套路上。
本书第1、2、4、7、8、10、12、13章由陈娟执笔,第3、5、6、9、11章由张长海执笔,最后由陈娟统稿。
限于作者水平,书中难免有疏漏和不妥之处,敬请广大读者批评指正。
作者 2014年4月于长春
第1版前言
随着计算机技术的不断发展,计算机应用的逐步普及,人们对于大学程序设计课的认识也在不断更新。
最早在20世纪70年代及其以前,计算机应用十分狭窄,所谓“搞计算机”的人也很少。那时的计算机专业是在研究计算机本身,相应的第一个程序设计课称为“算法语言”。学习该课程的目的是学习程序设计语言本身(绝大部分学校都选讲ALGOL 60),而对于怎么用这个语言不太关心。因为那时的教学目的是让学生研究计算机本身,是要制造计算机,是要研究透程序设计语言本身的语法和语义,并实现它。
目前已经进入21世纪,计算机已经渗透到各个领域,甚至已经普及到家庭,它像电视、冰箱一样,是家用电器之一。计算机专业的规模与30年前大不一样,据2005年统计,全国办“计算机科学与技术”专业的院校有741所,“计算机科学与技术”专业在校生人数超过45万;目前保守估计,全国办“计算机科学与技术”专业的院校超过800所,“计算机科学与技术”专业在校生人数超过50万。若再加上软件工程、计算机网络、信息技术等计算机类的专业,全国的计算机专业数和在校生数还将比800和50万多得多。
面对如此庞大的队伍,我们的毕业生不可能都去研究计算机本身,社会也不需要这么多人从事计算机研究。所以,现在计算机专业的含义已经完全与30年前的计算机专业不同了,现在绝大部分计算机专业人员主要是从事“计算机应用”,甚至是在“应用计算机”,而不是在研究计算机本身了。
再进一步,由于计算机的普及,高等院校各专业都在使用计算机解决本领域的问题,各专业的学生都需要学习“程序设计”,显然这些非计算机专业人员学习的目的更是在“应用计算机”。
在这种形式下,程序设计课怎么讲?摆在每个组织计算机教学的人面前,更摆在教授程序设计课的教师面前。目前学习程序设计的人大致可以分成三类:
从事计算机研究的人员,这类人员极其少量;
计算机应用和应用计算机的人员,这类人员是绝大多数;
程序编码人员,这类人员是高职高专培养的目标,社会需求极大,但学校培养的人数有限。
本书针对计算机应用人员和非计算机专业人员(应用计算机人员)。在面向应用的大背景下,程序设计课不应该再去讲程序设计语言本身了,而应该讲程序设计语言的应用。应该把授课重点从讲授语言的符号、语句等语言成分上,转移到讲授程序设计上。教学的目的是教会学生“怎么编程序”,而不是背几个语言符号、说明、语句等。应该把该课程的名字从“×××语言”改为“高级语言程序设计”、“程序设计基础”或“程序设计”。尤其一些非计算机专业开设该课程,更应该跳出讲授“语言”的误区。因为他们更是在“应用计算机”,是用计算机解决本专业领域的问题,更没有必要背那些死的语言符号、语法概念,更应该是学会怎么编程序。
本书秉承面向应用的主导思想,依托C语言讲述“程序设计”,重点在于程序设计。在这种思想指导下,对C语言本身采取“有所取、有所不取”的策略。对于那些常用的语言成分,直接讲述与程序设计方法有关的语言成分,穿插在程序设计过程中详细、准确的介绍;对于那些与程序设计方法联系不太紧要,但是还使用的部分,放在最后简单介绍;而对于那些与讲述程序设计方法关系不太大,也不常用的部分则根本不涉及。
本书秉承“授之以渔”而非“授之以鱼”的理念组织教学内容。“以案例为驱动”,使用大量例题讲解程序设计思想和方法。“案例”不是为了解释语言概念,而是从构造算法出发,以训练学生的实际编程能力为目标。彻底改变过去那种单纯解释语法、语义等语言成分的做法。改变那种提出一个很小的问题,然后给定相应的不太大的程序,最后解释程序中各个语句、说明的作法。让程序设计始终贯穿于整个教学过程,使教学内容更贴近应用。针对程序设计的每个知识模块都采取如下模式讲授:
提出有意义的问题→设计算法→分析算法特点→编出程序
→介绍使用的C语言成分→配合讲述大量例题→课后习题与实践
在上述过程中,把重点放在设计算法和讲述算法特点上。例如,全书开篇从有趣的“鸡兔同笼”问题开始,引进算法、程序、程序设计等概念,既讲授了抽象的概念又调动起了学生的学习兴趣。
作为大学本科计算机基础课教材,本书具有如下特点:
(1) 最大的特点是“以程序设计为主线”、“以案例为驱动”。按程序设计的思路组织全书内容,真正地在讲授程序设计,而不是讲语言,摒弃了目前各种程序设计书中流行的主要“解释程序设计语言”的作法。
(2) 整体结构好,章节安排合理,由浅入深地介绍程序设计知识。比如有关函数的知识,由浅入深地分散到四章中介绍;有关指针的知识也分散到五章中介绍,以免集中在一章,使读者学起来枯燥乏味,接受困难。
(3) 全书自始至终贯穿结构化程序设计思想,所有例题都具有良好的结构和程序设计风格。目的是给读者一个示范,使读者从开始学习程序设计就养成一个良好的程序设计习惯和风格。
(4) 图文并茂,引进PAD图表示程序逻辑。PAD图的结构比传统的流程图、NS图等都好,同时也比直接用程序表示算法更直观,易于理解。
(5) 配备大量例题和习题,并且全部为程序设计题目。例题讲解从构造算法出发,以训练读者的编程能力为目标;概念、语言成分的介绍穿插在程序设计之中。本书全部例题都在Microsoft Visual C++6.0的环境下调试通过。大量的习题供读者做练习和进一步提高使用。
全书共13章,大致分为4部分。
第1部分基础知识,为第1章,介绍计算、算法和程序设计基本概念。
第2部分程序设计,包括第2、3、4、5、9、11章。第2章为简单的程序设计,介绍顺序程序设计、数据及其类型、表达式、赋值、输入输出等;第3章介绍分支程序设计;第4章介绍循环程序设计;第5章简单介绍模块化程序设计思想,引进子程序和函数概念;第9章进一步介绍函数,讲述参数、作用域、递归程序设计;第11章介绍程序开发和结构化程序设计,包括结构化程序设计原则、程序风格、自顶向下逐步求精的程序设计技术。
第3部分数据组织,包括第6、7、8、10、12章。第6章介绍批量数据组织——数组;第7章介绍指针;第8章介绍对复杂的表单数据的描述,引进结构体和共用体;第10章介绍外部数据组织——文件及其操作;第12章介绍动态数据组织及其在程序设计中的应用。
第4部分为第13章,若干深入的问题。进一步介绍函数,讲述函数作参数、函数值、函数副作用、递归等;以及存储类别、位操作、位段、goto语句、编译预处理等。
本书第1、2、3、4章由张长海执笔,第5、6、7、8、9、10、11、12、13章由陈娟执笔。最后由张长海统稿。
在本书的编写过程中,作者参阅并引用了国内外诸多同行的文章、著作,在此作者向他们致意,并恕不一一列举、标明。在本书的成书和出版过程中得到清华大学出版社的帮助和大力支持,作者在此向他们表示由衷的感谢。
限于作者学术水平有限,错误和不足在所难免,敬请各位读者批评指正。作者十分感谢。
作者 2009年1月于长春