图书前言

本书第一版于2009年8月出版,经过几年使用,作者在征求任课教师和学生意见的基础上,对第一版作出了修订。其一,增加了一章计算机基础知识的内容;其二,对第一版C语言程序设计的内容做了部分调整,力求使难点相对分散、更加易于理解;其三,对全书的习题做了调整和精简。

第二版中,对于某些有一定难度的内容,以()标注,这些内容在初次讲授时,教师可以酌情跳过,在章节结束后以总结的形式介绍给学生,或者可以直接略过不讲。

在教学中作者发现,很多学生学完整个课程后还不会调试程序,遇到程序出现错误就无从下手,程序调试已经成为学生编程实践中的绊脚石和拦路虎。所以,配合本书,又专门编写了《程序设计实践教程》一书,以实验为重点,介绍程序调试的原理和方法。

作者2013年5月

随着信息技术的迅速发展和深入应用,程序设计已经逐渐成为高校理工科各专业普遍开设的一门公共基础课。 通过学习该课程,学生可以从以下几方面受益: 掌握通过编程解决问题的方法和思路,训练逻辑思维能力;掌握正确、 规范的编程方法;培养严谨的科学作风;加深对计算机基本概念的理解。

正如学生学习了高等数学但并不需要所有学生都从事数学研究一样,学习程序设计后,并不要求所有学生今后都要从事计算机程序设计工作。作者认为,程序设计作为一门基础课程,其主要作用在于培养、锻炼学生的逻辑思维能力和问题解决能力。程序设计与数学在培养学生逻辑思维能力方面具有不同的作用。数学的主要功能在于培养学生的演绎逻辑思维能力,而程序设计的功能在于培养学生归纳、综合的逻辑思维能力。

由于历史和现实原因,目前国内的大部分C语言教材都是以C语言的语法规则为主线编写,教学重点放在C语言语法规则的学习方面。教学中过分注重C语言语法和一些细节的讲解,教材和课程基本上是以C语言语法体系为脉络展开的。这样,学生虽然花费了很大精力去学习语法,但还是不知道如何编写一个比较简单的程序,不知道怎样通过编程去解决实际问题。

针对这样一些问题,作者在多年教学经验的基础上,决定编写本教材。正如教材名称所蕴含的意义,本教材的重点放在程序设计的思路和方法上面,C语言只是描述程序的工具和手段。本教材具有如下几点特色: 

(1) 体系编排和内容组织上,全书强调程序设计过程就是问题求解过程,注重问题求解能力的培养。为了突出“程序设计为主,语法规则为辅”这样一种教学理念,本书将C语言的重要语法规则集中在第2章和第3章介绍,通过这两章的学习,学生可以编写出绝大部分常用程序。这样就为后续程序设计的学习扫清了障碍。

(2) Pascal语言设计者、图灵奖得主Niklaus Wirth教授曾提出一个著名论断“程序=算法+数据结构”。这个论断的本质是说,程序的核心是算法,算法的本质是处理数据,算法与数据不可分离。本教材很好地体现了这一思想,全书大部分内容都是围绕算法和数据组织展开,第4章~第8章都是围绕不同的数据组织方式来编写的。

(3) 在程序设计(算法设计)方面,本书严格按照“自顶向下、逐步求精”这样结构化的程序设计原则进行例题讲解,摒弃了大多数C语言教材中“提出问题,给出源程序,解释程序”的教学思路,而是根据学生的学习规律,采用“提出问题,分析问题,设计算法框架,算法细化,程序实现,程序测试”这样一个步骤来组织内容,这样的组织方式可以更好地培养学生的程序设计能力。

(4) 教材中增加了一定的程序阅读训练方面的内容。程序阅读能力,是进行软件逆向工程的一项基本技能,作者希望通过这样的训练,为学生打下一定的基础。

(5) 教材中涉及的算法尽可能分类组织,从算法设计策略上讲,教材中主要介绍了穷举策略、递推策略、递归策略、回溯策略。从算法所涉及领域来讲,主要包括数论算法、排序算法、查找算法、字符串算法、大整数算法、数值算法等。

对于初学者来说,程序设计课程具有一定的挑战性,在学习过程中要注意总结学习方法。在教学过程中,作者发现许多数学、物理学习成绩很好的同学,对程序设计课程也是非常头疼和畏惧,究其原因,主要是因为没有掌握正确的学习方法。那么什么是程序设计课程正确的学习方法呢?

我们知道,以数学为基础的数理学科的知识发展逻辑是演绎逻辑,教材一般是按演绎推理为线索以线性方式组织。对这类学科的学习,一般采用“循序渐进、步步为营”的方式学习,即彻底搞清楚前面的知识单元后,才能很好地学习后面的知识单元。

