Fortran的主要版本及差別_第1頁
Fortran的主要版本及差別_第2頁
Fortran的主要版本及差別_第3頁
Fortran的主要版本及差別_第4頁
Fortran的主要版本及差別_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、、Fortran的主要版本及差別按其發(fā)展歷史,F(xiàn)ortran編譯器的版本其實很多。現(xiàn)在在廣泛使用的是Fortran77和Fortran90。Fortran90在Fortran77基礎(chǔ)上添加了不少使用的功能,并且改良了77編程的版面格式,所以編程時推薦使用90。鑒于很多現(xiàn)成的程序只有77版本,有必要知道77的一些基本常識,至少保證能夠看懂77程序。以下是77和90的一些格式上的區(qū)別。Fortran77:固定格式(fixedformat),程序代碼擴展名:.f或.for(1)若某行以C,c或*開頭,則該行被當(dāng)成注釋;(2)每行前六個字符不能寫程序代碼,可空著,或者15字符以數(shù)字表明行代碼(用作格式

2、化輸入輸出等);772為程序代碼編寫區(qū);73往后被忽略;(3)太長的話可以續(xù)行,所續(xù)行的第六個字符必須是"0"以外的任何字符。Fortran90:自由格式(freeformat),擴展名:.f90(1)以"!"引導(dǎo)注釋;(2)每行可132字符,行代碼放在每行最前面;(3)以&續(xù)行,放在該行末或下行初。以下都是討論Fortran90。3、 Fortran的一些特點,和C的一些不同其實很多,在下面涉及具體方面時可以看到。這里只是大致提一些。( 1)不分大小寫( 2)每句末尾不必要寫分號( 3)程序代碼命令間的空格沒有意義( 4)不像C,F(xiàn)ortran

3、不使用( 5)數(shù)據(jù)類型多出了復(fù)數(shù)和邏輯判斷類型。比如復(fù)數(shù)類型complex:a!聲明復(fù)數(shù)的方法。復(fù)數(shù)顯然方便了科學(xué)計算,滿足了工程方面的需求a=,!a=1+i( 6)多出了乘冪運算(*)。乘冪除了整數(shù)還可以是實數(shù)形式。如開方,開立方a=*,a=*。( 7)數(shù)組有一些整體操作的功能;可以方便的對部分元素進行操作( 8)有些情況下可以聲明大小待定的數(shù)組,很實用的功能4、 Fortran的基本程序結(jié)構(gòu)先看一看所謂的"HelloFortran"程序。programmain!程序開始,main是program的名字,完全自定義write(*,*)"Hello"!主

4、程序stop!終止程序endprogrammain!end用于封裝代碼,表示代碼編寫完畢。中的內(nèi)容可省略,下同。再看一段實用一些的程序,好有點感性認(rèn)識。程序用于計算圓柱的表面積,要求輸入底面半徑和高。其中展示了Fortran的一些特色用法。程序摘自維基。其實是一個叫的網(wǎng)上引用的維基的網(wǎng)頁。推薦去看看!能查到不少有意思的東西。programcylinder!給主函數(shù)起個名字!Calculatetheareaofacylinder.!Declarevariablesandconstants.!constants=pi!variables=radiussquaredandheightimplicit

5、none!Requireallvariablestobeexplicitlydeclared這個一般都是要寫上的。下面會進一步說明。integer:ierrcharacter:yn這是常量的聲明方法real:radius,height,areareal,parameter:pi=!interactive_loop:do!do循環(huán),F(xiàn)ortran 中的循環(huán)可以加標(biāo)簽,如 d面的interactive_loop就是標(biāo)!Prompttheuserforradiusandheight!andreadthem.屏幕輸出鍵盤輸入。 isotat 的值用write(*,*)'Enterradiusa

6、ndheight.'!read(*,*,iostat=ierr)radius,height于判斷輸入成功否。Ifradiusandheightcouldnotbereadfrominput,thencyclethroughtheloop.if(ierr/=0)thenwrite(*,*)'Error,invalidinput.'cycleinteractive_loop!cycleendifComputearea.The*means"raisetoapower.area=2*pi*(radius*2+radius*height)!Writetheinputva

7、riables(radius,height)!andoutput(area)tothescreen.write(*,'(1x,a7,5x,a7,5x,a5,')&!"&"相當(dāng)于C里的continue表示續(xù)行。這里指數(shù)運算比C方!還顯示了格式化輸出'radius=',radius,'height=',height,'area=',areayn=''yn_loop:do!內(nèi)嵌的另一個do循環(huán)write(*,*)'Performanothercalculationyn'

