FUNCTION 副程式的定義格式如下
type FUNCTION name ( x1, x2, ... , xn )
其中
注意
使用函數時,在算術式中列出其名稱及實際引數。 實際引數的數值成為相關的形式引數的數值,並用以計算 函數值。
注意,實際引數的個數和型式,必須和形式引數一致。
FUNCTION FACTOR (N) INTEGER FACTOR, N, I FACTOR = 1 DO 10 I = 2, N FACTOR = FACTOR * I 10 CONTINUE END
CHARACTER*9 FUNCTION AIR (INDEX) INTEGER INDEX, CUTOFF PARAMETER (CUTOFF = 50) IF (INDEX .LT. CUTOFF) THEN AIR = 'SAFE' ELSE AIR = 'HAZARDOUS' END IF END
FUNCTION POISS (LAMBDA, N) INTEGER FACTOR, N REAL POISS, LAMBDA POISS = (LAMBDA ** N * EXP(-LAMBDA)) / FACTOR(N) END
例題: Poisson probability Function (source)
亂數 (random number) 數列是一串表面上雜亂無章的數字。 數字重複出現的周期必須很長, 而且前後數字似無關聯。 均勻分佈 (uniformly distributed) 的亂數數列,可用下列式子產生
Xn+1 = (aXn + c) mod m, n>=0
式中初值 X0, 乘數 a, 增數 c 均不為負, 而且都小於模數 m。
適當選擇 X0, a, c, 和 m 值, 即可產生亂數。 以 32 bits 的計算機為例, 可取 a=3612, c=5701, m=566927。(ref. 3, p.335)
產生亂數的方法有好幾種,這種方法稱為線性同餘法 (linear congruential method)。
FORTRAN 90 -- 使用下列副程式產生亂數:
CALL RANDOM(X) 產生(0,1)亂數X CALL RANDOMSEED 設定亂數產生
References
假如函數可用單一式子界定,則可採用敘述函數定義。
name( x1, x2, ... , xn ) = expr
例如
POISS(LAMBDA, N) = (LAMBDA ** N * EXP(-LAMBDA)) / FACTOR(N)
例題: HADDER(Binary Half Adder) (source)
SUBROUTINE 副程式的定義格式如下
SUBROUTINE name ( x1, x2, ... , xn )
其中
SUBROUTINE 副程式也是一個完整的程式,它和 FUNCTION 副程式不同之處如下
例如
CALL PRNDEG(DEGS, MINUTS, SECONS)
使用副程式時,實際引數可以是另一副程式名稱。 由於副程式名稱和變數名稱一樣,無法區別, 所以必須使用 EXTERNAL 或 INTRINSIC 敘述予以宣告。
例如
EXTERNAL POLY例題: AREA: Rectangle approximation of an integral -- version 2 (source)
例如
INTRINSIC SIN例題: AREA: Rectangle approximation of an integral -- version 3 (source)
主程式和副程式間的資料,是依靠引數來傳送。 但是假如所要傳送的資料很多,或相同的資料要在幾個不同 的副程式中使用,這樣的傳送方式就很不方便。 這時適合使用 COMMON 敘述。 COMMON 敘述用以在程式中指定 某些特定的儲存位置為共用區,而各份程式都可直接使用此共用區的儲存位置。
COMMON 敘述的形式有兩種
COMMON list
例題 POLAR: Coordinate Conversion -- version 2 (source)
COMMON /name-1/ list-1 /name-2/ list-2 ...
FORTRAN 90 -- FUNCTION 和 SUBROUTINE 副程式都可以使用
遞迥式(recursive),例如
RECURSIVE FUNCTION FACTORIAL(N) RESULT(FACT) INTEGER FACTORIAL, RESULT, N IF (N<1) THEN FACT = 1 ELSE FACT = N * FACTORIAL(N-1) END IF END