![§54虛參與實參之間的數(shù)據(jù)傳遞_第1頁](http://file4.renrendoc.com/view/93a46674f12071872f2705c99be0036d/93a46674f12071872f2705c99be0036d1.gif)
![§54虛參與實參之間的數(shù)據(jù)傳遞_第2頁](http://file4.renrendoc.com/view/93a46674f12071872f2705c99be0036d/93a46674f12071872f2705c99be0036d2.gif)
![§54虛參與實參之間的數(shù)據(jù)傳遞_第3頁](http://file4.renrendoc.com/view/93a46674f12071872f2705c99be0036d/93a46674f12071872f2705c99be0036d3.gif)
![§54虛參與實參之間的數(shù)據(jù)傳遞_第4頁](http://file4.renrendoc.com/view/93a46674f12071872f2705c99be0036d/93a46674f12071872f2705c99be0036d4.gif)
![§54虛參與實參之間的數(shù)據(jù)傳遞_第5頁](http://file4.renrendoc.com/view/93a46674f12071872f2705c99be0036d/93a46674f12071872f2705c99be0036d5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
§5過程§5.1概述§5.5過程的應(yīng)用舉例§5.2函數(shù)子程序§5.3子例行子程序§5.4虛參與實參之間的數(shù)據(jù)傳遞
FORTRAN90程序有且僅有一個主程序,并從主程序開始運行。§5.1概述FORTRAN90程序由一個主程序、子程序過程和模塊組成,它們都稱為程序單元。
子程序單元稱為過程,可分為函數(shù)子程序與子例行子程序,供程序中任何需要的地方調(diào)用。根據(jù)子程序與主調(diào)過程的位置關(guān)系,又分為內(nèi)部過程和外部過程。模塊單元提供了一種類型定義和過程的共享途徑?!?.2函數(shù)子程序外部函數(shù)子程序的定義方式:[type][RECURSIVE]FUNCTIONfunc(虛參表)[RESULT(result-name)]…函數(shù)體…END[Function[fun]]Func是函數(shù)名,遵守變量命名規(guī)則。如果沒有RESULT域,則函數(shù)名代表其返回值,可以有type域,并且必須在函數(shù)體內(nèi)對函數(shù)名賦值;否則,不能出現(xiàn)type域,并且必須對result-name變量賦值?!?.2.1外部函數(shù)子程序沒有RESULT域時,因為函數(shù)名代表其返回值,有類型,在沒有取消I~N規(guī)則的情況下,可沒有type域,若取消了I~N規(guī)則,或者是字符型與邏輯型函數(shù),則必須有type域。RECURSIVE表明函數(shù)Func是遞歸的:可以直接或間接地調(diào)用自己。虛參表列出了函數(shù)的所有自變量(也叫形式參數(shù)),形式參數(shù)之間用逗號隔開。函數(shù)子程序可沒有形參,但括號必須寫。虛參和result-name變量的類型在函數(shù)體中說明。與數(shù)學(xué)函數(shù)不同,虛參不僅可以從主調(diào)過程傳值到函數(shù)過程中,而且可以向主調(diào)過程傳回值,甚至可以雙向傳值。缺省情況下,虛參是雙向傳值的,可以在虛參說明時指定其INTENT屬性,也可直接用INTENT說明其傳值方式:IN|OUT|INOUTFUNCTIONTRY(X,Y)REAL,INTENT(IN)::XINTENT(INOUT)::YY=X+3*YTRY=Y*5END例:判斷整數(shù)n是否為素數(shù),邏輯型函數(shù)logicalfunctionprime(n)prime=.true.doI=2,sqrt(real(n))if(mod(n,I)==0)thenprime=.false.exitenddoend例:計算整數(shù)n的階乘,數(shù)值型函數(shù)用循環(huán)實現(xiàn)的函數(shù)FunctionFact(n)result(f)real::ff=1doI=2,nF=F*Ienddoendfunctionfact主程序read*,ms=fact(m)print*,m,send例:計算整數(shù)n的階乘,數(shù)值型函數(shù)!用遞歸方法設(shè)計的函數(shù):recursiveFunctionFact(n)result(f)real::fif(n<=1)thenf=1elsef=fact(n-1)*nendifendfunctionfact!主程序:read*,ns=fact(n)print*,n,send調(diào)用格式:函數(shù)子程序名(實參表)必須在主調(diào)程序中正確說明函數(shù)類型。表達式能出現(xiàn)的地方,函數(shù)調(diào)用就能出現(xiàn)。實參與形參必須按類型與順序一一對應(yīng),但其名字可以不同?!?.2.2外部函數(shù)子程序的調(diào)用例:在x=5.0,5.2,…6.8處,計算對應(yīng)的一次至五次多項式functionFn(n,x)realx;integernfn=0;Xi=1.0DoI=1,nS=sum(I)Xi=Xi*XFn=fn+XI/senddoendFunctionsum(k)Sum=0.0Doj=1,kSum=sum+jEnddoend標(biāo)號2語句一行寫得下主調(diào)程序REALA(5)write(*,2)DoX=5.0,6.8,0.2DoI=1,5;A(I)=Fn(I,X);enddowrite(*,1)x,(a(I),i=1,5)Enddo1Format(1x,6F12.4)2Format(8x,'Xi',10x,'F1',10x,'F2',10x,'F3',10x,'F4',10x,'F5')END§5.2.3內(nèi)部函數(shù)子程序內(nèi)部函數(shù)子程序的定義方式:Contains[type][RECURSIVE]FUNCTIONfunc(虛參表)[RESULT(result-name)]…函數(shù)體…END[Function[fun]]Contains語句是內(nèi)部過程的引導(dǎo)語句,表明以下是一個完整的內(nèi)部過程定義。含有內(nèi)部過程的程序單元稱為宿主,可以是主程序,外部過程和模塊。但是,內(nèi)部過程不能作為宿主。內(nèi)部過程中說明的變量只局限于該過程,是局部數(shù)據(jù),其宿主或其他外部過程與模塊均不能訪問。宿主程序的說明語句與數(shù)據(jù)定義,是全局數(shù)據(jù),內(nèi)部過程中都可以使用,并且內(nèi)部過程對這些數(shù)據(jù)的賦值對宿主程序也有效。當(dāng)局部數(shù)據(jù)與全局數(shù)據(jù)同名時,局部數(shù)據(jù)屏蔽全局數(shù)據(jù)。在內(nèi)部過程中對變量的使用與賦值都只與局部變量有關(guān)。內(nèi)部過程必須放在宿主程序的最后。宿主程序只有一條END語句在內(nèi)部過程的后面。例:對于函數(shù)已知a,b,c,計算三點函數(shù)值的平均值read*,a,b,cprint*,(f(a)+f(b)+f(c))/3ContainsFUNCTIONF(X)Result(r)REALx,r,ar=x*xif(-1<x.and.x<1)r=r+sqrt(1+r)EndfunctionFEnd§5.3子例行程序子例行程序的定義:Subrotine子例行程序名([虛參表])…過程體…END[Subrotine[子例行程序名]]如果沒有參數(shù),則定義格式中()可有可無?!?.3.1外部子例行程序子例行程序調(diào)用方法:CALL子例行程序名(實參表)CALL子例行程序名()CALL子例行程序名后兩種是沒有參數(shù)的情形例:根據(jù)三角形三邊長度計算其面積。SubroutineTriangle(Area,a,b,c)Real,Intent(in)::a,b,cReal,Intent(out)::AreaRealss=(a+b+c)*0.5Area=Sqrt(s*(s-a)*(s-b)*(s-c))EndSubroutineTriangleabcdefg當(dāng)然,本例用函數(shù)過程會更方便些。FunctionTriang(a,b,c)result(Area)s=(a+b+c)*0.5Area=Sqrt(s*(s-a)*(s-b)*(s-c))End排序等算法中經(jīng)常要交換兩個數(shù)的值例:交換兩個實數(shù)的值Subroutineswap_real(a,b)Real,Intent(inout)::a,bRealTT=AA=BB=TENDSubroutine內(nèi)部子例行程序的定義:ContainsSubrotine子例行程序名([虛參表])…過程體…END[Subrotine[子例行程序名]]關(guān)于內(nèi)部函數(shù)過程的“內(nèi)部”屬性的討論同樣適用于內(nèi)部子例行程序;內(nèi)部子例行程序的定義與使用方法和關(guān)于外部子例行程序的區(qū)別只在于它是內(nèi)部過程:只能由其宿主調(diào)用。§5.3.2內(nèi)部子例行程序例:求一元二次方程AX2+BX+C=0的二個實根。程序為:Programsubprogramimplicitnonereala,b,c,x1,x2read*,a,b,ccallroot(a,b,c,x1,x2)write(*,10)x1,x210format(1x,’x1=’,f10.2,’x2=’,f10.2)containssubroutineroot(a,b,c,x1,x2)reala,b,c,x1,x2,p,qp=-b/(2.0*a)q=sqrt(b*b-4*a*c)/2.0/ax1=p+qx2=p-qendsubroutineendSubroutineBubble(A,N) DIMENSIONA(N)DOI=1,N-1DOJ=N,I+1,-1if(a(j)<a(j-1))callswap(a(j),a(j-1))EndDoEndDoEND例:對一組實型數(shù)據(jù)進行冒泡排序子程序可以調(diào)用其他子程序
例:置n維向量B=ASubroutinecopyab(a,b,n)DIMENSIONA(N),b(N)doI=1,n;B(I)=A(I);ENDDoend在矩陣運算中會有用的例:置n階單位矩陣ASubroutineIden(a,n)DimensionA(N,N)doI=1,nDoj=1,n;A(I,J)=I/J*J/I;ENDDOENDDOend不推薦使用這種技巧實參可以是常數(shù)、表達式、變量和數(shù)組元素。
如果實參是變量或數(shù)組元素,虛參與實參共用相同的存儲單元,虛參值的改變會影響實參的值;若實參是常量或表達式,則以實參的值傳給虛參,虛參在過程里不能被重新賦值?!?.4子程序的參數(shù)傳遞
subroutinet(a,b,c)reala,b,c;c=b+a;print*,a,b,c;endread*,b,c;callt(5,b,c);print*,b,c;end§5.4.1變量作為虛參
如果實參是字符型變量,則虛參的長度不能大于實參的長度,或者干脆用*表示虛參的長度不定。Character(len=8)::s1,s2Callcha(s1,s2)Print*,’s1=’,s1,’s2=’,s2ContainsSubroutinecha(s,r)Character(5)::s,r*(*)S=’china’R=’anhui’EndSubroutineend虛參是字符型變量時,可定義其長度為*,表示可變長度字符串:Character*(*)string子程序的虛參數(shù)也可以是子程序,這使一些通用算法的程序真正“通用”。調(diào)用子程序時,實參與虛參必須按類型與順序一一對應(yīng)。虛參名是局部變量,僅供子程序內(nèi)部使用。子程序作虛參時,對應(yīng)的實參必須是同類型的子程序或內(nèi)部函數(shù)。作為實參的函數(shù)子程序或子例行子程序,需用EXTERNAL語句說明;而內(nèi)部函數(shù),需用INTRINSIC說明。例:編寫程序計算一個角度的正切和余切值.Functiontriangle(x,f1,f2)result(tria_result)realx,tria_resulttria_result=f1(x)/f2(x)EndFunctiontriangleProgrammainIntrinsicsin,cosReal::x,yi,y2,pi=3.1415926X=pi/5Y1=triangle(x,sin,cos)Y2=triangle(x,cos,sin)Print*,y1,y2EndProgrammain例:求程序為:Programexamimplicitnoneintegerm,n,krealpread*,m,np=0.0dok=m,np=p+fun(k)enddo
write(*,*)’p=’,pcontainsfunctionfun(n)integern,I;realfunfun=1.0doI=2,nfun=fun*Ienddoendfunctionfunend計算Functionsum(m,mm)realsumsum=0.0doI=m,mmsum=sum+sqrt(real(I))enddoendProgramexamRead*,nSi=sum(1,n)S=sum(n+1,int(si))Print*,send§5.4.2數(shù)組作為虛參實參可以是數(shù)組名或數(shù)組元素。如果是數(shù)組名,則相當(dāng)于該數(shù)組的第一個元素(或第一個字符)。實參與虛參從這個元素(字符)開始逐個匹配。虛參與實參共用儲存單元。
在子程序中作為虛參數(shù)的數(shù)組,其每一維的大小可用變量表示,稱為可調(diào)數(shù)組??烧{(diào)數(shù)組只能作為子程序的虛參數(shù)使用。其它情況下不允許使用可調(diào)數(shù)組。表示可調(diào)數(shù)組大小的變量須放在形參表中或COMMON語句中。可調(diào)數(shù)組最后一維的上界可用*表示??烧{(diào)數(shù)組真實大小由調(diào)用時的實參確定。計算數(shù)量時,數(shù)值型與邏輯型數(shù)組以元素為單位,而字符型數(shù)組則以字符為單位。數(shù)組作虛參時,實參的維數(shù)與下標(biāo)界限可以與虛參不同,這個特性需要在掌握的前提下靈活使用,它能帶來方便,也能帶來混亂。對于初學(xué)者,建議最好不要這樣做。例如:將數(shù)組A(M,N)的內(nèi)容拷貝到B(M,N)中,可以用CALLCOPYAB(A,B,M*N)調(diào)用前面介紹的子程序copyab()來實現(xiàn)。
實參不得少于虛參。建議用可調(diào)數(shù)組。例:將百分制成績轉(zhuǎn)換成等級分。等級分每十分為一檔:90以上為“A”等;60分以上為‘D’等;60分以下統(tǒng)一記為“E”等?!?.5過程的應(yīng)用舉例functionLevel(score)result(CL)characterCL;integerkK=score/10;If(k>9)k=9;If(k<5)k=5CL=char(ichar('A')+9-k)ENDcharacterLevelread(*,*)s;write(*,*)Level(s)END例:矩陣乘法Subroutinemap(a,b,c,m,n,k)dimensiona(m,n),b(n,k),c(m,k)doi=1,mdoj=1,kc(I,j)=0doL=1,nc(I,j)=c(I,j)+a(I,L)*b(L,j)enddoEnddoEnddoEnd例:求方陣所有元素的和以及主對角線元素的積。Subroutinespa(A,N,S,P)DimensionA(N,N)Real,Intent(out)::s,pS=0P=1DOI=1,nP=P*A(I,I)DOJ=1,NS=S+A(I,J)ENDdoEnddoEnd例:打印N
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 個人借款質(zhì)押合同書樣本
- 專用線鐵路物流服務(wù)合同細則
- 個人與企業(yè)租賃合同范本大全
- 采購標(biāo)準(zhǔn)合同書
- 專業(yè)講師聘任合同范本
- 萬畝高標(biāo)準(zhǔn)農(nóng)田建設(shè)項目合同
- 業(yè)務(wù)承包合同書正式版
- 個人借款合同典范:版
- 上海市商品房買賣合同范本
- 專業(yè)測量儀器租賃合同模板
- 重慶市2025屆高三第一次聯(lián)合診斷檢測英語試卷(含解析含聽力原文無音頻)
- 《榜樣9》觀后感心得體會二
- 天津市部分區(qū)2024-2025學(xué)年九年級(上)期末物理試卷(含答案)
- 一氧化碳中毒培訓(xùn)
- 保潔服務(wù)質(zhì)量與服務(wù)意識的培訓(xùn)
- 突發(fā)公共衛(wèi)生事件衛(wèi)生應(yīng)急
- 《景觀設(shè)計》課件
- 會所股東合作協(xié)議書范文范本
- 人教版(2024)七年級上冊英語期中復(fù)習(xí)單項選擇100題(含答案)
- 2024年胡麻油市場前景分析:全球胡麻油市場規(guī)模達到了25.55億美元
- 小學(xué)英語800詞分類(默寫用)
評論
0/150
提交評論