前言C Programming: a Q & A Approach新生经常发现阅读计算机语言书很困难,书写本书的目的就是为了解决这个困难。如果能使学生深入到书本中,激发他们的兴趣,并使得他们思考C语言的用法和含义,那么我们就可以把学习的过程变得简单且有趣。为此,我们使用了Q&A的方式。在这个过程中,学生经常问的问题也会激发读者的思考。通过直接并清晰地回答这些问题,我们把读者的注意力集中到C编程中重要的概念上。我们也观察到很多计算机语言书很少有图。因为可视化的图形在教学中非常有用,所以我们努力使图示既准确又容易理解。对于程序执行的操作,这些图有利于澄清概念,加强学生对概念的理解。特别地,我们用三维的图来描述循环和判断结构,从而让学生可以很快地掌握程序的流程。我们相信这些图是对标准流程图的加强。我们也意识到对于很多学生来说,指针是最困难的部分。指针图示建立在包含变量名字、类型、地址和值的表格的基础之上,并且表格出现在文本解释的前面。本书中,我们使用表格来说明一个内存单元的信息是如何与另一个内存单元的信息联系起来的。很多书包含大量的代码,但是并没有给出充分的解释,大部分新生不能也不愿意在没有解释的情况下独立地理解哪怕是很简单的代码。本书在代码中引导学生了解操作以及生成代码的过程,目的就是使学生意识到哪些地方需要额外的想法,以及掌握正确细节的重要性。这种独特的方式已经受到用过本书草稿的学生的热烈欢迎。本书也被推荐给其他学生并询问他们的意见。当和其他书比较时,学生会优先选择我们的书。我们相信你在教学和学习过程中也会发现本书的价值。本书组织第1章介绍编程基础,假设学生除了会使用计算机进行简单的文字处理以外,没有其他的计算机知识。第1章介绍了编程语言的概念,描述了硬件、信息在内存中的存储方法、计算机语言、编译器和软件工程。本章的目标是使学生了解计算机的工作方式和软件设计背后的概念。第2章到第4章讨论了过程语言的基本概念、基本语法和控制结构,也介绍了C库函数和它们的用法。第5章介绍了用户定义函数,强调了模块化和可重用代码的概念,简单介绍了指针,并将它用在一个传递地址的函数中。本章最后,介绍了使用C语言用户定义函数的效果。第6章关注数值型数组。第7章描述了字符串和指针。由于字符串使用地址进行管理,这一章也非常适合用来解释如何利用指针修改内存。第8章覆盖了C语言中的结构及其在生成链表、堆栈、队列及二叉树中的用法。另外,本章也介绍了大型程序设计,因为工程问题通常都很大。使用C特性来处理大型程序是公司招聘学生开发商用软件产品时的一项重要考量。第9章是关于C++语言的介绍。因为已经介绍过C,所以更多地介绍C++中面向对象编程的核心概念。我们用简单的术语介绍了类、封装和多态。这一章有很多演示,简单的语言和丰富的演示为学生提供了很多使用C++基本特性的背景知识。大部分章节被分为两个部分——课程和应用程序。课程部分学习语法、格式和基本构造,应用程序部分演示课程中教授的知识如何用于解决实际问题,演示了开发的流程,目标是使学生能遵循结构化方法来开发自己的程序。特点1)本书使用简单的问答方式,学生会发现这种方式比讲解的方式更加友好、更易于理解。这种方法式下,作者能够发现学生经常问的问题并能简洁地回答这些问题。2)每一课都以一个样例程序开始:源代码并附有一些指示。学生根据指示观察代码的细节,从而了解C语言。下一步给出输出以及解释。解释环节给出一系列的问答以解释源代码做了什么。3)应用程序部分演示了C语言如何用于解决工程和计算机科学中的问题。我们详细地解释了它们。例子主要涉及程序设计、软件工程、模块化和生成可重用代码。4)给出大量的图来演示编程的概念。很多图都是独一无二的,能让学生快速地掌握概念。5)在应用程序部分描述了四步结构化方法(引入了字符串和更复杂的数据结构后变成了五步结构化方法)。方法包括生成结构流程图和数据流程图。6)应用程序部分也包括数值方法例子,这些例子用在把编程和数值方法结合起来的课程中。7)课程部分包含注释代码,以帮助学生理解程序的细节和流程,使学生关注代码并把代码中的重要部分高亮显示。8)我们意识到学生一般不会主动阅读多页代码,所以应用程序部分的每一段代码都只有2到3页,并有对应的解释。9)指针的概念很难理解。为了让学生理解指针,可视化图形是非常有用的。盒子中一个指针指向另外一个盒子,这种图是不够的。使用表格和网格状的内存草图,可以降低指针的神秘性。我们发现阅读本书后,学生能够轻松地理解指针的概念。10)应用程序部分后的练习可以用于实验课。教师可以让学生提前阅读特定的应用程序。上实验课时,可以指导学生做一些改动练习,后续的部分可以作为家庭作业。11)新生通常会在调试的时候遇到困难,因为他们对这个过程很陌生。新生也会感到很沮丧,因为他们必须要调试自己的第一个程序。为此,我们在第1章介绍了一个详细的调试例子。初学者也发现调试循环是很困难的,本书中关注循环并演示了循环中值是如何变化的。学生将学习如何追踪循环并发现错误。另外,初学者经常会犯的错误也在本书相应的位置指出。12)每课后面的判断题(有答案)可以让学生快速评价自己对基础知识的掌握程度。13)每章后面的应用练习可以作为家庭作业。14)本书中所有的程序都可以从www.mheducation.asiaolccprogramming获取。学生可以修改并执行这些程序以理解它们是如何运行的。15)第9章是有关C++的介绍,不仅讨论了基础知识,阅读完本章后,学生还将学会使用面向对象编程的很多基本功能。16)很多应用程序介绍了数值方法。如何使用本书对于学生在第1章,你会理解什么可以保存在内存中,编译器如何工作,软件工程的步骤,最重要的是,编写自己的第一个C程序。其他章讨论了C语言编程。章节的课程都以一个简短的介绍开始,指导你关注源代码中一些重要的知识点。然后你可以阅读源代码和其中的注解。你甚至可以运行代码并观察程序的行为。完成这些后,确保你理解本课中主要的概念。之后阅读解释部分并完成判断题和简答题。如果做不好练习,应重新学习本课以消除疑问。掌握了一章的课程后,开始学习应用程序部分,其目的是演示编写程序的一般过程以及C的实际用处。你会发现,当你写程序的时候会遇到很多应用程序中遇到的问题。在这一部分,关注学习方法论及理解每一个程序的逻辑。记住,编程中逻辑流是非常重要的。一个语句可能语法上正确但逻辑上却是错误的。掌握了每一个应用程序的来龙去脉,会让你在写自己程序的时候更加自信。不要只是读,要尝试每个程序,修改并试验它。它会帮助你掌握在课程中学习过的内容,进而解释程序的不同行为。利用这些知识完成教师布置的编程作业。对于教师作为一学期课程,本书的目的是为学生在后续课程中掌握高级编程奠定基础,例如C编程中带有C++的介绍,推荐你按照顺序讲完所有的内容。但是,按照不同的顺序讲解本书也是可以的。例如,课程3.2(单个字符数据)可以在第7章的课程前讲述。同时,如果需要的话,课程8.7(生成头文件)、课程8.8(使用多个源文件及存储类别)、类似函数的宏和条件包含可以在第5章介绍。你也可以将第7、8和9章的部分课程延后,时间允许再讲解它们。例如,课程7.9(指针符号与数组符号)可以延后到指针的高级话题(第8章的附加材料,指向函数的指针和返回指针的函数,通过www.mheducation.asiaolccprogramming获取)之前。对于试图建立编程基础的一个学期课程,我们推荐你讲解到课程7.8,再加上课程7.10、8.1、8.2、8.3、8.4和8.5。对于给学生一般的编程体验的短的课程,如果只讲解前6章,学生也会写出有价值且复杂的C程序。本书提供了丰富的练习,课程部分后有判断题和简答题。学生应该独立完成这些练习。课程后的一些简单程序可以留作作业。一个星期的时间学生足可以完成一个程序。应用程序部分后面的修改练习可以用于实验课。学生应该在实验之前学习相关的应用程序。实验中,可以指导学生完成修改练习。一些练习比较容易,而另外一些很难,难的可以留作家庭作业。大部分章末是应用练习。它们是本书中最有挑战性的练习,所以最适合留作家庭作业。根据不同的难度,需要2~4周的时间来完成它们。另外,本书可以用作ANSI C的参考书,参考表格分散在本书正文中。教师辅助材料教师可在网站www.mheducation.asiaolccprogramming获得以下补充材料。解答手册教学课件测试库附加练习附加阅读材料致谢C Programming: a Q & A Approach感谢McGraw-Hill出版社的Eric Munson和Holly Stark。感谢他们对本书的兴趣、支持、鼓励以及有见地的建议。与他们一起工作非常愉快。感谢Byron Gottfried(BEST系列的编辑),感谢他的支持和宝贵的批评,以及McGraw-Hill的Alisa Watson和她的产品团队,使得本书版式优美。我们有一些非常有想法的评论家。University of Houston的Betty Barr;University of Texas的Raymond Bell;Fayetteville State University的Tat W. Chan;Texas A&M University的Bart Childs;University of Minnesota的Chris J. Dovolis;Illinois State University的Janet Hartman;New Mexico State University的Elden W. Heiden;Purdue University的Elias Houstis;University of Minnesota的Joseph Konstan;University of Maryland的Jandelyn Plane;还有 WPI的Matthew Ward,他们都给出了非常有帮助的建议,感谢他们的贡献。我们的计算机生涯开始于University of Michigan和 U. C. Berkeley. 感谢J. M. Duncan, John Lysmer和Raymond Canale教授(我们第一年计算机课程的指导老师),他们鼓励我们解决一些复杂的问题,而由此带来的成就感和自信促使我们写这本书。感谢Suzanne Lacasse 和 Kaare Hoeg,他们分别为Norwegian Geotechnical Institute的主管和前主管。他们对我们的自信以及在开发地理应用程序时给予的资助,延展了计算机技术背景,为进一步开发程序所需要的技能打下了坚实的基础。感谢Hui Xian Liu(Institute of Mechanical Engineering中国哈尔滨地区的前主管), 感谢他对H.H. Tan不断的支持、指导和鼓励。最后要感谢我们的家庭。T.B. D’Orazio的妻子Elizabeth虽然自己也很忙,但还是抽出时间鼓励和支持我们。正是有了她,辛苦的工作才有了乐趣。感谢 H.H. Tan的妻子Wei Huang, 她一直是一个热心、含蓄、聪明的女人。感谢 H.H. Tan的女儿Sijing Tan,前四章的大部分图都是她绘制的。H.H. TanT.B. D’Orazio感谢McGraw-Hill的Gerald Bok和Chris Cheung。Gerald是这个项目的主要推动人,他处理了大量琐碎的事物,使得我们可以专注于本书的内容。Chris负责沟通协作,也提供了很多帮助。也感谢McGraw-Hill的Maureen Tan的大力支持。S.H. Or要感谢香港中文大学的John Lui教授在担任计算机科学和工程系主任时给予的支持。同时也感谢自己的妻子Pui-yee Lau,感谢她对孩子的细心照顾,使得自己可以专心于本书的编写。Marian Choy要感谢Tim Lambert(在University of New South Wales她最受欢迎的讲师)让自己看到了编程的乐趣和创造性。也要感谢Horace Ip教授在香港城市大学给了她第一个教学的职位。同时也感谢香港大学工学院的W.C. Chew和George L. Tham教授,他们提供了免费的平台使自己可以探索和实验各种教学方式。最后,感谢所有学习过她的编程课的学生,感谢她的家庭、小组成员、朋友和同事,感谢他们一如既往的支持,以及对自己“固执地”追求高水平教学质量的包容。S.H. OrMarian M.Y. Choy