8、read(*,'(a1)')ynif(yn='y'.or.yn='Y')exityn_loopif(yn='n'.or.yn='N'.or.yn='')exitinteractive_loopend do yn_loop結(jié)束內(nèi)嵌 do 循環(huán)enddointeractive_loopendprogramcylinderFortran程序的主要結(jié)構(gòu)就是這樣了。一般還會有些module的部分在主函數(shù)前,函數(shù)在主函數(shù)后。三、數(shù)據(jù)類型及基本輸入輸出1、數(shù)據(jù)類型,聲明及賦初值( 1) teger:短整型kind

9、=2,長整型kind=4integer(kind=2):a=3如果聲明成integer:a,則默認(rèn)為長整型。!":"在聲明并同時賦初值時必須要寫上;類型名后面有形容詞時也必須有;其他情況可略去!所謂形容詞,可以看一下這個。比如聲明常數(shù)real,parameter:pi=。parameter就是形容詞。( 2) real:單精度kind=4(默認(rèn)),雙精度kind=8real(kind=8):a=還有指數(shù)的形式,如1E10為單精度,1D10為雙精度( 3) complex單精度和雙精度complex(kind=4)b( 4) charactercharacter(len=10

10、)c!len為最大長度( 5) logicallogical*2:d=.ture.(等價于logical(2):d=.ture.)(6)自定義類型type:類似于C中的structFortran77中給變量賦初值常用DATAOr令,可同時給多個變量賦初值dataa,b,string/1,'fortran'/與C不同的是,F(xiàn)ortran中變量不聲明也能使用,即有默認(rèn)類型(跟implicit命令有關(guān))。按照默認(rèn)的規(guī)定,以i,j,k,l,m,n開頭的變量被定義為integer,其余為real。取消該設(shè)置需在程序聲明部分之前加implicitnone。彭國倫建議一般都使用該語句。另一點

11、關(guān)于聲明的不同是Fortran有"等價聲明":integera,bequivalence(a,b)使得a,b使用同一塊內(nèi)存。這樣可以節(jié)省內(nèi)存;有時可精簡代碼。如:equivalence(很長名字的變量比如三維數(shù)組的某個元素,a),之后使用a來編寫程序就簡潔多了。2、基本輸入輸出輸入:read(*,*)a!從鍵盤讀入輸出:write(*,*)"text"!在屏幕上輸出。Fortran77用'text'。Fortran90!一般""和''都可print*,"text"!只能屏幕輸出(*,

12、*)完整寫為(unit=*,fmt=*)。其中unit為輸入/輸出位置,如屏幕,文件等;fmt為print 后面的 *表示按格式。如果這兩項都寫成*,則按默認(rèn)的方式進行,即上面描述的。默認(rèn)格式輸四、流程控制1、運算符(1)邏輯運算符=/=>>=<<=!Fortran90用法.EQ.NE.GT.GE.LT.LE.!Fortran77用法(2)涉及相互關(guān)系的集合運算符.AND.OR.NOT.EQV.NEQV.!僅.NOT.連接一個表達式,其余左右兩邊都要有表達式(可以是logical類型的變量)!.EQV.:當(dāng)兩邊邏輯運算值相同時為真,.NEQV.:當(dāng)兩邊邏輯運算值不同時為

13、2、IF(1) 基本if(邏輯判斷式)thenendif如果then后面只有一句,可寫為if(邏輯判斷式)!then和endif可省略(2) 多重判斷:if(邏輯判斷式)thenelseifelseifelseendif(3) 嵌套:if(邏輯判斷式)thenif(邏輯判斷式)thenif(邏輯判斷式)thenelseif(邏輯判斷式)thenelseend if沒必要跟C語句多時用 了,因為有end ifendifendif(4) 算術(shù)判斷:programexampleimplicitnonerealcwrite(*,*)"inputanumber"read(*,*)ci

14、f(c)10,20,30!10,20和30為行代碼,根據(jù)c小于/等于/大于0,執(zhí)行10/20/30行的程序10write(*,*)"A"goto40!goto可實現(xiàn)跳到任意前面或后面的行代碼處,但用多了破壞程序結(jié)構(gòu)20write(*,*)"B"goto4030write(*,*)"C"goto4040stopend3、 SELECTCASE類似于C的switch語句selectcase(變量)case(數(shù)值1)!比如case(1:5)代表1<=變量<=5會執(zhí)行該模塊!case(1,3,5)代表變量等于1或3或5會執(zhí)行該模塊

