前言 基于对象的编程在许多工程和科学领域的应用都很广泛,我们在工作区中经常能够看到这种编程方法。C++是从C编程语言中派生出来的一种基于对象的编程语言,因此我们选择它来介绍工程和科学方面的计算教程。重点讨论科学编程所必需的基本控制结构、数据结构和函数时,可以先使用C++初步介绍基于对象的设计和编程。C编程语言对系统级操作极具吸引力的特征在C++中也得到支持,这使得C++成为功能最强大的编程语言之一。编写本教材的目的就是介绍如何使用一种基于对象的编程方法来解决工程问题。我们的目标是: ● 开发一套解决工程问题的相容方法; ● 介绍C++基于对象的特征而重点讨论编程基础; ● 通过一系列工程示例和应用程序来说明利用C++解决问题的过程; ● 为标准C++库中定义的函数模板和类提供一个容易理解的完整介绍。 为了实现上述目标,第1章介绍了文中解决工程问题时一致使用的一个五步过程(five-step process)。第2章在讨论数据类型和标准输入和输出时介绍了预定义的对象和成员函数的用法。第3到第5章介绍了解决工程问题的C++基本功能,包括控制结构、数据文件和函数。第6章和第7章介绍了数组,并向读者介绍了函数模板和向量类。第8章是对程序员自定义类的介绍。第9章介绍了指针、动态内存分配和为实现动态数据结构而在标准C++库中定义的类。第10章对类进行了更深入的介绍,包括重载运算符、继承和虚函数。书中引用了大量来自于不同工程、科学和计算机科学领域的示例。这些示例的解决方案就是使用五步过程和标准C++开发的。 预备知识 不要求预先有任何计算机经验。数学方面的预备知识涉及大学代数学和三角学的内容。当然,如果学生使用过其他计算机语言或软件工具,就能更快地掌握基础知识。 课程结构 本书选择的内容是工程和科学计算课程的基础知识。包含数学计算、字符数据、控制结构、函数、数组、类和指针等基本主题。学过其他计算机语言的学生应当能在一个学期内学完这些内容。对C++的介绍是本书的必修内容(选修内容在目录中以*表示)。我们可以通过以下3种方式学习本书和推荐的章节: ● 介绍C++ 面向初学者的基础教程除了向学生介绍计算机语言方面的知识之外,还向学生介绍了一些计算机工具。对于这些教程,我们推荐将第1到第7章作为必修内容向学生介绍C++的基本功能,以便他们能够使用数学计算、字符数据、控制结构、函数和数组来编写实质性的程序。 ● 用C++解决问题 在专门向学生讲授如何掌握C++语言的教程中,我们推荐将第1第10章的所有内容都作为必修内容。这些内容涉及C++语言的所有基本概念,包括数学计算、字符数据、控制结构、函数、数组、类和指针。 ● 用C++和数值技术解决问题 有背景知识的学生或者已经熟悉其他高级语言的学生能够很快地掌握本书的所有内容。另外,他们可以把数值技术应用到其他课程中。因此,我们建议这些学生应该学习本书第1到第10章的所有部分,包括选修部分的内容。 本书各章节在主题顺序上的设计为教师提供了很大的灵活性,尤其是在决定何时介绍类(在数组之前还是数组之后)时。有关类的基础章节不依赖于介绍数组的章节,而且有关数组的章节也不依赖类的基础章节。图0-1是一个从属关系图,说明了各章的从属关系。 图0-1 从属关系图 解决问题的方法 “解决工程和科学问题的重点”是本书必不可少的一部分。第1章将介绍使用计算机解决工程问题的一种五步过程: 1. 清楚地陈述问题; 2. 描述输入和输出信息,并确定所需的数据类型; 3. 手工处理一个简单的示例; 4. 开发一个算法并将其转化为计算机程序; 5. 用一组数据来测试该解决方案。 要加强解决问题技能的开发,每次解决一个完整的工程问题时都要清楚地定义上述五步中的每一步。另外,通过使用提纲、伪代码和流程图,介绍了自顶向下(top-down)的设计和步进式的细化。 工程和科学应用程序 贯穿本书所有内容,重点一直放在与现实的工程和科学示例及问题的结合上。这个重点围绕着巨大挑战的主题展开,包括: ● 对于天气、气候和全球变化的预测; ● 计算机语音识别; ● 人类基因的匹配; ● 交通工具性能的提高; ● 增强石油和天然气的回收能力; ● 仿真。 每一章对这些巨大挑战的某个方面进行讨论,使我们对工程师研究的领域有一个简单的了解。在后面的章节中,我们解决的问题不仅和介绍性的问题有关,而且还应用在其他问题解决方案中。这些巨大挑战同时也在其他示例和问题中引用。 标准C++ 本书提供的语句和开发的所有程序使用的都是C++标准,该标准是由国际标准化组织和美国国家标准学会ISO/ANSI)的C++标准委员会开发的。ISO和ANSI已经联合发布了C++编程语言的第一个国际标准。通过使用标准C++,学生可以学习编写从一个计算机平台转移到另一个计算机平台的可移植代码。本书讨论了C++编程语言的许多标准功能。在附录A中还对C++标准库中的其他组件进行了讨论。 软件工程的概念 我们期望工程师和科学家能够开发和实现对用户友好并能够重用的计算机解决方案。因此要成功地开发出这样的计算机解决方案,学习软件工程技术是至关重要的。在程序开发中,我们强调程序的可读性和文档规范。本书还讨论了与软件工程问题相关的其他主题,并包含一些问题,例如软件生命周期、可移植性、维护、模块化、递归、抽象化、可重用性、结构化编程、有效性和验证。 四种类型的问题 学习任何新技能都需要许多不同难度层次的实践。本书给出了四种类型的练习,供您实践解决问题的技能。第一组练习是练习1。这些问题的答案简短,与该问题之前介绍的内容相关。大部分章节后都紧跟着一组练习,以便学生能够测试他们是否已经准备好继续下一部分。本书最后给出了所有练习的答案。 设计“修改!”问题的目的则是为解决实际问题部分开发的程序提供内行的经验。在这些部分,我们利用五步过程开发了一个完整的C++程序。“修改!”要求学生利用不同的数据来运行程序,以测试他们对程序工作方式和工程变量之间关系的理解。这些练习还要求学生对程序进行简单的修改,然后运行程序来测试它们的变化。 大部分章节的最后都有一组“测试!”,同时每一章都包含一组编程问题。“测试!”问题的答案同样也很简短,但与整章的内容都有关。这些问题可以帮助学生测试他们对于文中提供的C++功能的理解程度。编程问题则是与各种工程应用相关的新问题,同时难度等级的范围从非常简单到大规模的项目任务。每个编程问题都需要学生开发一个完整的C++程序或者函数。 选学的数值技术 解决工程问题经常用到的数值技术在各章的选修部分中也有讨论,包括线性插值、线性建模(回归)、根寻找、数值积分和联立方程求解。也介绍了矩阵的概念,随后引用了许多示例对其进行了说明。所有这些主题都假设学生只具备三角学和大学代数的背景知识。 附录 为了进一步增强引用,附录中介绍了大量重要的内容。附录A讨论了C++标准库中的组件。附录B介绍了MATLAB的一些内容。