- 第一章 Fortran 语言程序设计初步
- 第二章 改变程序流程
- 第三章 循环结构
- 第四章 数据结构
- 第五章 数组
- 第六章 过程和模块
- 第七章 输入输出和文件
1.3.3 程序组成
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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论