C程序设计教程
作者 : (美)H.M.Deitel, P.J.Deitel
译者 : 薛万鹏等译
丛书名 : 计算机科学丛书
出版日期 : 2000-07-01
ISBN : 7-111-07952-3
定价 : 33.00元
教辅资源下载
扩展信息
语种 : 简体中文
页数 : 495
开本 : 16开
原书名 : C How to Program
原出版社: Prentice Hall
属性分类: 教材
包含CD :
绝版 : 已绝版
图书简介

本书详细叙述了C程序设计语言,强调用结构化程序设计方法编写程序,自始至终用完整的程序输出范例来演示所讲的概念,内容全面,层次清晰,可作为大专院校学生和计算机编程爱好者的入门与提高教程。

图书前言

欢迎进入C语言世界!本书是由父子两代人合著而成。年长者H.M.Deitel编写、教授程序设计已30余年,经验丰富、强调程序的清晰优美。年轻人P.J. Deitel编写程序亦有十余年,精力充沛、热衷于教学和程序设计,侧重于程序的性能和结果。我们希望通过我们两人的合作,奉献给读者一本集知识性和可读性于一体的书。
  C语言通常只教授给有程序设计基础的人。许多教育家认为C语言的复杂性及其众多的难点使得该语言不适合作为程序设计的第一门教学语言,而这正是本书的目标。那么我们为什么还要编写这本书呢
  事实上,C语言已成为工业界选用的系统实现语言。在大学教授Pascal语言已13年的H.M.Deitel强调清晰的结构化程序。Pascal课程中所讲的许多内容是结构化程序的基本原则。我们以H.M.Deitel在大学里的教学方式编写了这本教材。我们会指出疑点并说明有效解决的步骤。我们的经验是:要以学习Pascal语言同样的方式学习该教材。不过有一个值得注意的不同点,那就是学生们正为他们在学习一种毕业后就能立即有用的语言所鼓舞,这提高了他们的学习热情,在想到C语言难学时,这种学习热情对克服困难大有帮助。
  出版本书的目的是为那些没有或很少程序设计经验的学生提供相当于大学水准的入门教程,同时也是要对传统C教程所要求的理论和实践作严密的论述。为了达到这些目标,本书的内容比其它C语言教材丰富得多。在我们的教学中约有1000名学生使用了该教材,好几万名外国读者详细地学习了本书的第一版。
  为了让读者能够解决生动有趣的现实问题,本书提供丰富的范例、练习和从许多领域中提炼出的专题。
  本书侧重于软件工程的原则,强调用结构化程序设计方法编写清晰的程序,力求避免使用模糊的术语和语法规范。
  本书用完整的程序和输出范例来演示所讲的概念。每一章以学习目标开头,最后以小结和本章涉及的术语结束。每一章还配有习题。本书的练习涵盖面广,既有简单的复习题,也有复杂的程序设计问题,还有大型项目的开发。为了提高本书对学生的价值,我们在练习中投入了大量的精力。本书中的程序已在ANSI C兼容的编译器上作了测试,所用的机器包括Sun SPARC工作站、Apple Macintosh (Think C) IBM PC(Turbo C++,Borland C++)及DEC VAX/VMS(VAX C)。
 
