Fortran簡明自學手冊
Fortran簡明自學手冊
因為CSDN不支援對Fortran程式碼的高亮顯示,這兒貼出
學習手冊PDF版百度網盤的下載連結:
https://pan.baidu.com/s/1A_6N0TQERg2nrnxkh3UnGQ
Fortran即Formula Translation(公式翻譯)。是世界上誕生最早的高階語言之一,其易讀,好寫,很適合科學計算,一誕生便很快統治了數值計算界。因此也不難理解為何Fortran中保留了一些特殊的基礎型別,如虛數。過去學習Fortran也是一種風尚。很多科學界的前輩,往往就是從這門語言開始了對程式設計的學習。
如其字面意,本手冊是一本簡明扼要學習Fortran基礎知識的手冊。
本手冊所有Fortran程式碼均基於Fortran95版。
本手冊適合兩類人群:1.有其他程式語言基礎,對Fortran感興趣的人。2.有Fortran基礎,想要鞏固的人。
話不多說,下面開始。
文章目錄
第一章,開始
註釋
Fortran使用!表示單行註釋,其沒有多行註釋。
合理的書寫註釋是優秀的程式設計師的好習慣。
Hello World
學習程式設計從HelloWorld的心態做起。
program HelloWorld !這是一個Fortran的HelloWorld的程式。 print *, 'Hello World' end program HelloWorld
所有程式為了更好的流程控制和閱讀,必有語句結束符,表述一個語句的結束;必有區塊識別符號,表示一個區塊的位置。
語言 | 語句結束符 | 區塊識別符號 |
---|---|---|
C語言體系 | ; | {} |
Python | 一行書寫且只書寫一個語句 | 縮排來標識區塊 |
Fotran | 一行只書寫一個語句 | KeyWord (內容) End Keyword |
三者各自輸出1,10到螢幕上的程式碼如下。
C語言版。
int main()
{
int i;
for(i = 1; i <= 10; i ++)
{
printf("%d ", i);
}
return 0;
}
Python版。
Fotran版。
program Print1to10
integer i
do i=1,10
print *,i
end do
end program Print1to10
本程式碼中包括的兩個區塊,外層program…end program,內層do…end do。
請記住在Fortran中表示一個區塊時。凡開始必有結束。將do…end do一起書寫,再補全其中的內容是個好習慣。
幫助網址
前人栽樹後人乘涼。你可能會需要這些幫助網址。
Fcode:編譯器下載,一些Fortran原始碼,專門討論Fortran的網址。
易百教程|Fortran學習:詳細的分條目的Fortran手冊。
請善用搜索引擎。
第二章,變數
宣告規則
變數宣告的如下:
Kind(佔用位元組長) 變數名1,變數名2…
或者是
Kind*佔用位元組長 變數名1 ,變數名2…
例如
integer(4) i,j
!聲明瞭一個長度為4個位元組的整數i,j
real*8 income,outcome
character*13 name
!聲明瞭一個可以儲存十三個位元組字元資訊的字串name
新增::表示允許後續變數在宣告時同時初始化,當然也可不初始化。
形如:
Kind(佔用位元組長) :: 變數名1=初值,變數名2,變數…
logical::istrue=.false.
!聲明瞭一個布林型變數istrue,初始值為.false.
complex::a=(1,1.5),b=(3,3.5),ab
!聲明瞭複數a,b和ab,a,b賦予了初始值。
變數型別
(主要,次要型別是我為了便於大家理解而總結的,並非官方承認的)
主要型別 | 符號 | 備註 |
---|---|---|
整數 | integer(不能縮寫為int) | integer不給位元組長時預設長為4。可接受的長度為1,2,4,8。 |
實數 | real | real不給位元組長時預設長為4。可接受的長度為4,8。 也可用,double precision替代real*8。 |
字串 | character | 可接受長度為所有自然數。若長度為0則始終為空串。其必須使用” “或‘ ’將內容包起來。如”中國“。ASCII碼佔用一個位元組,中文佔用兩到三個位元組。 |
次要型別 | 符號 | 備註 |
---|---|---|
邏輯(布林型別) | logical | 可接受長度為1,2,4,8。不建議給定給長度。 接受的取值只有.true.和.false.。注意不要拼錯單詞,兩邊點號不可省略。 |
複數 | complex | 兩個real實數的有序對。a+bi書寫成(a,b)。可接受的長度為4,8。 |
常數
常數書寫與其他程式無異。
需要注意:
-
表示進位制
±r#數字(r表示進位制,36≥r≥2)
例如下面的程式碼是合法的:
print*,2#11110000 print*,7#345543
-
科學計數法
±n.mE±S (其中n.m表示任意實數或整數,S為整數,資料精度為real*4)
例如下面的程式碼是合法的:
也可以將E替換成D表示real*8的科學記數法。(其他語言沒有D的表示方法!)
注意1.d0就等於1.0。
宣告位置
Fortran的變數宣告都只能在程式最開始進行。
例如這樣的程式碼是錯誤的:
program GetSforCircle
print*,"請輸入圓的半徑"
integer r
read*,r !從外部讀取一個數字到r
real s
s=3.14*r*r
print*,s !輸出s
end program GetSforCircle
應該將之改成如下形式:
program GetSforCircle
!變數定義
integer r
real s
!程式主體
print*,"請輸入圓的半徑"
read*,r !從外部讀取一個數字到r
s=3.14*r*r
print*,s !輸出s
end program GetSforCircle
所以我建議將Fortran的程式分為變數定義和程式主體兩個部分,用註釋分開。
命名風格
Fortran不區分大小寫。如real和REAL是等效的。
你需要保證你的變數命名有意義。例如day,month,year就比a,b,c要好的多。
-
關鍵字和內部函式建議使用小寫。如if,end,do
-
自定義長變數建議使用如下風格之一作為主要風格:
PASCAL風格:首字母大寫。如IsTrue,CityName,GetTheTime
**駝峰風格:**單詞之間以_區分。如X_Postion,City_Population
同時也建議混搭使用匈牙利命名法來作為輔助:
**匈牙利命名法:**字首變數型別以便區分變數。如IntDistance,RealDistance
-
短變數和常用變數建議時候使用小寫。如i,j,k作為迴圈變數。n,sum作為計數變數等。
隱式宣告
隱式宣告必須放在程式最開始位置。其可批量定義某些字母開頭的變數的型別。
如:
implicit real(a-f),integer(x,y,z)
!a到f之間的變數隱式宣告為real變數。x,y,z變數隱式宣告為x,y,z變數。
則之後無需宣告對應變數。a1或者all就都會被視為real型別變數。xmlKind,year,z_postion
Fortran預先定義了隱式宣告的I-N規則。即在你不新增使用者的隱式規則時,I到N開頭的被當作整數變數。其他開頭的被當作實數變數。
優先順序如下:
顯式宣告>使用者定義隱式規則>預設隱式I-N規則
複雜程式的編寫不建議使用隱式定義。可將下列語句寫在程式最開頭,去除之。為了培養良好的程式設計習慣,建議不論什麼情況下均使用此語句。
implicit none
批量賦值
用data關鍵字來給已經宣告過的變數批量賦值。
data 變數1,變數2…/初始值1,初始值2…/
如下列程式碼:
integer a,b,c
data a,b,c/1,2,3/
integer x,y,z
data x,y,z/3*5/!m*n:重複m個n
第三章,計算和運算函式
運算子
如表:
符號 | 備註 |
---|---|
±*/ | 同其他程式語言。整數間用除法結果保留到整數。 |
** | 乘方。 |
= | 賦值。 |
運算函式
函式名 | 備註 |
---|---|
mod(x,y) | 求x除以y的餘數 |
sin(),cos(),tan(),asin(),acos(),atan() | 以弧度為單位求對應數值。只接受real變數作為引數。 |
abs(),exp(),log(),log10(),sqrt() | 求絕對值,e為底的乘方,e為底的對數,10為底的對數,開方。只接受real變數作為引數。 |
max(x1,x2…),min(x1,x2…) | 求一串數中的最大值和最小值。 |
int(),real(),char(),ichar() | 型別轉換函式。char()將整數轉為ASCII碼對應字元。ichar相反。 |
sizeof() | 獲得對應變數的位元組長度。 |
上述函式,很多語言通用。保持一個基本的映像,不會使用或未列到的搜尋即可。
運算優先順序
與其他語言無異。多用括號。遇到疑惑處搜尋即可。
字串運算
即字串處理。Fortran只在字串內部區分大小寫。
符號或函式 | 備註 |
---|---|
len() | 獲得字串的長度。 |
字串1//字串2 | 連線兩個字串 |
字串切片charatername(n:m) | 如string=”我愛中華“,則name(2:4)表示”愛中華“。第一個下標從1開始。其中1≤n≤m≤len() |
請務必注意字串賦值。多餘部分將被直接丟棄。不足部分以空格補齊。如:
character*4 ch1,ch2*1,ch3 !可以用這種方法來表示長度規定中的特例。
ch1='hello'
ch2=ch1
ch3='my'
執行後,ch1=‘hell’,ch2=‘h’,ch3='my '(my後接兩個空格)
這很令人惱火。其他高階語言吸取Fortran教訓後都規避了這一點,使用了引用變數達到任意擴充string的目的。
型別轉換
Fortran無隱式轉換。例如因為sin()只可以接受real型別的變數。所以直接寫sin(1)是錯誤的。而寫sin(1.0)或者sin(1.d0)卻是正確的。
顯式轉換使用運算函式即可實現。
字元型別和數字型別之間的轉換見第四章。
第四章,輸入輸出
簡單程式=輸入輸出+計算。
輸入輸出函式
型別 | 格式 | 備註 |
---|---|---|
預設輸出 | print *,等待輸出的資訊 | 始終輸出到預設裝置—控制檯。等待輸入的資訊彼此之間以逗號分隔。*處可填寫輸出格式。不填寫則按照預設格式。 |
預設輸入 | read *,等待接受輸入的資訊 | 始終從控制檯讀取資訊。與print相反。 |
輸出 | write(*,*) 等待輸出的資訊 | 第一個*指示輸出到的位置。不填寫則預設輸出到控制檯。第二個*號指定格式。其他與print同。 |
讀入 | read(*,*) 等待接受輸入的資訊 | 第一個*指示讀取資訊的位置。不填寫則預設從控制檯讀取資訊。第二個*號指定格式。其他與read同。 |
示例:從控制檯輸入輸出
program CreatePerson
implicit none
!變數定義
character*4 name
integer year
real height
!程式主體
print*,"請為你的小人起一個名字" !輸出到預設裝置——控制檯,沒有指定輸出格式。
read*,name !執行此語時控制檯等待輸入。按下確定後繼續。從控制檯讀取一個字串到name。
print*,"請為你的",name,"確定一個年齡和身高" !等待輸出的資訊以空格分開
read*,year,height
print*,name,"小人",year,"歲了,他的身高是",height
end program CreatePerson
圖-1
預設輸出因為沒有指定格式。故而輸出結果不夠美觀。使用格符就可以避免這點。
格式符
以print*,輸出表為例。*可以被格式語句替代。
格式語句形式如下:
“(第一個變數的格式,第二個變數的格式…)”
例如:
print,"(F3.2)",1.333333
輸出結果為:1.00
各格式符說明如下:
r為重複係數,不填為1。w為字元寬度,小數點算一位。[]中的表示可選引數。
型別 | 樣式 | 說明 |
---|---|---|
整數 | rIw | |
小數 | rFw.d | d為小數部分寬d |
指數 |
我們為上述程式碼增加輸出格式。
program CreatePerson
implicit none
!變數定義
character*4 name
integer year
real height
!程式主體
print*,"請為你的小人起一個名字"
read*,name
print*,"請為你的",name,"確定一個年齡和身高"
read*,year,height
print'(a4,a2,i3,a8,f5)',name,"小人",year,"歲了,他的身高是",height
end program CreatePerson
圖-2