程序设计课程有不同的特点,主要表现在两个方面: 其一,程序设计的基础逻辑思想是归纳逻辑,其内容组织方式呈现网状特征,也就是说,在学习前面的内容时,很可能会涉及后面才会详细介绍的知识点;其二,程序设计是一门实践性很强的课程,任何一个程序设计问题,最终都是需要计算机帮助计算,而这必须反复调试才能得出正确结果。

根据这样一些特点,作者建议读者在学习时注意下面一些学习方法: 

(1) 对于该课程,建议采用“整体学习方法”,即在学习前面的内容时,如果遇到不懂的内容,先暂时接受,不要考虑“为什么”,继续学习后面的内容,注意各章节的重点内容。整个内容学习结束后,再回头解决前面的问题。这样反复学习,每一次学习都会有新的收获。

(2) 程序设计是一门实践性很强的课程,学习方法也重在实践,这有两个方面的含义: 其一,正如学习数学要有足够量的练习才能融会贯通一样,学习程序设计,也需要足够的上机编程实践才能找到编程的感觉;其二,即使是有经验的程序员,除了极其简单的问题可以一次写出正确的程序外,对于大多数问题,初次写出的程序都会存在或多或少的错误,因此上机调试是学习程序设计过程中必须锻炼的一项基本技能。在程序员中流传着一个“2/8定律”,即对于一个需要编程解决的问题,编写出初步程序所用时间占总时间的20%,而程序调试、排错、修改、正确性测试等要用到总时间的80%。因此不要期望看一两本C语言或程序设计方面的书,就能学好这门课程,这种想法违背了课程特点和学习规律。

(3) 注意学习程序设计的基本思维模式。其一,掌握基本思维过程,从固定思维模式入手。在程序设计中,要掌握数据的“输入→处理→输出”这样一个基本顺序,不能颠倒,这里输入是为处理做准备,处理是为输出做准备。其二,正确理解和应用“自顶向下,逐步求精”的基本原则和思想方法。单个函数不要太大,如果某个函数的内容太多,应该考虑将其中功能相对独立的部分独立出来,编写成函数。

(4) 程序的核心是算法,算法的核心是数据处理,只有经过有效组织的数据才便于算法处理。因此,数据组织方式在程序设计中有重要的作用,在计算机科学中,数据的组织方式称为数据结构。C语言中简单的数组组织方式是基本数据类型的变量,高级数据组织方式主要有数组、字符串、链表、结构体、数据文件等内容。在学习过程中,对不同的数据组织方式,要充分理解它们的存储特点。

(5) 无论是自然语言或者是程序设计语言,语法规则都不难学,困难的是能够用语言正确地表达思想。正如我们为了学好英语,必须掌握一定的“习惯用法”才能很好地使用英语一样,程序设计也有一些固定的“习惯用语”,这就是基本编程模式和简单算法。例如,交换两个变量的值,多项数据求和,多项数据求最大值、最小值,多项数据按指定格式输出等这样一些程序片段称不上是算法,但是会经常用到,可以称其为编程模式。另外,基本的算法如最大公约数算法、排序算法、查找算法等也是在编写大型程序中会经常用到的算法。对于基本编程模式和基本算法,要求在学习过程中能牢记并能熟练运用。

(6) 教材提供了丰富的例题,在学习过程中,最基本的要求是将所有的例题自己输入计算机,自己调试。很多程序只是在纸上阅读,不一定能看懂,但是在调试过程中通过观察中间结果,可以慢慢理解程序思想和设计方法。对每一个例题或者算法,希望从两个方面注意总结。其一,其中用到的算法思想和算法设计过程与方法;其二,其中涉及的重要语法规则及应用方式。

在本教材编写过程中,参考了C99规范,但是目前没有任何一个编译器完全支持C99规范,因此只使用了C99规范中的“//”注释符,这样处理也便于与C++语言接轨,学生后续学习C++语言会比较自然。

考虑到目前计算机配置普遍以32位系统为主体,教材中的例题在32位平台上VC++6.0环境下调试通过。

本书不仅可以用于高等院校理工科学生程序设计课程的教材,也非常适合于C语言程序设计爱好者自学,同时,也可以用于程序设计竞赛基础训练教程。

感谢牟艳、周小芹两位老师通读全书,并提出了许多宝贵意见。

感谢北京航空航天大学出版社李文轶编辑提出的宝贵意见,对于她认真负责的敬业精神,作者深表钦佩。

书中使用了作者从网络收集的部分资料,由于过去时间较长,许多资料已经难于找到原创作者。在此,我们对向本书提供营养和素材的网络作者表示衷心感谢。

尽管我们希望做到最好,但因作者水平和成书时间所限,本书仍有许多不足之处,敬请同行教师和读者批评指正。

                                                 编者2009年7月