短信预约提醒成功
七、函数与子程序(过程)
(一)内部函数
内部函数是预先编制的一些常用函数或算法的过程,由FORTRAN语言提供,可以直接调用。内部函数调用时的一般形式是:
内部函数名(实元表)
实元表中元素的数据类型、个数是预先规定的。
常用内部函数及其功能可查阅FORTRAN教材或用户手册。
(二)语句函数
1.语句函数的定义
定义语句函数的语句称为语句函数语句。其一般形式为:
函数名(形参表)=表达式。
其中,函数名的命名规则与一般变量名相同,所以它也可以用类型说明语句等来说明。形参又称哑元,是一些变量名,一般应出现在表达式中。
语句函数在程序单位中的位置,应在所有可执行语句之前。
2.语句函数的调用
调用语句函数的结果是得到一个函数值,因此,调用语句函数时代之以实际变量(又 称实元)。
(三)函数子程序
一个函数子程序是一个独立的FORTRAN程序单位。它的第一个语句必须是FUNCTION语句,最后一个语句必须是END语句。即函数子程序的一般结构为:
[类型说明]FUNCTION函数名(形参表)
语句块
[RETURN]
END
也可以写为:FUNCTION函数名(形参表)
[类型说明 函数名]
语句块
[RETURN]
END
?08年考试规范、标准: 2008年一级注册结构工程师考试成绩查询汇总
其中函数名的命名规则与变量相同,而函数名的类型决定了函数值的类型。在函数子程序中,形参可以是变量名、数组名、外部过程名,而形参的命名与类型说明也与变量相同,形参数组也必须在函数子程序中予以定义.
函数子程序的函数值由函数名带回到调用该函数子程序的程序,因此,在函数子程序中必须对函数名赋值。在函数子程序中,函数名应该像普通变量那样来使用。
在函数子程序中,所有的名字、语句标号都可以和其他程序单位中的相同而彼此没有任何关系。
在函数子程序中,END语句的功能有两个:一是表示该程序单位的结束,二是具有返回语句RETURN的功能。函数子程序中必须有并且只有一个END语句,而且只能是子程序的最后一个语句。当在子程序的其他位置须要返回时,可以使用RETURN
语句。
(四)子程序
1.子程序的结构
一个子程序是一个独立的FORTRAN程序单位。子程序的第一个语句必须是SUBROUTINE语句,最后一个语句必须是END语句。
即子程序的一般结构为:
SUBROUTINE子程序名(形参表)
语句块
[RETURN]
END
SUBROUTINE语句中的形参表可以省略。这时子程序名后的括弧不要保留。对子程序的其他有关规定与函数子程序相同。
2.子程序的调用
子程序调用通过CALL语句实现。其形式为:
CALL子程序名(实参)
其他有关对子程序的调用规定与函数子程序相同。
八、程序单位间的数据传递
(一)虚实结合
虚实结合又称哑实结合,是各程序单位(主程序和各种过程如函数子程序)之间传递数据的一种重要途径。
1.变量的虚实结合
当子程序等过程的形参为变量时,则在调用时所对应的实参可以是类型相同的常数、变量、数组元素或表达式;子程序调用后,其运行的结果通过这些实参返回到调用者。在FORTRAN 77中,当形参变量所对应的实参是变量或数组元素时,则它们之间的结合方式是地址结合;而当形参变量所对应的实参是常数或表达式时,其结合方法对于不同的
FORTRAN系统有可能是不同的。
2.数组的虚实结合
当子程序中的形参为数组名时,则在调用时所对应的实参必须是数组名或数组元素。如果实参是数组名,则实参数组与形参数组按地址结合,实参数组与形参数组都从第一个元素开始按列逐个对应。例如,有主程序与子程序如下:
PROGRAMMAIN
INTEGERA(0:5)
…
CALLSB(A)
END
SUBROUTINESB(B)
INTEGERB(-1:2)
…
END
则在主程序中使用CALL语句调用子程序SB时,实参数组与形参数组的结合情况如下:
实参数组 形参数组 ,
A(0)――B(-1)
A(1)――B(0)
A(2)――B(1)
A(3)――B(2)
A(4)
A(5)
也即调用SB时,A数组的头4个元素与B数组的元素对应,这些对应元素实际上为同一存储地址。如果实参是数组元素,则从该元素开始依次与形参数组的第一个元素起按列逐个对应,它们也是按地址结合。例如,有主程序与子程序如下:
PROGRAMMAIN
DIMENTION A(8)
… ,
CALLSB(A(5))
END
SUBROUTINE SB(B)
DIMENSION B(3)
… ,
END
则在调用语句执行时,实参数组A与形参数组B的结合情况如下:
实参数组 形参数组
A(1)
A(2)
A(3)
A(4)
A(5)――B(1)
A(6)――B(2)
A(7)――B(3)
A(8)
FORTRAN77规定,不管实参是数组名还是数组元素,用作实参的数组,其维数、各维下标的上下限及数组中元素个数可以和与之结合的形参数组不同,但要求从与形参数组的第一个元素结合的实参数组元素算起,以后的实参数组元素的个数不能少于形参数组元素的个数。
多维数组或数组元素虚实结合时,要特别注意FORTRAN中数组按列存放的规定,不要摘错存储地址的对应关系。例如:
PROGRAMMAIN
DIMENSIONA(3,2)
…
CALL SB(A)
END
SUBROUTINE SB(B)
DIMENSION B(2,3)
… ,
END
这种情况下,数组元素地址的对应关系是:
实参数组 形参数组
A(1,1)――B(1,1)
A(2,1)――B(2,1)
A(3,1)――B(1,2)
A(1,2)――B(2,2)
A(2,2)――B(1,3)
A(3,2)――B(2,3)
3.可调数组
在主程序中定义数组元素时,?定义说明符中各维下标的上下限必须为整常数,不能是变量或算术表达式。但在子程序中定义数组时,允许用变量来定义各维下标的上下限。子程序中用变量来定义各维下标上下限的数组称为可调数组。但使用可调数组必须遵循以下几个原则。
(1)可调数组名必须是形参数组名。
(2)说明可调数组各维下标上下限的表达式中只能出现整型变量,且这种变量必须是 形参或出现在COMMON语句中。但在某些FORTRAN 77子集中,定义可调数组各维下标上下限时只能是整型变量,而不能是任何算术表达式。
(3)可调数组的大小不得超过对应实参数组的大小。
4.字符型变量的虚实结合
(1)当子程序中的形参为字符型变量时,对应的实参必须是字符型变量、字符常数、
字符型数组元素或字符表达式。字符型实参必须用CHARACTER语句加以说明。
(2)如果字符型形参的长度小于对应的实参长度,则从实参中最左边的字符开始与形
参结合,而实参中右边多余的字符被截去。例如:
CHARACTERA* 5
A=’ABCDE’
CALL SB(A)
END
SUBROUTINESB(X)
CHARACTER X*3
WRITE(*,*)X
END
程序执行后的输出结果为:ABC。
(3)在FORTRAN77中,对字符型形参的长度还可以用“*”号来说明,此时,形参字符变量自动与对应的实参取相同的长度。例如在上面的子程序SB中,如果将CHARACTER X*3改变为CHARACTER X*(*),则执行后,输出的结果为:ABCDE。
(4)当子程序中形参为字符型数组时,如果形参字符型数组元素的长度与对应实参字符型数组元素长度一致,则其虚实结合的情况与一般的数组虚实结合的情况相同。如果形参与实参的字符型数组元素长度不同,则按字符依次对应。例如,有主程序与子程序如下:
CHARACTFER A(5)* 3
DATA A/’ABC’,’DEF’,’GHI’,’JKL’,’MNO’/
CALL SB(A)
END
SUBROUTINE SB(D)
CHARACTERD(4)*2
…
END
则形参数组D中元素的值为:
D(1):’AB’
D(2):’CD’
D(3):’EF’
D(4):’GH’
(5)过程名的虚实结合
FORTRAN允许子程序中的形参为过程名,此时,调用程序中的实参必须是过程名。
如果实参是外部过程名(如函数子程序名、子程序名),则该外部过程名在调用程序中必须用EXTERNAL语句说明。
如果实参是内部过程名(如内部函数名),则该内部过程名在调用中必须用INTRINSIC语句说明。
(二)公用区语句
1.公用区语句的一般形式 -
COMMON[/公共区名1/]变量表1,[/公共区名2/变量表2]…
没有公用区名的就称为无名公用区,其他都是有名公用区;一个完整的程序只能设置一个无名公用区,但可以有多个有名公用区;变量表中,可以是变量名、数组名、数组说明符,互相之间用逗号隔开。例如:
COMMON a,b(3),c(2)
定义了b是3个元素的一维数组,c是2个元素的一维数组。这条语句与下面两句语句是等价的:
DIMENSION b(3),c(2)
COMMON a,b,c
2.利用公用区进行数据传递时,在无名公用区或同名的有名公用区中,位置排列相同的变量、数组,实际上使用同一存储地址,亦即共享同一数据。例如:
PROGRAMMAIN
COMMON a,I(2)/COM l/d,c
…
CALL SB
…
END
SUBROUTINE SB
COMMON aa,JK(2)/COM l/f,g
END
其中,主程序中的变量a的数据与子程序的变量aa共享,数组1的数据与JK共享,而d,c的数据分别与f,g共享。由此可以知道,各个程序单位中COMMON语句中的变量类型必须按位置一一对应一致才能正确传递数据。