FORTRAN95 语法基础 - 图文

发布时间 : 星期日 文章FORTRAN95 语法基础 - 图文更新完毕开始阅读

四、 DO循环结构 返回目录

4-1 无条件循环结构 [<名称>:] DO <循环体>

END DO [<名称>]

? 这类循环结构的循环体中应有判断语句,通过EXIT或GOTO语句结束循环。

4-2 计数型DO循环

[<名称>:] DO < 循环控制变量=初值,终值 [,步长] > <循环体>

END DO [<名称>] ? 缺省步长默认为1。

? <循环体>中可包含EXIT,CYCLE语句。EXIT强迫终止循环,转向END DO后的第一条语句。CYCLE语句结束当前的循环并开始下一次循环。

4-3 条件型DO循环

[<名称>:] DO WHILE (<循环条件>)

<循环体>

END DO [<名称>]

? <循环条件>只能是关系表达式或逻辑表达式。表达式为真时执行循环,为假时转向END DO后

的第一条语句。

4-4 给DO语句添加标记

在DO语句前可以添加标记或在关键词DO后添加语句标号。即

<标记:> DO …… …… END DO <标记> 或

DO <语句标号> …… …… …… <语句标号> ENDDO 例:

ASD: DO I=1,20 …… …… END DO ASD 或:

DO 100 I=1,8 …… …… 100 END DO

五、 数组 返回目录

5-1 数组的声明: 数组须经声明其类型与维数方可使用。 5-1-1 用类型声明语句:

类型声明语句为: <类型声明符>[::]<数组声明表>

<类型声明符>=[*N | (N) ]; <数组声明表> = <数组名>(<维说明表>) [=<数组初值表>]

{,<数组名>(<维说明表>) [=<数组初值表>]}

<维说明表> = [<下界>:]<上界>{,[<下界>:]<上界>} <数组初值表> = (/值1,值2,……/)

? N为KIND值,若省略则使用该类型的默认值。 ? 若要对数组赋初值,则必须使用‘::’符。

? 维说明表中缺省下界默认为1。若有任一维的下界大于上界则该数组大小为0。 例: real (4) ::A(2,3)=(/2.2, 4.2, 9.5, 8.7, 6.2, 7.9 /)

