版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
§5過程§5.1概述§5.5過程的應(yīng)用舉例§5.2函數(shù)子程序§5.3子例行子程序§5.4虛參與實(shí)參之間的數(shù)據(jù)傳遞
FORTRAN90程序有且僅有一個(gè)主程序,并從主程序開始運(yùn)行?!?.1概述FORTRAN90程序由一個(gè)主程序、子程序過程和模塊組成,它們都稱為程序單元。
子程序單元稱為過程,可分為函數(shù)子程序與子例行子程序,供程序中任何需要的地方調(diào)用。根據(jù)子程序與主調(diào)過程的位置關(guān)系,又分為內(nèi)部過程和外部過程。模塊單元提供了一種類型定義和過程的共享途徑。§5.2函數(shù)子程序外部函數(shù)子程序的定義方式:[type][RECURSIVE]FUNCTIONfunc(虛參表)[RESULT(result-name)]…函數(shù)體…END[Function[fun]]Func是函數(shù)名,遵守變量命名規(guī)則。如果沒有RESULT域,則函數(shù)名代表其返回值,可以有type域,并且必須在函數(shù)體內(nèi)對(duì)函數(shù)名賦值;否則,不能出現(xiàn)type域,并且必須對(duì)result-name變量賦值。§5.2.1外部函數(shù)子程序沒有RESULT域時(shí),因?yàn)楹瘮?shù)名代表其返回值,有類型,在沒有取消I~N規(guī)則的情況下,可沒有type域,若取消了I~N規(guī)則,或者是字符型與邏輯型函數(shù),則必須有type域。RECURSIVE表明函數(shù)Func是遞歸的:可以直接或間接地調(diào)用自己。虛參表列出了函數(shù)的所有自變量(也叫形式參數(shù)),形式參數(shù)之間用逗號(hào)隔開。函數(shù)子程序可沒有形參,但括號(hào)必須寫。虛參和result-name變量的類型在函數(shù)體中說明。與數(shù)學(xué)函數(shù)不同,虛參不僅可以從主調(diào)過程傳值到函數(shù)過程中,而且可以向主調(diào)過程傳回值,甚至可以雙向傳值。缺省情況下,虛參是雙向傳值的,可以在虛參說明時(shí)指定其INTENT屬性,也可直接用INTENT說明其傳值方式:IN|OUT|INOUTFUNCTIONTRY(X,Y)REAL,INTENT(IN)::XINTENT(INOUT)::YY=X+3*YTRY=Y*5END例:判斷整數(shù)n是否為素?cái)?shù),邏輯型函數(shù)logicalfunctionprime(n)prime=.true.doI=2,sqrt(real(n))if(mod(n,I)==0)thenprime=.false.exitenddoend例:計(jì)算整數(shù)n的階乘,數(shù)值型函數(shù)用循環(huán)實(shí)現(xiàn)的函數(shù)FunctionFact(n)result(f)real::ff=1doI=2,nF=F*Ienddoendfunctionfact主程序read*,ms=fact(m)print*,m,send例:計(jì)算整數(shù)n的階乘,數(shù)值型函數(shù)!用遞歸方法設(shè)計(jì)的函數(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ù)子程序名(實(shí)參表)必須在主調(diào)程序中正確說明函數(shù)類型。表達(dá)式能出現(xiàn)的地方,函數(shù)調(diào)用就能出現(xiàn)。實(shí)參與形參必須按類型與順序一一對(duì)應(yīng),但其名字可以不同。§5.2.2外部函數(shù)子程序的調(diào)用例:在x=5.0,5.2,…6.8處,計(jì)算對(duì)應(yīng)的一次至五次多項(xià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)號(hà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)語句,表明以下是一個(gè)完整的內(nèi)部過程定義。含有內(nèi)部過程的程序單元稱為宿主,可以是主程序,外部過程和模塊。但是,內(nèi)部過程不能作為宿主。內(nèi)部過程中說明的變量只局限于該過程,是局部數(shù)據(jù),其宿主或其他外部過程與模塊均不能訪問。宿主程序的說明語句與數(shù)據(jù)定義,是全局?jǐn)?shù)據(jù),內(nèi)部過程中都可以使用,并且內(nèi)部過程對(duì)這些數(shù)據(jù)的賦值對(duì)宿主程序也有效。當(dāng)局部數(shù)據(jù)與全局?jǐn)?shù)據(jù)同名時(shí),局部數(shù)據(jù)屏蔽全局?jǐn)?shù)據(jù)。在內(nèi)部過程中對(duì)變量的使用與賦值都只與局部變量有關(guān)。內(nèi)部過程必須放在宿主程序的最后。宿主程序只有一條END語句在內(nèi)部過程的后面。例:對(duì)于函數(shù)已知a,b,c,計(jì)算三點(diǎn)函數(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子例行程序名(實(shí)參表)CALL子例行程序名()CALL子例行程序名后兩種是沒有參數(shù)的情形例:根據(jù)三角形三邊長(zhǎng)度計(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ù)過程會(huì)更方便些。FunctionTriang(a,b,c)result(Area)s=(a+b+c)*0.5Area=Sqrt(s*(s-a)*(s-b)*(s-c))End排序等算法中經(jīng)常要交換兩個(gè)數(shù)的值例:交換兩個(gè)實(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)用?!?.3.2內(nèi)部子例行程序例:求一元二次方程AX2+BX+C=0的二個(gè)實(shí)根。程序?yàn)椋篜rogramsubprogramimplicitnonereala,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例:對(duì)一組實(shí)型數(shù)據(jù)進(jìn)行冒泡排序子程序可以調(diào)用其他子程序
例:置n維向量B=ASubroutinecopyab(a,b,n)DIMENSIONA(N),b(N)doI=1,n;B(I)=A(I);ENDDoend在矩陣運(yùn)算中會(huì)有用的例:置n階單位矩陣ASubroutineIden(a,n)DimensionA(N,N)doI=1,nDoj=1,n;A(I,J)=I/J*J/I;ENDDOENDDOend不推薦使用這種技巧實(shí)參可以是常數(shù)、表達(dá)式、變量和數(shù)組元素。
如果實(shí)參是變量或數(shù)組元素,虛參與實(shí)參共用相同的存儲(chǔ)單元,虛參值的改變會(huì)影響實(shí)參的值;若實(shí)參是常量或表達(dá)式,則以實(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變量作為虛參
如果實(shí)參是字符型變量,則虛參的長(zhǎng)度不能大于實(shí)參的長(zhǎng)度,或者干脆用*表示虛參的長(zhǎng)度不定。Character(len=8)::s1,s2Callcha(s1,s2)Print*,’s1=’,s1,’s2=’,s2ContainsSubroutinecha(s,r)Character(5)::s,r*(*)S=’china’R=’anhui’EndSubroutineend虛參是字符型變量時(shí),可定義其長(zhǎng)度為*,表示可變長(zhǎng)度字符串:Character*(*)string子程序的虛參數(shù)也可以是子程序,這使一些通用算法的程序真正“通用”。調(diào)用子程序時(shí),實(shí)參與虛參必須按類型與順序一一對(duì)應(yīng)。虛參名是局部變量,僅供子程序內(nèi)部使用。子程序作虛參時(shí),對(duì)應(yīng)的實(shí)參必須是同類型的子程序或內(nèi)部函數(shù)。作為實(shí)參的函數(shù)子程序或子例行子程序,需用EXTERNAL語句說明;而內(nèi)部函數(shù),需用INTRINSIC說明。例:編寫程序計(jì)算一個(gè)角度的正切和余切值.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例:求程序?yàn)椋篜rogramexamimplicitnoneintegerm,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計(jì)算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ù)組元素。如果是數(shù)組名,則相當(dāng)于該數(shù)組的第一個(gè)元素(或第一個(gè)字符)。實(shí)參與虛參從這個(gè)元素(字符)開始逐個(gè)匹配。虛參與實(shí)參共用儲(chǔ)存單元。
在子程序中作為虛參數(shù)的數(shù)組,其每一維的大小可用變量表示,稱為可調(diào)數(shù)組。可調(diào)數(shù)組只能作為子程序的虛參數(shù)使用。其它情況下不允許使用可調(diào)數(shù)組。表示可調(diào)數(shù)組大小的變量須放在形參表中或COMMON語句中??烧{(diào)數(shù)組最后一維的上界可用*表示??烧{(diào)數(shù)組真實(shí)大小由調(diào)用時(shí)的實(shí)參確定。計(jì)算數(shù)量時(shí),數(shù)值型與邏輯型數(shù)組以元素為單位,而字符型數(shù)組則以字符為單位。數(shù)組作虛參時(shí),實(shí)參的維數(shù)與下標(biāo)界限可以與虛參不同,這個(gè)特性需要在掌握的前提下靈活使用,它能帶來方便,也能帶來混亂。對(duì)于初學(xué)者,建議最好不要這樣做。例如:將數(shù)組A(M,N)的內(nèi)容拷貝到B(M,N)中,可以用CALLCOPYAB(A,B,M*N)調(diào)用前面介紹的子程序copyab()來實(shí)現(xiàn)。
實(shí)參不得少于虛參。建議用可調(diào)數(shù)組。例:將百分制成績(jī)轉(zhuǎn)換成等級(jí)分。等級(jí)分每十分為一檔: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例:求方陣所有元素的和以及主對(duì)角線元素的積。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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度場(chǎng)營(yíng)銷分公司智慧城市項(xiàng)目合作協(xié)議3篇
- 二零二五版商業(yè)街區(qū)場(chǎng)地租賃合作協(xié)議書6篇
- 2025年度高新技術(shù)產(chǎn)業(yè)常年法律顧問聘用協(xié)議3篇
- 二零二五年度企業(yè)稅收籌劃與稅收籌劃實(shí)施合同3篇
- 二零二五年度出口退稅證明開具及國(guó)際金融服務(wù)合同3篇
- 二零二五年度港口碼頭租賃及港口貨物裝卸、倉(cāng)儲(chǔ)及配送服務(wù)協(xié)議8篇
- 二零二五年度土地承包經(jīng)營(yíng)權(quán)糾紛調(diào)解合同-@-2
- 2025草原禁牧與水資源保護(hù)管理協(xié)議合同3篇
- 2025年度個(gè)人個(gè)人借款合同信用評(píng)估標(biāo)準(zhǔn)3篇
- 二零二五食用油產(chǎn)品包裝設(shè)計(jì)與印刷合同
- 中考模擬考試化學(xué)試卷與答案解析(共三套)
- 新人教版五年級(jí)小學(xué)數(shù)學(xué)全冊(cè)奧數(shù)(含答案)
- 風(fēng)電場(chǎng)升壓站培訓(xùn)課件
- 收納盒注塑模具設(shè)計(jì)(論文-任務(wù)書-開題報(bào)告-圖紙)
- 博弈論全套課件
- CONSORT2010流程圖(FlowDiagram)【模板】文檔
- 腦電信號(hào)處理與特征提取
- 高中數(shù)學(xué)知識(shí)點(diǎn)全總結(jié)(電子版)
- GB/T 10322.7-2004鐵礦石粒度分布的篩分測(cè)定
- 2023新譯林版新教材高中英語必修一重點(diǎn)詞組歸納總結(jié)
- 蘇教版四年級(jí)數(shù)學(xué)下冊(cè)第3單元第2課時(shí)“常見的數(shù)量關(guān)系”教案
評(píng)論
0/150
提交評(píng)論