图书前言

译 者 序

计算机是20世纪最伟大的发明之一。如今,计算机对于人类社会生活的巨大改变作用已日益显现,越来越多的人开始学习使用计算机。

要让计算机实现人的愿望,更好地完成人交给的任务,就必须先告诉计算机该如何去做,这就要编写计算机程序,即用一种计算机可以理解的语言告诉它如何工作。如何编写程序来让计算机干更多的事,获得更好的结果,是许多人日思夜想的事情。

一直以来,关于如何讲授面向大学生的程序设计基础课程,许多人争论的焦点放在了语言选择上,把讲授的重点放在了语言的语法规则介绍上。从短期看,这样做便于学生学,当然更便于教师教。但从长期看,我们发现,越是注重以语法来衡量学生对语言的“掌握”程度,就越是忽略程序设计真正实用的基本思维方式和方法,最后越是导致学生在学习了一学期之后,满脑子除了一些语法知识,几乎没有任何分析解决实际问题的技能。

人类的自然语言有千百种,归根结底都是人类思想交流、记录的工具。计算机语言同样也是对解决具体问题的算法思想的表达工具。表达的形式(程序设计语言)千差万别,但表达的内容(算法)则是殊途同归。这样看来,程序设计基础课程教学的核心目标,应该是让学生学习和掌握对于实际问题,如何分析和设计解决它们的算法。程序设计语言本身,应该只是在最后用来描述算法的一种工具。

既然如此,在脱离具体语言之后,如何来学习程序设计的基础呢?本书正是这样一本教材:它围绕程序设计初学者面对的中心问题——如何构思算法——来介绍程序设计中的主要基本概念和设计方法,包括“程序设计开发的过程、选择结构、重复结构、数组、文件”等,也包括主要的基本算法、冒泡排序、串行搜索,并通过很多生动有趣的例子进行讲解。同时,在算法最终描述时,以VB与C++为例,对一些程序进行对比实现。这种安排,既让学生可以在与语言无关的算法介绍中学习算法思想,又使他们不至于陷入只有伪代码的纸上谈兵。

该书各章、各节后面配有丰富的练习题,很有针对性,非常适合初学编程的读者学习。另外,网上配套资源也很实用,方便读者自学。

本书前三章和术语表由邬晓钧翻译,其余各章节由徐明星翻译。由于译者水平有限,对原文一些地方的把握难免有不妥之处,恳请广大读者批评指正。

前  言

本书提供一种不依赖特定语言的编程概念介绍,帮助学生学习如下内容。

* 一般性的编程问题,如数据类型、控制结构、数组、文件,以及子程序。

* 结构化编程的原则,如自顶向下的模块化设计、规范的程序文档和风格。

* 基本工具和算法,如数据检验、防御性编程,总和与均值的计算,列表搜索与排序。

在学习本教材之前,不需要计算机或编程方面的经验,也不需要数学、金融以及其他学科的专门知识。

第3版的改进

本书第3版对内容进行了全面修订和扩充,为编程概念的教学与学习提供了更好的工具。各章节都有相应的改动。主要的改动有:

* 全新的生动表达--在写作风格和文字设计上--使本书能被不同层次的读者所接受。

* 对多数伪代码示例进行逐行解释,帮助学生分析和设计解决编程问题所需要的逻辑和结构。

* 每一章增加的示例都是一些实用的非数学问题。

* “为什么”栏目让学生有机会对示例中的内容进行更深入的思考,鼓励他们进行讨论和交流。

* 用C++和Visual Basic编写的真实代码示例,向学生展示了伪代码是如何在实际编程中应用的。

* 对第3章(选择结构)和第4章(重复结构)进行了扩充,增加大量更详细的示例。

* 本书在章节安排上,是数组在数据文件之前,但在内容写作时,为读者按相反顺序进行学习留有选择的余地。

* 为“以解决问题为中心”一节提供了完全可实现的C++和Visual Basic代码。

* 重新组织教学目标,以鼓励主动学习,并使每节末尾的自测题与这些目标更吻合。

* 在第2章增加一节讲解外部文档。

* 增加附录“学习技巧指导”。

* 关键术语。

本 书 结 构

在专题内容覆盖上,组织结构要有足够的灵活性,如“章节依赖关系”一节中概要介绍的那样。第0章概述了一般性的计算机概念。第1章和第2章讨论与程序编写和程序设计相关的重要问题,包括程序开发周期和结构化编程中涉及的步骤。第3章和第4章深入研究了基本编程控制结构的细节:顺序结构、选择(判断)结构和重复(循环)结构。第5章集中讨论如何使用一维和二维数组。第6章解释了如何使用数据文件进行数据管理和输入。

章节依赖关系

第0章可以跳过,或者在第1章之前将其作为背景阅读材料布置给学生。第1~4章应该在后续章节之前讲授,但第3章和第4章是相互独立的,可以按任何顺序来讲授。第5章和第6章也可以按任意顺序来讲授。流程图P.1显示了这些章之间的相互依赖关系。

图P.1  章节依赖关系图

本 书 特 色

在日常生活中(In the Everyday World)

第0章之后的每一章,开始都要讨论该章内容是如何与我们所熟悉的事情相关联的,例如“在日常生活中的决定”。这个内容使用一个普通的和易理解的问题,引出了该章要讲授的主题,同时建立起一个基础,在它上面来介绍编程概念。

使它工作(Making It work)

这个栏目介绍如何用实际的高级语言,如C++或Visual Basic,来实现编程概念。这些整合在一起的特征在教材的整个过程中出现,它们是自我包含的和可供自由选择的。