关于本书
  这本书具有帮助学习的如下特点:
 学习目标
  每一章均以学习目标开头,它告诉学生应该达到什么标准,并能够在学完该章后测试自已是否达到了标准。
 节
  每章均由重点明确的节组成。每一节在介绍完整的C程序的同时介绍了C语言的特征。每一个程序之后都有输出结果,输出结果证实了所介绍的内容。把输出结果和程序设计语句结合起来讲解是学习和巩固所讲概念的好方法。本书的程序是为反映C语言的种种特点而设计的,在认真阅读的同时还需要上机实践。
 图解
  本书具有丰富的图解。结构化流程图有助于理解控制结构和结构化程序设计。本书还用大量的图示来说明重要数据结构(如链表、队列、堆栈、二又树)的建立和维护。
 小结
  每章的小结部分的内容可帮助学生复习和巩固重要的概念。
 术语
  每一章中还按字母顺序列出了本章定义的术语,它也是为了让学生进一步巩固所学的概念。然后归纳了良好的程序设计习惯、常见的程序设计错误、性能忠告、可移植性忠告及软件工程评述。
 自我测验练习
  为便于自学,本书还配有自我测验练习及答案。它可帮助学生树立信心并尝试其后的练习。
 练习
  每一章配有大量的练习。这些练习涵盖面广,包括重要术语及概念的回亿、编写一条C语句、写一小段C函数、编写完整的C函数和程序、直至编写重大项目。教师可根据需要和各学期的教学计划加以选择,还可以用这些练习题来安排家庭作业、小测验及重要考试。
  
