C语言程序设计与问题求解(原书第7版)
作者 : [美]杰瑞 R. 汉丽(Jeri R. Hanly)埃利奥特 B. 考夫曼(Elliot B. Koffman) 著
译者 : 赵涓涓 蔡星娟 纪国华 等译
丛书名 : 计算机科学丛书
出版日期 : 2017-05-13
ISBN : 978-7-111-56384-6
定价 : 129.00元
教辅资源下载
扩展信息
语种 : 简体中文
页数 : 537
开本 : 16
原书名 : Problem Solving and Program Design in C,Seventh Edition
原出版社: Pearson Education Asia
属性分类: 教材
包含CD :
绝版 :
图书前言

本书提供了一种问题解决的严谨方法,即通过连贯的、可读的、可重用的模块,将软件工程中被广泛接受的方法应用于程序设计中。我们选择ANSI C的子集作为这些模块的实现工具,因为C语言是一门因性能和可移植性而著称的标准的、强大的编程语言。这本书可作为编程方法的初级教程,假设读者没有计算机或编程的预备知识。本书案例分析和练习广泛丰富,可以帮助教师设计一门C语言程序设计引导课程,适用于计算机专业学生或其他相关专业学生。
版本更新
此版本的更新如下:
第3章(函数)、第5章(循环)和第7章(数组)包含图形程序的可选章节。
第6章(指针和模块化编程)新增了关于指针的6.1节。
第4章中用新的完整程序来说明if语句的使用。
第4章中用新的完整程序来说明switch语句的使用。
删除了以前版本中的第7章(简单数据类型),将内容整合到本书的其他章节中。
第1章中的硬件示例已更新并反映了当前最新技术。
一些章节中收录了新编程项目的作业题。
关于图形学的更多信息
许多计算机科学学院建议使用图形来启发编程初学者,并作为一种帮助学生了解如何使用库和调用函数的工具。我们同意这一观点,并在本版中收录了三个使用图形案例的可选章节。新的图形章节包括:
3.6节:计算机图形学介绍。
5.11节:循环在图形程序中的应用。
7.10节:数组表示图形程序。
为了减少引入图形所需的开销,我们决定使用WinBGIm(一种带有鼠标的Windows BGI),它是一个基于Turbo Pascal BGI(Borland Graphics Interface)库的软件包。WinBGIm由Michael Main和他的学生在科罗拉多大学创建,并在Win32库之上运行。一些适用于CS 1
课程的开发平台都已包含WinBGIm。Quincy(由Al Stevens开发)是一个开源的面向学生的C++ IDE,它包含WinBGIm和更高级的库(http://www.codecutter.net/tools/quincy)。下页图显示了使用所选WinBGIm图形应用的Quincy新项目窗口(File→New→Project)。
科罗拉多大学发布了一个基于开源GNU g++编译器和emacs程序编辑器的命令行平台(http:// www.codecutter.net/tools/winbgim)。WinBGIm也可以在Bloodshed软件的Dev-C++和Microsoft的Visual Studio C++中使用。
使用C语言进行程序开发教学
程序设计教学和C语言教学这两个目标在某些人看来可能是矛盾的。人们普遍认为C语言是一种只有在学习了一些更友好语言的基础上,才能更好地掌握的语言。C语言极其困难,这一认识可追溯到语言史。作为用于UNIX操作系统的编程工具,C语言可以在这类程序员中找到它的原始客户——他们了解操作系统和底层机器的复杂性,并认为在程序中利用这些知识是很自然的事情。因此,在许多以教授C语言为主要目标的教科书中,所给出的程序范例会要求学生了解机器的概念,而这些概念并不在标准入门编程课程的教学大纲中。

本书讲解了程序开发的合理方法并简单介绍了ANSI C,因为我们选择第一个目标——程序设计教学作为主要目标。有人可能担心这会导致ANSI C的淡化处理。然而,我们发现在C语言中编程概念和概念实现的有机结合可以充分彰显ANSI C作为高级编程语言的威力,而这在一些以ANSI C的全面覆盖为首要目标的书中常常被忽略。即使我们对程序设计的讨论优先于对C语言特性的讨论,但本书也达到了对C语言基本结构的全面覆盖。
指针和本书结构
C语言主题的组织顺序取决于程序初学者的需求,而不是C语言程序的结构。读者可能会惊讶地发现没有一章的标题为“指针”。这是因为我们将C语言作为高级语言进行处理,而不是忽视指针在C语言中的重要作用。
其他的高级语言对输出参数和数组都有独立的语言结构,而C语言公开地将这些概念“折叠”成指针,极大地增加了学习语言的复杂性。可以从不同的角度讨论指针来简化C语言的学习过程,让学生在一定时间内逐步理解指针使用的复杂性,类似的主题在其他编程语言中也经常出现。我们使用了基于传统高级语言的术语——输出参数、数组、数组下标、字符串,使基本概念的表示成为可能,也使没有汇编语言基础的学生更容易掌握指针使用的方方面面。
因此,本书使用四章而不是一章介绍指针。第6章从指针、间接引用和文件指针的使用(来源于第2章)开始讨论,然后讨论了指针作为简单输出和输入/输出参数的使用。第8章介绍了字符串指针和数组指针。第11章再次讨论了文件指针。第13章回顾了之前所学的指针使用,并且描述了动态存储分配。
软件工程概念
本书展示了软件工程的许多方面,有一些进行了明确的讨论而其他的仅使用例题进行讲解。早在第1章占用一小节讨论问题解决的艺术和科学时,我们就建立了良好的问题解决技巧和高效软件开发之间的联系。第1章提到的五段式软件开发方法不仅用来解决第一个案例分析,还将应用于整本书的案例分析。主要程序风格问题得到了重点呈现,而且例题中使用的编码风格都遵守C语言软件行业的准则。部分章节中有几节讨论了算法跟踪、程序调试和测试。
第3章通过指定的C语言库函数、无参数的void函数、有输入参数和一个返回值的函数介绍了过程抽象。第4章和第5章补充了一些附加函数的示例,包括函数作为参数的使用。第6章研究了含有简单参数的函数,还讨论了使用指针来表示输出和输入/输出参数。
第6、7和10章通过案例分析和示例程序介绍了数据抽象的概念、数据类型和运算符的封装。第12章介绍了在由单独头文件和实现文件定义的个人库中,用于形式化程序和数据抽象的C语言工具。第14章(在线资源)介绍了多进程处理的重要概念,例如父进程和子进程、进程间的通信、互斥锁和死锁避免。第15章(在线资源)描述了C++面向对象设计的实现。
整本书都在强调可视化函数接口的使用。直到第12章我们才会意识到使用全局变量的可能性,然后详细描述了使用全局变量的危险性和作用。
教学特点
下列特点使得本书更易于作为学习工具用于教学实践。
节末练习。大多数节的结尾都有自我检测练习,包括需要分析程序片段的练习和较短的编程练习。
实例和案例分析。本书包含了各种编程实例。实例会尽可能地包含完整的程序或函数,而不是零散的程序片段。每一章都包含一个或多个案例分析,我们使用软件开发方法对其进行求解。许多案例分析让学生了解了计算机应用程序的重要性,包括数据库检索、计费和销售分析的商业应用、文字处理以及辐射水平检测和节约用水的环境应用程序。
语法模块。语法模块描述的是新的C语言特征的语法和语义,并提供了示例。
程序风格模块。程序风格模块讨论的是良好的程序风格中的主要问题。
错误讨论和本章内容回顾。每章最后都有一节用于讨论常见的错误。本章内容回顾包含新的C语言结构表。
章末练习。每章内容回顾后面都附有快速练习及答案,每章末都有复习题。
编程项目。每章以编程项目结尾,给学生提供机会去练习相应章中学到的知识。
附录(在线资源)
本书只涉及ANSI C的一个子集,因此附录对于增加本书的参考价值十分重要。在整本书中,数组的引用是使用下标符号完成的,所以附录A只讨论指针运算;附录B按字母顺序给出了ANSI C标准库函数;附录C列出了所有ANSI C运算符的优先级和结合性,并解释了之前未定义的运算符;附录D给出了字符集表;附录E列出了所有的ANSI C保留字。
补充材料
读者可以从www.pearsonhighered.com/irc获得下列补充材料:
源代码。
勘误表。
序号为奇数的自我检测练习题的答案。
下面的教师补充材料只对有权限访问培生教师资源中心(IRC)的教师可用。访问www.pearsonhighered.com/irc或联系当地的培生销售代表来获得IRC的访问权限。
解决方案手册。
致谢
许多人参与了本书的编写。对于本版来说,我们要感谢Michael Main在WinBGIm和一些图形示例方面的帮助。我们也要感谢他在美国科罗拉多大学的学生所做的贡献,他们采用WinBGI创建了WinBGIm,谢谢Grant Macklem、Gregory Schmelter、Alan Schmidt和Ivan Stashak。本版的评审者是:宾夕法尼亚州费城天普大学的Frank L. Friedman,加利福尼亚州圣路易斯奥比斯波加州理工大学的Mark S. Hutchenreuther,内布拉斯加州林肯内布拉斯加大学的Anwar Mamat,新墨面哥州索科罗新墨西哥理工大学的Hamdy Soliman,佛罗里达州伯克莱屯佛罗里达大西洋大学的Tami Sorgente,艾奥瓦州埃姆斯艾奥瓦州立大学的Alexander Stoychev。
我们还要感谢南平原学院的Charlotte Young帮助编写了第0章,感谢WaveRules有限责任公司的Jeff Warsaw对第14章做出的重大贡献。感谢加州理工学院喷气推进实验室的Joan C. Horvath提供的编程练习题,感谢加州大学戴维斯分校的Nelson Max对文字内容提出的许多改进建议。Jeri感谢马里兰洛约拉大学的同事James R. Glenn、Dawn J. Lawrie和Roberta E. Sabin在某些编程项目中的贡献。我们也要感谢这几年来天普大学、怀俄明大学和哈佛大学的学生对编程示例的验证和提供的练习题答案,这些学生是Mark Thoney、Lynne Doherty、Andrew Wrobel、Steve Babiak、Donna Chrupcala、MasoudKermani、Thayne Routh和Paul Onakoya。
很荣幸与培生团队合作。总编辑Michael Hirsch和高级项目经理Carole Snyder在书稿修改的整个过程中提供了指导和鼓励。Pat Brown和Bob Engelhardt对本书制作进行了监督,Yez Alayan进行了市场推广。

J. R. H.
E. B. K.

上架指导

计算机\程序设计

作者简介

[美]杰瑞 R. 汉丽(Jeri R. Hanly)埃利奥特 B. 考夫曼(Elliot B. Koffman) 著:
杰瑞 R. 汉丽(Jeri R. Hanly) 怀俄明大学计算机科学系荣誉退休教师,曾任职于马里兰洛约拉大学和哈佛大学。
埃利奥特 B. 考夫曼(Elliot B. Koffman) 天普大学计算机和信息科学系教授,曾任ACM特别工作组主席,致力于程序设计导论课程的教学研究。

译者简介

赵涓涓 蔡星娟 纪国华 等译:暂无简介

译者序

近几年来,编程语言的发展可谓是进入了井喷时期。尽管每年都会诞生很多新的编程语言,C语言却始终位居编程语言榜首。有人可能会提出疑问,C语言为何具有如此强大的生命力?首先,这和C语言是标准通用汇编语言是分不开的。C语言完美平衡了语言中机器相关与机器无关的部分,使得我们可以用机器无关的方式来处理程序逻辑,但必要时又可以直接控制底层硬件,C语言被广泛运用在操作系统开发中正是这一点的绝佳例证。其次,C语言的核心非常简单,一切细节都尽显在程序员面前,不会因为某种语法构造而导致隐藏的性能消耗,这使得C语言成为程序员在追求程序效率时的一个绝佳选择。最后,C语言良好的设计、卓越的编码实现永远都是不可替代的,正是它们实现了一个软件的真正价值。
本书提供了一种连贯的、可读的、可重用的模块,通过“案例分析–章节回顾–程序设计”的学习模式,使读者循序渐进地掌握C语言的编程方法和思想,提高动手能力。全书案例按照“问题–分析–设计–实现–测试”的顺序组织,用通俗易懂的语言解释了C语言的主要知识点、简单应用和综合应用,建立了友好的问题解决技巧和高效软件开发之间的联系。
本书在前一版的基础上,提供了一种问题解决的严谨方法,将软件工程中被广泛接受的方法应用于程序设计中。这种程序开发的合理方法以及全书对ANSI C的全面覆盖极大地完善了前几版的C 语言体系,可谓是一个巨大的惊喜。此外,本书收录了3个使用图形案例的可选章节,在总结前几版的基础上对章节进行了更精确细微的调整,使内容在逻辑上更加合理,读起来更加流畅,更符合阅读习惯。本书使用四章而不是一章来介绍指针。第6章从指针、间接引用和文件指针的使用(来源于第2章)开始讨论,然后讨论了指针作为简单输出和输入/输出参数的使用。第8章介绍了字符串指针和数组指针。第11章再次讨论了文件指针。第13章回顾了之前所学的指针使用,并且描述了动态存储分配,使没有汇编语言基础的学生更容易掌握指针使用的方方面面。本书还包含各种编程实例,让学生了解计算机应用程序的重要性,包括数据库检索、计费和销售分析的商业应用、文字处理以及辐射水平检测和节约用水的环境应用程序。另外还有一些细微的调整与删除,使得本书更加紧凑与完美。
我认为,本书在C语言程序设计中具有重要的价值。它讨论的是程序设计中最基础、全面又具有实践性的思想、原理和编程方法,填补了国内目前这方面书籍的空白。这本书值得每个拥有编程梦想并努力使自己成为优秀程序员的爱好者参考,值得每个计算机相关专业的学生和研究工作者阅读,也可以作为程序设计、数据结构等相关课程的辅助教材。我相信,只要大家静下心来读这本接地气的实践指南,就会获益颇多。
我们非常高兴有机会翻译这本书。本书第0、1、2章由太原理工大学强彦译,第3、4章由太原理工大学赵涓涓译,第5、6章由太原科技大学蔡星娟译,第7、8章由忻州师范学院纪国华译,第9章由吕梁学院王三虎译,第10章由吕梁学院刘继华译,第11、12章由太原师范学院屈明月译,第13章由太原理工大学常春燕译,第14章由吕梁学院高文莲译,第15章和附录由太原理工大学雷红译。在本书的翻译工作中,廖晓磊、杨晓兰、崔强、宋云霞、赵鑫、张婷、赵鹏飞、董林佳、张伟做了大量的文献查找和校对工作,在此一并表示感谢。
在这里要感谢机械工业出版社华章分社的朱劼编辑、朱秀英编辑和其他编辑人员。他们为使这本好书较早地与读者见面投入了巨大的热情并付出了很多心血。没有他们的帮助和鼓励,本书不可能顺利付梓。
由于本书覆盖面广,翻译难度确实比较大,我们不仅查阅了大量国内外的相关资料,还与英文原著作者进行了深入交流,力求“信、达、雅”,但是在译文中仍难免会出现一些疏漏,如有任何意见和建议,我真诚地希望认真的、有见识的同行们和朋友们不吝赐教,共同进步。

译者
zhaojuanjuan@tyut.edu.cn
2017年3月

图书目录

出版者的话
译者序
前言
第0章 职业成长道路之计算机科学 1
0.1 为什么计算机科学可能是适合你的领域 1
0.1.1 主修计算机的原因 1
0.1.2 计算机科学家的特征 2
0.2 大学经验:计算机学科和专业选择 3
0.2.1 计算机科学 4
0.2.2 计算机工程 4
0.2.3 信息系统 4
0.2.4 信息技术 5
0.2.5 软件工程 5
0.2.6 混合学科专业 6
0.3 就业机会 6
0.3.1 美国和世界的需求 7
0.3.2 对弱势群体的需求 7
0.3.3 新职业初见端倪 8
第1章 计算机和程序设计概述 9
1.1 电子计算机的发展史 9
1.2 计算机硬件 11
1.2.1 存储器 12
1.2.2 中央处理单元 14
1.2.3 输入/输出设备 15
1.2.4 计算机网络 15
1.3 计算机软件 17
1.3.1 操作系统 17
1.3.2 应用软件 18
1.3.3 计算机语言 19
1.3.4 程序执行 22
1.4 软件开发方法 23
1.4.1 软件开发过程 23
1.4.2 注意:失败是软件开发过程的一部分 24
1.5 软件开发方法的应用 25
1.6 程序员的职业道德 27
1.6.1 数据隐私和滥用 27
1.6.2 计算机黑客 27
1.6.3 剽窃和软件盗版 28
1.6.4 计算机资源的滥用  28
本章内容回顾 29
快速练习 29
复习题 30
第2章 C语言概述 31
2.1 C语言元素 31
2.1.1 预处理指令 31
2.1.2 预处理指令的语法 33
2.1.3 主函数 33
2.1.4 保留字 34
2.1.5 标准标识符 34
2.1.6 用户自定义标识符 34
2.1.7 大写字母和小写字母 35
2.1.8 程序风格——选择标识符名称 35
2.2 变量声明和数据类型 36
2.2.1 变量声明 36
2.2.2 数据类型 37
2.2.3 数值类型间的差异 38
2.2.4 char数据类型 39
2.2.5 ASCII码 39
2.3 可执行语句 41
2.3.1 存储器中的程序 41
2.3.2 赋值语句 41
2.3.3 给一个字符型变量赋值 42
2.3.4 输入/输出操作和函数 43
2.3.5 printf函数 43
2.3.6 scanf函数 45
2.3.7 return语句 47
2.4 C程序的一般形式 48
2.4.1 程序风格——程序中的空格 48
2.4.2 程序中的注释 48
2.4.3 程序风格——使用注释 49
2.5 算术表达式 50
2.5.1 运算符/和% 50
2.5.2 表达式的数据类型 51
2.5.3 混合型赋值语句 52
2.5.4 强制类型转换 52
2.5.5 整型字符 53
2.5.6 多元运算符表达式 53
2.5.7 C语言中数学公式的表达 55
2.5.8 数值不精确 56
2.6 程序输出中的格式化数字 61
2.6.1 int类型的格式化值 61
2.6.2 double类型的格式化值 62
2.6.3 程序风格——消除首位空格 62
2.7 交互模式、批处理模式和数据文件 63
2.7.1 输入重定向 63
2.7.2 程序风格——回显输出与提示 63
2.7.3 输出重定向 64
2.8 常见编程错误 65
2.8.1 语法错误 65
2.8.2 运行时错误 67
2.8.3 未被发现的错误 67
2.8.4 逻辑错误 69
本章内容回顾 69
快速练习 70
复习题 71
编程项目 72
第3章 自顶向下的程序设计与函数 74
3.1 使用现有信息构建项目 74
3.2 库函数 81
3.2.1 预定义函数和代码重用 81
3.2.2 使用颜色突出显示新的结构 82
3.2.3 C语言库函数 83
3.2.4 知识扩展 84
3.3 自顶向下的设计和结构图 85
3.4 没有参数的函数 86
3.4.1 函数原型 87
3.4.2 函数定义 88
3.4.3 程序中函数的位置 89
3.4.4 程序风格——为程序中的函数添加注释 91
3.4.5 子函数与主函数的执行顺序 91
3.4.6 函数子程序的优点 91
3.4.7 显示用户说明 92
3.5 含输入参数的函数 93
3.5.1 含输入参数的void类型的函数 94
3.5.2 含输入参数与单一返回值的函数 95
3.5.3 程序风格——函数接口注释 97
3.5.4 带有多个参数的函数 97
3.5.5 对应参数列表 99
3.5.6 函数数据区 99
3.5.7 使用驱动程序测试函数 100
3.6 计算机图形学介绍(可选) 100
3.6.1 窗口的组成 100
3.6.2 常见的图形功能 101
3.6.3 程序风格——驼峰规则 102
3.6.4 背景色和前景色 102
3.6.5 绘制矩形 103
3.6.6 绘制圆、椭圆和弧线 104
3.6.7 程序风格——编写常见的图形程序 106
3.6.8 程序缺陷——不正确的函数调用顺序 108
3.6.9 扇形区域和实心椭圆 109
3.6.10 将文本信息添加到图形中 110
3.7 常见编程错误 112
本章内容回顾 112
快速练习 113
复习题 114
编程项目 114
图形项目 117
第4章 选择结构:if语句和switch语句 118
4.1 控制结构 118
4.2 条件表达式 119
4.2.1 关系运算符和等式运算符 119
4.2.2 逻辑运算符 120
4.2.3 运算符优先级 121
4.2.4 短路求值 122
4.2.5 用C语言实现对自然语言条件的编写 123
4.2.6 字符比较 123
4.2.7 逻辑赋值 124
4.2.8 补集 125
4.3 if语句 126
4.3.1 if双重选择语句 127
4.3.2 if单选择语句 128
4.3.3 if单选择语句与if双重选择语句的比较 128
4.3.4 程序风格——if语句的格式 129
4.4 含有复合语句的if语句 130
4.4.1 程序风格——使用复合语句编写if语句 131
4.4.2 if语句的调试 131
4.5 算法的决策过程 133
4.5.1 程序风格——函数名的一致性 139
4.5.2 程序风格——内聚函数 139
4.5.3 程序风格——使用常量宏定义来提高可读性和易维护性 139
4.6 更多待解决的问题 140
4.6.1 结构图中的数据流信息 140
4.6.2 函数子程序的修改 140
4.7 if嵌套语句和多重选择决策 142
4.7.1 if嵌套和if序列的比较 142
4.7.2 if嵌套语句的多重选择决策形式 143
4.7.3 多重选择决策条件的顺序 144
4.7.4 程序风格——验证变量的值 146
4.7.5 含有多个变量的if嵌套语句 146
4.8 switch语句 149
4.9 常见编程错误 153
本章内容回顾 154
快速练习 156
复习题 157
编程项目 158
第5章 重复和循环语句 162
5.1 重复 162
5.2 计数循环和while语句 163
5.3 使用循环计算累加和与乘积 166
5.3.1 程序风格——编写通用的循环 168
5.3.2 数字列表乘积运算 168
5.3.3 复合赋值运算符 169
5.4 for语句 170
5.4.1 程序风格——for语句的格式 171
5.4.2 自增和自减运算符 172
5.4.3 除1以外的增加量和减少量 173
5.4.4 显示数值表 175
5.5 条件循环 176
5.6 循环设计 180
5.6.1 标记控制循环 181
5.6.2 for语句实现标记循环 182
5.6.3 文件结束控制循环 183
5.6.4 错误数据上的无限循环 183
5.7 嵌套循环 185
5.8 do-while语句与标志控制循环 188
5.9 迭代近似 191
5.10 如何调试和测试程序 198
5.10.1 使用调试程序 198
5.10.2 不使用调试器调试 198
5.10.3 循环差一错误 199
5.10.4 测试 200
5.11 循环在图形程序中的应用(可选) 200
5.12 常见编程错误 205
本章内容回顾 207
快速练习 208
复习题 210
编程项目 211
图形项目 216
第6章 指针和模块化编程 217
6.1 指针和间接寻址运算符 217
6.1.1 间接引用 218
6.1.2 指向文件的指针 218
6.2 含有输出参数的函数 220
6.3 对包含输入/输出参数的函数的多重调用 226
6.4 名字作用域 230
6.5 形式输出参数作为实参 231
6.6 问题解决说明 234
6.7 程序系统的调试和测试 246
6.8 常见编程错误 248
本章内容回顾 248
快速练习 249
复习题 251
编程项目 252
第7章 数组 259
7.1 数组的声明和引用 259
7.1.1 数组的初始化 260
7.1.2 在字符数组中存储字符串 261
7.2 数组下标 261
7.3 使用for循环语句进行顺序访问 263
7.3.1 使用数组进行统计计算 263
7.3.2 程序风格——使用循环控制变量作为数组下标 266
7.4 使用数组元素作为函数参数 266
7.5 数组参数 267
7.5.1 形式数组参数 268
7.5.2 与数组参数有关的参数 268
7.5.3 数组作为输入参数 269
7.5.4 返回数组的结果 271
7.5.5 部分填充数组 272
7.5.6 栈 274
7.6 数组的查找与排序 276
7.6.1 数组查找 276
7.6.2 数组排序 278
7.7 并行数组和枚举类型 280
7.7.1 枚举类型 280
7.7.2 带有枚举类型下标的数组 284
7.8 多维数组 285
7.8.1 多维数组的初始化 287
7.8.2 具有多个维度的数组 287
7.9 数组处理说明 289
7.10 数组表示图形程序(可选) 295
7.10.1 绘制多边形 295
7.10.2 程序风格——使用字符数组存储提示信息 297
7.10.3 生成随机数 297
7.10.4 为随机数生成器设置随机数种子 297
7.10.5 绘制网格 298
7.11 常见编程错误 302
本章内容回顾 303
快速练习 304
复习题 305
编程项目 306
第8章 字符串 312
8.1 字符串基础知识 312
8.1.1 声明和初始化字符串变量 313
8.1.2 字符串数组 313
8.1.3 scan和printf的输入/输出 313
8.2 字符串库函数:赋值和子字符串 316
8.2.1 字符串赋值 318
8.2.2 子串 318
8.3 长字符串:串连和整行输入 323
8.3.1 串连 323
8.3.2 字符和字符串的区别 324
8.3.3 整行输入 324
8.4 字符串的比较 326
8.5 指针数组 328
8.6 字符操作 332
8.6.1 字符输入/输出 332
8.6.2 字符的分析与转换 334
8.7 字符串和数值之间的相互转换 336
8.8 字符串处理说明 340
8.9 常见编程错误 346
本章内容回顾 348
快速练习 349
复习题 351
编程项目 352
第9章 递归 355
9.1 递归的性质 355
9.2 跟踪递归函数 359
9.2.1 跟踪一个有返回值的递归函数 359
9.2.2 跟踪递归函数void 360
9.2.3 参数和局部变量堆栈 361
9.2.4 在C语言中实现参数栈 363
9.2.5 跟踪循环函数的时机和方法 363
9.3 递归的数学函数 364
9.4 带有数组和字符串参数的递归函数 368
9.5 递归问题的解决 373
9.6 递归的经典案例研究:汉诺塔 379
9.7 常见编程错误 383
本章内容回顾 384
快速练习 384
复习题 385
编程项目 386
第10章 结构体与联合体类型 388
10.1 用户定义的结构体类型 388
10.1.1 结构体类型定义 388
10.1.2 操作结构体数据对象的单个组件 390
10.1.3 运算符优先级回顾 391
10.1.4 操作整个结构体 391
10.1.5 程序风格——类型命名约定 391
10.2 作为输入和输出参数的结构体类型数据 392
10.3 结果值是结构体的函数 396
10.4 结构体类型的问题解决 398
10.5 平行数组和结构体数组 404
10.5.1 平行数组 404
10.5.2 声明一个结构体数组 404
10.6 联合体类型(可选) 412
10.7 常见编程错误 416
本章内容回顾 416
快速练习 417
复习题 419
编程项目 420
第11章 文本和二进制文件的处理 424
11.1 输入/输出文件:回顾和进一步研究 424
11.1.1 键盘和屏幕作为文本流 424
11.1.2 换行符和EOF 425
11.1.3 转义字符 425
11.1.4 printf的格式化输出 425
11.1.5 文件指针变量 427
11.1.6 获取文件指针参数的函数 428
11.1.7 关闭文件 428
11.2 二进制文件 431
11.3 数据库查询 435
11.4 常见编程错误 442
本章内容回顾 442
快速练习 443
复习题 444
编程项目 445
第12章 大规模编程 447
12.1 使用抽象来管理复杂度 447
12.1.1 过程抽象 447
12.1.2 数据抽象 448
12.1.3 信息隐藏 448
12.1.4 可重用代码 449
12.2 个人库:头文件 449
12.2.1 头文件 449
12.2.2 设计头文件的注意事项 452
12.3 个人库:实现文件 452
12.4 存储类 455
12.4.1 全局变量 455
12.4.2 存储类static和register 457
12.5 在库中修改函数 458
12.6 条件编译 460
12.7 主函数的参数 463
12.8 定义宏参数 465
12.8.1 在宏体中使用括号 466
12.8.2 将宏扩展到两行或多行 467
12.9 常见编程错误 468
本章内容回顾 468
快速练习 470
复习题 471
编程项目 471
第13章 动态数据结构 474
13.1 指针 474
13.1.1 作为函数参数的指针 475
13.1.2 表示数组和字符串的指针 475
13.1.3 指向结构体的指针 476
13.1.4 总结指针的使用 476
13.2 动态存储分配 477
13.2.1 访问动态分配结构体的组件 478
13.2.2 用calloc分配动态数组 479
13.2.3 返回堆的单元格 480
13.3 链表 480
13.3.1 带有指针组件的结构体 481
13.3.2 连接结点 482
13.3.3 链表的优点 483
13.4 链表运算符 484
13.4.1 遍历列表 484
13.4.2 获取输入列表 486
13.4.3 搜索目标链表 487
13.4.4 避免跟随空指针 488
13.5 用链表表示栈 488
13.6 用链表表示队列 491
13.7 有序表 496
13.8 二叉树 504
13.8.1 二叉搜索树 505
13.8.2 搜索二叉搜索树 505
13.8.3 创建二叉搜索树 506
13.8.4 显示二叉搜索树 509
13.9 常见编程错误 511
本章内容回顾 511
快速练习 512
复习题 513
编程项目 514
术语表 517
在线资源
第14章 多进程和线程的使用
第15章 C++基础
附录A 关于指针的更多知识
附录B ANSI C标准库函数
附录C C语言运算符
附录D 字符集
附录E ANSI C保留字

教学资源推荐
作者: (美)Y.Daniel Liang 著 阿姆斯特朗亚特兰大州立大学
作者: 马玉春 著
作者: 钱丽萍 汪立东 张健 编著
参考读物推荐
作者: 徐涛 著
作者: (美)Jose Annunziato 等