FORTRAN 第七章数组
fortran 第7章
§7-2-2 对整个数组的操作
a=b+c a=b-c a=b/c
! a、b、c的尺寸相同,如二维:a(i, j) =b(I, j) + c(I, j) ! a、b、c的尺寸相同,如二维:a(i, j) =b(I, j)- c(I, j)
将原本要使用循环才 能做到的设置功能改 ! a、b、c的尺寸相同,每个元素a(d1,d2,…) =b(d1,d2,..)/ c(d1,d2,..) 写成一行命令来完成
§7-2-5 FORALL
• FORALL 的语法: Forall (triplet1 [,triplet2 [triplet3 …]], mask) Tripletn 是用来赋值数组坐标范围的值,写法与隐含 式相同,第三个数是增值,省略时为1;tripletn的 个数最多为数组的维数。 Mask是判断条件,限定forall中的执行语句只作用于 数组中符合条件的元素
• Integer a(-3: 3) ! 能使用的是 a(-3), a(-2), a(-1), a(0), ! a(1), a(2), a(3) • Integer a(5, 0:3) ! 能使用的是a(1~5, 0~3)的元素 • Integer b(2:3, -2:1) ! 能使用的是b(2~3, -2~1)的元素
数组还可以用于自定义的数据类型
Type :: Person real :: height, weight End Type Type(person) :: a(10) !用person这个新类型来声明数组 …… …… a(2)%height=170. !变量后同样用%来使用person类型中的元素 a(2)%weight=70.
合工大FORTRAN第7章
ቤተ መጻሕፍቲ ባይዱ
数组构造器是一维的,当被赋值的数组是二维 或二维以上的数组时,可以用数组构造器对某 一维赋值,或者使用RESHAPE函数把列表中的 数据定义成某种形状的数组。如: INTEGER,DIMENSION(2,3):: A,B A(1,:)=(/1,2,3/) A(2,:)=(/4,5,6/) B=RESHAPE((/1,2,3,4,5,6/),(/2,3/))
7.2.2 数组的逻辑结构和存储结构
一维数组的逻辑结构可以看成是一个向量,每 个元素的下标值确定了该元素在数组中的位置, 它在内存中占据一系列连续的存储单元。 设有定义:INTEGER,DIMENSION(0:5)::A 则数组A在内存中的存储次序依次为: A(0)、A(1)、A(2)、A(3)、A(4)、A(5)
看一个例子:
INTEGER,DIMENSION(3,3)::A READ*,A DO I=1,3 PRINT ‘(1X,3I4)’,(A(I,J),J=1,3) ENDDO END DO I=1,3
PRINT ‘(1X,3I4)’,(A(J,I),J=1,3) ENDDO
【例7-6】求整型数组A(2×3)的平均值(保留2位小数) PROGRAM EXAM6 IMPLICIT NONE INTEGER,DIMENSION(2,3)::A INTEGER::I,J REAL::S=0 READ *,A DO I=1,2 DO J=1,3 S=S+A(I,J) END DO END DO S=S/6 PRINT '(1X,F7.2)',S END PROGRAM EXAM6
第七讲 数组的使用及Fortran函数
函数UBOUND(arr)求数组arr所有维的下标上界依次是: UBOUND(arr)求数组arr所有维的下标上界依次是 WRITE(*,*) '函数UBOUND(arr)求数组arr所有维的下标上界依次是:',ub 函数LBOUND(arr, 求数组arr LBOUND(arr,1 arr第 维的下标下界是: ,lb1 WRITE(*,*) '函数LBOUND(arr,1)求数组arr第1维的下标下界是:’,lb1 函数LBOUND(arr,DIM= 数组arr LBOUND(arr,DIM=2 arr第 维的下标下界是:',lb2 WRITE(*,*) '函数LBOUND(arr,DIM=2)数组arr第2维的下标下界是:',lb2 函数LBOUND(arr, 求数组arr LBOUND(arr,3 arr第 维的下标下界是:',lb3 WRITE(*,*) '函数LBOUND(arr,3)求数组arr第3维的下标下界是:',lb3 函数LBOUND(arr)求数组arr所有维的下标下界依次是: LBOUND(arr)求数组arr所有维的下标下界依次是 WRITE(*,*) '函数LBOUND(arr)求数组arr所有维的下标下界依次是:',lb END (运行结果) 运行结果) 数组的使用及Fortran Fortran函数 第七讲 数组的使用及Fortran函数
Fortran程序设计(第七章-函数与子程序(上))
QUESTION???
12
Fortran程序中的过程有两种:
函数子程序过程(简称函数子程序或函数)
子例子程序过程(简称子例子程序或子例行 子程序)。
这两者的形式、功能与调用方法都有所不同, 但总称为过程子程序,也简称为过程或子程序。
函数的分类:
函数过程
过程
子程序过程
内在过程 (系统内部提供)
内部过程(在主程序内部,用户编写)
前n项的和,x和n的值在调用时给定。
练习:
计算函数Sinh(x)的值,当ex的通项值小于等于1E-6 时停止。计算公式如下:
Sinh(x) ex ex 2
ex
1Fra Baidu bibliotek
x
x2 2!
x3 3!
.......
n0
xn n!
!主程序如下:
Program main1 Real:: myExp,y,x Write(*,*) ‘Enter x:’ Read(*,*)x Y=(MyExp(x)-MyExp(-x))/2.0 Write(*,100) ‘Sinh(‘,x,’)=’,Y END PROGRAM
是函数的结束标志,将控制返回到主调程序。 END [FUNCTION [函数名]] 3.函数过程体
是函数语句和函数结束语句之间的程序段,分为说明部分和执行部分。 说明部分应对程序体内一切变量、数组等实体(包括变元)作出说明,同时 还要说明函数结果变量名,但不可说明函数名。执行部分中必须对函数结果 名至少赋值一次。 4.形参
Fortran数组详细介绍
例如: 例如: REAL(8),DIMENSION(0:10) :: A,B,C INTEGER,DIMENSION(4,5) :: D,E 三个双精度型数组A,B,C 各含有11个元素。 A,B,C, 11个元素 三个双精度型数组A,B,C,各含有11个元素。两个 整型数组D,E 各含有20个元素。 D,E, 20个元素 整型数组D,E,各含有20个元素。 例如: 例如: REAL,DIMENSION(0:10) :: A,B(20),C(4,5,3) 说明A A(0:10), B(20), C(4,5,3)。 说明A为A(0:10),而B为B(20),C为C(4,5,3)。 以数组名后面的维说明为准。 以数组名后面的维说明为准。
二、以数组名作为输入输出项
数组元素按照在内存中的排列顺序一次全部输入输出。 数组元素按照在内存中的排列顺序一次全部输入输出。 将矩阵存放在数组中并输出。 例:将矩阵存放在数组中并输出。 INTEGER W(3, 3) READ(*,*) W !按列的顺序输入 WRITE(*, 10) W !按列的顺序输出 10 FORMAT(1X, 3I3) 输入: , , , , , , , , 输入:1,4,7,2,5,8,3,6,9 输出: 输出: □□1□□4□□7 □□2□□5□□8 □□3□□6□□9 1 2 3 4 5 6 7 8 9
7.3 数组元素的存储结构
例:INTEGER A(10),B(3,4)
fortran程序设计第7章
讲师:徐红波 Email: x_h_b@tom.com
第七章 数组
数组是一种数据结构,每个数组代表一组具有同 一类型的变量,把数组中所包含的变量称为数组元 素.在程序中通过说明语句声明数组.例如: INTEGER A(1:6) 每个变量都在内存中占有一个独立的存储单元. 例如: INTEGER A1, A2, A3, A4, A5, A6 这六个变量所代表的六个存储单元在内存中的位 置是彼此独立,互不相关的.
7.3.2 在输入输出语句中用数组名来输入输 出整个数组
FORTRAN规定在输入输出语句中可以出现数组名.如: WRITE (*, *) A 相当于: WRITE (*, *) A(1), A(2), A(3), A(4), …, A(10) 输入输出语句中的数组名可以是任意维数的.例如以上说 明的3*2的W数组是二维的,可以用以下语句输出W数组: WRITE (*, *) W 相当于: WRITE (*, *) W(1, 1), W(2, 1), W(3, 1), W(1, 2), W(2, 2), W(3, 2)
从终端键盘输入十个数,按顺序逐个放入A(1)到 A(10)中 DO 10, I=1, 10 READ (*, *) A(I) 10 CONTINUE
把A(1),A(3),A(5),A(7),A(9)输出到终端 屏幕上. DO 20 I=1, 10, 2 WRITE (*, *) A(I) 20 CONTINUE
Fortran-第七讲
7.3.6 过程作为其它过程的参数
问题的提出:
例7.1是一个复合梯形积分的子程序,可以对形如
f ( x) x sin(x)
2
的函数计算在某一区间内的积分。 可不可以对任一函数都可以调用这个函数来计算积 分呢? 把函数形式作为参数传递进去就可以了
自定义函数作为参数传递 例7.3 改进例7.1 SUBROUTINE solve(func,s,a,b,n) IMPLICIT NONE REAL(KIND=8),EXTERNAL :: func REAL(KIND=8) :: s,a,b,h,t INTEGER :: n,k n 1 b h s=0d0 f ( x ) dx f ( a ) f ( b ) 2 f ( a ih ) a h=(b-a)/n 2 i 1 s=func(a)+func(b) do k=1,n-1 t=a+k*h s=s+2d0*func(t) END DO s=s*h/2d0 END SUBROUTINE solve
解决的办法
旧的Fortran版本使用COMMON语句
COMMON语句在课本P169-176有讲,请自行查阅 现在通行的方法是用模块来共享数据
模块的定义
模块共享数据的使用
MODULE shared_data IMPLICIT NONE SAVE !在SAVE之后定义的变量都是全局变量 INTEGER,PARAMETER :: DIM_SUM=100 REAL,PARAMETER :: PI=3.14159,h=6.626E-34 REAL :: input_data(DIM_NUM) END MODULE
fortran 模块 数组
fortran 模块数组
Fortran模块是一种用于组织和管理Fortran程序的机制。在Fortran中,模块可以包含变量、函数和子程序,可以通过使用关键字MODULE和END MODULE来定义。模块的主要目的是提供一个集中管理代码和数据的方式,以便于程序的复用和维护。本文将重点介绍Fortran模块中的数组。
在Fortran中,数组是一种用来存储多个相同类型的数据元素的数据结构。数组可以是一维的,也可以是多维的。在模块中定义的数组可以在模块中的任何地方使用,并且可以在不同的子程序之间共享。这使得数组在Fortran程序中非常灵活和强大。
让我们来看一下如何在模块中定义一个一维数组。假设我们要定义一个长度为N的整数数组,可以使用以下语法:
MODULE ArrayModule
INTEGER, DIMENSION(N) :: MyArray
END MODULE ArrayModule
在上面的代码中,我们使用DIMENSION关键字指定了数组的长度为N。这个数组可以在模块中的任何地方使用。例如,我们可以在模块中的一个子程序中给数组赋值:
SUBROUTINE InitializeArray
USE ArrayModule
INTEGER :: i
DO i = 1, N
MyArray(i) = i
END DO
END SUBROUTINE InitializeArray
在上面的代码中,我们使用USE语句将模块ArrayModule引入到子程序InitializeArray中,以便可以使用模块中定义的数组。然后,我们使用一个DO循环为数组赋值。
Visual Fortran90第7章数组教学课件
A(1) A(2) A(3) A(4) A(5) A(6) A(7) A(8) A(9) A(10)
7.2.2一维数组的输入与输出P153 注意:
1、分几行输入输出
2、每行输入输出几个元素
方法一、使用数组名输入输出该数组的所有元素
例7-3:已知A是整型的一维数组,有15个元素,求它 们 的和。(表控格式)
数组说明的基本概念
例:INTEGER,DIMENSION(1:5)::A,B(-1:2),C REAL(4),DIMENSION(1:3,1:4)::D=0 1、大小:须写明维数,维界 维数——逗号分隔 每维维界——d1:d2,称为界偶 下界d1,上界d2。 2、维长:d2-d1+1 3、元素个数:各维维长的乘积 4、形状:各维维长的序列
一维数组:数组名(下标表达式) 二维数组:数组名(行下标表达式,列下标表达式) 三维数组:数组名(行下标表达式,列下标表达式, 页下标表达式) 注意:下标表达式值自动取整数。 下标值可正、可负、可为零。
例1:1,3,5,7,9
存储在数组A中
①设1为第一个元素,数组A的各元素为: A(1)、A(2)、A(3)、A(4)、A(5) ②设1为第0个元素,数组A的各元素为: A(0)、A(1)、A(2)、A(3)、A(4) ③设1为第-1个元素,数组A的各元素为:
例:3个学生4门课程的成绩 98,89,88,9Fra Baidu bibliotek.5 78,67,87,66 67,75,88,88
fortran中数组的定义 -回复
fortran中数组的定义-回复
Fortran 中数组的定义
在Fortran编程中,数组是一种强大且灵活的数据结构。它允许我们存储和操作一系列相同类型的数据。数组在科学计算中广泛应用,可以用于存储矩阵、向量、图像等多维数据。在本文中,我们将一步一步回答有关Fortran中数组的定义的问题。
第一步:声明数组
在Fortran中,要声明一个数组,我们需要指定数组的名称、维度和元素的数据类型。数组的名称是一个标识符,用于在程序中引用该数组。维度决定了数组的大小和形状,可以是一维、二维、三维或更高维。元素的数据类型定义了数组中每个元素的类型,可以是整数、实数、复数等。
在Fortran中,声明一个一维整数数组的语法如下:
fortran
INTEGER :: myArray(10)
这个声明语句创建了一个名为myArray的整数数组,大小为10。我们可
以通过myArray(i)来访问数组中的元素,其中i代表数组中的索引。索引从1开始,最大为数组的大小。
第二步:初始化数组
在声明数组之后,可以选择对数组进行初始化。作为初始化的一种方法,我们可以使用一个数组常量来为数组赋值。数组常量是一个由花括号括起来的列表,其中包含了按顺序排列的元素值。
例如,下面的语句将一个一维整数数组的前五个元素初始化为1、2、3、4和5:
fortran
INTEGER :: myArray(10)
myArray = [1, 2, 3, 4, 5, 0, 0, 0, 0, 0]
这个数组被初始化为:1, 2, 3, 4, 5, 0, 0, 0, 0, 0。数组的大小必须与数组常量的元素数目相匹配,否则会引发编译错误。
_fortran-第七章 过程
7.1.4 传递数组给子程序 通过内存位置指针将参数传递给子程序,如果 参数是个数组,那么指针指向的就是数组中的 第一个值。为此,子程序既需要知道数组的地 址,也需要知道数组的大小。
有3 种可能的方式来指明形参数组的大小: (1)把数组的大小作为形参传递。
(2) 把子程序中的所有形参数组声明为不定结 构的形参数组( assumed-shape dummy array) ,以创建一个子程序的显式接口。(7.3
使用use后模块对于该子程序是可见的,但是对 于调用该子程序的程序是不可见的,除非该程 序也use了该模块。 例7-6 生成随机数
一个简单的随机数生成算法:
ni 是一个非负整数,上式生成一系列数据, 它们取值在[0 ,134455]之间。现设计一个 随机数发生器,它将输出一个范围为[0.0, 1.0] 的实数。
子程序中的RETURN 语句是可选的。当运行到 END SUBROUTINE 语句时,程序会自动返回 到调用程序。只有需要在子程序结束之前返回 到调用程序时,才需要用到RETURN 语句。 例7-1 用直角三角形两直角边计算斜边。 例7-2 数据排序
7.1.2 INTENT 属性 子程序的形参可以与一个INTENT 属性联合 使用。INTENT 属性与类型声明语句联合使 用,来声明每个形参的类型, 告诉编译器如 何使用形参。
7.1 子程序
SUBROUTINE 语句标志着子程序的开始,定义了子 程序名和相关参数表。子程序名必须遵循标准的 Fortran 命名规则由字母和数字组成,最大长度可以 到31 个字符,但第一个字符必须是字母。参数表含 有一系列变量和/或数组,这些变量、数组的值将从 调用程序传递给子程序。这些变量被称为形参 (dummy agument ,形式参数),子程序实际上没有 为它们真正分配任何内存空间。对从调用程序单元传 递来的实际参数(实参)来说它们仅仅是占位符。
Fortran教程第七章数组
注意: (1)DIMENSION语句是非执行语句,必须放在程序单位的可执行语句之前。 (2)用DIMENSION语句只说明了数组的名字、维数、大小等特性,但不能说明数 组的类型,这时,数组类型的说明方法与变量名相同,即: ① 如无特别指明,数组的类型服从I-N规则。 ② 用类型说明语句指明数组的类型。 例如 DIMENSION JU(20),NAME(-10:10,1:2) REAL JU CHARACTER NAME 说明了一维实型数组JU,共有20个元素。还有二维字符型数组NAME,共有42个元素, 每个元素的定义长度为1。 ③ 用IMPLICIT语句指明数组的类型 例如 IMPLICIT INTEGER(A-C),REAL(I,J) DIMENSION B(3:15),IX(10) 说明了整型数组B和实型数组IX。
2. 用类型说明语句说明数组 这也是FORTRAN 77说明数组的一种方法,在FORTRAN 90中继续予以使用。类型说 明语句可以直接说明数组的全部特性,其一般格式为: 类型符 数组说明符[,数组说明符]… 例如 CHARACTER*6 CH(-10:10,5:9)*8 REAL KK(8) REAL(8) SOLUTION(30) 分别说明了字符型数组CH,数组元素的长度为8。还有实型数组KK和双精度数组 SOLUTION。 3. 同时使用DIMENSION语句和类型说明语句说明数组 这是FORTRAN 90增加的说明数组的方法。其一般格式为: 类型符, DIMENSION(维说明符[,维说明符]…) :: 数组名[,数组名]…
Fortran第7章2
例如:PRODUCT(A, 2, A>3)
数组内在函数(续) 8、 shape (数组名)
求数组的形状
形状:各维维长的序列 判定维数,求各维维长d2-d1+1 函数值为数组
练习2:阅读下列程序,写出运行结果
IMPLICIT NONE INTEGER,DIMENSION(0:1,-1:1,2)::M INTEGER,DIMENSION(3)::A M=RESHAPE((/1,2,3,4,5,6,7,8,9,&
对应位置相乘再相加
练习4:阅读下列程序,写出运行结果 PROGRAM MAIN IMPLICIT NONE INTEGER(2),DIMENSION(:),ALLOCATABLE::A,B
INTEGER(2)::C
ALLOCATE(A(1:5),B(1:5)) A=(/1,2,3,4,5/);B=(/5,4,3,2,1/) C=DOT_PRODUCT(A,B) WRITE(*,FMT='(I5)')C
数组内在函数(续) 9、 DOT_PRODUCT (数组名1, 数组名2)
求两个同形状的一维数组(向量)的点积
点积:
REAL,DIMENSION(3)::a REAL,DIMENSION(0:2)::b
DOT_PRODUCT (a,b): a(1)*b(0)+a(2)*b(1)+a(3)*b(2)
fortran语言教程第7章
第7章 模块化程序设计
7.1 程序的模块化思想
引例: 输入M 、N ,计算并输出:)!
(!!n m n m c n m -= 源程序(I ) READ(*,*) M, N DO 5 WHILE(M.LT.N) READ(*,*) M,N 5 CONTINUE X=M T=1.0 DO 10 I=1,X T=T*I 10 CONTINUE S=T X=N T=1 DO 20 I=1,X T=T*I 20 CONTINUE S=S/T X=M-N
T=1
DO 30 I=1,X
T=T*I
30 CONTINUE
S=S/T
WRITE(*,*) S
END
源程序(II )
FUNCTION FA(N)
T=1.0
DO 10 I=1,N
T=T*I 程序段1
10 CONTINUE
FA=T
END
READ(*, *)M, N
DO 5 WHILE(M.LT.N)
READ(*,*) M,N
5 CONTINUE 程序段2
S=FA(M)/(FA(N)*FA(M-N))
WRITE(*,*) S
END
源程序(I )中,加粗的3段完全相同,我们可以将其提炼出来,独立写成一个程序单位,构成一个子程序单元,写成源程序(II )的形式,这样的程序就形成了主程序和子程序的多部分、多模块的格局。 一般而言,模块是指可以独立存盘,并且可以分别编译的源程序文件,是一种构成FORTRAN 程序的独立成分。即是说子程序与主程序可以分别编辑存盘、编译,此时即形成所谓的多模块程序。 程序模块化的优点是:
(1)体现了算法和功能上的模块化,符合人们解决复杂问题的一般思路,也为结构化程序设计提供了有力支持。
fortran第7章 输入和输出
例3: 自带小数点 READ 10,A,B 10 FORMAT (F6.2,F6.2) 输入记录: 输入记录: 29.6720.8946 F6.2 F6.2 计算机赋值的过程: 计算机赋值的过程: 1.根据W的值 取前6位数字字符 取前6 1.根据W 根据 2.将其赋给输入变量表列中的第一项 2.将其赋给输入变量表列中的第一项 3.后面的情况以此类推于是 3.后面的情况以此类推于是 A=29.672 B=0.8946
• 各格式说明中的字母称之为编辑描述符. 各格式说明中的字母称之为编辑描述符. 例:I4中的I表明该数据是整型, :I4中的I表明该数据是整型, 中的 F10.4中的F F10.4中的F表明该数据是实型 中的 • 格式说明中的数值表明该数据的宽度 例: I4表明该数据是整型输入输出宽度为4位. I4表明该数据是整型输入输出宽度为 表明该数据是整型输入输出宽度为4 F10.4表明该数据是实型输入输出宽度10位 F10.4表明该数据是实型输入输出宽度10位 表明该数据是实型输入输出宽度10 其中小数位占4 其中小数位占4位.实际中小数点也占一位
若I=128,J=7142,K=1234567 输出记录: 输出记录: 128 7142******
2. F 编辑描述符 格式: 格式: FW.d 功能: 功能: 用于实型数据的描述 说明: 说明: 1.F说明被编辑的数据为实型 1.F说明被编辑的数据为实型 W说明字段的总宽度 2. W说明字段的总宽度 3. d说明小数点占的宽度 d说明小数点占的宽度 例: 6 PRINT 6,A,B,C FORMAT (1X,F6.2,F6.2,F7.4)
Fortran数组详细介绍
Fortran数组详细介绍
Fortran是一种编程语言,用于科学计算和数值计算。它是一种古老
的语言,最初于1950年代开发,但到现在仍然广泛使用。Fortran最初
是为处理数值计算而设计的,因此它具有许多特性和功能,使其成为处理
大规模数值计算的理想选择。
在Fortran中,数组是一种重要的数据结构。它们允许存储和处理大
量相同类型的数据。数组在Fortran中的声明方式非常简单,如下所示:```
real :: myArray(10)
```
上面的代码声明了一个名为myArray的实数数组,它可以存储10个
元素。在Fortran中,数组的下标从1开始,因此myArray(1)到
myArray(10)表示数组的不同元素。
数组在Fortran中的使用非常灵活。可以对整个数组执行操作,也可
以对数组的部分元素执行操作。例如,可以使用循环结构来遍历数组的所
有元素,并对它们进行计算或处理。
此外,Fortran还具有一些特殊的数组功能,例如数组切片和数组广播。数组切片允许从一个数组中选择一部分元素,而不需要复制整个数组。数组广播允许在不同形状的数组之间执行操作,Fortran会自动扩展较小
的数组,使其与较大的数组具有相同的形状。
总之,Fortran数组是一种强大的数据结构,用于存储和处理大规模
数值计算。它们具有灵活的使用方式,高性能和许多内置功能。Fortran
数组的使用可以简化复杂的计算任务,并提高计算效率。因此,对于进行科学计算和数值计算的应用程序,使用Fortran数组是一个明智的选择。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(3) 数组的维数:数组的维数即为了区分数组元素所需顺序号的个 数。
(4) 数组的大小:数组的大小即数组中包含数组元素的个数,由数 组每维下标的上界和下界来决定。
数组名、数组的维数和每一维的上、下界的定义要用到数组说明 符。它的一般形式是:
数组名(维说明符[,维说明符]…) 数组说明符中,维说明符的个数就是数组的维数。维说明符至少 一个,最多七个,即FORTRAN 90最多允许使用七维数组。
INTEGER A(50),B(3,4)
REAL C(3,2,3) 编译程序将为一维数组A开辟50个连续存储单元,数组元素按下标表达 式值由小到大顺序存放,如图7.1(a)所示。二维数组B占有12个连续存储 单元,各数组元素按列的顺序存放,即先依次存放第一列中各元素,然 后依次存放第二列中各元素,最后依次存放第三列中各元素,如图7.1(b) 所示。三维数组C占有18个连续存储单元,首先按列的顺序存放第一页 上的元素,然后是第二页上的元素按列存放,最后是第三页上的元素按 列存放,如图7.1(c)所示。每小长方框表示一个存储单元,序号表示存储 单元的顺序号。
第七章 数组
7.1 数组的概念 7.2 数组的说明与引用
7.3 数组元素的存储结构
7.4 数组的输入输出 7.5 给数组赋初值 7.6 数组的应用
在迄今所涉及的程序设计问题中,我们都是采用 FORTRAN的基本数据类型(整型、实型、复型、 逻辑型和字符型)定义单个的变量来对数据进行描 述。在科学计算中,常常需要保存具有相同类型 的一批数据,这时如果仍然用单个变量来表示, 不但十分麻烦,有时根本无法处理。为了描述现 实问题中的各种复杂的数据,FORTRAN语言还 提供了由基本数据类型按某种机制组成的结构数 据类型。数组是一种结构数据类型,本章介绍它 的定义与应用。
其中参数Array代表被检测的数组变量。参数Dim代表数组变量的维,该参 数省略时,获取数组变量所有维的下标上界和下标下界。分析下面的程序: INTEGER,DIMENSION(4,5) :: A A=100 PRINT *,UBOUND(A,1),LBOUND(A,1) PRINT *,UBOUND(A),LBOUND(A) END
7.4 数组的输入输出
7.4.1 使用DO循环输入输出数组元素
这种方式的特点是:对于输入,每执行一个输入语句输入一个数组元素值(一 个数组元素值组成一个输入记录)。对于输出,每执行一个输出语句输出一个 数组元素值(每一行输出一个数组元素值)。例如,利用二重循环实现二维数 组的输入输出: INTEGER I,J REAL MAT(2,3) DO I=1,3
源自文库
输出结果为:
4 4 1 5 1 1
即数组A第一维下标上界为4,下界为1。第二个输出语句输出了数组A每一 维的下标上界和下标下界
7.3 数组元素的存储结构
高级语言编译系统为一个数组分配一片连续的内存单元,每个存储单元 存放一个数组元素。对于一维数组按下标从小到大的顺序存放,而对于 二维数组是如何存放的呢?不同的高级语言有不同的处理方式。 FORTRAN 90规定,数组元素在内存中是按列的顺序连续存放的。就二 维数组而言,存放时先存入第一列元素,然后第二列,…,直到全部元 素存完为止。对于多维数组,首先改变第一个下标,其次改变第二个下 标,直至最后一个。例如,有下列语句:
注意: (1)DIMENSION语句是非执行语句,必须放在程序单位的可执行语句之前。 (2)用DIMENSION语句只说明了数组的名字、维数、大小等特性,但不能 说明数组的类型,这时,数组类型的说明方法与变量名相同,即: ① 如无特别指明,数组的类型服从I-N规则。 ② 用类型说明语句指明数组的类型。
例如
DIMENSION JU(20),NAME(-10:10,1:2)
REAL JU CHARACTER NAME
说明了一维实型数组JU,共有20个元素。还有二维字符型数组NAME,共有42个 元素,每个元素的定义长度为1。 ③ 用IMPLICIT语句指明数组的类型 例如
IMPLICIT INTEGER(A-C),REAL(I,J)
7.1 数组的概念
在许多应用中,我们需要存储和处理大量数据。在我们迄 今涉及的程序设计问题中,我们能够利用少量的存储单元,处 理大量的数据。这是因为我们能够处理每一个单独的数据,然 后再重复使用存储该数据的存储单元。在有些应用中,为了其 后的处理,需要保存所处理的数据。例如,要计算和打印一个 班学生的平均成绩以及每个成绩与平均成绩的差。在这种情况 下,在计算每个成绩与平均成绩的差之前,首先计算平均成绩, 然后计算每个成绩与这个平均成绩的差。因此必须能够两次考 查学生成绩。由于我们不愿意两次重复输入学生成绩,我们希 望在第一步时,将每个学生的成绩保存于单独的存储单元中, 以便在第二步时重新使用它们。在输入数据时,用不同的名字 引用每一个存储单元将是烦琐的。如果有100个成绩要处理,我 们将需要一个长的输入语句,其中每个变量名被列出一次。我 们也需要100个赋值语句。
(2) 数组说明符与数组元素名的区别。有下列程序片段: REAL LK(5,5) … LK(5,5)=12.5 … 两个语句中都有L(5,5),由于它出现在两个不同类型的语句中,所以含义 截然不同。REAL语句中的L(5,5)是数组说明符,其含义是:定义了一个L数 组,实型、二维、大小为25个元素。赋值语句中的L(5,5)是数组元素名,其 含义是将12.5存放到L数组的最后一个元素。
7.2.3 数组元素的引用
数组元素是通过数组元素名来引用的。数组元素名的一般形式是: 数组名(下标表达式[,下标表达式]…)
其中下标表达式为整型表达式,如果不是整型,则自动取整之后再使用。下 标表达式的个数必须等于该数组的维数,每个下标表达式的值必须在相应的 维下界到维上界之间。
注意:
(1) 数组元素表示数组中每一个成份的值,数组元素名表示数组元素的名 字。但在实际使用中,数组元素与数组元素名并不加区分。由于数组元素名 是用数组名后面带下标表示的,所以数组元素名叫下标变量。下标变量可以 和简单变量等同使用。
引入数组以后,让一批同类型数据共享一个名字,不必为每一对象都定一个名 字。数组元素是按顺序号连续存放的,我们可以用循环语句控制下标的变化,这 给在同一方式下处理多个同类型数据带来极大方便。例如,要计算和打印N名学 生的平均成绩以及每个成绩与平均成绩的差。程序如下: PARAMETER(N=5) INTEGER I REAL P(N),AVER DO I=1,N READ(*,*)P(I) !输入成绩并存入P数组 !求成绩之和 !定义P数组
数组的使用将简化大批量数据的存储和处理。我们把具有相同类型的一 批数据看成是一个整体,叫做数组。给数组取一个名字叫数组名。所以 数组名代表一批数据,而以前使用的简单变量代表一个数据。数组中的 每一个数据称为数组元素,它可通过顺序号(下标)来区分。只要给出数 组名和下标就可以表示某一数组元素。例如,一个班60名学生的成绩组 成一个数组G,每个学生的成绩分别表示为: G(1),G(2),G(3),…,G(i),…,G(60) 又如某厂5个车间全年各季度的产量组成数组P,每个车间每季度的产量 分别表示为: P(1,1),P(1,2),P(1,3),P(1,4) P(2,1),P(2,2),P(2,3),P(2,4) P(3,1),P(3,2),P(3,3),P(3,4) P(4,1),P(4,2),P(4,3),P(4,4) P(5,1),P(5,2),P(5,3),P(5,4) 在这里,区分G数组的元素需要一个顺序号,故称为一维数组,而区 分P数组的元素需要两个顺序号,故称为二维数组。
AVER=AVER+P(I) END DO AVER=AVER/N DO I=1,N
!求平均成绩
PRINT *,P(I)-AVER
END DO END
!输出成绩与平均成绩之差
7.2 数组的说明与引用
7.2.1 数组说明的内容 程序中要使用任何一个数组都必须给予说明,即说明该数组的名 字、类型、维数及大小,以便编译系统给数组分配相应的存储单元。 (1) 数组名:数组和变量一样,也用符号名来命名。 (2) 数组的类型:数组的类型由数组元素的类型来决定。
维说明符的一般形式是: [维下界:]维上界 维下界与维上界之间用冒号“:”分隔,下界为1时,可以省略不写。维下界 和上界都只能是整型表达式,叫做维界表达式。维界表达式的值必须是整数 值,而且维上界的值必须大于维下界的值。 在维界表达式中,允许出现整常量、整型变量或者星号“*”。不允许出现 函数或数组元素。如果在维界表达式中出现整型变量名,则该数组称作可调 数组。如果出现星号,则只能用星号作为最后维的上界,这样的数组叫做假 定大小的数组。可调数组和假定大小数组只能出现在子程序中,不允许在主 程序中使用。 7.2.2 数组说明的方法 在FORTRAN 90中,数组可以通过DIMENSION语句、类型说明语句或同 时使用DIMENSION语句和类型说明语句进行说明。 1. 用DIMENSION语句说明数组 使用DIMENSION语句说明数组是FORTRAN 77说明数组的一种方法,在 FORTRAN 90中继续使用。一般格式是: DIMENSION 数组说明符[,数组说明符]…
DO J=1,2
READ(*,*)MAT(J,I) END DO END DO (接下页)
(接上页)
DO I=1,2 DO J=1,3 WRITE(*,10)MAT(I,J) END DO END DO 10 FORMAT(1X,F6.2) END 程序运行时,输入数据的方法如下: 45
DIMENSION B(3:15),IX(10) 说明了整型数组B和实型数组IX。
2. 用类型说明语句说明数组 这也是FORTRAN 77说明数组的一种方法,在FORTRAN 90中继续予以使 用。类型说明语句可以直接说明数组的全部特性,其一般格式为: 类型符 数组说明符[,数组说明符]… 例如 CHARACTER*6 CH(-10:10,5:9)*8 REAL KK(8) REAL(8) SOLUTION(30) 分别说明了字符型数组CH,数组元素的长度为8。还有实型数组KK和双精度 数组SOLUTION。 3. 同时使用DIMENSION语句和类型说明语句说明数组 这是FORTRAN 90增加的说明数组的方法。其一般格式为: 类型符, DIMENSION(维说明符[,维说明符]…) :: 数组名[,数组名]…
例如 REAL(8),DIMENSION(0:10) :: A,B,C INTEGER,DIMENSION(4,5) :: D,E 说明了三个双精度型数组A,B,C,它们各含有11个元素。说明了两个整型数组 D,E,它们各含有4×5共20个元素。 在说明数组时,也可以在数组名后面给出维说明,这时以该数组名后面的维 说明为准。例如 REAL,DIMENSION(0:10) :: A,B(20),C(4,5,3) 说明A为A(0:10),而B,C分别为B(2)和C(4,5,3)。
(3)在FORTRAN 77中,除了在输入输出语句中之外,其他场合不允许对 数组进行整体操作,只能对数组的元素逐个进行操作。但在FORTRAN 90中,允许对数组进行整体操作。例如 INTEGER,DIMENSION(4,5) :: A A(:,:)=100 A(:,1:5:2)=470 说明了4×5整型数组A,先将A的全部元素赋为100,再将A第1,3,5列元素 赋为470。其中1:5:2是一个三元表达式,可作为数组元素的下标表达式。 1:5:2的含义是从1变化到5,每次增加2。三元表达式更一般的形式是: 初值:终值:步长 其中步长为1时,步长可以省略。显然,如果用三元表达式作为数组元素 的下标,则引用的不是一个数组元素,而是一个数组片段。 FORTRAN 90提供内部函数UBOUND和LBOUND来获取数组变量所有 维或某一维的下标上界和下标下界。具体调用格式为: UBOUND(Array,[Dim]) LBOUND(Array,[Dim])