軟體工程師手冊/語言詞典/FORTRAN
這是 維基百科條目。以下簡要介紹 Fortran77。Fortran 77 是 Fortran 66 和 Fortran IV 的改進版本,但增加了一些理想的新特性。最值得注意的是CHARACTER型別。
Fortran 是一種完整的過程式語言。
程式的主要入口點在PROGRAM語句中。
PROGRAM XYZ
Fortran 是針對穿孔卡片設計的,因此實際的 Fortran 程式碼從第 7 個字元偏移開始。字元由 6 個字元字首。字元 1 到 5 表示標籤,字元 6 表示行繼續。
例如
12345 PROGRAM
+HLO WLD
67890 PRINT *,
+'HELLO WORLD'
99999 END
注意:在錯誤的地方插入額外的字元可能會導致意外行為。比較 wikiquote:Special:Search=C._A._R._Hoare 關於 海員號太空火箭。
在本例中,PROGRAM 和 <END> 語句是可選的。
還要注意
- 從第 76 個字元開始的字元被忽略。因此,在插入長行中的字元時要小心。(IBM FORT/VS 編譯器出於某些奇怪的原因會在這一列中插入行號)
- 空格字元被忽略,除非在引號中,最值得注意的是這兩行被解釋為相同,因此產生了與海員號墜毀相關的懷疑。
DO 19,I=1,99
DO19I=1,99
第一列中的 'C'、'*' 和有時為 'c' 字元表示註釋。例如
* This is a hello world program
12345 PROGRAM
+HLO WLD
C Output Hello World
67890 PRINT *,
+'HELLO WORLD'
c all done, I'm out of here...
99999 END
在 Fortran 中,變數的型別由變數名稱的第一個字母隱式定義。以字母 I 到 N 開頭的變數自動被認為是 整數,而 A 到 H 和 O 到 Z 被認為是 實數。
這種行為可以透過 IMPLICIT INTEGER 宣告(設定整數的字母範圍)或顯式宣告變數並給出其型別來修改。
因此,“上帝是真實的(除非宣告為整數)”。
例子
PROGRAM EG DEC
* Net line is not needed as this would be IMPLICIT INTEGER
INTEGER I,J,K
* long INTEGERs
INTEGER II*8,JJ*8,KK*8
* define some arrays
INTEGER M(2),N(3),O(4)
* Some array initialisations
INTEGER MM(2)/1,2/,NNN(3)/1,2,3/,OOOO(4)/1,2,3,4/
* Some REAL initialisations
REAL R/1.0/,S/2.0/,T/3.0/
* Some DOUBLE PRECISION (long) initialisations
REAL*8 RR/1.0D/
DOUBLE PRECISION SS/2.0D/
END
Fortran 有幾種型別的FUNCTIONS/SUBROUTINES。例子
PROGRAM P
PRINT *,'The cube of 2 is',CUBE(2.0)
PRINT *,'The square of 2 is',SQUARE(2.0)
END
FUNCTION CUBE(X)
* FILSQ is an inline Function returning the square of a value
FILSQ(X)=X*X
CUBE=FILSQ(X)*X
RETURN
ENTRY SQUARE(X)
CUBE=FILSQ(X)
END
產生
The cube of 2 is 8.
The square of 2 is 4.
請注意,在輸出中,第一個字元通常是空格字元。透過在第一列中插入其他字元,您可以強制印表機進行換頁,並執行其他有趣的行為。
變數的作用域嚴格限制在當前的 PROGRAM/SUBROUTINE 或 DATA BLOCK 中。DATA BLOCK 可以由 PROGRAM/SUBROUTINE 共享,允許程式設計師擴充套件變數的作用域。
<用文字描述條件語句並展示。>
* A one liner
IF(1 .EQ. 2)PRINT *,'Dreaming'
* A block structured
IF(1 .EQ. 1)THEN
PRINT *,'A distinct possibility'
ELIF(2 .EQ. 2)THEN
PRINT *,'Too late'
ELSE
PRINT *,'Way too late'
ENDIF
*
條件語句還包括 GOTO 語句。
I=3
GOTO(111,112,113,114)I
PRINT *,'I was not found'
GOTO 119
111 CONTINUE
print *,'I was 1'
GOTO 119
112 CONTINUE
print *,'I was 2'
GOTO 119
113 CONTINUE
print *,'I was 3'
GOTO 119
114 CONTINUE
print *,'I was 4'
GOTO 119
119 CONTINUE
FORTRAN 也有一個三路條件。
I=1
IF(I)121,122,123
121 CONTINUE
print *,'I is less then zero'
GOTO 129
122 CONTINUE
print *,'I is zero'
GOTO 129
123 CONTINUE
print *,'I is greater then zero'
GOTO 129
129 CONTINUE
FORTRAN 77 > DO / WHILE 迴圈
A = 1
DO WHILE (A .LT. 10)
PRINT *, 'COUNTING: ', A
A = A + 1
END DO
在較舊的 FORTRANS 中,標籤和 GOTO 將用於實現相同的效果。例如
INTEGER A
IF(.NOT.(A .LT. 10))GO TO 139
PRINT *,'COUNTING: ',A
A = A + 1
* A convention is to terminate the label number with a 9
* in cases where the GOTO breaks out of a loop.
139 CONTINUE
第一個 hello world 示例
PRINT *,'Hello World'
或者
WRITE (*,*)'Hello World'
或者(標準輸出通道為 6)
WRITE (6,*)'Hello World'
或者
WRITE (6,'( A)')'Hello World'
或者
WRITE (UNIT=6,FMT='( A)')'Hello World'
或者
WRITE (UNIT=6,FMT=141)'Hello World'
141 FORMAT(A)
Fortran 包括 OPEN、CLOSE、READ、WRITE 和 PRINT 語句。READ 和 WRITE 命令可以透過記錄號訪問檔案中記錄的資訊,因此 Fortran 包含了隨機檔案訪問的雛形。不幸的是,在檔案 IO 上,“字”的大小是實現相關的,在 CDC 上為 6 位,在 IBM 上為 8 位,在 VAXVMS 上為 32 位。
FORTRAN 77 沒有結構或類定義。最接近的例子是 COMMON 語句。
CHARACTER NAME*16, ADDRESS*64
FLOAT BALANCE*4
COMMOM /CSTREC/NAME,ADDRESS,BALANCE
EQUIVALENCE 語句允許這種 COMMON 塊語句被重疊,並允許直接賦值。但這很成問題。
CHARACTER ALLREC*(16+64+4)
EQUIVALENCE(ALLREC,CUSREC)
EQUIVALENCE 還具有與 Algol68(然後是 C)語言 union 語句類似的效果。其最終效果是兩個變數 ALLREC、CUSREC 共享記憶體中的同一位置。
僅當語言支援 FORTRAN 的子程式呼叫約定(並非所有 FORTRAN 都使用堆疊!)時,才能訪問其他語言。 而且實際約定因機器而異。
垃圾回收不是語言的一部分,而是使用資料塊單獨實現的。 在 Fortran 中,程式啟動時的記憶體是程式在終止之前可用的全部記憶體。(例外情況是,如果編譯器支援帶有區域性變數的遞迴,但並非總是如此。)
Fortran 的 `external` 作用域規則類似於 C 程式語言中的作用域。 但是 Fortran 77 沒有標準的 `INCLUDE` 語句。
- DATABLOCK EXTNM1
- EXTERNAL EXTNM2
- PROGRAM EXTNM3
- FUNCTION EXTNM3
- ENTRY EXTNM4
- SUBROUTINE EXTNM5
- DATA BLOCK
- COMMON EXTNM6
- 陣列從 1 開始索引。
<列出可能會有幫助的其他書籍和文章。 請包括參考資料適合的讀者級別。(初學者/中級/高階)>