为什么(What and Why)

我们经常用简短讨论来总结示例,如当程序运行时会发生什么,或者如果程序进行了改动又会发生什么。这些"为什么"段落帮助学生加深对程序如何运行的理解,对每节课开始时的讨论也有用处。

代码风格建议(Sytle Pointer) 

第2章引入了编程风格和文档的概念,并处处予以强调。当讨论到关于编程的风格和文档时,就会出现风格指示。 

以解决问题为中心(Focus on Problem Solving)

以解决问题为中心,给出一个编程题,分析它,设计一个程序来解决它,讨论写程序时应该注意的事项,并指出如何测试程序。在这个过程中,学生不仅复习了该章的内容,而且还完成了一个有相当难度的编程题。在http://www.aw.com/cssupport学生支持网站上,有许多以解决问题为中心节中代码的C++和Visual Basic的完整实现。

练习题(Exercises)

教材包含了以下多种多样的练习题以供选择。

* 自测题:在每一节结尾包含一些题目,测试学生对该节内容的理解情况(答案在学生支持网站上有提供)。

* 复习题:在每一章结尾包含各种类型的题目,对该章内容进行更深入的复习(单号题目的答案在学生支持网站上有提供;双号题目的答案则在教师支持网站上提供)。

* 编程题:在每一章结尾,要求学生使用该章以及之前的某些章节中学到的知识,来设计一些程序(部分编程题的解答在学生支持网站上有提供;大部分编程题的解答则在教师支持网站上提供)。

附录“学习技巧指导”(Study Skills Guidelines Appendix)

在附录中,提供了8篇学习指导,提高学生的学习技巧。每篇都有一个特定的主题;例如,充分利用课堂,书写程序,以及使用教材。

其他辅助材料

学生支持网站

该网站提供了多种辅助材料。在http://www.aw.com/cssupport上,为所有学生提供了以下资源:

* 自测题的答案。

* 单号复习题的答案。

* 以解决问题为中心章节中编程题的C++和Visual Basic 实现。

教师的辅助材料

需要以下一些辅助材料的老师请与longqm@tup.tsinghua.edu.cn联系。

* 学生支持材料;

* 双号复习题的答案;

* 大多数编程题的解答;

* 测试库;

* Powerpoint幻灯片文件。

致    谢

正如没有一个唯一正确的方法来讲授编程一样,也没有一个唯一正确的方法来写作关于编程的教材。在创作本教材的时候,有以下有经验的教师提供了各式各样的观点和许多有益的建议。对本书第3版,我们要感谢如下人员花时间与我们一起工作:

William Bowers  宾西法尼亚州立大学,Berks

Xiomara Casado Manatee 社会大学

Diane Cassidy 北卡罗莱纳州大学,Charlotte

Lall Comar 佛罗里达社会大学,Jacksonville

Nicholas Duchon 马里兰大学,大学学院

James Fuller 财富谷社会大学

Patrick Hogan Cape Fear 社会大学

Michael Kelly 罗得岛社会大学

Robert Molnar 印地安那大学,Purdue

David Morgan 圣莫尼卡学院

Judy Scholl Austin 社会大学

Joe Sherrill 马丁社会大学

Melinda White Seminole社会大学

Julie Wright Baker College

多年以来,有很多人在本书的不断发展过程中做出了贡献。他们包括:Colin Archibald, Heather K. Bloom, David W. Boyd, Ashraful Chowdhury, Ramona Coveny, Linda Denney, Elizabeth Dickson, Kathie Doole, Judy Dunn, Daniel L. Edwards, Jaime Espinosa, Terry Felke-Morris, Terry Foty, Tom Friday, Susan Fulton, Carol Grimm, Bill Hammerschlag, John Humphrey, Chung Lee, Mike Matuszek, John W. Miller, Michael Passalacqua, Diane Perreault, Catherine D. Stoughton, daniel R. Terrian, Peggy Watkins, Marilyn Wildman. 

那些“在日常生活中”的短文段落,是本书独到的一个特色,它是由Brookhaven学院的Bill Hammerschlag在本书第2版时设想和起草的,在这一版中仍然保留。

“以解决问题为中心”小节中代码的实现,是由佛罗里达大学的Anton Drake创建的。

我们要致以特别的感谢给你们:执行编辑Michael Hirsch带我们一起来为这个项目工作,一直给予我们指导并始终鼓励我们;以及助理编辑Lindsey Triebel,回答了我们所有的问题,并在项目进程的每一阶段提供支持。我们还得到了Addison-Wesley的整个教材团队的帮助,包括Michelle Brown, Sarah, Milmore, Marilyn Lloyd, Joyce Wells, Gillian Hall, Kathy Cantwell, Holly McLean-Aldis, Jack Lewis. 

--Stewart Venit

Elizabeth Drake

我想感谢我的妻子Corinne和女儿Tamara对我的耐心和理解;当我写作本书时,我花了无数的小时来伏案工作,就像是粘到计算机键盘上去了,对此她们从未抱怨过。

--Stewart Venit

我要感谢合作者Stewart Venit。跟他一起工作很快乐,我感谢他的建议、专业知识以及反馈意见。Gillian Hall和Kathy Cantwell对我特别有耐心,我受惠于他们的亲切帮助。我还要感谢Anton和Santa Fe社会学院的同事Nancy McCurdy,一位无价的研究助理。我尤其要感谢Severia,Anton,Frank,Justito和Jacob,因为作为我的家庭,他们持续的鼓励和支持,使我一直想做的事——写作——成为可能。

--Elizabeth Drake