本书概况
  本书共有14章和5个附录,详细地叙述了C程序设计语言(包括结构化程序设计的内容)并提供了支持正文的参考资料。
  第l章“基本概念”,讨论什么是计算机、它是如何工作的以及人们是怎样为计算机编写程序的。引入了结构化程序设计的概念,解释了为什么这种技术促成了程序设计方法的革命。叙述了从机器语言到汇编语言及高级语言的发展史。介绍了C语言的起源和C程序设计的环境。
  第2章“C语言程序设计入门”,简要地介绍了C程序的编写,详述了C语言中的判断及算术运算。学完这一章后,学生将理解怎样编写简单而完整的C程序。
  第3章“结构化程序的开发”,它可能是本书最重要的一章。本章介绍了帮助解决问题的算法表示,解释了结构化程序设计在编写易于理解、调试、维护及更可朗在第一次调试就能正确运行的程序中的重要性。介绍了结构化程序设计的基本控制结构,即顺序结构、选择结构和循环结构。解释了自顶向下、逐步求精的程序设计技术,这种技术对编写正确的结构化程序是很重要的。介绍流行的帮助设计程序的方法——结构化伪码。第3章介绍的方法不仅适用于C语言,而且也适用于其它任何结构化程序设计语言。本章有助于培养学生良好的程序设计习惯,从而为解决复杂程序设计任务打下坚实的基础。
  第4章“程序控制”,提炼了结构化程序设计的表示方法并介绍了其它控制结构。详细地探讨了循环结构,对比了用计数器控制的循环和用标记控制的循环。介绍了for结构,它是实现用计数器控制的循环的一种方便的方法。还介绍了switch选择结构和do/while循环结构。最后还讨论了逻辑运算符。
  第5章“函数”,讨论了程序模块的设计和构造,介绍的内容包括标准库函数、程序员定义的函数、递归和传值调用。本章介绍的技术对于开发正确的结构化程序(尤其是大型程序和软件)相当重要。本章所介绍的“细化”程序设计策略是解决复杂问题的有效的方法,这种策赂就是用函数把复杂的问题分解为简单而又相关的部分。学生们欣赏本书对随机数和模拟的介绍,还欣赏本书对完美地使用了控制结构的掷骰子游戏的讨论。本章还介绍了递归结构,列出了书(包括练习)中涉及到的3l例递归范例。有些教材把递归结构放在后面介绍,但我们认为这一内容最好逐步覆盖全书。练习中搜集了几个经典的递归问题,如汉诺塔问题(TowersofHanoi)。
  第6章“数组”,讨论了数组数据结构(即同一类型的相关数据项的集合)。本章列举了大量的一维数组和二维数组的范例,阐明了结构化数据与控制结构对于正确地开发结构化程序同样重要。本章的范例涉及到对数组的各种常用操作方法、打印直方图、数据排序、把数组传递给函数以及统计数据的简单分析。本章的特点之一是仔细地介绍二分查找法,这种方法是对线性查找方法的极大的改进。练习中有许多有趣而富有挑战性的问题,包括排序方法的改进、航空预约系统的设计、龟图概念(在L1003语言中很著名)和在人工智能领域广泛作为程序开发概念的骑士漫游和八皇后问题。
  第7章“指针”,讲述了C语言中功能最强大的特点之一——指针。详细地解释了指针 的操作、传引用调用、指针表达式、指针的算术运算、指针与数组的关系、指针数组和指向函数的指针。练习中有经典的龟免赛跑的模拟、洗牌和发牌的算法,还包括专题“建立自己的计算机”。专题中解释了机器语言程序设计的表示方法,让学生设计和实现一个允许编写和运行机器语言程序的计算机模拟器。这种特点对于那些希望理解计算机到底是如何工作的读者尤其有用。学生们喜欢这种专题,他们经常能够补充一些增强功能(练习中建议了许多增强功能)。在第12章中,另一个专题指导了读者建立一个编译器,然后把编译器所生成的机器语言放在第7章中建立的机器语言模拟器上运行。
  第8章“字符和字符串”,探讨了处理非数值数据的基本问题。这一章完整地介绍了C函数库中的字符和字符串处理函数。所讨论的技术可广泛地用于建立字处理器、页版面和排版软件、文本处理应用程序。本章搜集了33道与文本处理有关的有趣的练习题,涉及的领域包括回文、打油诗、英文转换、产生表示给定电话号码的七字单词、文本对齐、用单词书写支票金额、产生莫尔斯码、公制转换和讨债信。本章最后一道练习是对学生的挑战,它要求用计算机化的字典建立纵横字谜发生器。
  第9章“格式化输入/输出”,介绍了printf和scad函数的强大的格式化能力。讨论了printf函数的格式化输出功能,如把浮点数精确到指定的小数位、数值的列对齐、左对齐和右对齐、插入直接信息、强制打印出加号、打印前导零、用指数表示法输出结果、八进制和十六进制的使用、以及域宽和精度的控制。讨论了printf函数的转义序列,如光标的移动、特殊字符的打印和系统响铃等等。讨论了scad函数的所有的格式化输入能力,包括读取十进制、八进制、十六进制、浮点数、字符和字符串数据。还讨论了通过扫描输入的数据从扫描集中读取匹配或不匹配的字符。本章的练习实际上测试了C的所有的格式化输入/输出能力。
  第10章“结构、联合、位运算和枚举”,介绍了各种重要的特点。结构类似于Pascal语言和其它语言中的记录,它把各种类型的数据项组合在一起。第11章用结构来建立包含以记录格式组织信息的文件。第12章把结构和指针以及动态内存分配一起使用,建立了链表、队列、堆栈和树等等的动态数据结构。联合用于使一块内存区能够被不同类型的数据在不同时刻使用。枚举对定义有用的符号常量是很方便的,它能够使程序具有更好的可读性。C语言的功能强大的位操作能力能够让程序员编写控制底层硬件的程序。程序中使用位操作能够处理位串、屏蔽(或取消屏蔽)某个位和更紧凑地存储信息;这种通常只在底层汇编语言中才有的能力可以让程序员编写系统软件(如操作系统和网络软件)。本章的特点之一是重写了以前的洗牌和发牌模拟程序,新的程序效率更高,从中可以看出算法质量的重要性。
  第11章“文件处理”,讨论了处理顺序存取文本文件和随机存取文本文件的技术。先介绍了数据的层次结构,即从位、字节、字段、记录到文件这样的一种层次结构。然后简要地介绍了C语言把文件看作字节流的观点。本章用三个程序讨论了顺序存取文件,这些程序说明了怎样打开和关闭文件、怎样按顺序把数据存储在文件中以及怎样按顺序读取文件中的数据。讨论随机存取文件时介绍了四个程序,这些程序说明了怎样按顺序建立一个随机存取的文件、怎样随机地读取和写入文件数据、怎样按顺序读取随机存取文件中的数据。第四个程序是一个完整的金融事务处理程序,它综合了顺序和随机存取文件的许多技术。工业界的读者告诉我们说,通过本书的学习,他们已经能够编写在其机构内适用的文件处理程序。
  第12章“数据结构”,讨论了用于建立动态数据结构的技术。本章以讨论自引用结构和动态内存分配开始,然后讨论了怎样建立和维护各种动态数据结构,包括链表、队列、堆栈和树。对于每一种类型的数据结构,我们都提供了完整的程序和输出结果。第12章有助于学生真正地掌握指针。本章包含了使用间接引用和二次间接引用(特别难懂的概念)的丰富的范例。指针学习的难点之一是学生难以想象数据结构以及结点的连接。为此,我们用图示的方法来说明链节及其建立的顺序。用二叉树范例研究指针和动态数据结构是再好不过了。范例程序建立了一个二叉树,并以先根次序、中根次序和后根次序遍历该二又树。学生们特别欣赏以中根次序遍历并打印结点的排序值。本章有丰富的练习,其中的重点之一是专题内容“建立自己的编译器”。该专题练习指导学生开发把中缀表达式转换为后缀表达式的程序和计算后缀表达式的程序。然后,我们修改了后缀表达式的算法,并用该算法产生机器语言代码。编译器把它所产生的机器语言代码文件放在了一个文件中(用第11章中的方法),学生可以在第7章开发的软件模拟器上运行编译器所产生的机器语言代码。
  第13章“预处理程序”,详细地讨论了预处理程序的指令。本章完整地介绍了预处理指令#include和#define。#include指令在程序编译之前把指定文件的拷贝包含到指令所在的位置,#define指令用来建立符号常量和宏。本章解释了条件编译,它能够让程序员控制预处理指令的执行和对源代码的编译。还讨论了把其操作数转换为字符串的运算符#和连接两个记号的运算符##,介绍了五个预定义的宏常量_LINE_、_FILE_、_DATE_、_TIME_ 和_STDC_。最后讨论了头文件assert.h中的宏assert,在测试、调试和校验程序时,宏assert是有价值的。
  第14章“高级话题”,介绍了在通常的教程中不涉及到的某些高级话题。第14.2节介绍了怎样把来自于文件的输入重定向到程序中、怎样把来自程序的输出重定向到文件中、怎样把一个程序的输出重定向成另一个程序的输入(即建立管道)以及怎样把程序的输出追加到现有的文件中。第14.3节讨论了怎样开发使用变长参数列表的函数。第14.4节介绍了怎样把命令行参数传递给函数main以及怎样在程序中使用这些参数。第14.5节讨论了怎样编译由多个源文件组成的程序。第14.6节讨论了用函数atexit注册要在程序结束时执行的函数,还讨论了结束程序执行的函数exit。第14.7节讨论了类型限定符const和volatile。第14.8节介绍了怎样用整数和浮点数后缀指定数值常量的类型。第14.9节解释了二进制文件和临时文件的用法。第14.10节介绍了怎样用信号处理库捕捉意外的事件。第14.11节讨论了用函数calloc和realloc建立和使用动态数组。
  附录部分提供了有价值的参考资料。附录A是C语法概要,附录B摘编了C标准库,附录C完整地列出了运算符的优先级和结合性,附录D列出了ASCII字符集代码,附录E讨论了二进制、八进制、十进制和十六进制数值系统。附录B是根据ANSI标准文献摘编的(经美国国家标准化协会允许),该附录对编写C程序是详细而有价值的。附录E是一套完整的数值系统,其中包括自我测验练习和答案。
  欢迎使用本书。本书作者期待您的意见、批评、指正和建议。

