電腦系統與程式設計概念  

 

中央處理器(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.f1.3M  無壓縮檔(5.3M

程式 null.f

敘述

現在再來看程式本體的「敘述」部分。其實上面 null.f 的三行也都是敘述:

PROGRAM 敘述:是程式第一個敘述,宣告程式的名稱,可省略。

STOP 敘述:終止程式。

END 敘述:告訴編譯程式,本程式之原始碼在此處結束。

輸入輸出敘述:READ、WRITE。程式讀入與輸出資料。

FORMAT敘述:指定輸入與輸出的格式。

宣告敘述:指定變數名稱、型態。

運算敘述:將運算後的「值」指定至變數。

控制流程敘述:迴圈、邏輯檢查。

呼叫敘述:呼叫副程式

程式示範 hello.f(5.1M  無壓縮檔(29M)

程式 hello.f

 

變數型態

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

程式示範:bmi.f(5.8M)  無壓縮檔(32M)

程式示範:bmi.f(4.1M)  無壓縮檔(21M)

程式 bmi.f

作業:讀入 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」之間離很遠時,利用行號來標定迴圈比較不容易出錯。

程式示範:loop.f(3.2M)  無壓縮檔(19M)

程式示範:sum.f(5.2M)  無壓縮檔(30M)

程式 loop.f  程式 sum.f

 

 輸出格式之使用: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.5F表示輸出實數變數,共 8 個欄位,其中最右邊五個欄位為小數部分使用,右邊數來第六欄位為小數點,剩下的左邊欄位供整數部分使用

注意順序:輸出指令為「WRITE(*,100) I,X」,也就是「先輸出 I,再輸出 X」,對照 FORMAT 敘述中,可以放變數的位置是「I4」與「F8.5」兩個地方,因此就依序將變數 I 以「I4」格式,變數 X 以「F8.5」格式輸出。

注意

  1. 請試試看,當 Format 指令所給的欄位不敷使用時,例如將上述範例改為 I=1234567X=-12.34,會發生什麼事?應該如何修改?

  2. 如果將一整數以實數格式輸出,或是將一實數以整數格式輸出,會發生什麼事?

作業: 有一函數 f(x)=x3-6x2+9x+3,求x=0.5, 1, 1.5, 2, 2.5, 3...., 9.5, 10所對應之 f(x) 值,並求此函數在此範圍內之極大與極小值

作業:列出九九乘法表(需用到兩層迴圈)