Fortran/基礎
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 具有廣泛的函式,這些函式在數值工作中很有用,例如 sin、exp 和 log。函式的引數必須具有正確的型別,並且應括在括號中
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. b 與 a.and.not.b 相同,但不同於 a.and..not.b。
請參閱輸入和輸出
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'。
WRITE 或 READ 的第一個括號內的引數是單元號。單元號以作業系統確定的方式與輸入或輸出流相關聯。在非常舊的系統中,單元號是裝置地址。在 IBM JCL 系統中,單元號與檔案之間的關聯是透過 JCL DD 語句完成的。在其他版本中,存在一些將檔案和單元號關聯起來的語句。UNIT= 標籤可以省略。如果使用星號作為單元號,則所涉及的 I/O 是標準輸入通道或標準輸出通道。
WRITE 或 READ 的第二個括號內的引數是記錄號。請注意,如果存在,此引數與單元號之間用單引號隔開。如果存在,此變數定義要從中讀取或寫入的記錄號。例如,
record_number = 5
write (2, record_number) x, y, z
將 x、y 和 z 以壓縮的機器特定格式寫入記錄號 5。當然,請注意,此用法要求您的 OS 或 Fortran 編譯器知道構成記錄的因素。在位元組組織的檔案中,上面的程式碼將從檔案位元組號 5 開始寫入 x、y 和 z。
WRITE 或 READ 的第三個括號引數是格式編號。如果這個第三個引數像上面一樣用星號表示,那麼格式就是預設的。如果您想使用 FORMAT 語句來格式化輸入或輸出,則包括 FORMAT 語句的語句編號。例如
write (7,1) 'Hello, world!', i, 'More text', x
1 format (A,I,A,F)
請注意,format 語句不能作為內聯語句執行。它僅在 read 或 write 引用時使用。fmt= 標籤可以省略。整個引數也可以省略。但是,如果您省略格式引數,則 I/O 將以非格式化的方式執行,使用特定於機器的打包資料。
write 或 read 的最後一個括號引數是錯誤處理語句標籤。例如,如果
write (5,err=2) x, y, z
被編碼,這意味著輸出將被非格式化到單元 5。如果發生錯誤,執行將繼續在語句 2(在它前面帶有語句標籤 2 的語句)處繼續。如果發生錯誤,並且沒有 ERR= 引數,那麼程式會異常終止。因此,ERR= 是其他語言中 catch 的最接近的等效項。雖然最後一個引數可以完全省略,但一旦使用,ERR= 就不能從引數中省略。
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