为什么开发深入浅出系列丛书?
目的是从读者角度写书,开发出高质量的、适合阅读的图书。
“不积跬步,无以至千里;不积小流,无以成江海。”知识的学习是一个逐渐积累的过程,只有坚持系统地学习知识,深入浅出,坚持不懈,持之以恒,才能把一类技术学习好。坚持的动力源于所学内容的趣味性和讲法的新颖性。
计算机课程的学习也有一条隐含的主线,那就是“提出问题→分析问题→建立数学模型→建立计算模型→通过各种平台和工具得到最终正确的结果”,培养计算机专业学生的核心能力是“面向问题求解的能力”。由于目前大学计算机本科生培养计划的特点,以及受教学计划和课程设置的原因,计算机科学与技术专业的本科生很难精通掌握一门程序设计语言或者相关课程。各门课程设置比较孤立,培养的学生综合运用各方面的知识能力方面有欠缺。传统的教学模式以传授知识为主要目的,能力培养没有得到充分的重视。很多教材受教学模式的影响,在编写过程中,偏重概念讲解比较多,而忽略了能力培养。为了突出内容的案例性、解惑性、可读性、自学性,本套书努力在以下方面做好工作。
1. 案例性
所举案例突出与本课程的关系,并且能恰当反映当前知识点。例如,在计算机专业中,很多高校都开设了高等数学、线性代数、概率论,不言而喻,这些课程对于计算机专业的学生来说是非常重要的,但就目前对不少高校而言,这些课程都是由数学系的老师讲授,教材也是由数学系的老师编写,由于学科背景不同和看待问题的角度不同,在这些教材中基本都是纯数学方面的案例,作为计算机系的学生来说,学习这样的教材缺少源动力并且比较乏味,究其原因,很多学生不清楚这些课程与计算机专业的关系是什么。基于此,在编写这方面的教材时,可以把计算机上的案例加入其中,例如,可以把计算机图形学中的三维空间物体图像在屏幕上的伸缩变换、平移变换和旋转变换在矩阵运算中进行举例;可以把双机热备份的案例融入到马尔科夫链的讲解;把密码学的案例融入到大数分解中等。
2. 解惑性
很多教材中的知识讲解注重定义的介绍,而忽略因果性、解释性介绍,往往造成知其然而不知其所以然。下面列举两个例子。
(1) 读者可能对OSI参考模型与TCP/IP参考模型的概念产生混淆,因为两种模型之间有很多相似之处。其实,OSI参考模型是在其协议开发之前设计出来的,也就是说,它不是针对某个协议族设计的,因而更具有通用性。而TCP/IP模型是在TCP/IP协议栈出现后出现的,也就是说,TCP/IP模型是针对TCP/IP协议栈的,并且与TCP/IP协议栈非常吻合。但是必须注意,TCP/IP模型描述其他协议栈并不合适,因为它具有很强的针对性。说到这里读者可能更迷惑了,既然OSI参考模型没有在数据通信中占有主导地位,那为什么还花费这么大的篇幅来描述它呢?其实,虽然OSI参考模型在协议实现方面存在很多不足,但是,OSI参考模型在计算机网络的发展过程中起到了非常重要的作用,并且,它对未来计算机网络的标准化、规范化的发展有很重要的指导意义。
[1]〖2〗深入浅出C语言程序设计(第2版)[1]丛书序〖2〗(2) 再例如,在介绍原码、反码和补码时,往往只给出其定义和举例表示,而对最后为什么在计算机中采取补码表示数值?浮点数在计算机中是如何表示的?字节类型、短整型、整型、长整型、浮点数的范围是如何确定的?下面我们来回答这些问题(以8位数为例),原码不能直接运算,并且0的原码有 0和-0两种形式,即00000000和10000000,这样肯定是不行的,如果根据原码计算设计相应的门电路,由于要判断符号位,设计的复杂度会大大增加,不合算;为了解决原码不能直接运算的缺点,人们提出了反码的概念,但是0的反码还是有 0和-0两种形式,即00000000和11111111,这样是不行的,因为计算机在计算过程中,不能判断遇到0是 0还是-0;而补码解决了0表示的唯一性问题,即不会存在 0和-0,因为 0是00000000,它的补码是00000000,-0是10000000,它的反码是11111111,再加1就得到其补码是100000000,舍去溢出量就是00000000。知道了计算机中数用补码表示和0的唯一性问题后,就可以确定数据类型表示的取值范围了,仍以字节类型为例,一个字节共8位,有00000000~11111111共256种结果,由于1位表示符号位,7位表示数据位,正数的补码好说,其范围从00000000~011111111,即0~127;负数的补码为10000000~11111111,其中,11111111为-1的补码,10000001为-127的补码,那么到底10000000表示什么最合适呢?8位二进制数中,最小数的补码形式为10000000;它的数值绝对值应该是各位取反再加1,即为01111111 1=10000000=128,又因为是负数,所以是-128,即其取值范围是-128~127。
3. 可读性
图书的内容要深入浅出,使人爱看、易懂。一本书要做到可读性好,必须做到“善用比喻,实例为王”。什么是深入浅出?就是把复杂的事物简单地描述明白。把简单事情复杂化的是哲学家,而把复杂的问题简单化的是科学家。编写教材时要以科学家的眼光去编写,把难懂的定义,要通过图形或者举例进行解释,这样能达到事半功倍的效果。例如,在数据库中,第一范式、第二范式、第三范式、BC范式的概念非常抽象,很难理解,但是,如果以一个教务系统中的学生表、课程表、教师表之间的关系为例进行讲解,从而引出范式的概念,学生会比较容易接受。再例如,在生物学中,如果纯粹地讲解各个器官的功能会比较乏味,但是如果提出一个问题,如人的体温为什么是37℃?以此为引子引出各个器官的功能效果要好得多。再例如,在讲解数据结构课程时,由于定义多,表示抽象,这样达不到很好的教学效果,可以考虑在讲解数据结构及其操作时用程序给予实现,让学生看到直接的操作结果,如压栈和出栈操作,可以把PUSH()和POP()操作实现,这样效果会好很多,并且会激发学生的学习兴趣。
4. 自学性
一本书如果适合自学学习,对其语言要求比较高。写作风格不能枯燥无味,让人看一眼就拒人千里之外,而应该是风趣、幽默,重要知识点多举实际应用的案例,说明它们在实际生活中的应用,应该有画龙点睛的说明和知识背景介绍,对其应用需要注意哪些问题等都要有提示等。
一书在手,从第一页开始的起点到最后一页的终点,如何使读者能快乐地阅读下去并获得知识?这是非常重要的问题。在数学上,两点之间的最短距离是直线。但在知识的传播中,使读者感到“阻力最小”的书才是好书。如同自然界中没有直流的河流一样,河水在重力的作用下一定沿着阻力最小的路径向前进。知识的传播与此相同,最有效的传播方式是传播起来损耗最小,阅读起来没有阻力。
是为序。
欢迎老师投稿: bailj@tup.tsinghua.edu.cn。
2014年12月15日
“C语言程序设计”是计算机专业及各理工科专业一门重要的基础课程。C语言既有高级语言的强大功能,又有很多直接操作计算机硬件的功能,因此,C语言通常称为中级语言。学习和掌握C语言,既可增进对于计算机底层工作机制的了解,又可为进一步学习其他高级语言打下坚实基础。
本课程的教学目的是引导初学者掌握C语言的基本语法,锻炼实际动手能力和逻辑思维能力,并能将理论知识应用于解决各种实际问题。作者根据多年的教学经验,在分析国内外多种同类教材的基础上,编写了本书。
本书内容深入浅出、循序渐进,采用大量实例帮助初学者快速掌握C语言的语法知识,书中所有实例都在Code∷Blocks环境下验证通过并有运行结果的截图。例题的选择基于以下几点考虑。
(1) 例题分为基础型和应用型两种。基础型例题主要演示C语言基本语法的使用格式及应用场合;应用型例题融会贯通了前后知识点,帮助初学者理解并掌握解决各类实际问题的编程方法。
(2) 为从多角度扩展读者的思路,部分有代表性的例题在解决同一问题时给出了多种编程方法。
(3) 一些例题的讲解采用了“比较式教学法”,既给出正确的程序,又给出错误的程序,引导读者深入分析问题,学会判断错误。
(4) 例题的讲解引入计算思维的教学理念,体现提出问题、分析问题、解决问题的思维方式,首先给出编程思路,然后给出源代码,并对源代码中的重点、难点进行剖析,最后提出思考问题,激发学生的创新思考。
本书与国内同类教材最大的一个不同点是,对初学者容易出现的各类常见错误进行重点分析。很多同类教材只讲对的,不讲错的,对于一个编程者来说,如果不能了解和认识错误,就不可能真正懂得编程。因此,本书采用各种对比手法及大量表格为初学者剖析容易混淆的各种基本概念。实践表明,人们从错误中学到的东西往往比从正确中学到的东西多得多,懂得错误并能识别错误才能真正掌握程序设计的方法。
本书共由3部分组成,分为14章,内容编排由浅入深。第一部分介绍基础知识,包括第1~3章;第二部分介绍程序设计的3种基本结构,包括第4~6章;第三部分是程序设计的提高与进阶,包括第7~14章。
第一部分介绍基础知识,其中第1章介绍C语言的发展、程序设计的步骤及原理、C语言开发环境等内容;第2章主要介绍结构化程序设计的方法,通过流程图为初学者建立程序设计的基本框架;第3章介绍C语言的数据类型、运算符及表达式,为后面的程序设计奠定基础。通过这一部分的学习,读者应认识程序设计的一般步骤,能够书写简单表达式语句,能够用流程图对简单算法的结构化程序进行描述。
[1]〖2〗深入浅出C语言程序设计(第2版)[1]前言〖2〗第二部分介绍程序设计的3种基本结构(顺序结构、选择结构、循环结构)。其中第4章是顺序结构程序设计,重点介绍程序设计中使用最多的输入输出函数;第5章是选择结构程序设计,介绍构成选择结构的语句及运算符;第6章是循环结构程序设计,介绍构成循环结构的3种语句,以及用在循环结构中使用的非结构化语句。通过这部分的学习,读者应掌握结构化程序设计的方法,学会设计简单的算法,并依据算法编写程序解决问题。
第三部分介绍多种程序设计的方法。其中第7章介绍一维数组、二维数组的知识;第8章和第10章介绍指针相关的知识,由于指针是C语言的精华及难点,因此将指针的基础与提高分两章进行介绍;第9章是函数,函数是C程序的基本组成单位,体现了模块化设计的思想;第11章是字符串,主要介绍数组与指针操作字符串的方法,以及常用字符串处理函数;第12章是结构体与共用体,介绍构造类型用于处理大量复杂类型数据的方法;第13章是文件,介绍C语言对文件的操作,重点是文件常用函数的使用方法;第14章是位运算,本章体现了C语言不同于其他高级语言,能够对计算机硬件直接操作的特点。通过这些章节的学习,读者应掌握程序的模块化设计方法及更多的编程手段,采用计算思维的方法分析问题,灵活运用数组、指针、结构体、链表等手段解决问题,培养创新思维和解决问题的能力。
本书特色如下。
(1) 对初学者各类常见错误进行重点剖析,帮助初学者快速掌握C语言语法知识。
对初学者来说,学习编程的第一步是掌握程序设计语言的语法知识,但是学习过程中往往会出现各种各样的语法错误,使得程序编写难以达到预期结果,很多初学者常常纠结于各种语法错误,从而丧失对程序设计语言学习的兴趣与信心。作者根据多年的实际教学经验,总结了初学者常见的各类语法错误和逻辑错误,在教材中采用大量表格及各种比较手段剖析这些错误,以帮助初学者能够识别并避免各类错误,尽快迈过语法关。
(2) 引入计算思维的教学方式,例题讲解遵循提出问题、分析问题、解决问题的思维模式。
本课程的教学目的是培养学生分析问题和解决问题的能力,最终能够将C语言应用于解决各类实际问题。为了达到这一目的,例题的分析与讲解是关键。书中很多例题的代码配有流程图,以帮助初学者更好地建立编程思维。例题的讲解通常是首先给出编程思路,然后给出源代码,并对源代码中的重点和难点问题进行剖析,最后进行总结,并提出思考问题,引导读者深入理解用C语言编写程序解决实际问题的方法和步骤,提升读者的学习兴趣。
(3) 本书主要知识点的讲解贯穿了“比较教学模式”,主要体现在以下几个方面。
① 对容易混淆的基本概念进行比较,例如用表格对初学者最易混淆的运算符==和=进行比较,以帮助初学者正确掌握这两个运算符的使用方法。
② 对同一问题的解决给出多种方法,帮助读者融会贯通所学知识、扩展思路、从中体会哪种方法解决问题更为便捷。例如,用指针引用数组元素既可以用下标法,也可以用指针法,在一个程序中同时采用多种方法,以帮助读者深刻理解各种方法的特点。
③ 对一个复杂问题的讲解采用由易到难多步骤进行,通过对每个步骤源代码的比较,读者便在潜移默化中掌握了复杂问题的编程方法。例如,在讲解循环嵌套的知识点时,按照由易到难的步骤,依次讲解输出矩形、直角三角形、正三角形的方法,通过比较输出这几种图形的源代码,读者可以逐步掌握循环嵌套的编程方法。
本书可以作为普通高等院校计算机专业及理工类专业的本科教材,也可作为各类C语言认证考试的复习参考书,以及作为计算机工程技术人员的参考书。
本书由李俊萩、张晴晖、强振平任主编,徐伟恒、陈旭、钟丽辉任副主编。
本书第4章、第9章、第10章由李俊萩编写,第7章、第11章、第14章由张晴晖编写,第6章和第13章由徐伟恒编写,第12章由陈旭编写,第3章和第5章由钟丽辉编写。
由于作者水平有限,书中难免有不当之处,恳请广大读者批评指正。
如果需要书中的程序源代码或教学课件,可与作者联系。
作者
2015年1月