跳轉到內容

Fortran/基礎

75% developed
來自華夏公益教科書,開放的書籍,為開放的世界
(從 Fortran/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 有許多在數值工作中很有用的函式,例如 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. b 等價於 a.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。當然,請注意,這種用法要求您的作業系統或 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= 在使用後不能從引數中省略。

示例程式碼

[edit | edit source]

參見 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


華夏公益教科書