《《fortran中的数组》ppt课件》由会员分享,可在线阅读,更多相关《《fortran中的数组》ppt课件(56页珍藏版)》请在金锄头文库上搜索。
1、第9章 Fortran中的数组,数组是Fortran语言中功能最为强大、运用最为灵活的一种数据结构。数组(ARRAY)在科学和工程计算中通常用来表示矩阵和向量。同一般的变量声明相比,数组能够同时保存多个数据。它是一种使用大规模数据的方法。配合Fortran语言中的数组操作,可用于对大量不同的数据进行处理。在存储结构上,数组占用一片连续的存储单元。程序中通过数组索引来对数组元素、片断进行操作。,9.1 数组的定义,要在程序中使用数组,需要首先在变量声明中进行数组定义。数组定义规定了数组的维数和大小,以及数组所能保存的数据类型。在程序中,通过数组引用来对数组、数组元素或者数组片断进行操作。 数组是
2、类型相同、种别一致的一组变量的有序集合。它可以是整型、实型、双精度型、复型、逻辑型、字符型以及自定义类型等中的任意一种。组成数组的每一个变量被称为数组元素,并由唯一的下标来进行标识。数组定义说明了数组所能保存的数据类型、数组的维数、维的范围和数组的大小。本节主要介绍Fortran中数组定义的几种方式。,9.1.1 定义形式一,第一种数组定义形式的语法格式如下所示。 类型说明 : 数组名(下标下界:下标上界,), 该定义形式通过类型说明来显式声明数组的数据类型,并通过下标下界和下标上界来规定数组中某一维的范围。下标下界和下标上界共同组成了维说明符。当维说明符省略下标下界时,默认所在维的下标从1开
3、始。如下代码都是合法的数组定义。 REAL : A(1:2,2:4) INTEGER B(10),9.1.2 定义形式二,第二种数组定义形式的语法格式如下所示。 DIMENSION : 数组名(下标下界:下标上界,), 类型说明 : 数组名, 该定义形式通过DIMENSION语句来进行数组的定义,通过下标下界和下标上界来规定数组中某一维的范围。在第二行通过类型说明来显式声明数组的数据类型。当省略类型说明时,采用默认的“I-N”规则来对数组的数据类型进行定义。如下代码合法的对数组进行了定义。 DIMENSION : A(10), B(2:11) INTEGER : A,9.1.3 定义形式三,第
4、三种数组定义形式的语法格式如下所示。 DIMENSION(下标下界:下标上界,) : 数组名, 类型说明 : 数组名, 该定义形式通过DIMENSION语句直接说明了数组的维数和维的范围。这种形式定义的数组全部具有相同的维数和大小。如下代码表示了如何采用上述形式进行数组的定义。 DIMENSION(10, 4:10) : A, B, N INTEGER : A REAL(8) : N,9.1.4 定义形式四,第四种数组定义形式的语法格式如下所示。 类型说明,DIMENSION : 数组名(下标下界:下标上界,), 类型说明,DIMENSION(下标下界:下标上界,) : 数组名, 该定义形式可
5、以说是前三种定义形式的综合形式。通过在DIMENSION语句前引入类型说明来显式的说明数组的数据类型。下列代码演示了此种形式的数组定义。 REAL, DIMENSION : I(10), M(10,5) INTEGER, DIMENSION(10) : A, C,9.1.5 数组定义的特点,上述数组定义的形式中,中括弧内的部分可有可无。数组定义语句必须出现在所有可执行语句之前。除了上述基本的定义形式外,在Fortran77中可以使用COMMON语句,在Fortran90中可以用POINTER语句、ALLOCATABLE语句等对数组定义进行加强。 在前面所述的四种定义形式中,定义形式因简洁直观而
6、常见于实际使用中。此外,如下问题是在实际编程中应该注意的。 在前面所述的数组定义中,I(10)、M(10,5)、A、C等称为数组说明符。在同一个说明语句中有多个数组说明符时,用逗号进行分隔。 数组说明符中的I、M、A、C等是数组名,其取名规则与变量相同并且不应与程序中的其他变量同名。在同一个程序单元中,一个数组名只允许定义一次,不能重复定义。例如下面的数组定义是错误的。 INTEGER : A(10), A(10,20),9.2 数组的引用方式,数组经过定义之后,就可以在程序中使用了。在Fortran77标准中,数组只允许在输入输出语句中进行整体操作。在其他场合,只能对数组的元素通过下标索引的
7、方式逐个进行操作。到了Fortran90标准,这一限制被大大放宽了。数组除了能够进行整体操作以外,还能对数组中的片断和数组的整体进行操作。这进一步增强了Fortran语言在数值处理方面的能力。Fortran中数组的引用方式可以概括为以下几种:,9.2.1 引用数组元素,引用数组元素的语法格式如下所示。 数组名(下标,) 这种引用方式通过下标索引来对数组中的每一个元素进行操作。它是Fortran中最为传统的一种引用方式。采用这种方式进行引用时,下标的值不能超出数组定义时的下标上下界。目前市面上绝大部分的Fortran编译器都会提供在编译时进行数组下标越界检查的功能。而其他计算机语言的编译器,如C
8、/C+编译器往往不提供这样的功能,需要程序员自行检查代码中是否存在数组越界的行为。,9.2.2 引用数组整体,引用数组整体的语法格式如下所示。 数组名 这种引用方式通过数组名来对数组进行整体操作。这种引用方式是Fortan90中新增的,大大提高了程序编写的灵活性和简单性。我们对前一个例程TEST0901进行修改,通过整体引用来对数组进行赋值。 TEST0902.F90 ! 引用数组整体的范例 PROGRAM TEST0902 IMPLICIT NONE ! 变量定义 REAL : A, B(5,5) READ(*, *)A ! 数组整体引用 B = A END PROGRAM TEST0902
9、,9.2.3 引用数组片断,引用数组片断的语法格式如下所示。 数组名(下标范围,) 在这种引用方式中,数组中的元素可以用过数组片断来进行引用。当需要给数组中的不同片断的元素赋予不同数值时,这种引用方式非常方便。来看下面一个例子。 TEST0903.F90 ! 引用数组片断的范例 PROGRAM TEST0903 IMPLICIT NONE ! 变量定义 REAL : A1, A2,A3,A4,A5,B(5,5) READ(*, *)A1,A2,A3,A4,A5 ! 数组片断的引用 B(1,1:5) = A1 B(2,1:5) = A2 B(3,1:5) = A3 B(4,1:5) = A4 B
10、(5,1:5) = A5 END PROGRAM TEST0903,9.3 数组的存储,尽管在Fortran语言中,允许程序员声明维数高达7维的数组来使用,但是计算机的内存却只是一维的。所以不管声明的数组有几维,数组在内存中都是以一维的方式来进行存储。数组中元素在计算机内的存储顺序同时也被用作输入/输出时确定其中的元素数据在进行操作时的先后顺序。,9.3.1 数组的存储结构,Fortran中,一维数组在计算机内存中的存储是最简单的一种情况。在逻辑结构上,一维数组可以看成是由一系列数组元素组成的一个单列数据表。数组中每个元素的下标就确定了此元素在数据表中的位置。下标越小,在数据表中的位置就越靠前
11、。在计算机内存中,一维数组占据一片连续的存储单元,单个元素在内存中的位置就是其逻辑结构中的位置。,9.3.2 数组存储结构的应用,目前的计算机硬件体系结构决定了在读取大批量数据时,如果这一批数据都位于临近的内存中时,读取操作会执行得较快。在编写程序时,如果想要提高执行效率,就应该对数据在计算中的保存方式和读取方式有一定的了解。只有了解了数据在计算内的存储结构,才能在编写程序的时候做到有的放矢。这样编写出来的程序在数据的存取效率上才能较高。 需要注意的是,尽管Fortran中的数组是按“列元素优先”的规则进行存储的,但是C语言中的数组则是按照“行元素优先”的原则进行存储,并且C语言中数组的下标下
12、界固定是从0开始的。在编写相关的程序时,应该注意到这一差别。Fortran语言中,使用DO循环进行高效率数组操作的代码写法可能在C语言中恰恰是最低效的。比如下面的程序段在Fortran中能够得到较好的执行效率: DO J = 1, 5 DO I = 1,3 Sum = Sum + A(I, J) ENDDO,9.4 数组的类型,根据数组在定义时的特征,比如数组的秩、数组的形状和每一维的大小,可以将数组划分为好几种类型。这些不同类型的数组在程序单元中如何使用?在哪些程序单元中使用?有什么特点?本节将针对这些问题进行逐一介绍。,9.4.1 显形数组,显形(Explicit-shape)数组是For
13、tran中最简单、最容易理解的一种数组类型。顾名思义,这种类型的数组在定义阶段就通过数组定义语句明确的规定了所有特征,比如数组的秩、数组的维数、每一维的长度和上下界。通过这种方式定义的数组具有确定的形状和大小,在程序运行过程中不允许再对数组的任何特征进行改变。需要注意的是,在显形数组的维说明中,还允许使用整型变量或整型表达式来定义维的上下界。这涉及到两种特殊的显形数组,会在随后的小节中进行介绍。,9.4.2 特殊的显形数组自动数组,自动数组(Automatic Array)是显形数组的一种特殊形式,这种形式的显形数组只能是过程中的局部变量。 使用自动数组时最好在过程中加以声明,并且数组中至少有
14、一维的上下界是不确定的整型变量或整型表达式。在调用过程时,自动数组中不确定的上下界首先通过整型变量或整型表达式求出。这样,整型变量或整型表达式的值在过程中发生的变化,就不会影响到数组中的上下界。,9.4.3 特殊的显形数组可调数组,可调数组(Adjustable Array)也是显形数组的一种特殊形式,这种类型的显形数组只能是过程中的一个哑元。 可调数组中至少有一维的上下界不是常数,这个维的上下界只有当过程被调用时才能最终确定。并且该维的上下界表达式中的整型变量可以是通过过程传递的哑元,也可以是通过COMMON语句中传递的整型常量或变量。和自动数组类似,过程内部对维界参数的赋值不会改变数组中该
15、维的上下界。,9.4.4 显形数组的不足,显形数组是数组应用的基础,其中的自动数组和可调数组能够提供非常灵活的数组应用。比如自动数组在处理具体数量未知的大笔数组数据时,能够提供相当好的解决方案。但是有一点需要注意,由于自动数组和可调数组都是通过过程来使用的,因此过程的一些特点也会影响到这两种数组的使用。比如使用自动数组时,过程在计算机中的堆栈限制会妨碍可使用的自动数组的大小。这种情况可以通过在执行TEST0906时,将变量I设置成一个大数(比如100000)来观察到,此时屏幕上的打印信息如下: Input the value of I: 100000 forrtl: severe (170): Program Exception - stack overflow Image PC Routine Line Source TEST0307.exe 004011DB Unknown Unknown Unknown TEST0307.exe 0040110A Unknown Unknown Unknown TEST0307.exe 0043FCD9 Unknown Unknown Unknown TEST0307.exe 00428FF9 Unknown Unknown Unknown kernel32.dll