跳轉到內容

Fortran/基礎

75% developed
來自華夏公益教科書


Fortran 程式由主程式和模組組成,每個程式都可以包含子程式和函式.

程式執行時應執行的程式碼應放置在 program 塊中,如下所示

program name_of_program
  ! <variable declarations> ...
  ! <program statements> ...
end program

縮排不是必需的,但建議使用。程式名稱必須以字母開頭,其他部分可以包含字母、數字和下劃線 (下劃線) 字元。每個語句以行尾結束。

自由格式和固定格式

[編輯 | 編輯原始碼]

Fortran 77 語法要求在任何命令之前留出 6 個空格。這 6 個空格源自 Fortran 的穿孔卡片版本。在最初的 6 個空格之後,您可以根據需要放置額外的空格進行縮排。

但是,總的來說,行寬限制為 72 個字元(包括最初的 6 個空格)。如果您需要額外的空格,可以在第 6 列放置任何字元(某些編譯器除外,0 除外);這稱為“續行符”。對於穿孔卡片,這意味著您可以將該行繼續到第二張卡片上。

C2345678...
      PRINT *,"This is a really....
     *...long line.

在某些編譯器中,您可以透過指定“自由格式”而不是“固定格式”模式來關閉 6 個空格規則,並關閉固定長度行。如果您使用 GNU Fortran 編譯器 (gfortran),則在編譯時可以使用 -ffree-form 命令列選項來實現相同目的。

在行中包含感嘆號 ! 將使該行剩下的部分成為註釋,如下所示

 a = b ! this is a comment
 c = d ! this!! is also a comment

在固定格式模式下,您還可以透過在第一列放置 *c 來將整行標記為註釋。

請參閱變數

變數有許多不同的型別和選項,但現在我們將堅持基本內容。

real       :: a  ! Decimal number.
integer    :: b  ! Whole number.
character  :: c  ! Single character.

建議在變數宣告之前使用 implicit none 語句,以透過強制顯式宣告每個程式變數來避免型別錯誤。

數學運算子

[編輯 | 編輯原始碼]

請參閱數學

  • 加、減、乘、除
  +
  -
  *
  /
  • 賦值
  =
  • 乘方(2**4 等於 2 的 4 次方 = 16)
  **

數學運算子具有特定的優先順序順序

** [乘方] 總是優先順序最高,它是從右到左結合。即 2**3**2 = 512,而不是 64

接下來是 * [乘法] 和 / [除法],它們是從左到右結合,即 1.0/1.0/2.0*6.0 = ((1.0/1.0)/2.0)*6.0 = 3.0,而不是 12.0。

接下來是 + [加法] 和 - [減法],它們也是從左到右結合,所以 x-y+z = (x-y)+z = x+(-y)+z。

最後是 = [賦值]。

內在函式

[編輯 | 編輯原始碼]

Fortran 具有廣泛的函式,這些函式在數值工作中很有用,例如 sinexplog。函式的引數必須具有正確的型別,並且應括在括號中

x = sin(3.14159) ! Sets x equal to sin(pi), which is zero.

Fortran 的內在數學函式是 elemental,這意味著它們可以將陣列和標量作為引數,並返回與形狀相同的標量或陣列

real :: x(2), pi=3.14159
x = sin([pi, pi/2])

上面的程式片段將陣列 x 的兩個元素 x(1)x(2) 分別設定為 sin(pi)sin(pi/2)

比較和邏輯運算子

[編輯 | 編輯原始碼]

if 語句和其他一些地方,您可以將關係運算符 =、<、>、≤、≥ 和 ≠ 分別編碼為 .eq..lt..gt..le..de..ne.。另一種寫這些運算子的方法是:==、<、>、<=、>= 和 /=。

您還可以使用邏輯運算子 .and..or..not.,以及邏輯常量 .true..false.。在組合這些專案時,不要重複使用點。例如,a .and. .not. ba.and.not.b 相同,但不同於 a.and..not.b