15、case(數(shù)值2)!括號中數(shù)值只能是integer,character或logical型常量,不臺匕能是real型casedefaultendcase4、 PAUSE,CONTINUEpause暫停程序執(zhí)行,按enter可繼續(xù)執(zhí)行continue貌似沒什么用處,可用作封裝程序的標(biāo)志五、循環(huán)1、 DOdocounter=初值,終值,增/減量!counter的值從初值到終值按增/減量變化,!counter每取一個值對應(yīng)著一次循環(huán)。增/減量不寫則默認(rèn)為1循環(huán)主體也沒有必要用enddoFortran77中不是用enddo來終止,而是下面這樣子:do循環(huán)最后一行的行代碼counter=初值,終值,增/減

16、量行代碼!這是do的最后一行2、 DOWHILEdowhile(邏輯運算)enddo類似于C中的while(邏輯運算)。一開始那個計算圓柱表面積的程序中,應(yīng)該也算是這一類。不過它是通過內(nèi)部的if語句來控制循環(huán)。看來也是可以的,不過在這本書上沒看到這樣寫。其實應(yīng)該也可以歸于下面這種。3、沒看到和C里面的dowhile(邏輯運算);相對應(yīng)的循環(huán)語句,不過可以這樣,保證至少做一次循環(huán):dowhile(.ture.)if(邏輯運算)exit!exit就好比C里面的break°C里的continue在Fortran里是cycleenddo4、Fortran的一個特色:帶署名的循環(huán)可以這樣,不易

17、出錯:outer:doi=1,3inner:doj=1,3enddoinnerenddoouter還可以這樣,很方便:loop1:doi=1,3loop2:doj=1,3終止整個循環(huán)loop1跳出 loop2 的本次循環(huán),進行l(wèi)oop2 的if(i=3)exitloop1!exitif(j=2)cycleloop2!cycle下一次循環(huán)write(*,*)i,jenddoloop2enddoloop1還有一些循環(huán)主要用于Fortran中的數(shù)組運算,為Fortran特有,很實用。六、數(shù)組1、數(shù)組的聲明和C不同的是,F(xiàn)ortran中的數(shù)組元素的索引值寫在()內(nèi),且高維的也只用一個(),如下inte

18、gera(5)!聲明一個整型一維數(shù)組real:b(3,6)!聲明一個實型二維數(shù)組類型可以是integer,real,character,logical或type。最高可以到7維。數(shù)組大小必須為常數(shù)。但是和C語言不同,F(xiàn)ortran也有辦法使用大小可變的數(shù)組,方法如下:integer,allocatable:a(:)!聲明大小可變經(jīng)過某個途徑得知所需數(shù)組大小size之后,用下面的語句:allocate(a(size)!配置內(nèi)存空間之后該數(shù)組和通過一般方法聲明的數(shù)組完全相同。與C不同,F(xiàn)ortran索引值默認(rèn)為從1開始,而且可以在聲明時改變該規(guī)則:integera(-3:1)!索引值為-3,-2,

19、-1,0,1為可使用的元素integerb(2:3,-1:3)!b(23,-13)2、數(shù)組在內(nèi)存中的存放和C不同,F(xiàn)ortran中的數(shù)組比如a(2,2)在內(nèi)存中存放順序為a(1,1),a(2,1),a(1,2),a(2,2)。原則是先放低維的元素,再放高維的元素。此規(guī)則稱為columnmajor3、賦初值(1)最普通的做法:integera(5)dataa/1,2,3,4,5/或integer:a(5)=(/1,2,3,4,5/)若integer:a(5)=5,則5個元素均為5對于integer:a(2,2)=(/1,2,3,4/)根據(jù)數(shù)組元素在內(nèi)存中存放的方式,等價于賦值a(1,1)=1,a

20、(2,1)=2,a(1,2)=3,a(2,2)=4(2)利用Fortran的特色:隱含式循環(huán)??蠢泳兔靼琢恕ntegera(5)integeridata(a(i),i=2,4)/2,3,4/!(a(i),i=2,4)表示i從2到4循環(huán),增量為默認(rèn)值1還可以這樣:integeriinteger:a(5)=(/1,(2,i=2,4),5/)!五個元素分別賦值為1,2,2,2,5integer:b(5)=(/i,i=1,5/)!五個元素分別賦值為1,2,3,4,5還可以嵌套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

21、,a(2,2)=44、操作整個數(shù)組設(shè)a,b為相同類型、維數(shù)和大小的數(shù)組a=5!所有元素賦值為5a=(/1,2,3/)!這里假設(shè)a為一維,a(1)=1,a(2)=2,a(3)=3a=b!對應(yīng)元素賦值,要求a,b,c維數(shù)和大小相同,下同a=b+ca=b-ca=b*ca=b/ca=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)=5a(1:5:2)=3!a(1)=3,a(3)=3,a(5)=3a(3:)=5!a(3)以及之后的所有元素賦值為5a(1:3)=b(4:6)!類似于這種的要求左右數(shù)組元素個數(shù)相同a(:)=

