本书采用以解决实际应用问题为导向、以具体编程任务为驱动的模式,将C语言的知识无缝融入每个实际应用程序中。作者精心设计了100多个应用案例,每个案例均有实现特定功能的、完整的、可运行的程序代码。本书图表丰富,对程序设计的概念、求解问题的思路和方法、程序背后的原理和机制进行了深入剖析。全书共9章。第1章从简单程序入手,将程序设计相关的基础性概念融入案例,使读者对C程序设计有一个整体的、直观的、感性的认识。第2章阐述表达复杂逻辑的分支和循环语句的用法,使读者对应用问题中的逻辑具有较好的表达能力。第3章阐述了利用数组处理批量数据。第4章阐述了如何存储和处理文本型数据。第5章全面地阐述了函数这一模块化程序设计利器。第6章对具有内存间接访问能力的指针进行了深入阐述。第7章讲解如何利用结构体类型创建用户所需新数据类型。第8章阐述了如何利用文件实现数据持久化。第9章讲解了位运算的规则和用法。
本书采用大量具有实际生活应用背景的实例系统地、通俗地、透彻地讲解了如何运用C语言设计程序解决实际问题。本书提出的基于应用导向与任务驱动的学习方法是值得推荐的程序设计学习方法。本书从形式到内容都具有一定创新性。本书内容组织独具匠心、叙述方式通俗易懂、编程实例力求原创、任务驱动逻辑清晰、代码注释别具一格、知识扩展开拓思路。
本书是大学工科类专业的*门程序设计课程的*教材,也是广大零基础学习程序设计读者不二之选。
本书具有六大特色:
1、以应用导向,将C语言的知识融汇贯穿在对实际问题求解的过程中,尽量避免单纯语法的讲解。
2、每个编程任务目标明确、源于生活、意趣兼备。以实际任务驱动编程,更加生动有趣。全书共150多个编程实例,可使用程序设计练习系统在线评判,方便上机练习。
3、本书大量运用图解、表格、小贴士、小问答等形式,运用类比、对比等方法,尽量用直观的形式帮助读者理解程序设计中相对抽象的概念、原理、机制。
4、本书内容深入浅出,表里兼顾,帮助读者深入地理解程序底层的运行机制和原理。使读者在编程时做到知其然且知其所以然。本书语言通俗、可读性好、方便自学又不失深度。
5、程序代码与相应注释之间用箭头连接,代码和注释,一目了然,方便阅读。
6、本书始终站在程序设计者的角度即人的角度,来讲解程序设计,而不是站在C语言的角度即语法的角度,来讲解程序设计。本书始终以工具(C语言作为程序设计的)服务于目标(求解实际问题)视角来展开讨论。从这样的视角出发,读者更容易理解和接受程序代码。
前 言
当您第一眼见到这本书,一定诧异于它的厚度,但只要您翻开阅读,我想,您一定不会觉得这是一本难啃的大部头,而像是一本娓娓道来的程序设计故事书。
当我想要编写一本关于程序设计的教材时,难抑内心的激动。我的第一门程序设计语言是BASIC,然后学习C语言,后来学过C 、Java、Python等程序设计语言。多数学过程序设计的人,对第一门程序设计语言的印象大抵是艰难而晦涩的。一些人秉承对程序设计的执着和热爱,从这种艰难中走过来了,并且从此爱上了程序设计,享受程序设计在解决现实生活的实际应用问题后带来的快乐和成就感。但更多的人对编程望而生畏,面对堪如天书的代码,始终难解心中诸多困惑:这些代码是如何写出来的?为什么要写成这样?必须写成这样吗?为什么我这样写就不对呢?解决此问题还有其他写法吗?为何当我面对实际应用问题时总感到无从下手呢?怎样才能创造出属于自己的程序呢?
我尽最大努力,使程序设计的每个细节变得简单清晰。为了让您理解程序的来龙去脉,对于每次需要解决的编程任务,不是一次性地抛出最终程序代码,而是必须对解决此问题的思路、方法进行详尽分析。并且遵循由简单到复杂,由低级到高级的设计过程,尽可能完整地展示程序是怎样炼成的。对于同一编程任务,提供尽可能多的设计思路和不同的算法以及实现代码,帮助您打开程序设计思维的匣子。
本书侧重于培养您作为程序设计者必须具备的计算思维。所谓的计算思维,就是以计算机的方式去思考问题的求解过程。作为机器的计算机思考问题的方式与作为万物之灵的人的思考问题方式是不同的。人通过学习程序设计去理解并掌握计算机思考问题的方式,这个过程就是培养计算思维的过程。因此,本书以求解具体应用问题为目标,驱动相关程序设计知识的应用。
本书强调,程序设计语言是求解问题的工具,程序设计语言是为求解问题服务的。本书对语法的讲解以够用为准,不提倡代码中应用古怪、费解的语法。当然,程序设计必须掌握相关语法,有语法错误的程序过不了编译关。掌握C语言语法不是程序设计学习的重点,更不是学习目的。培养计算思维,能利用程序设计语言解决实际应用问题才是最终目的,学习程序设计必须过实际运行关。
C语言具有语法简洁、概念清晰、底层控制力强等优点,是值得程序设计初学者首选的语言。C语言虽是面向过程的程序设计语言,但是学好C语言将为面向对象的程序设计语言(如C 、Java、C#、Python等)的学习打下坚实基础。
学好编程没有捷径,上机练习、独立思考、保持兴趣、学用结合、日积月累、持之以恒是成为编程高手的秘籍。关于如何学习程序设计的建议请参见附录10.1关于程序设计的学习方法(扫描前言中的二维码)。
本书特色:
一、本书贯彻以求解应用问题(实际应用问题的一部分或实际应用问题的简化问题)为导向,以具体编程任务为驱动的程序设计学习方法,将每个知识点融入实际编程任务中。因此,展现在您面前的代码是一个完整的、可运行的、有输入/输出的、实现了一定功能的应用程序,而不是仅仅为了讲解某个知识点的片段的、不完整的代码。
二、作为例题的编程任务生动有趣。每个编程任务力求有现实生活应用背景,让您时刻不忘学习程序设计的目的是能运用计算机程序解决现实生活中或大或小的实际问题,体会计算机是如何按您的意图行动的,体会计算机给我们生活带来的方便,体会计算机的威力与魅力。编程不再是单纯地学习C语言语法,也不是纯粹为了实现数学的数值计算。
三、图表丰富。本书秉承能用图和表表达的,一定画图做表的思想。因此,书中配有大量图解、表格,大量地运用了类比、对比、小贴士、小问答等形式,尽量用直观的形式帮助您理解程序设计的概念、原理、机制等方面。
四、讲解深入浅出。本书融入了我多年程序设计教学经验、教学成果、应用软件开发经验和对程序设计的体会与理解。对程序中诸多概念的理解,需要程序设计者(以后简称为程序员)对操作系统的有关原理有一定的理解。因此,本书在讲解程序的同时,尽量对发生在程序运行背后的机制特别是操作系统中与编程相关的机制进行了深入剖析。对操作系统和计算机原理的介绍,能帮助程序员深入地理解程序在底层的运行机制,使程序员在编程时做到知其然且知其所以然。
五、程序代码箭指代码解释,阅读代码一目了然、易读易懂。对于程序代码中每个重要语句,均引出箭头指向相应的代码解释,代码和对应的解释是左邻右舍、如影相随的,方便阅读。此外,在排版上,也尽量将一个完整程序或函数模块的代码排在同一页中,确保代码的形式整体性。
六、本书站在程序员的角度来看待和学习C语言,而不是站在C语言的角度罗列C语言知识本身。站在程序员的角度,面对编程任务时,我们应该思考的是如何运用C语言为我(即程序员)的设计目标服务。从这个角度出发,您就更容易理解和接受C语言的知识了。
本书的例题全部采用编程任务的形式给出。每个编程任务由8部分构成:标题、任务描述、输入、输出、输入举例、输出举例、分析,以及参考代码。本书例题采用此形式是基于以下四点考虑的。
其一,这种方式对要解决的任务有清晰、准确的编程描述,因此每个程序代码需要达到的目标和需要实现的功能非常明确。学习程序设计是为了能用自己设计的程序解决实际问题,因此,我们将本书读者的角色定为软件开发者。软件开发是软件开发者按照用户提出的需求进行软件设计的过程。设计得到的软件必须达到指定功能,满足软件用户的需求。描述清晰、准确的软件需求对软件开发至关重要。因为需求的小变化,可能导致软件设计的巨大改变,甚至从头重新设计。
其二,有利于独立思考和寻求解决问题的多种方法,培养计算思维。在达到既定软件开发目标的情况下,鼓励读者学会分析问题,开动脑筋独立思考,尝试用不同思路、不同算法或不同的代码去完成同一个任务,对比不同实现方式之间的优缺点。对于每个编程任务,本书代码仅供参考。本书绝不鼓励读者仅满足于将本书代码照抄照搬,死记硬背。
其三,对C语言知识点均采用融入具体编程任务的方式讲解,使我们对每个C语言知识要素所适用的实际应用场合有最感性的认识。
其四,方便使用OJ作为程序设计在线练习平台。本书的编程任务便于自动裁判(可简单地将裁判理解为教师批改学生所交的程序设计作业这一过程)。国内外有许多大学和组织提供了开放式的在线裁判系统(Online Judge,OJ),它能对提交的程序源代码进行自动裁判。OJ系统24小时在线练习资源丰富,裁判结果公正客观。OJ系统原本为程序设计竞赛所用,但是好的工具为什么不能用于学习呢?参加过信息学竞赛(IOI,NOI)或大学生程序设计竞赛(CPC)的读者一定对这种编程任务的形式不陌生,因为竞赛题采用此形式。希望本书读者不要对此表示疑惑,学习程序设计当然不是为了参加比赛。在此,只是取其长而用之,更好地服务于学习程序设计这一目标。我早在2009年就开始将OJ系统作为练习平台引入到信息类本科专业的C程序设计课程教学中,得到了学生和同行的好评与认可。目前,将OJ作为程序设计教学练习平台的做法在越来越多的学校的程序设计教学中得到运用。
本书提供所有编程任务的描述、测试用例数据和标程,并且不断补充高质量的编程任务作为练习或测试用。读者(包括教师或学生)可在OJ上练习、实验、测试和上机考试。如果您所在学校尚未建立OJ系统,可自主开发OJ,也可利用开源系统部署自己的OJ,或者直接利用互联网上开放的OJ系统。如果OJ上没有想要练习的编程任务,则需要先在OJ上添加它。欢迎使用湖南农业大学程序设计在线练习系统(http://210.43.224.19/oj)。
本书适合作为本科低年级程序设计课程教材,也非常适合程序设计初学者自学使用。对参加奥林匹克信息学竞赛的队员和参加ACM/ICPC大学生程序设计竞赛的队员来说,也是一本非常好的入门教材。对于有一定程序设计基础的读者,本书也不失参考价值。书中有许多对程序深入的剖析很有启发意义,值得一读。
众所周知,C程序设计课程是计算机类专业、信息类专业极其重要的专业基础课。我从事本科程序设计专业基础课一线教学十余年,希望能有一本读起来不那么枯燥,同时又不失专业性和系统性的面向程序设计初学者的C语言图书,这是我写本书的意图。如何利用本书,各位见仁见智。
希望通过本书带给读者更多愉悦的程序设计经历,提振编程信心,激发编程的兴趣,为今后的学习、工作、科研培养良好的计算思维和软件设计基础。
本书的写作是我将头脑中纷繁的思绪变成有条理文字的过程,既艰辛又充满快乐。常常为了设计一个恰到好处的编程任务或为了更好地表述某个概念,灵感突现,即使是已卧床或半夜醒来,也立刻记录,唯恐遗漏。本书力求知识更加系统、表述更加准确、语言更加通俗、例子更加贴近生活,这使写作过程充满挑战性,字句斟酌,直到自己满意为止,以致成书过程如此漫长。对本书内容安排、章节设置、设置每个例子代码甚至每段表述,都经过反复琢磨和权衡,力求语言描述精准、思想表达透彻。漫长的成书过程,让我体会到了写书的不易,不过,本书写作过程带给我更多的是快乐。在写作期间,不仅有将存在于脑海的点滴心得随着键盘的敲击变成文字的快感,而且,在此期间我的儿子不经意间长成了帅小伙,陪伴他的时间总是短暂而欢快的。我的妻子虽常常担心因长时伏案而有腰椎疾病的我,但她送来键盘旁的一杯热茶、一碟水果,顿时让我满血复活。特别感谢我的妻子陈海燕女士包容我无数个日夜以计算机为伴而少有陪伴她,家务操持多劳她费心,虽偶有抱怨,但忍韧而坚强。谨以此书献给我的家人。
感谢电子工业出版社高等教育分社谭海平社长和冉哲编辑对我蜗牛般写稿进度的容忍。
感谢我的学生卢晨曦、邵振宇、王舒心、王鹏、陈慧、张洋、唐朝宇、廖颜勤、姚沛丰、熊嘉奇、唐航、周子翔、沈煜恒为本书的校对付出了辛勤劳动。
虽然我对本书写作用心尽力,但由于学识水平有限,错误与不足之处在所难免,恳请批评指正(我的邮箱:390199309@qq.com)。
限于篇幅,本书第1章至第9章的综合应用实例和知识拓展部分以及附录部分,以扫描二维码下载相应文档的形式提供。
附录:
贺细平
博士,国防科技大学计算机学院计算机应用专业。湖南农业大学信息科学技术学院电商系主任,副教授。中国计算机学会会员,湖南省高教学会计算机教育专业委员会会员。出版教材:现代计算机网络系统原理及技术研究,中国商务出版社,2013年。