| 電腦系統與程式設計概念 |

中央處理器(CPU: Central Processor Unit):電腦的運算核心
記憶體(Memory):暫時處存資料的區域(關機後會流失),電腦執行程式時,先將程式執行碼與所需的資料載入記憶體,再由 CPU 根據程式碼的指令處理記憶體中的資料
儲存裝置(Storage):永久處存資料的區域(關機後不會流失),軟碟、光碟、硬碟等皆屬此類
輸入裝置(Input):將指令或資料傳送給電腦的裝置,如鍵盤、滑鼠
輸出裝置(output):展示電腦處理資料後的工具,如螢幕、印表機等

| Fortran 程式的基本架構 |
一個 Fortran 程式的組成為:
| PROGRAM NAME 敘述一..... 敘述二..... ............ STOP END |
注意:Fortran 語法中,每一行必須從第七個字元開始寫,前五個字元一定要空白,第六個字元在某些情況下需輸入。一般而言,前六個字元都是空白。
所以我們可以寫一個最小的程式,叫做 null.f:只有開頭「Program」行(事實上,連這行都可以省略),以及「stop」、「end」,中間沒有任何敘述。
程式內容:
| PROGRAM NULL STOP END |
Linux 所使用的 Fortran 編譯器叫做 g77,打入 「g77 null.f」即可產生一執行檔「a.out」。
敘述
現在再來看程式本體的「敘述」部分。其實上面 null.f 的三行也都是敘述:
PROGRAM 敘述:是程式第一個敘述,宣告程式的名稱,可省略。
STOP 敘述:終止程式。
END 敘述:告訴編譯程式,本程式之原始碼在此處結束。
輸入輸出敘述:READ、WRITE。程式讀入與輸出資料。
FORMAT敘述:指定輸入與輸出的格式。
宣告敘述:指定變數名稱、型態。
運算敘述:將運算後的「值」指定至變數。
控制流程敘述:迴圈、邏輯檢查。
呼叫敘述:呼叫副程式
變數型態
FORTRAN 程式中,一共有以下幾種型態(若變數名稱為 A):
|
資料型態 |
宣告方式 |
儲存長度(Byte) |
數值範圍 |
|
整數 |
INTEGER A |
2 |
±32767 |
|
整數 |
INTEGER*2 A |
2 |
同上 |
|
整數 |
INTEGER*4 A |
4 |
±2,147,483,647 |
|
實數 |
REAL A |
4 |
±8.43 E-37 ~ ±3.37 E+38 |
|
實數 |
REAL*4 A |
4 |
同上 |
|
實數 |
REAL*8 A |
8 |
±4.19 D-307 ~ 1.67 D+308 |
|
實數 |
DOUBLE PRECISION A |
8 |
同上 |
|
複數 |
COMPLEX A |
8 |
實、虛部皆為 REAL*4 |
|
複數 |
COMPLEX *8 A |
8 |
同上 |
|
複數 |
COMPLEX*16 A |
16 |
實、虛部皆為 REAL*8 |
|
邏輯 |
LOGICAL A |
2 |
TRUE/FALSE |
|
邏輯 |
LOGICAL*2 A |
2 |
同上 |
|
字元 |
CHARACTER*10 A |
10 |
長度為10的字串(最長127) |
IMPLICIT 式宣告:
設定「規則」,指定某一字母開頭的變數皆為該種變數型態,例如:
IMPLICIT REAL*8 (A-H,O-Z)
表示以 A-H、O-Z 開頭的變數,都是長度 8 bytes(倍精度)實數。
流程控制:IF、THEN、ENDIF
使用方式:
| IF (條件) THEN 敘述一.... 敘述二.... ........ ENDIF |
作業:讀入
a, b, c,計算一元二次方程式 ax2+bx+c=0 之根,需注意各種可能情況,如 a=0, a=b=0, 判別式大於、小於或等於 0
迴圈:DO、ENDDO
若要重複執行一些敘述很多次,將此敘述輸入很多次是一件很煩的工作,這時候可以用迴圈來執行。例如要列印「Hello World!」十次,可以用:
|
PROGRAM HELLO_10 WRITE(*,*) 'HELLO WORLD!' WRITE(*,*) 'HELLO WORLD!' WRITE(*,*) 'HELLO WORLD!' WRITE(*,*) 'HELLO WORLD!' WRITE(*,*) 'HELLO WORLD!' WRITE(*,*) 'HELLO WORLD!' WRITE(*,*) 'HELLO WORLD!' WRITE(*,*) 'HELLO WORLD!' WRITE(*,*) 'HELLO WORLD!' WRITE(*,*) 'HELLO WORLD!' STOP END |
利用迴圈,可以改寫為:
|
PROGRAM HELLO_LOOP DO I=1,10 WRITE(*,*) 'HELLO WORLD!' ENDDO STOP END |
可以縮短程式,並且易讀。另一種寫法是:
|
PROGRAM HELLO_LOOP DO 100 I=1,10 WRITE(*,*) 'HELLO WORLD!' 100 CONTINUE STOP END |
當程式中有很多迴圈,或是迴圈很大,導致「DO」與「ENDDO」之間離很遠時,利用行號來標定迴圈比較不容易出錯。
輸出格式之使用:FORMAT 敘述
若要讓程式執行結果輸出較為美觀,在使用WRITE指令時,可用FORMAT敘述指定輸出格式,例如:

上面的範例中,第一次的「WRITE(*,*) I,X」是自由格式輸出,系統會自動為 I 與 X 的值輸出定位。在此也可以注意到因為 X 是單精度的實數,所以只準到有效為數八位,第九位(即小數點以下第八位)是錯誤的(原應為 9,系統中實際的為 8)。
第二次「WRITE(*,100)」表示輸出格式必須依照行號 100 的 FORMAT 指令,意義如下:
'I=':單引號內的字串表示直接將字串輸出
I4:I表示輸出整數變數(注意:跟變數的名稱的「I」無關),留下 4 個欄位,輸出一整數。因為 I=12只有兩位數,所以左邊空兩欄,輸出變數 I 當時的值 12。同理,若要輸出一六位數的整數就得使用 I6。
1X:X表示空格,1X表示空一格,2X表示空兩格....依此類推
'X=':直接將單引號內字串輸出
F8.5:F表示輸出實數變數,共 8 個欄位,其中最右邊五個欄位為小數部分使用,右邊數來第六欄位為小數點,剩下的左邊欄位供整數部分使用
注意順序:輸出指令為「WRITE(*,100) I,X」,也就是「先輸出 I,再輸出 X」,對照 FORMAT 敘述中,可以放變數的位置是「I4」與「F8.5」兩個地方,因此就依序將變數 I 以「I4」格式,變數 X 以「F8.5」格式輸出。
注意:
請試試看,當 Format 指令所給的欄位不敷使用時,例如將上述範例改為 I=1234567,X=-12.34,會發生什麼事?應該如何修改?
如果將一整數以實數格式輸出,或是將一實數以整數格式輸出,會發生什麼事?
作業:
有一函數 f(x)=x3-6x2+9x+3,求x=0.5, 1, 1.5, 2, 2.5, 3...., 9.5,
10所對應之 f(x) 值,並求此函數在此範圍內之極大與極小值
作業:列出九九乘法表(需用到兩層迴圈)