一、說明
本文多數(shù)內(nèi)容是我讀彭國倫《Fortran 95 程序設(shè)計(jì)》的筆記。只讀到第九章,主要是3~9
章,都是最基本的用法(原書共16章)。這里主要摘錄了我看書過程中總結(jié)的一些Fortran和C不
同的地方,主要是語法方面。希望這份筆記能夠給學(xué)過C但沒有接觸過Fortran的同學(xué)帶去一些幫
助。要想得更清楚些,推薦看一下原書,覺得作者真的寫得很好,很清楚;如果有C語言的基礎(chǔ),
看完前九應(yīng)該很快的,花一兩天就行了。覺得如果耐心看完本文,基本功能應(yīng)該也可以順利用起
來了。外,由于我之前沒有用過Fortran,這次為了趕文檔看書又看得很粗淺,大多數(shù)東西看過
之后都沒得及仔細(xì)想,只是按著作者的意思去理解。所以這份筆記還處于紙上談兵的層次。如果
有不妥的方,希望大家指正。謝謝!
文中藍(lán)色的部分是程序代碼,!后面的內(nèi)容為注釋。
二、概述
1、名詞解釋
Fortran=Formula Translator/Translation
一看就知道有什么特色了:可以把接近數(shù)學(xué)語言的文本翻譯成機(jī)械語言。的確,從一開始
,IBM設(shè)計(jì)的時(shí)候就是為了方便數(shù)值計(jì)算和科學(xué)數(shù)據(jù)處理。設(shè)計(jì)強(qiáng)大的數(shù)組操作就是為了實(shí)現(xiàn)這一
目標(biāo)。ortran奠定了高級(jí)語言發(fā)展的基礎(chǔ)?,F(xiàn)在Fortran在科研和機(jī)械方面應(yīng)用很廣。
2、Fortran的主要版本及差別
按其發(fā)展歷史,F(xiàn)ortran編譯器的版本其實(shí)很多。現(xiàn)在在廣泛使用的是Fortran 77和Fortr
an90。ortran 90在Fortran 77基礎(chǔ)上添加了不少使用的功能,并且改良了77編程的版面格式,
所以編程時(shí)推薦使用90。鑒于很多現(xiàn)成的程序只有77版本,有必要知道77的一些基本常識(shí),至少保
證能夠看77程序。以下是77和90的一些格式上的區(qū)別。
Fortran 77: 固定格式(fixed format),程序代碼擴(kuò)展名:.f或.for
(1)若某行以C,c或*開頭,則該行被當(dāng)成注釋;
(2)每行前六個(gè)字符不能寫程序代碼,可空著,或者1~5字符以數(shù)字表明行代碼(用作格
式化輸入出等);7~72為程序代碼編寫區(qū);73往后被忽略;
(3)太長的話可以續(xù)行,所續(xù)行的第六個(gè)字符必須是"0"以外的任何字符。
Fortran 90:自由格式(free format), 擴(kuò)展名:.f90
(1)以"!"引導(dǎo)注釋;
(2)每行可132字符,行代碼放在每行最前面;
(3)以&續(xù)行,放在該行末或下行初。
以下都是討論Fortran 90。
3、Fortran的一些特點(diǎn),和C的一些不同
其實(shí)很多,在下面涉及具體方面時(shí)可以看到。這里只是大致提一些。
(1)不分大小寫
(2)每句末尾不必要寫分號(hào)
(3)程序代碼命令間的空格沒有意義
(4)不像C,F(xiàn)ortran不使用{ }
(5)數(shù)據(jù)類型多出了復(fù)數(shù)和邏輯判斷類型。比如復(fù)數(shù)類型
complex :: a !聲明復(fù)數(shù)的方法。復(fù)數(shù)顯然方便了科學(xué)計(jì)算,滿足了工程方面需求
a=(1.0,2.0) ! a=1+i
(6)多出了乘冪運(yùn)算(**)。乘冪除了整數(shù)還可以是實(shí)數(shù)形式。如開方,開立方
a=4.0**0.5,a=8.0**(1.0/3.0)。
(7)數(shù)組有一些整體操作的功能;可以方便的對部分元素進(jìn)行操作
(8)有些情況下可以聲明大小待定的數(shù)組,很實(shí)用的功能
4、Fortran的基本程序結(jié)構(gòu)
先看一看所謂的"Hello Fortran"程序。
program main !程序開始,main是program的名字,完全自定義
write(*,*) "Hello" !主程序
stop !終止程序
end [program[main]] !end用于封裝代碼,表示代碼編寫完畢。[ ]中的內(nèi)容可省略,下同。
再看一段實(shí)用一些的程序,好有點(diǎn)感性認(rèn)識(shí)。程序用于計(jì)算圓柱的表面積,要求輸入底面
半徑和。其中展示了Fortran的一些特色用法。程序摘自維基。其實(shí)是一個(gè)叫www.answers.com
的網(wǎng)上引的維基的網(wǎng)頁。推薦去看看!能查到不少有意思的東西。
program cylinder !給主函數(shù)起個(gè)名字
! Calculate the area of a cylinder.
! Declare variables and constants.
! constants=pi
! variables=radius squared and height
implicit none ! Require all variables to be explicitly declared
!這個(gè)一般都是要寫上的。下面會(huì)進(jìn)一步說明。
integer :: ierr
character :: yn
real :: radius, height, area
real, parameter :: pi = 3.1415926536 !這是常量的聲明方法
interactive_loop: do !do循環(huán),F(xiàn)ortran中的循環(huán)可以加標(biāo)簽,如d前面的
!interactive_loop就是標(biāo)簽
! Prompt the user for radius and height
! and read them.
write (*,*) 'Enter radius and height.' !屏幕輸出
read (*,*,iostat=ierr) radius,height !鍵盤輸入。isotat的值用判斷輸入成功否。
! If radius and height could not be read from input,
! then cycle through the loop.
if (ierr /= 0) then
write(*,*) 'Error, invalid input.'
cycle interactive_loop !cycle 相當(dāng)于C里的continue
end if
! Compute area. The ** means "raise to a power."
area = 2 * pi * (radius**2 + radius*height) ! 指數(shù)運(yùn)算比C方便
! Write the input variables (radius, height)
! and output (area) to the screen.
write (*,'(1x,a7,f6.2,5x,a7,f6.2,5x,a5,f6.2)') &
!"&"表示續(xù)行。這里還顯示了格式化輸出
'radius=',radius,'height=',height,'area=',area
yn = ' '
yn_loop: do !內(nèi)嵌的另一個(gè)do循環(huán)
write(*,*) 'Perform another calculation? y[n]'
read(*,'(a1)') yn
if (yn=='y' .or. yn=='Y') exit yn_loop
if (yn=='n' .or. yn=='N' .or. yn==' ') exit interactive_loop
end do yn_loop !結(jié)束內(nèi)嵌do循環(huán)
end do interactive_loop
end program cylinder
Fortran程序的主要結(jié)構(gòu)就是這樣了。一般還會(huì)有些module的部分在主函數(shù)前,函數(shù)在主函
數(shù)后。
三、數(shù)據(jù)類型及基本輸入輸出
1、數(shù)據(jù)類型,聲明及賦初值
(1)integer: 短整型kind=2, 長整型kind=4
integer([kind=]2) :: a=3
如果聲明成integer:: a,則默認(rèn)為長整型。
!"::" 在聲明并同時(shí)賦初值時(shí)必須要寫上;類型名后面有形容詞時(shí)也必須保留::;其他情況可略去
!所謂形容詞,可以看一下這個(gè)。比如聲明常數(shù)
real,parameter :: pi=3.1415926 。parameter就是形容詞。
(2)real:單精度kind=4(默認(rèn)),雙精度kind=8
real([kind=]8) :: a=3.0
還有指數(shù)的形式,如1E10為單精度,1D10為雙精度
(3)complex 單精度和雙精度
complex([kind=]4) b
(4)character
character([len=]10) c !len為最大長度
(5)logical
logical*2 :: d=.ture. (等價(jià)于logical(2)::d=.ture.)
(6)自定義類型type:類似于C中的struct
Fortran 77中給變量賦初值常用DATA命令,可同時(shí)給多個(gè)變量賦初值
data a,b,string /1, 2.0, 'fortran'/
與C不同的是,F(xiàn)ortran中變量不聲明也能使用,即有默認(rèn)類型(跟implicit命令有關(guān))。按
照默認(rèn)的定,以i,j,k,l,m,n開頭的變量被定義為integer,其余為real。取消該設(shè)置需在程序聲明
部分之前implicit none。彭國倫建議一般都使用該語句。
另一點(diǎn)關(guān)于聲明的不同是Fortran有"等價(jià)聲明":
integer a,b
equivalence(a,b)
使得a,b使用同一塊內(nèi)存。這樣可以節(jié)省內(nèi)存;有時(shí)可精簡代碼。如:equivalence(很長名
字的變量如三維數(shù)組的某個(gè)元素,a),之后使用a來編寫程序就簡潔多了。
2、基本輸入輸出
輸入:read(*,*) a !從鍵盤讀入
輸出:write(*,*) "text" !在屏幕上輸出。Fortran 77用' text'。Fortan 90中一般" "和' '都可
print *,"text" !只能用于屏幕輸出
(*,*)完整寫為(unit=*,fmt=*)。其中unit為輸入/輸出位置,如屏幕,文件等;fmt為
格式。如這兩項(xiàng)都寫成*,則按默認(rèn)的方式進(jìn)行,即上面描述的。print后面的*表示按默認(rèn)格式輸
出。
四、流程控制
1、運(yùn)算符
(1)邏輯運(yùn)算符
== /= > >= < <= !Fortran 90用法
.EQ. .NE. .GT. .GE. .LT. .LE. !Fortran 77用法
(2)涉及相互關(guān)系的集合運(yùn)算符
.AND. .OR. .NOT. .EQV. .NEQV.
! 僅.NOT.連接一個(gè)表達(dá)式,其余左右兩邊都要有表達(dá)式(可以是logical類型的變量)
!.EQV.:當(dāng)兩邊邏輯運(yùn)算值相同時(shí)為真, .NEQV.:當(dāng)兩邊邏輯運(yùn)算值不同時(shí)為真
2、IF
(1) 基本 :
if(邏輯判斷式) then
……
end if
如果then后面只有一句,可寫為
if(邏輯判斷式) …… !then和end if可省略
(2) 多重判斷:
if(條件1) then
……
else if(條件2)then
……
else if (條件3)then
……
else
……
end if
(3) 嵌套:
if(邏輯判斷式) then
if(邏輯判斷式) then
if(邏輯判斷式) then
else if(邏輯判斷式) then
……
else
……
end if
end if
end if
(4) 算術(shù)判斷:
program example
implicit none
real c
write (*,*) "input a number"
read (*,*) c
if(c) 10,20,30 !10,20和30為行代碼,根據(jù)c小于/等于/大于0,執(zhí)行10/20/30行的程
10 write (*,*) "A"
goto 40 !goto可實(shí)現(xiàn)跳到任意前面或后面的行代碼處,但用多了破壞程序結(jié)
20 write (*,*) "B"
goto 40
30 write (*,*) "C"
goto 40
40 stop
end
3、SELECT CASE
類似于C的switch語句
select case(變量)
case(數(shù)值1) ! 比如case(1:5)代表1<=變量<=5會(huì)執(zhí)行該模塊
…… !case(1,3,5)代表變量等于1或3或5會(huì)執(zhí)行該模塊
case(數(shù)值2) !括號(hào)中數(shù)值只能是integer,character或logical型常量,不能real型
…
case default
……
end case
4、PAUSE, CONTINUE
pause暫停程序執(zhí)行,按enter可繼續(xù)執(zhí)行
continue貌似沒什么用處,可用作封裝程序的標(biāo)志
五、循環(huán)
1、DO
do counter=初值, 終值, 增/減量 !counter的值從初值到終值按增/減量變,
…… !counter每取一個(gè)值對應(yīng)著一次循環(huán)。增/減量不寫則認(rèn)為1
……
…… !循環(huán)主體也沒有必要用{}
……
end do
Fortran 77中不是用end do來終止,而是下面這樣子:
do 循環(huán)最后一行的行代碼 counter=初值, 終值, 增/減量
……
行代碼 …… !這是do的最后一行
2、DO WHILE
do while(邏輯運(yùn)算)
……
……
end do
類似于C中的while(邏輯運(yùn)算) {……}。
一開始那個(gè)計(jì)算圓柱表面積的程序中,應(yīng)該也算是這一類。不過它是通過內(nèi)部的if語句來
控制循??磥硪彩强梢缘?,不過在這本書上沒看到這樣寫。其實(shí)應(yīng)該也可以歸于下面這種。
3、沒看到和C里面的do{……}while(邏輯運(yùn)算); 相對應(yīng)的循環(huán)語句,不過可以這樣,保證
至少做一循環(huán):
do while(.ture.)
……
……
if(邏輯運(yùn)算) exit !exit就好比C里面的break。C里的continue在Fortran里是cycle
end do
4、Fortran的一個(gè)特色:帶署名的循環(huán)
可以這樣,不易出錯(cuò):
outer: do i=1,3
inner: do j=1,3
……
end do inner
end do outer
還可以這樣,很方便:
loop 1: do i=1,3
loop2: do j=1,3
if(i==3) exit loop1 !exit終止整個(gè)循環(huán)loop1
if(j==2) cycle loop2 !cycle跳出loop2的本次循環(huán),進(jìn)行l(wèi)oop2的下次循環(huán)
write(*,*) i,j
end do loop2
end do loop1
還有一些循環(huán)主要用于Fortran中的數(shù)組運(yùn)算,為Fortran特有,很實(shí)用。
六、數(shù)組
1、數(shù)組的聲明
和C不同的是,F(xiàn)ortran中的數(shù)組元素的索引值寫在()內(nèi),且高維的也只用一個(gè)(),如
integer a(5) !聲明一個(gè)整型一維數(shù)組
real :: b(3,6) !聲明一個(gè)實(shí)型二維數(shù)組
類型可以是integer, real, character, logical或type。最高可以到7維。
數(shù)組大小必須為常數(shù)。但是和C語言不同,F(xiàn)ortran也有辦法使用大小可變的數(shù)組,方法如:
integer, allocatable :: a(:)
!聲明小可變經(jīng)過某個(gè)途徑得知所需數(shù)組大小size之后,用下面的語句:
allocate(a(size)) !配置內(nèi)存空間
之后該數(shù)組和通過一般方法聲明的數(shù)組完全相同。
與C不同,F(xiàn)ortran索引值默認(rèn)為從1開始,而且可以在聲明時(shí)改變該規(guī)則:
integer a(-3:1) ! 索引值為-3,-2,-1,0,1
integer b(2:3,-1:3) !b(2~3,-1~3)為可使用的元素
2、數(shù)組在內(nèi)存中的存放
和C不同,F(xiàn)ortran中的數(shù)組比如a(2,2)在內(nèi)存中存放順序?yàn)閍(1,1),a(2,1),a(1,2),a(2,2
)。原則是放低維的元素,再放高維的元素。此規(guī)則稱為column major。
3、賦初值
(1)最普通的做法:
integer a(5)
data a /1,2,3,4,5/
或integer :: a(5)=(/1,2,3,4,5/)
若integer :: a(5)=5,則5個(gè)元素均為5
對于integer :: a(2,2)=(/1,2,3,4/)
根據(jù)數(shù)組元素在內(nèi)存中存放的方式,等價(jià)于賦值a(1,1)=1,a(2,1)=2,a(1,2)=3,a(2,2)=4
(2)利用Fortran的特色:隱含式循環(huán)??蠢泳兔靼琢恕?br>integer a(5)
integer i
data (a(i),i=2,4)/2,3,4/ !(a(i),i=2,4)表示i從2到4循環(huán),增量為默認(rèn)值1
還可以這樣:
integer i
integer :: a(5)=(/1,(2,i=2,4),5/) !五個(gè)元素分別賦值為1,2,2,2,5
integer :: b(5)=(/i, i=1,5/) !五個(gè)元素分別賦值為1,2,3,4,
還可以嵌套
data ((a(i,j),i=1,2),j=1,2)=/1,2,3,4/ !a(1,1)=1,1(2,1)=2,a(1,2)=3,a(2,2)=4
4、操作整個(gè)數(shù)組
設(shè)a,b為相同類型、維數(shù)和大小的數(shù)組
a=5 !所有元素賦值為5
a=(/1,2,3/) !這里假設(shè)a為一維,a(1)=1,a(2)=2,a(3)=3
a=b !對應(yīng)元素賦值,要求a,b,c維數(shù)和大小相同,下同
a=b+c
a=b-c
a=b*c
a=b/c
a=sin(b) !內(nèi)部函數(shù)都可以這樣用
5、操作部分?jǐn)?shù)組元素
a為一維數(shù)組
a(3:5)=(/3,4,5/) !a(3)=3,a(4)=4,a(5)=5
a(1:5:2)=3 !a(1)=3,a(3)=3,a(5)=3
a(3:)=5 !a(3)以及之后的所有元素賦值為5
a(1:3)=b(4:6) !類似于這種的要求左右數(shù)組元素個(gè)數(shù)相同
a(:)=b(:,2) !a(1)=b(1,2),a(2)=b(2,2),以此類推
6、WHERE
where形式上類似于if,但只用于設(shè)置數(shù)組。設(shè)有兩個(gè)同樣類型、維數(shù)和大小的數(shù)組a,b
where(a<3)
b=a !a中小于3的元素賦值給b對應(yīng)位置的元素
end where
再如:where(a(1:3)/=0) c=a !略去了end where,因?yàn)橹桓艘恍衱here可嵌,也
!可類似do循環(huán)有署名標(biāo)簽。
7、FORALL
有點(diǎn)像C中的for循環(huán):
forall(triplet1[,triplet2 [,triplet3…]],mask)
其中triplet形如i=2:6:2,表示循環(huán),最后一個(gè)數(shù)字省略則增量為1
例如:
forall(i=1:5,j=1:5,a(i,j)<10)
a(i,j)=1
end forall
又如: forall(i=1:5,j=1:5,a(i,j)/=0) a(i,j)=1/a(i,j)
forall也可以嵌套使用,好比C中for循環(huán)的嵌套。
七、函數(shù)
Fortran中函數(shù)分兩類:子程序(subroutine)和自定義函數(shù)(function)。自定義函數(shù)本
質(zhì)上就是學(xué)上的函數(shù),一般要傳遞自變量給自定義函數(shù),返回函數(shù)值。子程序不一定是這樣,可
以沒有返值。傳遞參數(shù)要注意類型的對應(yīng),這跟C是一樣的。
1、子程序
目的:把某一段經(jīng)常使用的有特定功能的程序獨(dú)立出來,可以方便調(diào)用。
習(xí)慣上一般都把子程序放在主程序結(jié)束之后。
形式:
subroutine name (parameter1, parameter2)
!給子程序起一個(gè)有意義的名字??梢詡鬟f參數(shù),這樣可以有返回值。括號(hào)內(nèi)也可以
空著,代不傳遞參數(shù)。
implicit none
integer:: parameter1, parameter2 !需要定義一下接收參數(shù)的類型。
…… !接下來的程序編寫跟主程序沒有任何別。
……
mreturn !跟C不同,這里表示子程序執(zhí)行后回到調(diào)用它的地方繼續(xù)執(zhí)行下面的程序。不一定放
!在最后。可以放在子程序的其他位置,作用相同;子程序中return之后的部分不執(zhí)行。
end [subroutine name]
調(diào)用:使用call命令直接使用,不需要聲明。在調(diào)用處寫:
call subroutine name(parameter1,parameter2)
注意點(diǎn):
a.子程序之間也可相互調(diào)用。直接調(diào)用就是了,像在主程序中調(diào)用子程序一樣。
b.傳遞參數(shù)的原理和C中不同。Fortran里是傳址調(diào)用(call by address/reference),就是
傳遞時(shí)用參數(shù)和子程序中接收時(shí)用的參數(shù)使用同一個(gè)地址,盡管命名可以不同。這樣如果子程序
的執(zhí)行改子程序中接收參數(shù)的值,所傳遞的參數(shù)也相應(yīng)發(fā)生變化。
c.子程序各自內(nèi)部定義的變量具有獨(dú)立性,類似于C。各自的行代碼也具有獨(dú)立性。因此各
個(gè)子程序主程序中有相同的變量名、行代碼號(hào),并不會(huì)相互影響。
2、自定義函數(shù)
和子程序的明顯不同在于:需要在主程序中聲明之后才能使用。調(diào)用方式也有差別。另外
按照慣例用函數(shù)不去改變自變量的值。如果要改變傳遞參數(shù)的值,習(xí)慣上用子程序來做。
聲明方式:real, external :: function_name
一般自定義函數(shù)也是放在主程序之后。
形式:
function function_name(parameter1, parameter2)
implicit none
real:: parameter1, parameter2 !聲明函數(shù)參數(shù)類型,這是必需的
real::function_name !聲明函數(shù)返回值類型,這是必需的
……
……
function_name=…. !返回值的表達(dá)式
return
end
也可以這樣直接聲明返回值類型,簡潔些:
real function function_name(parameter1, parameter2)
implicit none
real:: parameter1, parameter2 !這個(gè)還是必需的
……
……
function_name=…. !返回值表達(dá)式
return
end
調(diào)用:function_name(parameter1,parameter2)
不需要call命令。
自定義函數(shù)可以相互調(diào)用。調(diào)用時(shí)也需要事先聲明。
總之,調(diào)用自定義函數(shù)前需要做聲明,調(diào)用子程序則不需要。
3、關(guān)于函數(shù)中的變量
(1)注意類型的對應(yīng)。Fortran中甚至可以傳遞數(shù)值常量,但只有跟函數(shù)定義的參數(shù)類型
對應(yīng)才會(huì)到想要的結(jié)果。如call ShowReal(1.0)就必須用1.0而不是1。
(2)傳遞數(shù)組參數(shù),也跟C一樣是傳地址,不過不一定是數(shù)組首地址,而可以是數(shù)組某個(gè)
指定元素地址。比如有數(shù)組a(5),調(diào)用call function(a)則傳遞a(1)的地址,調(diào)用call functio
n(a(3))則遞a(3)的地址。
(3)多維數(shù)組作為函數(shù)參數(shù),跟C相反的是,最后一維的大小可以不寫,其他維大小必須
寫。這決于Fortran中數(shù)組元素column major的存放方式。
(4)在函數(shù)中,如果數(shù)組是接收用的參數(shù),則在聲明時(shí)可以用變量賦值它的大小,甚至可
以不指定小。例如:
subroutine Array(num,size)
implicit none
integer:: size
integer num(size) !可以定義一個(gè)數(shù)組,其大小是通過傳遞過來的參數(shù)決定的。這很實(shí)用
……
……
return
end
(5)save命令:將函數(shù)中的變量值在調(diào)用之后保留下來,下次調(diào)用此函數(shù)時(shí)該變量的值就
是上次保的值。只要在定義時(shí)加上save就行:
integer, save :: a=1
(6)傳遞函數(shù)(包括自定義函數(shù)、庫函數(shù)、子程序都是可以的)。類似于C中的函數(shù)指針需要在
主程序和調(diào)用函數(shù)的函數(shù)中都聲明作為參數(shù)傳遞的函數(shù)。如
real, external :: function !自定義函數(shù)
real, intrinsic :: sin !庫函數(shù)
external sub !子程序
(7)函數(shù)使用接口(interface):一段程序模塊。以下情況必需:
a.函數(shù)返回值為數(shù)組
b.指定參數(shù)位置來傳遞參數(shù)時(shí)
c.所調(diào)用的函數(shù)參數(shù)個(gè)數(shù)不固定
d.輸入指標(biāo)參數(shù)時(shí)
e.函數(shù)返回值為指針時(shí)。
具體用法結(jié)合例子容易看懂。例子都很長??磿?。
4、全局變量
功能就不用說了。原理:根據(jù)聲明時(shí)的相對位置關(guān)系而取用,不同與C中根據(jù)變量名使用。
如果在主程序中定義:
integer :: a,b
common a,b !就是這樣定義全局變量的
在子程序或自定義函數(shù)中定義:
integer :: c,d
common c,d
則a和c共用相同內(nèi)存,b和d共用相同內(nèi)存。
全局變量太多時(shí)會(huì)很麻煩??梢园阉鼈?nèi)藶闅w類,只需在定義時(shí)在common后面加上區(qū)間名
。如
common /groupe1/ a, common /group2/ b。這樣使用時(shí)就不必把所有全局變量
都列出來,再聲明common /groupe1/ c就可以用a、c全局變量了。
可以使用block data程序模塊。在主程序和函數(shù)中不能直接使用前面提到的data命令給全
局變量賦初值??梢越o它們各自賦初值;如果要使用data命令必須要這樣:
block data [name]
implicit none
integer a,b,c
real d,e
common a b c
common /group1/ d,e
data a,b,c,d,e /1,2,3,4.0,5.0/
end [block data [name]]
5、Module
Module不是函數(shù)。它用于封裝程序模塊,一般是把具有相關(guān)功能的函數(shù)及變量封裝在一起
。用法很單,但能提供很多方便,使程序變得簡潔,比如使用全局變量不必每次都聲明一長串,
寫在odule里調(diào)用就行了。Module一般寫在主程序開始之前。
形式:
module module_name
……
……
end [module [module_name]]
使用:在主程序或函數(shù)中使用時(shí),需要在聲明之前先寫上一行:use module_name.
Module中有函數(shù)時(shí)必須在contains命令之后(即在某一行寫上contains然后下
面開始寫數(shù),多所有函數(shù)都寫在這個(gè)contains之后)。并且module中定義過的變量在module里的
函數(shù)中可直接使用,函數(shù)之間也可以直接相互調(diào)用,連module中的自定義函數(shù)在被調(diào)用時(shí)也不用
先聲明。
6、include放在需要的任何地方,插入另外的文件(必須在同一目錄下)。如:
include 'funcion.f90'
八、文件
1、文本文件
Fortran里有兩種讀取文件的方式,對應(yīng)于兩種文件
順序讀?。河糜谖谋疚募?br>直接讀?。河糜诙M(jìn)制文件
這里只摘錄關(guān)于文本文件的讀取。一般模式如下。
character(len=20)::filenamein="in.txt", filenameout="out.txt" !文件名
logical alive
integer::fileidin=10,fileidout=20
!10,20是給文件編的號(hào),除1,2,5,6的正整數(shù)都可,因?yàn)?、6是默認(rèn)的輸出位置(屏幕
),1、5是默認(rèn)的輸入位置(鍵盤)
integer::error
real::in,out
!下面這一段用于確認(rèn)指定名字的文件是否存在
inquire(file=filenamein, exist=alive) !如果存在,alive賦值為0
if(.NOT. alive) then
write(*,*) trim(filenamein), " doesn't exist."!trim用于刪去filenamein中字串
!后面的stop多余空格,輸出時(shí)好看些
end if
open([unit=]fileidin, file=filenamein, status="old")
open([unit=]fileidout,file=filenameout[,status="new"])
!unit指定輸入/輸出的位置。打開已有文件一定要用status="old";打開新文件用status="new";
!不指定status,則默認(rèn)status="unknown",覆蓋已有文件或打開新文件……
read([unit=]fileidin, [fmt=]100,iostat=error )in !error=0表示正確讀入數(shù)據(jù)。
100 format(1X,F6.3)
!按一定格式輸入輸出,格式可以另外寫并指定行代碼,也可以直接寫在read/write中
write(([unit=]fileidout, "(1X,F6.3)")out
close(fileidin)
close(fileidout)
!1X代表一個(gè)空格。F6.3代表real型數(shù)據(jù)用占6個(gè)字符(含小數(shù)點(diǎn)),其中小數(shù)點(diǎn)后三位。
!常用的還有I3,用于整型數(shù)據(jù),共占三個(gè)字符;A8,字符型,占8個(gè)字符。換行用 /
二進(jìn)制文件的讀取有所不同。不再列舉。
2、內(nèi)部文件
另一個(gè)很實(shí)用的讀寫功能是內(nèi)部文件(internal file)。看看這個(gè)例子就明白了。
integer::a=1,b=2
character(len=20)::string
write(unit=string,fmt="(I2,'+',I2,'=',I2)")a,b,a+b
write(*,*)string
則結(jié)果輸出1+2=3。反過來也是可以的:
integer a
character(len=20)::string="123"
read(string,*)a
write(*,*)a
則輸出123。
聯(lián)系客服