图书前言

这本教材介绍的是一种很规则的方法,用于解决问题以及将广泛接受的软件工程方法作为内聚的、可读的、可重用的模块来应用到程序解决方案的设计中。本书将用ANSI C子集作为实现工具,ANSI C由于其强大的功能和可移植性而成为业界的标准编程语言。本书也可以作为编程方法入门教材,因为本书假定读者事先并不具有计算机或者编程方面的知识。本书包含了很多案例研究和练习题,可作为计算机工程专业新生或者其他学科学生的C语言编程的教材。

这一版本中的新内容

在这一版的准备过程中,我们增加了一个计算机术语的词汇表,其中包含了对类型强转(type casting)和字符串扩展等内容的详细说明。第5章中的新案例研究探索了太阳热能领域中一些最新的研究成果。通过本书的学习,同学们将利用数目众多的全新项目来实践所学到的编程技能。另外,这一新版本中的附录还包含了最流行的开发环境之一即Borland C++ Builder。本书的附录D还进一步探讨了指针的一些附加的算法。最后,本书的创作团队为本书定制了全新的样式,为范例代码都加上了行号,以便于同学们参考引用。

用C语言讲授程序开发

我们的两个目的--讲授程序设计和讲授C语言--看上去似乎有某种一致性。C是大家公认的最难的编程语言,只有用其他更友好的语言学习了编程的基础知识之后,才能开始学习C语言。C语言特别难学的认识可以追溯到其刚刚诞生的时候。由于C语言是为UNIX操作系统设计的编程工具,因此其最初的用户群是那些能够理解操作系统的复杂性和底层机制,并且能够很自然地将这些知识应用到所编写的程序中的程序员。所以,很多以讲授C语言为主要目标的教科书都要求学生们事先已经掌握了学习这门介绍性编程语言时原本并不需要了解的关于机器语言方面的知识。

本书讲授了编程开发的关系方法以及ANSI C的内容,但我们的重点将放在编程开发的关系方法上。有人可能会担心这种选择会导致本书在内容上对ANSI C的忽视。其实相反,本书将编程概念与用C语言来实现这些概念有机地融合在一起,重点展示了ANSI C作为一种高级编程语言的强大功能,而这一点正是许多以泛泛介绍ANSI C的教科书所忽略掉的。即使是遵循着这种先介绍C语言特性再介绍程序设计过程的教学方法,本书还是很全面地涵盖了C语言最本质的结构。

本书内容的组织结构与"指针"

本书介绍C语言各个主题的顺序是根据初级编程学生的学习需要来进行的,而不是根据C编程语言的结构来进行的。同学们可能会很惊讶于为什么本书没有名为"指针"的一章。之所以遗漏了这一章主题,是因为本书将C作为高级语言来对待,而不是没有意识到指针在C中所扮演的关键性角色。

与其他高级语言对输出参数和数组分别采取单独的语言结构不同的是,C语言将这些概念全包括在指针概念中,因此急剧地增加了学习C语言的复杂度。本书通过不同角度来讨论指针,从而简化了指针的学习过程,使同学们能够每次掌握一点关于指针的内容来循序渐进地学习。这样,本书就可以使用传统的高级语言的命名方式--输出参数、数组、数组下标、字符串--来展示基本概念,并且使得同学们不需要事先具备汇编语言的背景知识,就能掌握指针使用的各个方面。

因此,本书并不是没有专门介绍指针,而是用了整整4章的篇幅来分别介绍指针。第6章介绍了指针在简单输出和输入/输出参数方面的使用方法,第8章介绍了指针在数组中的使用方法,第9章介绍了指针在字符串和数组中的使用方法,第14章在回顾了前面介绍过的指针使用方法后讨论了动态内存分配。另外,第2章和第12章也讨论了文件指针。

软件工程概念

本书展示了软件工程的许多方面。某些内容是直接介绍的,还有一些内容则是通过范例来讲授的。良好的问题解决技能和高效软件开发之间的联系早在第1章中就确立了,第1章中专门用一节的篇幅来讨论问题解决的方法论。第1章中所讲述的软件开发现场阶段用于解决第一个案例研究,也将应用于本书后续的所有案例研究。主要的程序风格将用特殊格式突出显示出来,而范例中所使用的编码风格是基于C软件产业的标准。在好几章中都有一些小节讨论算法的跟踪、程序的调试和测试。

