返回介绍

1.3.3 程序组成

发布于 2025-03-08 16:28:28 字数 3955 浏览 0 评论 0 收藏 0

a) 程序总体构造

Fortran90 程序是一种分块形式的程序,整个程序由若干个程序模块组成。各模块都有相似的语句组织形式,其中主程序起整体控制作用,各辅程序模块各自完成问题中的一个算法。在解决一个比较复杂的问题时,先把求解的问题分解为若干相对独立的子算法,每一个子算法编为一个辅程序,然后按搭积木一样将各有关程序模块组成一个程序。主程序依次调用各辅程序模块,控制各子算法的实施,通过主程序对子程序的调用,形成程序的整体运行,完成问题的解。

若某一子程序算法仍复杂,可再把它分解为若干更小的算法,分别编写为更低一层次的辅程序,由其他辅程序分别去调用。这种情况可以类推到其它子程序或更低一层次。所以,Fortran 程序=n 个程序单位=1 主程序单位+(0~n-1) 个子程序单位。在最简情况下, Fortran 程序只由一个主程序构成而没有辅程序,所有算法都由主程序自身完成。按现代要求,即使功能比较简单的问题,也最好写成主程序调用辅程序的形式,以便于维护。

F77 中定义的辅程序对所有其它辅程序都是公开的,即除自己本身以外都可以加以引用。而在 F90 中,辅程序可以被本身应用,且可以定义不能被其它辅程序应用的内部辅程序。

b) 程序单位

主程序

[PROGRAM 程序名] ←语句可省略

.....

END [PROGRAM [程序名]] ←END 必须有

辅程序(过程)

SUBROUTINE 子程序

FUNCTION   函数
BLOCK DATA 块数据
MODULE     模块 (F90)

内部过程  CONTAINS (F90)

程序单位是 Fortran 中的基本成分,包括主程序、辅程序、块数据单元和内部过程。辅程序可以是函数辅程序或子程序辅程序。模块中包含可由其他程序单位访问的各种实体。块数据单元用来对有名公用块的数据对象规定初始值。一个执行程序总是由一个主程序单位和任意个(可以为零) 其他类型的程序单位组成,任何程序单位都不能调用主程序。在主程序中定义的内部过程必须跟在 CONTAINS 语句之后,主程序是它的内部程序的宿主。过程包括函数和子程序,对一个子程序的引用是通过 CALL 语句或定义的赋值语句来引用的。

MODULE 过程在主程序中通过 USE 语句与之相联系。模块用于组装若干功能(如过程、类型定义、语义扩展等) 为一集团,是 F90 中极具柔软性的程序单位,它取代了 F77 中的某些不安全的特性。

BLOCK DATA 辅程序的用处是定义全局常数或全局初始化,在 F90 中是不推荐使用的,其功能已被 MODULE 和 USE 取代。

c) 程序体和语句顺序

各程序单位(除模块程序单位外) 的程序体形式相同,共分两部分:前面是说明部分,后面是执行部分(模块程序单位只有说明部分),两部分之间没有确切的分界,紧密衔接,但不准彼此穿插。即:程序单位=单位起始语句+程序体+单位结束语句。程序体=说明部分+执行部分。

Fortran 要求严格的语句顺序。在每个程序单位中,根据语句种类按如下的次序排列。F77 中的顺序可简单归纳为:

PROGRAM,FUNCTION,SUBROUTINE,BLOCK DATA 等程序单位开始语句

变量类型和语句函数等定义语句     (说明部分)

执行语句,DATA 语句,FORMAT 语句    (执行部分)

END 语句

在 F90 中将新增加的语句功能综合后,其顺序为:

PROGRAM, FUNCTION, SUBROUTINE, MODULE, BLOCK DATA

USE

FORMAT ENTRY

IMPLICIT NONE

PARAMETER

IMPLICIT

PARAMETER & DATA

定义:派生类型、接口块、变量类型、语句函数

DATA

执行结构

CONTAINS

内部过程或模块过程

END

整个程序中只能有一个 PROGRAM,一个 BLOCK DATA,可以有多个各自命名的 FUNCTION 和 SUBROUTINE 辅程序。

d) 英文名

变量名和程序名等使用的英文名是由(F77:6;F90:31) 个字符(包含英文字母 A-Z、数字 0-9、F90:下划线 _) 构成,且第一个字符必须是字母。其英文名的有效使用范围原则上限于一个程序单位之内(内部过程除外)。如下面的语句是错误的:

INTEGER :: 1A ! 不是以字母开头

INTEGER :: A_name_made_up_of_more_than_31_letters ! 太长

INTEGER :: China:0 ! 含有不允许的字符

INTEGER :: A-3 ! 减号在此是无意义的

Fortran 没有规定保留字,即可以用函数名或语句定义符作变量名。但为了避免混淆,建议不要使用 Fortran 中已有特定含义的字作变量名。如 SIN 是正弦函数的名字,如果有以下语句:

SIN=3.5

PRINT *,SIN

则语句中的 SIN 是变量名而不代表正弦函数。系统会根据它后面有无自变量而作出判断,又如:

READ *,PRINT

此时 PRINT 是一个变量名而不代表“打印输出”的操作。系统会认定语句的第—个字 READ 为代表操作的语句定义符,而把 PRINT 作为 READ 语句中读数的变量。但在同一个程序单位(主程序或子程序分别是一个程序单位) 中,变量名和函数名或语句定义符不能同名。以下是错误的:

SIN=3.5

A=SIN*SIN(2.0)

PRINT *,PRINT

e) 标号和标签

可在语句开头加上标号或标签,用于指定特定的语句。有效范围限于一个程序单位内。

标号:1-5 位的 10 进制整数,且至少一位不为 0,前导 0 不起作用。F90 中,不可对空语句加上语句标号。

标签:英文名,后面接“:”(冒号) (F90)

例:

DO 10 k = 1,100

...

10 CONTINUE

 

注:不能使用整型变量来指定转向语句的标号。如下是错误的。

n = 10

GOTO n

 

例: (F90)

DO k = 1,100

loop2: DO

....

END DO loop2 !已有标签名时不能省略标签名。

END DO

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文