译者简介

薛万鹏等译:暂无简介

译者序

C语言表达能力强,目标代码效率高,可移植性好,既具有高级语言的优点,又具有低级语言的特点,因此特别适合编写操作系统、网络软件、编译器等系统软件。
  市面上介绍C语言的书是很多的,这些书的内容可以说是“大而全”。C语言入门并不难,但是,正如许多人认为的那样,掌握程序设计语言最困难之处是用其灵活高效地开发实际软件系统,这需要大量的实践和学习,而C因其丰富的功能和复杂的特点更是如此。与其它书不同,本书从软件工程的角度介绍并讨论了C语言,读者能在学习的同时为实际使用打下坚实的基础,初学者和有经验的程序员都会从中受到启发。原书作者有着丰富软件开发经验。Harvey M.Deitel教授是虚拟存储系统(VMS)的先驱研究者之一,如今这种系统已经广泛地应用于UNIX、OS/2和Windows NT等等的操作系统上;Paul J.Deitel在网络数据管理、数据库查询翻译器、金融财务管理系统的开发方面具有丰富的经验。本书的许多内容都体现了作者对程序设计技术的理解,正如作者所言:“本书集我们40余年程序设计经验之精华”。
  本书主要由薛万鹏、纪宁、韩磊、许文轩、梅开、谢立、薛鸾、李岩、沈长华翻译,参加翻译工作的还有淄玉民、赵晓蓉、瘢先杰、任映梅、治中、瞿跃龙、苏泳民、史荣光、上官立新、单力、汪梓鸣、成文、魏莲方、马蔚、杨开开、段群慧、蒋星、文达、韩青云等,张祖荫、梁敏、沈维亮、李听怡对本书进行了全面的审校。机械工业出版社华章分社和华译工作室也为本书的翻译给予了大力的支持和帮助,在此深表感谢。
  原书内容严谨,具有较强的理论性和实用性。译者力求反映原书的特点和风貌,但由于时间关系及水平所限,不当和疏漏之处在所难免,敬请广大读者批评指正。
                             1997年4月

