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。當然,請注意,這種用法要求您的作業系統或 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= 在使用後不能從引數中省略。
示例程式碼
[edit | edit source]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