Fortran95 簡介與範例

 

為了讓同學們快速方便地認識 Fortran 90/95 語法,我們採用前面課中的範例來撰寫 90/95 版本。

對 Fortran 程式語言完全陌生的同學,可先看「請你跟我這樣做」及「Fortran 兩小時快速入門」。

 

目的

方便(延伸行,註解,宣告,公共區塊,字串處理)

擴充(矩陣運算,自定資料結構,動態配置,遞迴呼叫)

 

最需要學(與本課程有關)[簡潔與方便]

語法支援

Fortran 77 語法全部支援,確保舊程式、後續者改良的舊程式、舊風格的新程式,皆能被編譯。

write_hello.f90

print.f90

 

 

格式(自由格式)

 

範例:Hello, World! (hello.f90

範例:1 加到 10 ( one_to_ten.f90

範例:1 加到 N ( one_to_n.f90

 

註解

驚嘆號「!」之後的同一行是註解,之前的同一行指令仍有效

範例:(自由格式 free_comment.f90

對比固定格式 fixed_comment.f

 

延伸行

末完成的行,打 「&」符號作為連到下一行的標記

範例:Hello, World! 中斷版 ( hello-cnt.f90

 

宣告

(多重屬性,一次 (合併) 宣告,因此使用雙冒號)

範例:拋物線 pgplot ( pg_example.f90

 

程式檔命名

大部分的 Fortran 編譯器,認定用固定格式的規則來編譯 .f ,用自由格式的規則來編譯 .f90。因此,要採用包含自由格式的新語法,程式檔名必須以 .f90 作為延伸檔名。

 

矩陣宣告與運算

C = A + B 這種運算,變數可以是矩陣

 

像以下這樣一個動作就把陣列 A 內的所有元素歸零

A = 0.0

 

將兩個同長度的向量 Va、Vb 取內積

dot_product(Va, Vb)

 

一個向量 / 陣列 V 的維度大小,可以用 size(V) 來獲得

 

將兩個矩陣 Ma、Mb 作相乘(其中 [Ma] m × l 、[Mb] l × n ,第一個矩陣的第二個指標大小以及第二個矩陣的第一個指標大小要一樣)

matmul(Ma, Mb)

 

動態配置

核心功能

step 1 :將變數宣告成 allocatable

step 2 : 下達 allocate 函數

範例:拋物線 pgplot 詢問點數後動態配置 ( pg_example_allocate.f90

 

進階功能

測試某陣列是否己配置

allocated(可配置陣列名)

解除配置 / 釋放記憶體

deallocate(可配置陣列名)

 

內建亂數產生器

使用方法:call random_number(r)會在 r 內填入 0.0 至 1.0 之間的實數值

範例:骰子程式 dice.f90

dice_vervose.f90

dice_check.f90(當投擲數多,獲得每種點數的統計都趨向 1 / 6 )

需要重設亂數種子時,用:call random_seed()

舊版的 gfortran (如 4.0.x 版) 這個功能不正常,須使用較新版本 (如 7.0.x) 或其他編譯器 (如 Intel) 就可以,請注意。

dice_true.f90 (重覆執行程式,每次丟出的隨機順序都不一樣)

dice_clock.f90(使用 system_clock 來馬乎地取得亂數)


有用小秘技

在程式運行中 執行(啟動) 外部程式執行檔,用 CALL EXECUTE_COMMAND_LINE([外部程式名稱]) 這樣的指令。

 

 

未來中階 [物件導向]

簡介「物件導向」的程式建構理念

「物件」就是,從外部看起來,一個單元的性質跟本體是在一起走的,並且可以作單元之間的組裝。「物件」被複製時,「性質」也跟著被複製。

小程式段都是按步驟依序執行,流程圖是常用於表示其行為,它是程式「內部」運作的程序,相當足夠,也正是泛用圖靈機的本意。

然而,當程式大越越複雜,或共同開發的人越多,就需要將「介面」/「銜接方式」 的定義非常重要,駕馭繁以簡,我們。什麼東西,我們只看見它們的表面與行為,也能著手加以組合以創造新的功,但卻不需知道其內部細節,就是「物件」。

 

封裝性

有規範地收納資料與副程式放在一起,這個動作定義了物件的範圍及功能。並區分了公用與私用,

繼承性

模組層級鍊之間的垂直關係中,較基礎(低階))的要能夠方法能夠被較應用的所運用。透過己定資料型態的再組合定義,上層/高層/應用層不必重定資料結構細節。

角鋼鎖出來的書架仍有

多型性

模組層級鍊之間的水平關係,有類似性高的,再包裝在一起。如此可減化物件關係圖,讓「物件」的功能行為更清楚。

(例如,一維函數求最小值與二維函數求最小值其演算法可能完全是不一樣的。透過擴充過的「介面」把兩者包在一起,求最小值這個動作從外郊的叫用就可以簡化,不必對維度作不同的處理。)

抽象性

條條大路通羅馬,同一個目的或效果,可以有不同的方法(演算法)來達成,一個最有彈性的作法,要將功能跟具體的方法分開,外面不用知道,只回應真正有唯一性的特性與行為。

 

模組

USE [模組名稱] 的方式載入

 

模組本身,則與副程式相似是以宣告的方式定義,

 

把資料(變數) 與 行為(程式) 封裝

 

分為 public (公用) 與 private (私用) ,可明確定義凡是要被「使用」的名稱

 

字串操作

裁剪拼接

範例:print_name_trim.f90

 

流程控制(select, case, cycle, exit)(使用 goto 行號 的機會會大幅度減少)

select ... case 語法,可以用來規劃多重通道,簡化 if ... then ... else ... ednif 架構

dice_clock.f90

 

數值型態選用

kind 相關函數用以詢問 / 指定 豐富彈性的數值型態

 

未來進階

使用者自定型

使用 % 符號作為 部件/分量 選擇器 (component selecter), 以定義樹枝狀分叉結構欄位,

有利於整個資料物件或其一部分的複製

配合「模組」,資料與行為可以抽象化地一併收藏,實現「物件」導向的程式寫作方式。(自定型態,有利於物件的外部不需要知道具體的資料內容的放置方式,只管整套資料物件的取用、傳輸或操作即可。

 

多型 (overload)

一塊招牌、多重業務

 

呼叫時可變引數串

 

遞迴式呼叫及函數

有些演算法的本質

 

有關公共(數據)區塊

這是為了要讓不同副程式之間共享,所以如果能有

 

FORTRAN 風格續存

簡單

清楚

數學