WRITE 語句

[編輯 | 編輯原始碼]

請參閱輸入和輸出

write (*,*) "Hello World", variablename, "More text", anothervariable

(*,*) 表示使用預設輸出,並使用預設選項,通常列印到螢幕。引號內的內容將按程式碼中的原樣列印,變數的值將被列印。物件必須用逗號隔開,預設情況下,write 語句會自動結束該行。

完整的正式語法是

write (unit=unit_num, FMT=fmt_label, err=label) "Hello World", variablename, "More text", anothervariable

請注意,某些版本的 Fortran 不允許使用雙引號,而是需要使用單引號。封閉的單引號可以用兩個單引號表示。例如,'don''t'

WRITEREAD 的第一個括號內的引數是單元號。單元號以作業系統確定的方式與輸入或輸出流相關聯。在非常舊的系統中,單元號是裝置地址。在 IBM JCL 系統中,單元號與檔案之間的關聯是透過 JCL DD 語句完成的。在其他版本中,存在一些將檔案和單元號關聯起來的語句。UNIT= 標籤可以省略。如果使用星號作為單元號,則所涉及的 I/O 是標準輸入通道或標準輸出通道。

WRITEREAD 的第二個括號內的引數是記錄號。請注意,如果存在,此引數與單元號之間用單引號隔開。如果存在,此變數定義要從中讀取或寫入的記錄號。例如,

record_number = 5
write (2, record_number) x, y, z

將 x、y 和 z 以壓縮的機器特定格式寫入記錄號 5。當然,請注意,此用法要求您的 OS 或 Fortran 編譯器知道構成記錄的因素。在位元組組織的檔案中,上面的程式碼將從檔案位元組號 5 開始寫入 x、y 和 z。

WRITEREAD 的第三個括號引數是格式編號。如果這個第三個引數像上面一樣用星號表示,那麼格式就是預設的。如果您想使用 FORMAT 語句來格式化輸入或輸出,則包括 FORMAT 語句的語句編號。例如

write (7,1) 'Hello, world!', i, 'More text', x
1 format (A,I,A,F)

請注意,format 語句不能作為內聯語句執行。它僅在 readwrite 引用時使用。fmt= 標籤可以省略。整個引數也可以省略。但是,如果您省略格式引數,則 I/O 將以非格式化的方式執行,使用特定於機器的打包資料。

writeread 的最後一個括號引數是錯誤處理語句標籤。例如,如果

write (5,err=2) x, y, z

被編碼,這意味著輸出將被非格式化到單元 5。如果發生錯誤,執行將繼續在語句 2(在它前面帶有語句標籤 2 的語句)處繼續。如果發生錯誤,並且沒有 ERR= 引數,那麼程式會異常終止。因此,ERR= 是其他語言中 catch 的最接近的等效項。雖然最後一個引數可以完全省略,但一旦使用,ERR= 就不能從引數中省略。

示例程式碼

[編輯 | 編輯原始碼]

參見 Fortran 中更多示例

program nearlyuseless
    implicit none

    real    :: temperature
    integer :: cows

    temperature = 98.6
    cows        = 9
    print *, "There are ", cows, " cows outside."
    print *, "You are probably ", temperature, " right now"
end program

Fortran 的某些版本,或在某些設定中,使用格式字元。當使用格式字元時,行的第一個字元決定如何列印該行。1 表示新頁面。0 表示在行之前進行 2 次換行(雙倍行距)。- 表示在行之前進行 3 次換行(三倍行距)。+ 表示在行之前不進行換行(覆蓋列印)。而空格表示在行之前進行一次換行(正常列印)。

以下是相同程式的古老形式,帶有此形式控制字元

temperature = 98.6
i_cows = 6
write (*,*) ' There are ', i_cows, ' cows outside.'
write (*,*) ' You are probably ', temperature, ' right now.'
end


華夏公益教科書