22、b(:,2)!a(1)=b(1,2),a(2)=b(2,2),以此類推6、 WHEREwhere形式上類似于if,但只用于設(shè)置數(shù)組。設(shè)有兩個同樣類型、維數(shù)和大小的數(shù)組a,b34mwhere(a<3)b=a!a中小于3的元素賦值給b對應(yīng)位置的元素endwhere再如:where(a(1:3)/=0)c=a!略去了endwhere,因為只跟了一行where可嵌套,也可類似do循環(huán)有署名標(biāo)簽7、 FORALL有點像C中的for循環(huán):forall(triplet1,triplet2,triplet3口,mask)其中triplet形如i=2:6:2,表示循環(huán),最后一個數(shù)字省略則增量為1例如:fo

23、rall(i=1:5,j=1:5,a(i,j)<10)a(i,j)=1endforall又如: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ì)上就是數(shù)學(xué)上的函數(shù),一般要傳遞自變量給自定義函數(shù),返回函數(shù)值。子程序不一定是這樣,可以沒有返回值。傳遞參數(shù)要注意類型的對應(yīng),這跟C是一樣的。1、子程序目的:把某一段經(jīng)常使用的有特定功能的程序獨立出來,可以方便調(diào)用。習(xí)慣上一般都把子程序放在主程序

24、結(jié)束之后。形式:subroutinename(parameter1,parameter2)!給子程序起一個有意義的名字??梢詡鬟f參數(shù),這樣可以有返回值。括號內(nèi)也可以空著,代表不傳遞參數(shù)。implicitnoneinteger:parameter1,parameter2!需要定義一下接收參數(shù)的類型。!接下來的程序編寫跟主程序沒有任何差別。mreturn!跟C不同,這里表示子程序執(zhí)行后回到調(diào)用它的地方繼續(xù)執(zhí)行下面的程序。不一定return!放在最后??梢苑旁谧映绦虻钠渌恢?,作用相同;子程序中之后的部分不再執(zhí)行。endsubroutinename調(diào)用:使用call命令直接使用,不需要聲明。在調(diào)用處

25、寫:callsubroutinename(parameter1,parameter2)、,、-、t_'注意點:a. 子程序之間也可相互調(diào)用。直接調(diào)用就是了,像在主程序中調(diào)用子程序一樣。b. 傳遞參數(shù)的原理和C中不同。Fortran里是傳址調(diào)用(callbyaddress/reference),就是傳遞時用的參數(shù)和子程序中接收時用的參數(shù)使用同一個地址,盡管命名可以不同。這樣如果子程序的執(zhí)行改變子程序中接收參數(shù)的值,所傳遞的參數(shù)也相應(yīng)發(fā)生變化。c.子程序各自內(nèi)部定義的變量具有獨立性,類似于C。各自的行代碼也具有獨立性。因此各個子程序和主程序中有相同的變量名、行代碼號,并不會相互影響。2、自

26、定義函數(shù)和子程序的明顯不同在于:需要在主程序中聲明之后才能使用。調(diào)用方式也有差別。另外按照慣例調(diào)用函數(shù)不去改變自變量的值。如果要改變傳遞參數(shù)的值,習(xí)慣上用子程序來做。聲明方式:real,external:function_name一般自定義函數(shù)也是放在主程序之后。形式:functionfunction_name(parameter1,parameter2)implicitnonereal:parameter1,parameter2!聲明函數(shù)參數(shù)類型,這是必需的real:function_name!聲明函數(shù)返回值類型,這是必需的function_name=.!返回值的表達式returnend也可