5-`1-2 用DIMENSION语句声明数组 DIMENSION <数组声明表>

<数组声明表> = <数组名>(<维说明表>) {,<数组名>(<维说明表>)} <维说明表> = [<下界>:]<上界> [{,[<下界>:]<上界>}]

? DIMENSION语句中不能有‘::’符号,不能给数组赋初值。

? 用DIMENSION语句声明的数组,其类型可按隐含规则(I-N规则)确定,也可用显式声明其类

型,但显式声明语句应在DIMENSION语句之前。如:

Real (8) NUM,SUM

DIMENSION NUM(2,3),SUM(2:8)

5-1-3 联合使用类型声明语句与DIMENSION属性声明数组 <类型>,DIMENSION (<维说明表>) ::<数组声明表>

<维说明表> = [<下界>:]<上界> [{,[<下界>:]<上界>}] <数组声明表> = <数组名>[<维说明表>][=<数组初值表>]

{,<数组名>[<维说明表>][=<数组初值表>]}

? 数组声明表中的数组若自带维声明,则按自带声明的维数与上下界,否则按DIMENSION属性

给出的维说明。

例: Integer, demension(2,3):::num=(/1,2,3,10,20,30/) ! 对数组NUM赋初值 real, dimension (3)::A1,A2,A3(3,6) !A1,A2为一维数组,A3为二维数组 integer, dimension(3,4):: A,B ! 声明A,B为二维数组

5-2 数组的引用

1)访问整个数组,用数组名。如

A=3.5 ! 将3.5赋值给数组A的所有元素。

Print*,‘A= ’, A !显示数组A的全部元素。 2)访问数组元素,须指定下标,或下标范围: <数组名>(<下标>[{,<下标>}]

Num = A(2,3)+A(1,3) ! 将数组元素A23与A13之和赋值给Num

? 下标一般是整型数,若给了实型数则系统自动取整(截断取整)。 3) 访问一组连续的数组元素片段,可给出下标的范围: <数组名>(<下标>[{,<下标>}]

<下标> = <表达式>|[<下界表达式>]:[<上界表达式>]

? 缺省下界表达式则默认取本维的下界;缺省上界表达式则默认取本维的上界。也可以上、

下界表达式都缺省,则默认为包含该维从下界到上界的全部元素。 如: A(1,1:3)= 6.5 !将6.5赋值给A11,A12,A13

:)= 8 !将 8赋值给数组A的第二行所有元素。 A (2,

? 上/下界表达式可以是整型或实型,若为实型则表达式自动取整。 4)访问一组或有规则间隔的元素可给出下标的范围及步长::

<数组名>(<下标>[{,<下标>}]

<下标> = <表达式>|[<下界表达式>]:[<上界表达式>][:<步长>]

? 缺省步长,默认为1。

? 缺省上/下界表达式,取本维的上/下界 。 如: A(1,1:3:2) = 8.2 !将8.2赋值给A11与A13。

? 下标越界会产生不可预知的错误。为避免发生此类错误,可使用检测函数: UBOUND(<数组名>[,[dim=]<维的序号>]) ! 给出数组相应维的下标上界

LBOUND(<数组名>[,[dim=]<维的序号>]) ! 给出数组相应维的下标下界 ? 若缺省维的序号,则给出的一维整型数组依次为各维下标的上/下界。

5-3 数组的算术运算

算术运算符 +、-、×、/ 、** 也适用于数组。其功能是对同形数组的对应元素进行相应运算。 如:对于数组A(m,n)与B(m,n),语句 A = A / B 等同于: do i = 1,m ; do j = 1,n A(i,j) = A(i,j) / B(i,j) enddo ; enddo

5-4 数组的输入 / 输出 1)使用数组名输入 / 输出 read*, A ! 输入A数组 print*, A !输出A数组 或 WRITE (*,‘(<格式说明表>)’) A WRITE (*,) A

数组的逻辑结构是数据表,一维数组是一行,多维数组是多层的数据表。而数组在计算机中的存储结构是连续分布的一串存储单元,是一维线性表。数据的存储顺序是以列为主,按列从上到下,从左到右,从第一层到最后层。

使用数组名输入 / 输出就是按数组的存储结构顺序输入/ 输出。第一个元素是第一层表的第一列第一行,第二个元素是第一层表的第一列第二行,……,然后是第二列第一行、第二行……,再后是第二层表的第一列第一行、第二行……,第二列第一行、第二行…………。

34??12??

8例5-3: 矩阵A?567????9101112??对READ*,A 语句的输入顺序应是: 1,5,9,2,6,10, 3,7,11 ,4,8,12

用PRINT*,A语句输出的结果也是: 1,5,9,2,6,10, 3,7,11 ,4,8,12

2)使用DO循环语句输入/ 输出数组:

使用循环语句输入/输出,可以实现以行为主或以列为主的顺序。下面为用DO语句输入: DO J = 1,4 DO I =1,3

READ*, A(I,J) END DO END DO

执行时,以列为主输入,顺序为:1,5,9,2,6,10, 3,7,11 ,4,8,12 (逗号处回车换行) 若要以行为主输入,则上列程序段应改为:

DO I = 1,3 DO J =1,4

READ*, A(I,J) END DO END DO

执行时,以行为主的输入,顺序为:1,2,3,4,5,6,7,8,9,10,11,12(逗号处回车换行) 输出时,若要保持原矩阵排列的形式,其程序段为: DO I = 1,3 DO J =1,4

WRITE(*,'(2x,I2,2x,\\)') A(I,J) END DO WRITE (*,*) END DO

若要将A转置,则其程序段为: DO J = 1,4

DO I = 1,3

WRITE(*,'(2x,I2,2X,\\))') A(I,J) END DO WRITE (*,*) END DO

3)使用隐DO循环输入 / 输出数组

隐DO循环输入 / 输出的语法格式为:

(<输入 / 输出项>,<循环控制变量>=<初值>,<终值>[,<步长>])

? 输入项可以是数组元素或普通变量;但不能是常数、函数或表达式。但输出项则除了数组元素外还可以是普通变量、常数、函数或表达式。

? 缺省步长默认为1。

如:对前面的A数组,对其输入的语句为: Read*, ((A(I,J), j = 1,4), i = 1, 3 )

执行时,按行输入数据。与使用DO循环语句输入时不同的是,不是键入一个数据就回车换行,而是可以一行输入多个数据。应输入的全部数据可以一行输入,也可以任意分成多行输入。

若要按列输入数据,则上述语句应改为:

Read*, ((A(I,J), i = 1,3),j = 1, 4 ) 输出A矩阵的隐DO循环语句是:

Write (*,\以下输出其转置矩阵

Write (*,\

5-5 给数组赋初值 返回目录

数组在未经赋值前其各元素均为0。 1)使用数组名

若对数组所有元素赋以相同的值,可用数组名。如: real A(1:8)

A=5.6 ! 将5.6赋给A的所有8 个元素

联系合同范文客服:xxxxx#qq.com(#替换为@)