第3章介绍了通过选定的C库函数来进行过程抽象,以及无参数的空函数和接收输入参数并返回一个值的函数。第4章和第5章包含了一些附加的函数范例,第6章结束了具有简单参数的函数的学习。这一章将通过讨论指针的使用来展示输出参数和输入/输出参数。第7章介绍了将函数作为参数的使用方法。

第6章、第8章和第11章中的案例研究和范例程序介绍了数据抽象的概念,以及数据类型与运算符的封装的概念。第13章介绍了C语言在过程形式化方面的简便性,以及在由独立的头文件和实现文件定义的个人库中的数据抽象。第15章介绍了面向对象设计的概念,就像C++语言所实现的那样。

可视化函数接口的使用贯穿全书。直到第13章前,本书都没有使用全局变量,在全局变量的危险性和价值之间,我们需要谨言慎行。

本书在教学方面的特性

为了使本书能够成为一种更有用的教学工具,我们在本书中包含了以下教学方面的特性:

每个小节末尾的练习题  大多数小节的末尾都包含了一些自测题。其中包括需要分析程序代码段的习题,以及比较短的编程练习。

范例和案例研究  本书包含了大量的编程范例。我们尽可能地包含完整的程序或函数,而不是不完整的程序段。每一章都包含一个或多个案例研究,可用该章中所学的软件开发方法来解决。许多案例研究使同学们可以对一些重要的应用有一个大概的认识,比如数据库搜索、支付与销售分析等商务应用、字处理,以及辐射等级监控和水资源保护等环境方面的应用。

语法显示框  本书用特殊的语法显示框来描述新的C特性的语法语义,并提供范例。

程序风格显示  程序风格显示框用于向同学们展示好的编程风格。

错误讨论和章节回顾  每一章都包含有一个小节来讨论常见的编程错误。章节回顾用表格形式展示了新遇到的C的语言结构。

每章末尾的练习题  每一章的章节回顾之后,都包含了带有答案的快速自测题。另外还包含有一些复习题。

每章末尾的编程练习  每一章末尾都会有一些编程练习。

附录

附录F介绍了如何使用最流行的开发环境之一即Borland C + + Builder,此外这个附录还介绍了如何使用可从Borland网站(www.Borland.com)免费下载的命令行解释器。关于ANSI C结构的一个表包含在本书的最后,而附录A则包含了字符集的表格。由于本书内容只涉及ANSI C的一个子集,因此剩余的附录将扮演尤其重要的角色,这些章节能大大提高本书的参考价值。附录B是一个按字母顺序排列的ANSI C标准库的表格。附录C的表格展示的是所有ANSI C运算符的优先级和结合规则,以及在本附录中没有解释过的运算符。在本书中,数组的引用是通过下标来完成的,附录D只介绍了指针的算法。附录E列出了ANSI C的所有保留字。

教辅材料

本书的源代码和勘误表可以从www.aw.com/cssupport下载。

需要以下教辅材料的教师,请与longqm@tup.tsinghua.edu.cn联系。

l 包含答案的教师手册:包含了每一章的提要以及建议,还包含了自测题、复习题和部分编程练习的答案。

l 所有PowerPoint文件。

l 源代码。

致谢

许多人都参与了本书编写工作,在此我们要感谢来自加州理工学院喷气推进实验室的Joan C. Horvath,感谢他提供了一些编程练习。我们要特别感谢霍华德大学学生Paul Onakoya的贡献,他为本书编写了新的词汇表,核查了习题答案,并为许多新的编程练习提供了教师手册答案。我们还要感谢坦普尔大学和怀俄明州大学前几届学生的协助,他们帮助我们检查了编程范例,并为大多数习题提供了答案,这些学生包括Mark Thoney、Lynne Doherty、Andrew Wrobel、Steve Babiak、Donna Chrupcala、Masoud Kermani和Thayne Routh。

我们很高兴与Addison-Wesley团队合作。责任编辑Susan Hartman Sullivan和Michael Hirsch以及助理编辑Galia Shokry在我们编写本书的过程中给予了很多的指导。Juliet Silveri监督了本书的编写工作,Nathan Schultz和Lesly Hershman为本书的市场宣传做了很多工作。

J.R.H.

E.B.K.