C++和面向对象数值计算
[特价中]基本信息
内容简介回到顶部↑
本书教你学习C++编程和面向对象的数值计算方法。
本书包括11章,分别从类型、表达式、语句、文件、类、操作符重载、模板、例外等方面探讨了C++编程的基本特点以及在数值计算方面的应用方法,最后一章专门讨论了线性方程组求解的问题。
本书适合学习C++编程的计算机科学或工程专业的学生及科研人员阅读,对于有一定基础的C++程序员通过本书可以了解C++的高级特性和在数值计算方面的应用。
本书包括11章,分别从类型、表达式、语句、文件、类、操作符重载、模板、例外等方面探讨了C++编程的基本特点以及在数值计算方面的应用方法,最后一章专门讨论了线性方程组求解的问题。
本书适合学习C++编程的计算机科学或工程专业的学生及科研人员阅读,对于有一定基础的C++程序员通过本书可以了解C++的高级特性和在数值计算方面的应用。
作译者回到顶部↑
本书提供作译者介绍
杨道奇,山东省郓城县人。1980年考入山东大学数学系。1987年获计算数学硕士学位。从1987年8月到1990年8月任教于青岛大学数学系,后就读于美国普度大学(Purdue University),并在1994年获计算机科学硕士学位,1995年获应用数学博士学位(导师为Jim Douglas,Jr.)。
1995年8月他任教于美国密西根州韦恩州立大学(Wayne State University)数学系。他从1996年9月到1997年8月在Minnesota University当博士后。之后返回韦恩大学任助理教授。从2000年底以来,他在工业界从事软件开发工作。目前他.. << 查看详细
1995年8月他任教于美国密西根州韦恩州立大学(Wayne State University)数学系。他从1996年9月到1997年8月在Minnesota University当博士后。之后返回韦恩大学任助理教授。从2000年底以来,他在工业界从事软件开发工作。目前他.. << 查看详细
目录回到顶部↑
第1章 基本类型
1.1 一个例程
1.2 类型与声明
1.3 基本类型
1.3.1 整数类型
1.3.2 字符类型
1.3.3 浮点类型
1.3.4 布尔类型
1.3.5 void类型
1.4 数值极限
1.5 标识符和关键词
1.5.1 标识符
1.5.2 关键词
1.6 练习
第2章 表达式和语句
2.1 作用域和存储分类
2.1.1 局部变量和全局变量
2.1.2 外部变量和寄存器变量
2.2 表达式
2.2.1 算术表达式
1.1 一个例程
1.2 类型与声明
1.3 基本类型
1.3.1 整数类型
1.3.2 字符类型
1.3.3 浮点类型
1.3.4 布尔类型
1.3.5 void类型
1.4 数值极限
1.5 标识符和关键词
1.5.1 标识符
1.5.2 关键词
1.6 练习
第2章 表达式和语句
2.1 作用域和存储分类
2.1.1 局部变量和全局变量
2.1.2 外部变量和寄存器变量
2.2 表达式
2.2.1 算术表达式
前言回到顶部↑
本书希望为从事科学和工程的学生和专业人员提供对ISO/ANSIC++编程语言的通俗、简明而又比较完全的介绍,并着重对面向对象的数值计算进行了讲解。本书中对于语言的描述是与平台无关的,只要有标准的C++编译器的支持,它适合于不同的操作系统,如Unix、Linux、MacOS、Windows以及DOS。阅读本书的前提只需基本的微积分和线性代数知识。不过,如果只是为了讲授C++而略过所有数值计算的内容的话,可以不用满足以上这些要求。对其他的编程语言,如FORTRAN、C、Ada、Pascal、Maple或Matlab等有经验的话肯定会对阅读本书有所帮助,但这不是必需的。
书中对C++的所有特点都以通俗易懂的方式进行介绍,利用函数、复数、向量、矩阵、积分等这些对于每一位从事工程和科学研究的学生或专业人员都很熟悉的概念来讲解。在最后一章中,对一些在FORTRAN、C、Ada以及Matlab中没有的高级特性的介绍融汇在线性方程组的迭代算法,比如带预条件的共扼梯度(CG)方法和广义最小残差(GMRES)方法的实现中。对于CG、GMRES和其他预处理技术不需要作事先的了解,书中会作详细的解释。矩阵能够以3种方式存储:密集存储(所有的元素都被存储)、带状存储(只存储沿主对角线方向上的一个带状区域之内的元素以节省内存)、稀疏存储(只保存非零元素)。对于CG或GMRES来说只需要有一种定义就可以适用于3种存储方式。这和其他基于过程的语言,比如FOMRAN、C、Ada或Matlab需要给出三种不同定义相比有很大的不同。这是面向对象编程的一个突出的特点,被称为继承性。CG和GMRES方法定义成一个基类,并能够被三种矩阵继承。如果以后需要再添加一种对称矩阵的存储方式(对称矩阵中只需要存储一半元素以节省空间),那么CG和GMRES的代码可以重用,不需要重新编译。
另一个值得注意的特性是通过模板实现的泛型编程,它可以定义一个函数,根据不同的调用条件采用不同类型的参数。比如,CG和GMRES的同样的定义可以处理单精度、双精度、扩展双精度甚至是实部和虚部具有不同数据类型的复数的矩阵。同样,使用C和FORTRAN需要定义该函数的不同版本来处理不同的数据类型,当日后函数需要作出改进来提高健壮性或效率时,所有的版本都必须更新,这是非常枯燥的,而且容易出错。C++的运算符重载特性使得矩阵和向量使用十和*来相加或相乘就像普通的数值计算一样。运算符是可以由用户定义的,
所以比Matlab更加灵活。比如,运算符十和“可以用来相加、相乘三种不同的矩阵。这些特性以及C++的其他特性,比如信息隐藏、封装、多态、错误处理和标准函数库等,都将在书中作详细介绍。随着数值算法的复杂性增加,很多复杂的数据结构用C++比用FOBTRAN和C实现相对容易一些,这是C++一个十分重要的特性。C++编译器比FOBTRAN、C、Ada、Pascal和其他许多语言的编译器纠错能力更强,这使得C++使用更安全。
然而,凡事都是有利有弊的。比如,模板会造成编译时的额外负担,而继承(和动态类型绑定)会造成运行时的额外负担。这些特性会使得程序在编译和运行时变慢。好的C++编译器可以尽可能地减少这些额外开销,而程序员就可以在享受C++带来的开发便利的同时不需要过多地为编译运行速度担心。这一点可以从C++在工业界,特别是在对速度要求非常高的领域,如数据库、计算机图形学和电子通信等方面的流行得到印证。当人们不断的优化编译器,C++就变得越来越快。在有限元分析中作的一些性能比较表明C++已经可以在速度上和FORTRAN 77和UC抗衡了。另一方面,C++具有超越FOBTRAN77和C的潜力, 因为它有很多内置的复合运算符和模板机制,使得它能够避免比如由于传递函数参数带来的负担,并且许多高性能的函数库(像valarry)可以在不同的体系结构上优化。这种潜力在许多测试中已是现实。
本书由三个部分组成:第一部分(第l章到第4章)是对C++基本特性的介绍,有些和FORTRAN 90和C有类似的地方。如果读者只了解这一部分,他可以做一个FORTRAN90或C程序员可以做的任何事。同时也对如何写Makefile文件、使用调试器、建立库和如何对程序计时和配置一个程序作了介绍。第二部分(第5章到第9章)是关于C++的面向对象和通用编程特性的。这些在FOBTRAN90或C中是没有的。许多编写高效率的C++程序的技术也作了介绍,参见6.5、7.2、7.6、7.2.4、7.7和8.6节。正是这一部分使得许多人认为C++“太复
杂”,为了能够使得普通的科学与工程人员和学生易于理解,我使用了复数、向量、矩阵和积分的基本概念和运算。这些应该是能够容易为一个具有微积分和线性代数基本知识的人所接受的。第三部分(第10章和第11章)描述了C++容器类的标准库(比如链表、集合、向量、映射、栈和队列),算法(比如线性排序、搜索算法等),以及对一个由用户定义的数值线性代数库,它包含CG和GMRES算法,可以适用于用各种方式存储的实数和复数矩阵。这可以加深读者对于第一、第二部分的理解。并且,如果读者想创建自己的库的话,它可以节省很多时间。在书中,我很仔细地将容易理解和在数值计算中经常使用的特性首先介绍。书中的一些例子是取自标准的数值计算函数库,也可以用于建立数值计算函数库。而另外的例子则是为C++特性的解释和说明而构造的。
从数值计算角度来看,本书包含了有关以下数值方法的讨论和程序:多项式求值(63.12),数值积分技术(3.13,5.1和7.7,向量和矩阵计算(6.3和7*1),非线性方程的迭代算法(4.7),多项式插值(7*8),实域和复域上线性方程组的迭代和直接算法(7.8,11.3和11.4),求解常微分方程的Euler和Runge—Kutta方法(5.9)以及求解偏微分方程的有限差分方法(11.5)。这些数值算法还远远称不上完全,而只是想让读者对数值方法有一个基本的了解,并且可以看出C++是如何有效地应用于这些问题的。对于学习如何编写数值计算程序的读者可以仔细阅读这些部分,而如果只想了解C++,则略过或浏览一下就可以了。
C++不是一个完美的语言,但它似乎拥有了一个程序员所能想到的所有特征和标准库。我的经验是使用它编程比FORTRAN和C容易许多,因为后两者运行时有太多的错误和太少的特征及标准库。许多运行时错误是难以调试的,但却可以被C++编译器轻松地发现。
总而言之,C++是这样一种记号的集合,人们不需要完全了解它的所有特性,就可以用它来编写优美和有用的程序。希望读者能喜欢!
如何使用本书:
本书可以作为教材,也可以作为自学者的参考教材。
1.本书的主要目的是为科研人员和学生同时教授C++和数值计算。首先介绍C++,然后是数值算法。
2.它也可以为只想了解基本和高级C++特性的读者使用。这样有关数值计算的章节就可以省略了,并且不需要微积分和线性代数的知识。但是读者还是需要知道什么是向量和矩阵,知道向量和矩阵上的基本运算,如向量求和、标量一向量相乘以及矩阵一向量相乘等等。
3.本书可以作为学习数值方法的参考教材,因为书中有很多的数值计算源程序。初次接触数值方法的学生实现算法时往往会遇到困难。书中的代码可能会对他们有帮助并能加深他们的理解。
4.对于熟练的C++程序员来说,本书也可以作为参考。它包括了ISO/ANSIC++的所有特性,以及书写高效C++程序的技巧。比如,在大多数介绍C++的书上介绍的对向量运算采用标准的运算符重载的方法,可能会比用C或FORTRAN慢几倍。而在本书中给出了一些技巧,使得C++的代码不比相应的C或FORTRAN慢。同时,还给出了使用静态多态来代替某些纯虚函数的例子,以提高运行效率。其他的高级技巧还包括表达式模板和模板元程序。
致谢:
本书已经作为韦恩州立大学(Wayne State University)的本科生的C++和数值计算课程的教科书。作者愿借此机会向他的学生们表示感谢。感谢他们就本书所开展的讨论和对本书提出的建议。作者还感谢编辑和技术审稿人,是他们认真的审阅和建议使得本书的质量得以提高。作者也欢迎读者通过电子邮件对本书提出批评和建议。作者的电子邮件地址是dyang@na-net.ornl.gov。
书中对C++的所有特点都以通俗易懂的方式进行介绍,利用函数、复数、向量、矩阵、积分等这些对于每一位从事工程和科学研究的学生或专业人员都很熟悉的概念来讲解。在最后一章中,对一些在FORTRAN、C、Ada以及Matlab中没有的高级特性的介绍融汇在线性方程组的迭代算法,比如带预条件的共扼梯度(CG)方法和广义最小残差(GMRES)方法的实现中。对于CG、GMRES和其他预处理技术不需要作事先的了解,书中会作详细的解释。矩阵能够以3种方式存储:密集存储(所有的元素都被存储)、带状存储(只存储沿主对角线方向上的一个带状区域之内的元素以节省内存)、稀疏存储(只保存非零元素)。对于CG或GMRES来说只需要有一种定义就可以适用于3种存储方式。这和其他基于过程的语言,比如FOMRAN、C、Ada或Matlab需要给出三种不同定义相比有很大的不同。这是面向对象编程的一个突出的特点,被称为继承性。CG和GMRES方法定义成一个基类,并能够被三种矩阵继承。如果以后需要再添加一种对称矩阵的存储方式(对称矩阵中只需要存储一半元素以节省空间),那么CG和GMRES的代码可以重用,不需要重新编译。
另一个值得注意的特性是通过模板实现的泛型编程,它可以定义一个函数,根据不同的调用条件采用不同类型的参数。比如,CG和GMRES的同样的定义可以处理单精度、双精度、扩展双精度甚至是实部和虚部具有不同数据类型的复数的矩阵。同样,使用C和FORTRAN需要定义该函数的不同版本来处理不同的数据类型,当日后函数需要作出改进来提高健壮性或效率时,所有的版本都必须更新,这是非常枯燥的,而且容易出错。C++的运算符重载特性使得矩阵和向量使用十和*来相加或相乘就像普通的数值计算一样。运算符是可以由用户定义的,
所以比Matlab更加灵活。比如,运算符十和“可以用来相加、相乘三种不同的矩阵。这些特性以及C++的其他特性,比如信息隐藏、封装、多态、错误处理和标准函数库等,都将在书中作详细介绍。随着数值算法的复杂性增加,很多复杂的数据结构用C++比用FOBTRAN和C实现相对容易一些,这是C++一个十分重要的特性。C++编译器比FOBTRAN、C、Ada、Pascal和其他许多语言的编译器纠错能力更强,这使得C++使用更安全。
然而,凡事都是有利有弊的。比如,模板会造成编译时的额外负担,而继承(和动态类型绑定)会造成运行时的额外负担。这些特性会使得程序在编译和运行时变慢。好的C++编译器可以尽可能地减少这些额外开销,而程序员就可以在享受C++带来的开发便利的同时不需要过多地为编译运行速度担心。这一点可以从C++在工业界,特别是在对速度要求非常高的领域,如数据库、计算机图形学和电子通信等方面的流行得到印证。当人们不断的优化编译器,C++就变得越来越快。在有限元分析中作的一些性能比较表明C++已经可以在速度上和FORTRAN 77和UC抗衡了。另一方面,C++具有超越FOBTRAN77和C的潜力, 因为它有很多内置的复合运算符和模板机制,使得它能够避免比如由于传递函数参数带来的负担,并且许多高性能的函数库(像valarry)可以在不同的体系结构上优化。这种潜力在许多测试中已是现实。
本书由三个部分组成:第一部分(第l章到第4章)是对C++基本特性的介绍,有些和FORTRAN 90和C有类似的地方。如果读者只了解这一部分,他可以做一个FORTRAN90或C程序员可以做的任何事。同时也对如何写Makefile文件、使用调试器、建立库和如何对程序计时和配置一个程序作了介绍。第二部分(第5章到第9章)是关于C++的面向对象和通用编程特性的。这些在FOBTRAN90或C中是没有的。许多编写高效率的C++程序的技术也作了介绍,参见6.5、7.2、7.6、7.2.4、7.7和8.6节。正是这一部分使得许多人认为C++“太复
杂”,为了能够使得普通的科学与工程人员和学生易于理解,我使用了复数、向量、矩阵和积分的基本概念和运算。这些应该是能够容易为一个具有微积分和线性代数基本知识的人所接受的。第三部分(第10章和第11章)描述了C++容器类的标准库(比如链表、集合、向量、映射、栈和队列),算法(比如线性排序、搜索算法等),以及对一个由用户定义的数值线性代数库,它包含CG和GMRES算法,可以适用于用各种方式存储的实数和复数矩阵。这可以加深读者对于第一、第二部分的理解。并且,如果读者想创建自己的库的话,它可以节省很多时间。在书中,我很仔细地将容易理解和在数值计算中经常使用的特性首先介绍。书中的一些例子是取自标准的数值计算函数库,也可以用于建立数值计算函数库。而另外的例子则是为C++特性的解释和说明而构造的。
从数值计算角度来看,本书包含了有关以下数值方法的讨论和程序:多项式求值(63.12),数值积分技术(3.13,5.1和7.7,向量和矩阵计算(6.3和7*1),非线性方程的迭代算法(4.7),多项式插值(7*8),实域和复域上线性方程组的迭代和直接算法(7.8,11.3和11.4),求解常微分方程的Euler和Runge—Kutta方法(5.9)以及求解偏微分方程的有限差分方法(11.5)。这些数值算法还远远称不上完全,而只是想让读者对数值方法有一个基本的了解,并且可以看出C++是如何有效地应用于这些问题的。对于学习如何编写数值计算程序的读者可以仔细阅读这些部分,而如果只想了解C++,则略过或浏览一下就可以了。
C++不是一个完美的语言,但它似乎拥有了一个程序员所能想到的所有特征和标准库。我的经验是使用它编程比FORTRAN和C容易许多,因为后两者运行时有太多的错误和太少的特征及标准库。许多运行时错误是难以调试的,但却可以被C++编译器轻松地发现。
总而言之,C++是这样一种记号的集合,人们不需要完全了解它的所有特性,就可以用它来编写优美和有用的程序。希望读者能喜欢!
如何使用本书:
本书可以作为教材,也可以作为自学者的参考教材。
1.本书的主要目的是为科研人员和学生同时教授C++和数值计算。首先介绍C++,然后是数值算法。
2.它也可以为只想了解基本和高级C++特性的读者使用。这样有关数值计算的章节就可以省略了,并且不需要微积分和线性代数的知识。但是读者还是需要知道什么是向量和矩阵,知道向量和矩阵上的基本运算,如向量求和、标量一向量相乘以及矩阵一向量相乘等等。
3.本书可以作为学习数值方法的参考教材,因为书中有很多的数值计算源程序。初次接触数值方法的学生实现算法时往往会遇到困难。书中的代码可能会对他们有帮助并能加深他们的理解。
4.对于熟练的C++程序员来说,本书也可以作为参考。它包括了ISO/ANSIC++的所有特性,以及书写高效C++程序的技巧。比如,在大多数介绍C++的书上介绍的对向量运算采用标准的运算符重载的方法,可能会比用C或FORTRAN慢几倍。而在本书中给出了一些技巧,使得C++的代码不比相应的C或FORTRAN慢。同时,还给出了使用静态多态来代替某些纯虚函数的例子,以提高运行效率。其他的高级技巧还包括表达式模板和模板元程序。
致谢:
本书已经作为韦恩州立大学(Wayne State University)的本科生的C++和数值计算课程的教科书。作者愿借此机会向他的学生们表示感谢。感谢他们就本书所开展的讨论和对本书提出的建议。作者还感谢编辑和技术审稿人,是他们认真的审阅和建议使得本书的质量得以提高。作者也欢迎读者通过电子邮件对本书提出批评和建议。作者的电子邮件地址是dyang@na-net.ornl.gov。
序言回到顶部↑
当我写本书英文版时,我没有想到它要被翻译成其他语言。今天,我很高兴看到它被翻译成中文——我的母语。
作为一种计算机语言,C++有很多优点。很多复杂的算法和设计可以比较容易地用C++来实现。同时它的计算速度可以与FORTRAN和C相媲美(有时比FORTRAN和C更快)。当前,C++已经被普遍地应用于科学技术和日常生活的各个领域。
本书除了介绍C++语言的基础知识和高级技巧,还阐明了很多计算方法。另外,本书包括一些实例来说明怎样提高程序的计算速度。在写本书时,我力争把这些内容写得简明扼要,通俗易懂,而又比较完整。这样它既可以作为C++初学者的教材,又可以供给有经验的C++程序员参考。本书特别适用于各类科学技术专业的学生和工作人员,因为它包含很多常用的计算方法及其C++源程序。
总之,希望本书中文版的读者能够有所收获并喜欢它,同时敬请读者多多指教。
最后,感谢清华大学王晓鸽副教授和清华大学的盛佳和武勃,感谢他们辛勤的翻译工作,感谢福特汽车公司梁磊先生对译稿的校对工作和人民邮电出版社陈冀康先生的编辑工作。
杨道奇
2002年10月于美国密西根州
作为一种计算机语言,C++有很多优点。很多复杂的算法和设计可以比较容易地用C++来实现。同时它的计算速度可以与FORTRAN和C相媲美(有时比FORTRAN和C更快)。当前,C++已经被普遍地应用于科学技术和日常生活的各个领域。
本书除了介绍C++语言的基础知识和高级技巧,还阐明了很多计算方法。另外,本书包括一些实例来说明怎样提高程序的计算速度。在写本书时,我力争把这些内容写得简明扼要,通俗易懂,而又比较完整。这样它既可以作为C++初学者的教材,又可以供给有经验的C++程序员参考。本书特别适用于各类科学技术专业的学生和工作人员,因为它包含很多常用的计算方法及其C++源程序。
总之,希望本书中文版的读者能够有所收获并喜欢它,同时敬请读者多多指教。
最后,感谢清华大学王晓鸽副教授和清华大学的盛佳和武勃,感谢他们辛勤的翻译工作,感谢福特汽车公司梁磊先生对译稿的校对工作和人民邮电出版社陈冀康先生的编辑工作。
杨道奇
2002年10月于美国密西根州
相关资源回到顶部↑
· 【推荐】众多高校学子口口相传,他们共同的选择--华清远见嵌入式学院(嵌入式Linux就业课程、3G手机开发就业课程,通过入学测试即签100%就业协议,4个月集中实训,世界500强企业成功就业保障!!!)· 【亚嵌教育 嵌入式培训专家】(嵌入式培训,嵌入式Linux培训,ARM培训,Linux培训,3G培训,Android培训,WINCE培训,DSP培训,FPGA培训,嵌入式就业培训)
· 程序员的7种武器(正则表达式、编程语言、数据库、算法、软件调试、开发环境)
· C/C++ 经典著作(《C专家编程》《C++ Templates中文版》《C和指针 》《C陷阱与缺陷》《C++沉思录》)







点击看大图




加载中...

