描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787121332326
第1章 邂逅程序设计—初识C语言 1
1.1 个程序—我会算加法 2
1.2 人机交互—输入和输出函数的基本用法 10
1.3 条件与判断—随机应变 17
1.3.1 二叉分支的表达—基本的if-else语句 17
1.3.2 复合条件的表达 22
1.4 利用库函数—拿来主义 25
1.5 机器擅长之“算术运算”—计算机的老本行 28
1.6 变量—数据的栖身之所 34
1.6.1 变量的概念 34
1.6.2 变量的数据类型 37
1.6.3 程序中的常量 40
1.7 赋值运算—改变变量的值 42
1.8 程序设计的一般过程 47
本章小结 48
第2章 程序逻辑之关键—分支与循环 51
2.1 机器智能与决策之基石—分支结构 52
2.1.1 决策与分支结构 52
2.1.2 基本分支结构及其连接方式 60
2.1.3 逻辑运算与复合条件表达 71
2.1.4 if条件表达典型错误分析 75
2.2 机器擅长之“循环”—不厌其烦地重复 77
2.2.1 for循环的引入 78
2.2.2 剖析for循环 86
2.2.3 必须应用循环结构的场合 90
2.2.4 循环的初步运用 93
2.2.5 for循环常见错误分析 96
2.3 程序逻辑进阶—多分支和多重循环 98
2.3.1 深入理解循环 98
2.3.2 循环的连接 100
2.3.3 双重循环与多重循环 107
2.3.4 break和continue的运用 110
2.3.5 分支与循环的串联和嵌套 120
2.4 其他形式分支与循环 121
2.4.1 switch-case分支结构 121
2.4.2 while与do…while循环 128
本章小结 130
第3章 批量数据存储与处理—数组 134
3.1 何时需要数组 134
3.2 序列数据的处理—一维数组 135
3.2.1 一维数组的定义 135
3.2.2 数组与内存分配 137
3.2.3 数组操作之演练 140
3.2.4 一维数组的运用 141
3.2.5 巧用数组下标 149
3.3 表格型数据的处理—二维数组 154
3.3.1 二维数组的定义 154
3.3.2 访问二维数组的元素 155
3.3.3 二维数组操作演练 155
3.3.4 二维数组的应用 159
3.4 其他 164
3.4.1 数组的拓展—多维数组 164
3.4.2 二维数组与一维数组的关系 165
3.4.3 数组下标越界 165
3.4.4 数组定义时的大小能否为变量 167
本章小结 168
第4章 文本数据处理—字符串 169
4.1 字符数据存储和处理 169
4.1.1 字符的编码 169
4.1.2 字符数据的存储 173
4.1.3 字符数据的运算 173
4.2 字符串数据存储和处理 176
4.2.1 字符串的存储 176
4.2.2 文本型数据输入/输出 177
4.2.3 字符串处理与库函数 180
4.3 文本型数据处理之演练 190
4.4 其他 193
4.4.1 空字符''的作用 193
4.4.2 字符和字符串的区别与联系 194
本章小结 195
第5章 模块化设计之利器—函数 196
5.1 初识函数设计 197
5.2 函数的概念 200
5.2.1 函数的概念剖析 200
5.2.2 模块化设计思想在函数中的体现 203
5.3 新函数是如何炼成的 206
5.4 函数的设计 207
5.4.1 发掘任务中的模块 207
5.4.2 函数的定义 207
5.4.3 设计函数的方法论 209
5.4.4 设计函数的要点详解 211
5.5 函数的测试 220
5.6 函数的交付使用 221
5.6.1 函数的调用形式 223
5.6.2 函数调用过程详解 224
5.6.3 函数参数的传递 230
5.6.4 函数的声明 234
5.7 函数设计实践 236
5.8 函数的递归—自相似之美 249
5.8.1 初识递归函数 250
5.8.2 递归函数设计的关键点 253
5.8.3 递归调用的执行过程 262
5.8.4 二分法与递归 264
5.8.5 递归与非递归 273
5.8.6 提高递归效率 281
5.9 函数相关主题 287
5.9.1 局部变量与全局变量 287
5.9.2 函数的嵌套定义的应用 289
5.9.3 如何生成随机数 289
5.9.4 库函数 295
5.9.5 初谈提高程序效率 295
本章小结 299
第6章 内存间接访问之神器—指针 301
6.1 深入理解内存地址 302
6.1.1 内存是什么 302
6.1.2 什么是内存地址 302
6.2 间接访问与直接访问 305
6.3 指针变量与普通变量 309
6.3.1 指针变量的概念 309
6.3.2 揭秘“指针”的由来 310
6.3.3 普通变量与指针变量的对比 311
6.4 指针与数组的天然联系 312
6.4.1 数组名与数组起始地址 312
6.4.2 揭秘访问数组的更多细节 313
6.5 指针的移动 319
6.6 地址值在函数调用中的特殊作用 331
6.6.1 函数调用过程详解 331
6.6.2 指针作为函数参数 334
6.6.3 数组名作为函数实参 341
6.6.4 可接受地址值的形参类型探究 349
6.7 指针与动态内存分配 352
6.7.1 一维数组的动态内存分配 354
6.7.2 二维及多维数组与指针 357
6.7.3 多阶指针 370
6.7.4 返回值为指向动态分配空间的指针 370
6.8 变量的存储区、作用范围与生命期 371
6.8.1 静态变量和全局变量 372
6.8.2 进程内存地址空间布局 376
6.8.3 变量的作用范围、生命期和存储区 379
6.8.4 extern的用法 382
6.9 函数也可作为参数—函数指针与应用 384
6.9.1 函数指针的概念 384
6.9.2 函数指针数组的运用 387
6.9.3 函数指针与qsort( )函数的应用 388
本章小结 396
第7章 创造新数据类型—结构体类型 399
7.1 为何引入结构体类型 399
7.2 结构体类型的定义和基本用法 402
7.2.1 结构体类型的定义 402
7.2.2 结构体类型的基本用法 406
7.3 结构体类型数组的用法 409
7.4 结构体类型在函数中的运用 411
7.4.1 结构体类型在函数中的一般用法 411
7.4.2 结构体类型数组的排序 420
7.5 结构体类型与链表 431
7.5.1 链表的概念和用途 431
7.5.2 链表 432
7.5.3 为什么需要链表 439
7.5.4 循环单链表及其应用 440
本章小结 447
第8章 数据持久化—文件 448
8.1 文件的基本概念 449
8.1.1 文件的“纸带模型” 449
8.1.2 缓冲文件读/写过程模型 451
8.1.3 读/写文件基本流程与文件指针 452
8.1.4 文件打开方式 454
8.2 文件的读/写 454
8.2.1 文本文件的读/写 454
8.2.2 二进制文件读/写 459
8.3 文件读/写位置的定位 466
8.4 文本文件与二进制文件的对比 470
8.5 其他主题 475
8.5.1 关于stdin、stdout、stderr 475
8.5.2 标准输入、输出的重定向 476
8.5.3 理解和运用stderr与stdout 478
8.5.4 fflush( )函数的用法 479
8.5.5 EOF的运用 481
8.5.6 容易被误解的feof( )函数 482
8.5.7 fgets( )与gets( )的区别 484
本章小结 485
第9章 深入到bit的运算—位运算 487
9.1 位运算的运算符 487
9.2 初识位运算 488
9.3 位运算的应用 489
9.4 位运算的注意事项 505
9.4.1 右移的补位方式 505
9.4.2 移位量的取模特性 506
9.4.3 位运算的数据类型 507
9.5 位域 509
本章小结 510
前 言
当您眼见到这本书,一定诧异于它的厚度,但只要您翻开阅读,我想,您一定不会觉得这是一本难啃的“大部头”,而像是一本娓娓道来的程序设计“故事书”。
当我想要编写一本关于程序设计的教材时,难抑内心的激动。我的门程序设计语言是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语言图书,这是我写本书的意图。如何利用本书,各位见仁见智。
希望通过本书带给读者更多愉悦的程序设计经历,提振编程信心,激发编程的兴趣,为今后的学习、工作、科研培养良好的计算思维和软件设计基础。
本书的写作是我将头脑中纷繁的思绪变成有条理文字的过程,既艰辛又充满快乐。常常为了设计一个恰到好处的编程任务或为了更好地表述某个概念,灵感突现,即使是已卧床或半夜醒来,也立刻记录,唯恐遗漏。本书力求知识更加系统、表述更加准确、语言更加通俗、例子更加贴近生活,这使写作过程充满挑战性,字句斟酌,直到自己满意为止,以致成书过程如此漫长。对本书内容安排、章节设置、设置每个例子代码甚至每段表述,都经过反复琢磨和权衡,力求语言描述精准、思想表达透彻。漫长的成书过程,让我体会到了写书的不易,不过,本书写作过程带给我更多的是快乐。在写作期间,不仅有将存在于脑海的点滴心得随着键盘的敲击变成文字的快感,而且,在此期间我的儿子不经意间长成了帅小伙,陪伴他的时间总是短暂而欢快的。我的妻子虽常常担心因长时伏案而有腰椎疾病的我,但她送来键盘旁的一杯热茶、一碟水果,顿时让我满血复活。特别感谢我的妻子陈海燕女士包容我无数个日夜以计算机为伴而少有陪伴她,家务操持多劳她费心,虽偶有抱怨,但忍韧而坚强。谨以此书献给我的家人。
感谢电子工业出版社高等教育分社谭海平社长和冉哲编辑对我蜗牛般写稿进度的容忍。
感谢我的学生卢晨曦、邵振宇、王舒心、王鹏、陈慧、张洋、唐朝宇、廖颜勤、姚沛丰、熊嘉奇、唐航、周子翔、沈煜恒为本书的校对付出了辛勤劳动。
虽然我对本书写作用心尽力,但由于学识水平有限,错误与不足之处在所难免,恳请批评指正(我的邮箱:[email protected])。
限于篇幅,本书第1章至第9章的综合应用实例和知识拓展部分以及附录部分,以扫描二维码下载相应文档的形式提供。
附录:
贺细平
评论
还没有评论。