27、以這樣直接聲明返回值類型,簡潔些:realfunctionfunction_name(parameter1,parameter2)implicitnonereal:parameter1,parameter2!這個還是必需的function_name=.!返回值表達式returnend調(diào)用:function_name(parameter1,parameter2)不需要call命令。自定義函數(shù)可以相互調(diào)用。調(diào)用時也需要事先聲明??傊{(diào)用自定義函數(shù)前需要做聲明,調(diào)用子程序則不需要。3、關(guān)于函數(shù)中的變量(1)注意類型的對應(yīng)。Fortran中甚至可以傳遞數(shù)值常量,但只有跟函數(shù)定義的參數(shù)類型對應(yīng)才會得到

28、想要的結(jié)果。如callShowReal就必須用而不是1。(2)傳遞數(shù)組參數(shù),也跟C一樣是傳地址,不過不一定是數(shù)組首地址,而可以是數(shù)組某個指定元素的地址。比如有數(shù)組a(5),調(diào)用callfunction(a)則傳遞a(1)的地址,調(diào)用callfunction(a(3)則傳遞a(3)的地址。(3)多維數(shù)組作為函數(shù)參數(shù),跟C相反的是,最后一維的大小可以不寫,其他維大小必須寫。這決定于Fortran中數(shù)組元素columnmajor的存放方式。(4)在函數(shù)中,如果數(shù)組是接收用的參數(shù),則在聲明時可以用變量賦值它的大小,甚至可以不指定大小。例如:subroutineArray(num,size)implic

29、itnoneinteger:sizeintegernum(size)!可以定義一個數(shù)組,其大小是通過傳遞過來的參數(shù)決定的。這個很實用returnend( 5) save命令:將函數(shù)中的變量值在調(diào)用之后保留下來,下次調(diào)用此函數(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ù)externalsub!子程序(7)函數(shù)使用

30、接口(interface):一段程序模塊。以下情況必需:a. 函數(shù)返回值為數(shù)組b. 指定參數(shù)位置來傳遞參數(shù)時c. 所調(diào)用的函數(shù)參數(shù)個數(shù)不固定d. 輸入指標(biāo)參數(shù)時e. 函數(shù)返回值為指針時。具體用法結(jié)合例子容易看懂。例子都很長。看書吧。4、全局變量功能就不用說了。原理:根據(jù)聲明時的相對位置關(guān)系而取用,不同與C中根據(jù)變量名使用。如果在主程序中定義:integer:a,bcommona,b!就是這樣定義全局變量的在子程序或自定義函數(shù)中定義:integer:c,dcommonc,d則a和c共用相同內(nèi)存,b和d共用相同內(nèi)存。全局變量太多時會很麻煩。可以把它們?nèi)藶闅w類,只需在定義時在common面加上區(qū)間名

31、。如common/groupe1/a,common/group2/b。這樣使用時就不必把所有全局變量都列出來了,冉聲明common/groupel/c就可以用a、c全局變量了。可以使用blockdata程序模塊。在主程序和函數(shù)中不能直接使用前面提到的data命令給全局變量賦初值??梢越o它們各自賦初值;如果要使用data命令必須要這樣:blockdatanameimplicitnoneintegera,b,creald,ecommonabccommon/group1/d,edataa,b,c,d,e/1,2,3,endblockdatanames. ModuleModule不是函數(shù)。它用于封裝程

32、序模塊,一般是把具有相關(guān)功能的函數(shù)及變量封裝在一起。用法很簡單,但能提供很多方便,使程序變得簡潔,比如使用全局變量不必每次都聲明一長串,寫在Module里調(diào)用就行了。Module一般寫在主程序開始之前形式:modulemodule_nameendmodulemodule_name使用:在主程序或函數(shù)中使用時,需要在聲明之前先寫上一行:usemodule_name37m。Module中有函數(shù)時必須在contains命令之后(即在某一行寫上contains然后下面開始寫函數(shù),多所有函數(shù)都寫在這個contains之后)。并且module中定義過的變量在module里的函數(shù)中可以直接使用,函數(shù)之間也可以直接相互調(diào)用,連module中的自定義函數(shù)在被調(diào)用時也不用先聲明的。t. include放在需要的任何地方,插入另外的文件(必須在同一目錄下)。如:include''八、文件1、文本文件Fortran里有兩種讀取文件的方式,對應(yīng)于兩種文件順序讀?。河糜谖谋疚募苯幼x?。河糜诙M制文件這里只摘錄關(guān)于文本文件的讀取。一般模式如下。character(len=20):filenamein="",filenameout=""!文件名logicalaliveinteger:fileidin=10,fileidout=20!10

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論