1. 程式人生 > >Fortran簡明自學手冊

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。

常數

常數書寫與其他程式無異。

需要注意:

  1. 表示進位制

    ±r#數字(r表示進位制,36≥r≥2)

    例如下面的程式碼是合法的:

    print*,2#11110000
    print*,7#345543
    
  2. 科學計數法

    ±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要好的多。

  1. 關鍵字和內部函式建議使用小寫。如if,end,do

  2. 自定義長變數建議使用如下風格之一作為主要風格:

    PASCAL風格:首字母大寫。如IsTrue,CityName,GetTheTime

    **駝峰風格:**單詞之間以_區分。如X_Postion,City_Population

    同時也建議混搭使用匈牙利命名法來作為輔助:

    **匈牙利命名法:**字首變數型別以便區分變數。如IntDistance,RealDistance

  3. 短變數和常用變數建議時候使用小寫。如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 

		1540617735116

圖-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 

1540618445525

​ 圖-2