图书目录

出版说明
 译者序
 前言
 第1章 基本概念
  1.1 引言
  1.2 计算机是什么
  1.3 计算机的结构
  1.4 批处理、多道程序设计和分时
  1.5 个人计算、分布式计算和客户/服务器计算
  1.6 机器语言、汇编语言和高级语言
  1.7 C语言的历史
  1.8 C标准库
  1.9 其它高级语言
  1.10 结构化程序设计
  1.11 C环境的基本知识
  1.12 对C语言和本书的总的说明
  1.13 Concurent C
 第2章 C语言程序设计入门
  2.1 引言
  2.2 一个简单的C语言程序:打印一行文本
  2.3 另一个简单的C语言程序:求两个整数的和
  2.4 内存的概念
  2.5 C语言中的算术运算
  2.6 判断语句:相等测试运算符和关系运算符
 第3章 结构化程序的开发
  3.1 引言
  3.2 算法
  3.3 伪码
  3.4 控制结构
  3.5 if选择结构
  3.6 if/dse选择结构
  3.7 while循环结构
  3.8 制定算法:实例研究1
  3.9 用自顶向下、逐步求精的方法制定算法:实例研究2
  3.10 用自顶向下、逐步求精的方法制定算法:实例研究3
  3.11 赋值运算符
  3.12 自增和自威运算特
 第4章 程序控制
  4.1 引言
  4.2 循环的本质
  4.3 计数器控制的循环
  4.4 for循环结构
  4.5 for结构:说明和评述
  4.6 for结构用法举例
  4.7 switch多路选择结构
  4.8 do/while循环结构
  4.9 break和continue语句
  4.10 逻辑运算符
  4.11 容易混淆的相等测试运算符==和赋值运算符=
  4.12 结构化程序设计小结
 第5章 函数
  5.1 引言
  5.2 C语言的程序模块
  5.3 数学库函数
  5.4 函数
  5.5 函数定义
  5.6 函数原型
  5.7 头文件
  5.8 函数调用:传值调用和传引用调用
  5.9 随机数的产生
  5.10 范例:碰运气游戏
  5.11 存储类别
  5.12 作用域规则
  5.13 递归
  5.14 递归应用举例:Fibooacci数列
  5.15 递归与迭代的比较
 第6章 数组
  6.1 引言
  6.2 数组
  6.3 数组的声明
  6.4 数组使用举例
  6.5 把数组传递给函数
  6.6 数组排序
  6.7 实例研究:用数组计算均值(mean)、中位值(median)和众数(mode)
  6.8 数组查找
  6.9 多维数组
 第7章 指针
  7.1 引言
  7.2 指针变量的声明和初始化
  7.3 指针运算符
  7.4 函数的传引用调用
  7.5 对指针使用凹nst限定符
  7.6 使用传引用调用的泡沫排序法
  7.7 指针表达式和指针的算术运算
  7.8 指针和数组的关系
  7.9 指针数组
  7.10 实例研究:洗牌和发牌模拟
  7.11 指向函数的指针
 第8章 字符和字符串
  8.1 引言
  8.2 字特串和字符的基本知识
  8.3 字符处理函数库
  8.4 字符串转换函数
  8.5 标准输入/输出库函数
  8.6 字符串处理库中的字符操作函数
  8.7 字符串处理库中的比较函数
  8.8 字符串处理库中的查找函数
  8.9 字符串处理库中的内存函数
  8.10 字符串处理库中的其它函数
 第9章 格式化输入/输出
  9.1 引言
  9.2 流
  9.3 Printf的格式化输出
  9.4 打印整数
  9.5 打印浮点数
  9.6 打印字符串和字符
  9.7 其它转换说明符
  9.8 打印的域宽和精度
  9.9 在Printf的格式控制串中使用标志
  9.10 打印直接量和转义序列
  9.11 scanf函数的格式化输入
 第10章 结构、联合、位运算和枚举
  10.1 引言
  10.2 结构的定义
  10.3 结构的初始化
  10.4 访问结构成员
  10.5 结构和函数
  10.6 类型定义:typedef
  10.7 范例:高效的洗牌和发牌模拟
  10.8 联合
  10.9 位运算符
  10.10 位段
  10.11 枚举常量
 第ll章 文件处理
  11.1 引言
  11.2 数据的层次结构
  11.3 文件和流
  11.4 建立项序存取文件
  11.5 读取顺序存取文件中的数据
  11.6 随机存取文件
  11.7 建立随机存取文件
  11.8 向随机存取文件中随机地写入数据
  11.9 从随机存取文件中随机地读取数据
  11.10 实例研究:事务处理程序
 第12章 数据结构
  12.1 引言
  12.2 自引用结构
  12.3 动态内存分配
  12.4 链表
  12.5 堆栈
  12.6 队列
  12.7 树
 第13章 预处理程序
  13.1 引言
  13.2 预处事指令#include
  13.3 预处理指令#define :符号常量
  13.4 预处理指令#ddfine:宏
  13.5 条件编译
  13.6 预处理指令#error和#program
  13.7 运算符#和##
  13.8 行号
  13.9 预定义的符号常量
  13.10 宏assert
 第14章 高级话题
  14.1 引言
  14.2 UNIX和DOS系统中的输入/输出重定向
  14.3 变长参数列表
  14.4 使用命令行参数
  14.5 对编译多个源文件程序的说明
  14.6 用exit和atexit终止程序的执行
  14.7 类型限定符volatie
  14.8 整数和浮点数常数的后缀
  14.9 再谈文件
  14.10 信号处理
  14.11 动态内存分配:函数caMtx和realloc
  14.12 无条件转移:goto语句
 附录A C语法
 附录B 标准库
 附录C 运算符的优先级与结合性
 附录D ASCII字符集
 附录E 数值系统

教学资源推荐
作者: [英]理查德·伯德(Richard Bird) 著
作者: 邱李华,曹青,郭志强
作者: [美]本贾尼·斯特劳斯特卢普(Bjarne Stroustrup) 著
参考读物推荐
作者: [瑞士]路易斯·汤斯顿(Lewis Tunstall),[瑞士]莱安德罗·冯·韦拉(Leandro von Werra),[法]托马斯·沃尔夫(Thomas Wolf) 著