




已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1 FORTRAN77四則運算符+ - */ * (其中*表示乘方)在表達式中按優(yōu)先級次序由低到高為: +或-*或/*函數(shù)()2 FORTRAN77變量類型2.1 隱含約定:I-N規(guī)則凡是以字母I,J,K,L,M,N六個字母開頭的,即認為是整型變量,其它為實型變量。2.2 用類型說明語句確定變量類型:可以改變I-N規(guī)則INTEGER整型REAL實型DOUBLE PRECISION雙精度實型COMPLEX復型,賦值形式為(實部,虛部),如D=(8.76E+0.5,-67.8E-3),C=(3.0,6.3),如果含表達式則用CMPLX,如C=CMPLX(3.0*A,6.0+B)LOGICAL邏輯型,邏輯常量有“T”和“F”,“T”表示“.TRUE.”,“F”表示“.FALSE.”CHARACTER*N字符型,N為字符串長度,可以在變量名稱后重新指定長度,如CHARACTER*8 STR1,STR2*10 ,賦值形式為STR2=IM A BOY.2.3 用IMPLICIT語句將某一字母開頭的全部變量指定為所需類型如 IMPLICIT REAL (I,J)三種定義的優(yōu)先級別由低到高順序為:I-N規(guī)則IMPLICIT語句類型說明語句,因此,在程序中IMPLICIT語句應放在類型說明語句之前。2.4 數(shù)組的說明與使用使用I-N規(guī)則時用DIMENSION說明數(shù)組,也可在定義變量類型同時說明數(shù)組,說明格式為:數(shù)組名(下標下界,下標上界),也可省略下標下界,此時默認為1,例:DIMENSION IA(0:9),ND(80:99),W(3,2),NUM(-1:0),A(0:2,0:1,0:3)REAL IA(10),ND(80:99)使用隱含DO循環(huán)進行數(shù)組輸入輸出操作:例如WRITE(*,10) (I=,I,A=,A(I),I=1,10,2)10FORMAT(1X,5(A2,I2,1X,A2,I4)2.5 使用DATA語句給數(shù)組賦初值變量表中可出現(xiàn)變量名,數(shù)組名,數(shù)組元素名,隱含DO循環(huán),但不許出現(xiàn)任何形式的表達式:例如DATA A,B,C/-1.0,-1.0,-1.0/DATA A/-1.0/,B/-1.0/,C/-1.0/DATA A,B,C/3*-1.0/CHARACTER*6 CHN(10)DATA CHN/10*/INTEGER NUM(1000)DATA (NUM(I),I=1,500)/500*0/,(NUM(I),I=501,1000)/500*1/3 FORTRAN77程序書寫規(guī)則程序中的變量名,不分大小寫;變量名稱是以字母開頭再加上1到5位字母或數(shù)字構成,即變更名字串中只有前6位有效;一行只能寫一個語句;程序的第一個語句固定為PROGRAM 程序名稱字符串某行的第個字符至第個字符位為標號區(qū),只能書寫語句標號或空著或注釋內容;某行的第個字符為或號時,則表示該行為注釋行,其后面的內容為注釋內容;某行的第個字符位為非空格和非字符時,則該行為上一行的續(xù)行,一個語句最多可有19個續(xù)行;某行的第至字符位為語句區(qū),語句區(qū)內可以任加空格以求美觀;某行的第至字符位為注釋區(qū),字符位以后不能有內容。4 FORTRAN77關系運算符.GT. 大于.GE. 天于或等于.LT. 小于.LE. 小于或等于.EQ. 等于.NE. 不等于 .AND. 邏輯與.OR. 邏輯或.NOT. 邏輯非.EQV. 邏輯等.NEQV. 邏輯不等運算符優(yōu)先級由高到低順序為:()*或/+或-.GT.或.GE.或.LT.或.LE.或.EQ.或.NE.NOT.AND.OR.EQV.或.NEQV5 FORTRAN77語句語句說明備注WRITE(*,*) X1,X2輸出語句第一個*號是指輸入輸出文件設備號或其它設備,如果不指定則是指顯示器或打印機,第二個*號是指表控格式語句的行號,如不指定則用默認格式PRINT *,X1,X2輸出語句*號是指表控格式語句的行號,如不指定則用默認格式READ *,X1,X2輸入語句*號是指表控格式語句的行號,如不指定則用默認格式FORMAT(格式符)請見附錄一。請見附錄二。END結束程序或子程序STOP N結束程序并輸出信息NN為數(shù)字或字符串信息PAUSE N暫停程序執(zhí)行并輸出信息N,輸入回車后繼續(xù)執(zhí)行N為數(shù)字或字符串信息PARAMETER (PI=3.14)參數(shù)語句,用來定義常量,在程序中應放在類型說明語句之后EQUIVALENCE (變量表)等價語句,()內變量共用一個存儲單元。EQUIVALENCE(X1,X2,XN),(X1,X2,XN),COMMON X1,公用語句,其后變量相等,用來在程序單位間傳遞數(shù)據(jù),同時可以用來說明數(shù)組。程序中可有一個無名公用區(qū)和多個有名公用區(qū)。無名公用區(qū):在主程序各子程序中相同,均在可執(zhí)行語句之前,如COMMON A(5),I有名公用區(qū):名稱放在兩個“/”之間,如COMMON /X1,X2,X3/C1/X4,X5,X6OPEN (說明項1)打開舊文件或創(chuàng)建新文件說明項1中內容:UNIT=N, FILE=NAM, STATUS=STR1, ACCESS=STR2, FORM=STR3, RECL=C, BLANK=STR4, ERR=BH, IOSTAT=M其中:1.N=199;2.NAM為文件名,可以是字符常量或變量;3.STR1=NEW時新建文件;OLD時打開文件;SCRATCH時表示臨時文件,關閉時自動刪除,且不能與FILE=NAM項共存;UNKNOWN時由計算機系統(tǒng)規(guī)定文件狀態(tài);4.STR2為文件存取方式,SEQUENTIAL表示順序存取,DIRECT表示直接存取,省略此項時表示按順序存??;5.STR3為記錄格式說明,FORMATTED表示記錄按有格式形式存放, UNFORMATTED表示記錄按無格式形式存放。省略此項時,對于順序文件是有格式的,對于直接存取文件是無格式的;6.C表示記錄長度,以字節(jié)為單位,直接存取文件必指定,順序文件必省略;7.STR4表示數(shù)字值格式輸入字段中空格含意,NULL時表示忽略不計,ZERO時表示按0計。省略此項時按0計;8.BH表示出錯時處理語句行標號,可以省略此項;9.M為整數(shù),出錯時返回該整數(shù),可以省略此項。CLOSE (說明項2)關閉已打開文件說明項2中內容:UNIT=N,STATUS=STR5,ERR=BH,IOSTAT=M其中STR5為文件關閉狀態(tài),KEEP時保留,DELETE刪除,省略此項時為保留;ERR=BH,IOSTAT=M可以省略。REWIND (說明項3)將文件讀寫指針置于文件開頭說明項3中內容:UNIT=N,ERR=BH,IOSTAT=MERR=BH,IOSTAT=M可以省略BACKSPACE (說明項3)將文件讀寫指針回退一行6 FORTRAN77選擇判斷語句6.1 邏輯IF語句IF (邏輯表達式) 程序語句6.2 無ELSE塊IF (邏輯表達式) THEN程序塊END IF6.3 標準選擇IF (邏輯表達式) THEN程序塊1ELSE程序塊2END IF6.4 多重選擇塊IF (邏輯表達式1) THEN程序塊1ELSE IF (邏輯表達式2) THEN程序塊2ELSE IF (邏輯表達式2) THEN程序塊2.ELSE IF (邏輯表達式N) THEN程序塊NELSE程序塊N+1END IF7 FORTRAN77循環(huán)語句7.1 GO TO語句標號程序行程序塊GO TO 標號7.2 DO語句DO 標號,記數(shù)變量=起始值,終止值,步距”語句,如DO 標號,N=1,100,1程序塊標號CONTINUE7.3 DO WHILE 語句DO 標號,WHILE(PI.EQ.3.14159)程序塊標號CONTINUE7.4 DO UNTIL語句DO 標號,UNTIL (邏輯表達式)”語句,如DO 標號,UNTIL(PI.GT.3.14159)程序塊標號CONTINUE8 FORTRAN77內部函數(shù)INT(X)將數(shù)字串或數(shù)值X轉換為整型數(shù)REAL(X)將數(shù)字串或數(shù)值X轉換為實型數(shù)DBEL(X)將數(shù)字串或數(shù)值X轉換為雙精度型數(shù)CMPLX(X)將數(shù)字串或數(shù)值X轉換為復型數(shù)CHAR(X)將數(shù)值X轉換為字符(0X255)ICHAR(X)將字符X轉換為整數(shù)AINT(X)截去X的小數(shù)部分ANINT(X)將X舍入到最接近的整數(shù)NINT(X)將X舍入到最接近的整型數(shù)ABS(X)返回X的絕對值MOD(X1,X2)返回X1/X2的余數(shù)SIGN(X1,X2)取X2的符號,取X1的絕對值DIM(X1,X2)當X1X2時,等于X1-X2,當X1X2時,等于0DPROD(X1,X2)雙精度乘(X1,X2均為實數(shù))AIMAG(X)返回字符串X的虛部CONJG(X)返回字符串X的共軛MAX(X1,X2,X3,.,XN)返回X1,X2,X3,.,XN中最大值MIN(X1,X2,X3,.,XN)返回X1,X2,X3,.,XN中最小值SQRT(X)返回X的平方根(X0)EXP(X)返回E的X次方LOG(X)返回以E為底的X的對數(shù)即自然對數(shù)(X0)LOG10(X)返回以10為底的X的對數(shù)即常用對數(shù)(X0)SIN(X)返回弧度值X的正弦值COS(X)返回弧度值X的余弦值TAN(X)返回弧度值X的正切值ASIN(X)返回弧度值X的反正弦值ACOS(X)返回弧度值X的反余弦值ATAN(X)返回弧度值X的反正切值SINH(X)返回X的雙曲正弦值COSH(X)返回X的雙曲余弦值TANH(X)返回X的雙曲正切值LEN(X)返回字符串X的長度INDEX(X1,X2)返回字符串X2在字符串X1中的位置,不包含時返回0LGE(X1,X2)如果字符串X1X2則等于.TRUE.,否則等于.FALSE.LGT(X1,X2)如果字符串X1X2則等于.TRUE.,否則等于.FALSE.LLE(X1,X2)如果字符串X1X2則等于.TRUE.,否則等于.FALSE.LLT(X1,X2)如果字符串X1X2則等于.TRUE.,否則等于.FALSE.9 FORTRAN77函數(shù)與子程序9.1 FORTRAN77語句函數(shù)當函數(shù)十分簡單,用一條語句足以定義時(允許使用繼續(xù)行)才用;應該放在所有可執(zhí)行語句之前和有關類型說明語句之后,是非執(zhí)行語句;只在其所在程序單位中有意義;語句函數(shù)中的虛參就是變量名,不能是常量、表達式或數(shù)組元素等;語句函數(shù)定義語句中的表達式可以包含已經定義過的語句函數(shù)、外部函數(shù)或內部函數(shù)。語句函數(shù)通過表達式得一個函數(shù)值,此數(shù)值類型必須與函數(shù)名的類型一致。語句函數(shù)的使用同內部函數(shù)相同。語句函數(shù)例子:YMJ(R)=3.14159265*R*RZMJ=YMJ(5)9.2 FORTRAN77自定義函數(shù)定義格式:類型說明 FUNCTION 函數(shù)名(虛擬參數(shù)1,虛擬參數(shù)2,虛擬參數(shù)N)程序塊(可以含有RETURN)函數(shù)名=函數(shù)值END調用格式與內部函數(shù)相同。9.3 FORTRAN77子程序定義格式:SUBROUTINE 子程序名(虛擬參數(shù)1,虛擬參數(shù)2,虛擬參數(shù)N)程序塊(可以含有RETURN)END調用格式:CALL 子程序名(實在參數(shù)1,實在參數(shù)2,實在參數(shù)N)數(shù)據(jù)塊子程序:只是用來給有名公用區(qū)中的變量賦初值,格式如下:BLOCK DATA 子程序名DATA語句塊END附錄一、FORTRAN77控制輸入輸出格式1.在打印輸出時,每一行第1個字符不顯示,用來控制縱向走紙或顯示行。第1個字符作用空格正常回車換行0回車并跳過1行1換頁+只回車不換行其它通常是回車換行2.輸入小數(shù)時,自帶小數(shù)點優(yōu)先。3.輸出字段寬度不夠時用*號填充。附錄二、FORTRAN77控制輸入輸出格式語句1IW或IW.M整數(shù)型W為字段寬度,M為最少數(shù)字位數(shù)2FW.D實數(shù)型D為小數(shù)位數(shù)3EW.D或EW.DEE指數(shù)實數(shù)型E為指數(shù)位數(shù),通常為3或44GW.M自動實數(shù)型5DW.D雙精度型6LW邏輯型7A或AW字符型不指定W時自動8字符串插入字符串兩個表示一個字符9NH字符串插入長度為N的字符串10NX插入N個空格11RIW,R(NX,IW.M)R個IW,R個(NX,IW.M)R為重復系數(shù)12/換行13,$禁止換行目錄:一、說明二、概述三、數(shù)據(jù)類型及基本輸入輸出四、流程控制五、循環(huán)六、數(shù)組七、函數(shù)八、文件一、說明本文多數(shù)內容是我讀彭國倫Fortran 95 程序設計的筆記。只讀到第九章,主要是39 章,都是最基本的用法(原書共16章)。這里主要摘錄了我看書過程中總結的一些Fortran和C不 同的地方,主要是語法方面。希望這份筆記能夠給學過C但沒有接觸過Fortran的同學帶去一些幫 助。要想得更清楚些,推薦看一下原書,覺得作者真的寫得很好,很清楚;如果有C語言的基礎, 看完前九應該很快的,花一兩天就行了。覺得如果耐心看完本文,基本功能應該也可以順利用起 來了。外,由于我之前沒有用過Fortran,這次為了趕文檔看書又看得很粗淺,大多數(shù)東西看過 之后都沒得及仔細想,只是按著作者的意思去理解。所以這份筆記還處于紙上談兵的層次。如果 有不妥的方,希望大家指正。謝謝! 文中藍色的部分是程序代碼,!后面的內容為注釋。二、概述1、名詞解釋 Fortran=FormulaTranslator/Translation 一看就知道有什么特色了:可以把接近數(shù)學語言的文本翻譯成機械語言。的確,從一開始 ,IBM設計的時候就是為了方便數(shù)值計算和科學數(shù)據(jù)處理。設計強大的數(shù)組操作就是為了實現(xiàn)這一 目標。ortran奠定了高級語言發(fā)展的基礎?,F(xiàn)在Fortran在科研和機械方面應用很廣。2、Fortran的主要版本及差別 按其發(fā)展歷史,F(xiàn)ortran編譯器的版本其實很多?,F(xiàn)在在廣泛使用的是Fortran 77和Fortr an90。ortran 90在Fortran 77基礎上添加了不少使用的功能,并且改良了77編程的版面格式, 所以編程時推薦使用90。鑒于很多現(xiàn)成的程序只有77版本,有必要知道77的一些基本常識,至少保 證能夠看77程序。以下是77和90的一些格式上的區(qū)別。Fortran 77:固定格式(fixed format),程序代碼擴展名:.f或.for (1)若某行以C,c或*開頭,則該行被當成注釋; (2)每行前六個字符不能寫程序代碼,可空著,或者15字符以數(shù)字表明行代碼(用作格 式化輸入出等);772為程序代碼編寫區(qū);73往后被忽略; (3)太長的話可以續(xù)行,所續(xù)行的第六個字符必須是0以外的任何字符。Fortran 90:自由格式(free format), 擴展名:.f90 (1)以!引導注釋; (2)每行可132字符,行代碼放在每行最前面; (3)以&續(xù)行,放在該行末或下行初。 以下都是討論Fortran 90。3、Fortran的一些特點,和C的一些不同 其實很多,在下面涉及具體方面時可以看到。這里只是大致提一些。 (1)不分大小寫 (2)每句末尾不必要寫分號 (3)程序代碼命令間的空格沒有意義 (4)不像C,F(xiàn)ortran不使用 (5)數(shù)據(jù)類型多出了復數(shù)和邏輯判斷類型。比如復數(shù)類型complex : a!聲明復數(shù)的方法。復數(shù)顯然方便了科學計算,滿足了工程方面需求a=(1.0,2.0)! a=1+i (6)多出了乘冪運算(*)。乘冪除了整數(shù)還可以是實數(shù)形式。如開方,開立方a=4.0*0.5,a=8.0*(1.0/3.0)。 (7)數(shù)組有一些整體操作的功能;可以方便的對部分元素進行操作 (8)有些情況下可以聲明大小待定的數(shù)組,很實用的功能4、Fortran 的基本程序結構先看一看所謂的Hello Fortran程序。program main!程序開始,main是program的名字,完全自定義write(*,*) Hello!主程序stop!終止程序end programmain!end用于封裝代碼,表示代碼編寫完畢。 中的內容可省略,下同。再看一段實用一些的程序,好有點感性認識。程序用于計算圓柱的表面積,要求輸入底面 半徑和。其中展示了Fortran的一些特色用法。程序摘自維基。其實是一個叫的網上引的維基的網頁。推薦去看看!能查到不少有意思的東西。program cylinder!給主函數(shù)起個名字! Calculate the area of a cylinder.! Declare variables and constants.! constants=pi! variables=radius squared and heightimplicit none! Require all variables to be explicitly declared !這個一般都是要寫上的。下面會進一步說明。integer : ierrcharacter : ynreal : radius, height, areareal, parameter : pi = 3.1415926536!這是常量的聲明方法interactive_loop: do!do循環(huán),F(xiàn)ortran 中的循環(huán)可以加標簽,如d前面的 !interactive_loop就是標簽! 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) thenwrite(*,*) Error, invalid input.cycle interactive_loop!cycle 相當于C里的continueend if! Compute area. The * means raise to a power.area = 2 * pi * (radius*2 + radius*height)! 指數(shù)運算比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!內嵌的另一個do循環(huán)write(*,*) Perform another calculation? ynread(*,(a1) ynif (yn=y .or. yn=Y)exit yn_loopif (yn=n .or. yn=N .or. yn= )exit interactive_loopend do yn_loop!結束內嵌do循環(huán)end do interactive_loop end program cylinderFortran 程序的主要結構就是這樣了。一般還會有些module的部分在主函數(shù)前,函數(shù)在主函 數(shù)后。三、數(shù)據(jù)類型及基本輸入輸出1、數(shù)據(jù)類型,聲明及賦初值(1)integer: 短整型kind=2, 長整型kind=4integer(kind=2) : a=3如果聲明成integer: a,則默認為長整型。 !: 在聲明并同時賦初值時必須要寫上;類型名后面有形容詞時也必須保留:;其他情況可略去 !所謂形容詞,可以看一下這個。比如聲明常數(shù)real,parameter : pi=3.1415926。parameter就是形容詞。(2)real:單精度kind=4(默認),雙精度kind=8real(kind=8) : a=3.0還有指數(shù)的形式,如1E10為單精度,1D10為雙精度(3)complex 單精度和雙精度complex(kind=4) b(4)charactercharacter(len=10) c!len為最大長度(5)logicallogical*2 : d=.ture.(等價于logical(2):d=.ture.)(6)自定義類型type:類似于C中的structFortran 77中給變量賦初值常用DATA命令,可同時給多個變量賦初值data a,b,string /1, 2.0, fortran/與C不同的是,F(xiàn)ortran 中變量不聲明也能使用,即有默認類型(跟implicit命令有關)。按照默認的定,以i,j,k,l,m,n開頭的變量被定義為integer,其余為real。取消該設置需在程序聲明部分之前implicit none。彭國倫建議一般都使用該語句。另一點關于聲明的不同是Fortran有等價聲明:integer a,b equivalence(a,b)使得a,b使用同一塊內存。這樣可以節(jié)省內存;有時可精簡代碼。如:equivalence(很長名字的變量如三維數(shù)組的某個元素,a),之后使用a來編寫程序就簡潔多了。2、基本輸入輸出輸入:read(*,*) a!從鍵盤讀入輸出:write(*,*) text!在屏幕上輸出。Fortran 77用 text。Fortan 90中一般 和 都可print *,text!只能用于屏幕輸出 (*,*)完整寫為(unit=*,fmt=*)。其中unit為輸入/輸出位置,如屏幕,文件等;fmt為 格式。如這兩項都寫成*,則按默認的方式進行,即上面描述的。print后面的*表示按默認格式輸 出。四、流程控制1、運算符(1)邏輯運算符= /= = = !Fortran 90用法.EQ. .NE. .GT. .GE. .LT. .LE. !Fortran 77用法(2)涉及相互關系的集合運算符.AND. .OR. .NOT. .EQV. .NEQV. ! 僅.NOT.連接一個表達式,其余左右兩邊都要有表達式(可以是logical類型的變量) !.EQV.:當兩邊邏輯運算值相同時為真, .NEQV.:當兩邊邏輯運算值不同時為真2、IF(1) 基本 :if(邏輯判斷式) thenend if如果then后面只有一句,可寫為if(邏輯判斷式) !then和end if可省略(2) 多重判斷:if(條件1) thenelse if(條件2)thenelse if (條件3)thenelseend if(3) 嵌套:if(邏輯判斷式) thenif(邏輯判斷式) thenif(邏輯判斷式) thenelse if(邏輯判斷式) thenelseend ifend ifend if(4) 算術判斷:program exampleimplicit nonereal cwrite (*,*) input a numberread (*,*) cif(c) 10,20,30!10,20和30為行代碼,根據(jù)c小于/等于/大于0,執(zhí)行10/20/30行的程10 write (*,*) Agoto 40!goto可實現(xiàn)跳到任意前面或后面的行代碼處,但用多了破壞程序結20 write (*,*) Bgoto 4030 write (*,*) Cgoto 4040 stopend3、SELECT CASE類似于C的switch語句select case(變量)case(數(shù)值1)! 比如case(1:5)代表1=變量=5會執(zhí)行該模塊!case(1,3,5)代表變量等于1或3或5會執(zhí)行該模塊case(數(shù)值2)!括號中數(shù)值只能是integer,character或logical型常量,不能real型case defaultend case4、PAUSE, CONTINUEpause暫停程序執(zhí)行,按enter可繼續(xù)執(zhí)行continue貌似沒什么用處,可用作封裝程序的標志五、循環(huán)1、DOdo counter=初值, 終值, 增/減量!counter的值從初值到終值按增/減量變,!counter每取一個值對應著一次循環(huán)。增/減量不寫則認為1!循環(huán)主體也沒有必要用end doFortran 77中不是用end do來終止,而是下面這樣子:do 循環(huán)最后一行的行代碼 counter=初值, 終值, 增/減量行代碼 !這是do的最后一行2、DO WHILEdo while(邏輯運算)end do類似于C中的while(邏輯運算) 。 一開始那個計算圓柱表面積的程序中,應該也算是這一類。不過它是通過內部的if語句來 控制循??磥硪彩强梢缘模贿^在這本書上沒看到這樣寫。其實應該也可以歸于下面這種。3、沒看到和C里面的dowhile(邏輯運算); 相對應的循環(huán)語句,不過可以這樣,保證至少做一循環(huán):do while(.ture.)if(邏輯運算)exit!exit就好比C里面的break。C里的continue在Fortran里是cycleend do4、Fortran的一個特色:帶署名的循環(huán) 可以這樣,不易出錯:outer: do i=1,3inner: do j=1,3end do innerend do outer還可以這樣,很方便:loop 1: do i=1,3loop2: do j=1,3if(i=3)exit loop1!exit終止整個循環(huán)loop1if(j=2)cycle loop2!cycle跳出loop2的本次循環(huán),進行l(wèi)oop2的下次循環(huán)write(*,*) i,jend do loop2end do loop1還有一些循環(huán)主要用于Fortran中的數(shù)組運算,為Fortran特有,很實用。六、數(shù)組1、數(shù)組的聲明和C不同的是,F(xiàn)ortran 中的數(shù)組元素的索引值寫在()內,且高維的也只用一個(),如integer a(5)!聲明一個整型一維數(shù)組real : b(3,6)!聲明一個實型二維數(shù)組類型可以是integer, real, character, logical或type。最高可以到7維。 數(shù)組大小必須為常數(shù)。但是和C語言不同,F(xiàn)ortran也有辦法使用大小可變的數(shù)組,方法如:integer, allocatable : a(:)!聲明小可變經過某個途徑得知所需數(shù)組大小size之后,用下面的語句:allocate(a(size)!配置內存空間之后該數(shù)組和通過一般方法聲明的數(shù)組完全相同。 與C不同,F(xiàn)ortran索引值默認為從1開始,而且可以在聲明時改變該規(guī)則:integer a(-3:1)! 索引值為-3,-2,-1,0,1integer b(2:3,-1:3)!b(23,-13)為可使用的元素2、數(shù)組在內存中的存放和C不同,F(xiàn)ortran 中的數(shù)組比如a(2,2)在內存中存放順序為a(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個元素均為5對于integer : a(2,2)=(/1,2,3,4/)根據(jù)數(shù)組元素在內存中存放的方式,等價于賦值a(1,1)=1,a(2,1)=2,a(1,2)=3,a(2,2)=4(2)利用Fortran的特色:隱含式循環(huán)。看例子就明白了。integer a(5)integer idata (a(i),i=2,4)/2,3,4/!(a(i),i=2,4)表示i從2到4循環(huán),增量為默認值1 還可以這樣:integer iinteger : a(5)=(/1,(2,i=2,4),5/)!五個元素分別賦值為1,2,2,2,5integer : b(5)=(/i, i=1,5/)!五個元素分別賦值為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)=44、操作整個數(shù)組設a,b為相同類型、維數(shù)和大小的數(shù)組a=5!所有元素賦值為5a=(/1,2,3/)!這里假設a為一維,a(1)=1,a(2)=2,a(3)=3a=b!對應元素賦值,要求a,b,c維數(shù)和大小相同,下同a=b+c a=b-c a=b*c a=b/c a=sin(b)!內部函數(shù)都可以這樣用5、操作部分數(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(:)=b(:,2)!a(1)=b(1,2),a(2)=b(2,2),以此類推6、WHEREwhere形式上類似于if,但只用于設置數(shù)組。設有兩個同樣類型、維數(shù)和大小的數(shù)組a,bwhere(a3) b=a!a中小于3的元素賦值給b對應位置的元素end where再如:where(a(1:3)/=0) c=a!略去了end where,因為只跟了一行where可嵌,也 !可類似do循環(huán)有署名標簽。7、FORALL有點像C中的for循環(huán):forall(triplet1,triplet2 ,triplet3,mask)其中triplet形如i=2:6:2,表示循環(huán),最后一個數(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ù)本 質上就是學上的函數(shù),一般要傳遞自變量給自定義函數(shù),返回函數(shù)值。子程序不一定是這樣,可 以沒有返值。傳遞參數(shù)要注意類型的對應,這跟C是一樣的。1、子程序目的:把某一段經常使用的有特定功能的程序獨立出來,可以方便調用。 習慣上一般都把子程序放在主程序結束之后。形式:subroutine name (parameter1, parameter2)!給子程序起一個有意義的名字??梢詡鬟f參數(shù),這樣可以有返回值。括號內也可以 空著,代不傳遞參數(shù)。implicit noneinteger: parameter1, parameter2!需要定義一下接收參數(shù)的類型。!接下來的程序編寫跟主程序沒有任何別。return!跟C不同,這里表示子程序執(zhí)行后回到調用它的地方繼續(xù)執(zhí)行下面的程序。不一定放在最后??梢苑旁谧映绦虻钠渌恢?,作用相同;子程序中return之后的部分不執(zhí)行。end subroutine name調用:使用call命令直接使用,不需要聲明。在調用處寫:call subroutine name(parameter1,parameter2)注意點:a.子程序之間也可相互調用。直接調用就是了,像在主程序中調用子程序一樣。b.傳遞參數(shù)的原理和C中不同。Fortran 里是傳址調用(call by address/reference),就是傳遞時用參數(shù)和子程序中接收時用的參數(shù)使用同一個地址,盡管命名可以不同。這樣如果子程序的執(zhí)行改子程序中接收參數(shù)的值,所傳遞的參數(shù)也相應發(fā)生變化。c.子程序各自內部定義的變量具有獨立性,類似于C。各自的行代碼也具有獨立性。因此各個子程序主程序中有相同的變量名、行代碼號,并不會相互影響。2、自定義函數(shù)和子程序的明顯不同在于:需要在主程序中聲明之后才能使用。調用方式也有差別。另外按照慣例用函數(shù)不去改變自變量的值。如果要改變傳遞參數(shù)的值,習慣上用子程序來做。聲明方式:real, external : function_name一般自定義函數(shù)也是放在主程序之后。形式:function function_name(parameter1, parameter2)implicit none real: parameter1, parameter2!聲明函數(shù)參數(shù)類型,這是必需的real:function_name!聲明函數(shù)返回值類型,這是必需的function_name=.!返回值的表達式returnend也可以這樣直接聲明返回值類型,簡潔些:real function function_name(parameter1, parameter2)implicit nonereal: parameter1, parameter2!這個還是必需的function_name=.!返回值表達式returnend調用:function_name(parameter1,parameter2)不需要call命令。 自定義函數(shù)可以相互調用。調用時也需要事先聲明。 總之,調用自定義函數(shù)前需要做聲明,調用子程序則不需要。3、關于函數(shù)中的變量(1)注意類型的對應。Fortran 中甚至可以傳遞數(shù)值常量,但只有跟函數(shù)定義的參數(shù)類型 對應才會到想要的結果。如call ShowReal(1.0)就必須用1.0而不是1。(2)傳遞數(shù)組參數(shù),也跟C一樣是傳地址,不過不一定是數(shù)組首地址,而可以是數(shù)組某個 指定元素地址。比如有數(shù)組a(5),調用call function(a)則傳遞a(1)的地址,調用call functio n(a(3)則遞a(3)的地址。(3)多維數(shù)組作為函數(shù)參數(shù),跟C相反的是,最后一維的大小可以不寫,其他維大小必須 寫。這決于Fortran中數(shù)組元素column major的存放方式。(4)在函數(shù)中,如果數(shù)組是接收用的參數(shù),則在聲明時可以用變量賦值它的大小,甚至可 以不指定小。例如:subroutine Array(num,size)implicit noneinteger: size integer num(size)!可以定義一個數(shù)組,其大小是通過傳遞過來的參數(shù)決定的。這很實用returnend(5)save命令:將函數(shù)中的變量值在調用之后保留下來,下次調用此函數(shù)時該變量的值就 是上次保的值。只要在定義時加上save就行:integer, save : a=1(6)傳遞函數(shù)(包括自定義函數(shù)、庫函數(shù)、子程序都是可以的)。類似于C中的函數(shù)指針需要在 主程序和調用函數(shù)的函數(shù)中都聲明作為參數(shù)傳遞的函數(shù)。如real, external : function!自定義函數(shù)real, intrinsic : sin!庫函數(shù)external sub!子程序(7)函數(shù)使用接口(interface):一段程序模塊。以下情況必需: a.函數(shù)返回值為數(shù)組 b.指定參數(shù)位置來傳遞參數(shù)時 c.所調用的函數(shù)參數(shù)個數(shù)不固定 d.輸入指標參數(shù)時 e.函數(shù)返回值為指針時。 具體用法結合例子容易看懂。例子都很長。看書吧。4、全局變量功能就不用說了。原理:根據(jù)聲明時的相對位置關系而取用,不同與C中根據(jù)變量名使用。如果在主程序中定義:integer : a,bcommon a,b!就是這樣定義全局變量的在子程序或自定義函數(shù)中定義:integer : c,dcommon c,d則a和c共用相同內存,b和d共用相同內存。全局變量太多時會很麻煩??梢园阉鼈內藶闅w類,只需在定義時在common后面加上區(qū)間名,如common /groupe1/ a,common /group2/ b。這樣使用時就不必把所有全局變量都列出來,再聲明common /groupe1/ c就可以用a、c全局變量了??梢允褂胋lock data程序模塊。在主程序和函數(shù)中不能直接使用前面提到的data命令給全局變量賦初值??梢越o它們各自賦初值;如果要使用data命令必須要這樣:block data nameimplicit noneinteger a,b,creal d,ecommon a b ccommon /group1/ d,edata a,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《尿毒癥患者的護理》課件
- 《現(xiàn)匯現(xiàn)金流估價》教學課件
- 幼兒園小班科學《認識兔子》課件
- 《國際銀行家尼爾》課件
- 城市規(guī)劃設計與課件教學互動
- 2025石油化工托盤貿易合同
- 2025上海市國內旅游合同(A版)
- 2025年事業(yè)單位綜合b類真題及答案
- 《金屬材料部分》課件2
- 2025室內設計合同范本
- 買賣合同法律知識及風險防范培訓課件
- 腦出血患者術后護理論文
- 9.2嚴格執(zhí)法 (課件+視頻)(部編版)
- 《運輸方式和交通布局與區(qū)域發(fā)展的關系》
- 建筑電氣武校剛課后參考答案
- 廣東省2024年高考物理試題(附答案解析)
- 中國南水北調集團新能源投資有限公司招聘筆試題庫2024
- 圍手術期深靜脈血栓預防的術中護理
- 工程項目成本管理的案例分析
- 合作收款合同范本
- 2024年四川省成都市中考物理試卷附答案
評論
0/150
提交評論