FORTRAN語言第8章(共8章).ppt_第1頁
FORTRAN語言第8章(共8章).ppt_第2頁
FORTRAN語言第8章(共8章).ppt_第3頁
FORTRAN語言第8章(共8章).ppt_第4頁
FORTRAN語言第8章(共8章).ppt_第5頁
已閱讀5頁,還剩83頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第八講 子程序,在程序設(shè)計中,常會遇到某些程序段需多次重復使用,為此,將這些需要重復使用的程序段單獨編制成子程序,該子程序用以實現(xiàn)某些特定功能(例如:計算平均值、計算方差等)并可供其它程序單元多次調(diào)用,以處理不同的數(shù)據(jù)。,第八講 子程序,Fortran的應(yīng)用程序一般由一個主程序和若干個子程序組成。主程序或子程序分別是一個獨立的程序單元。主程序單元為Fortran應(yīng)用程序提供程序執(zhí)行的入口。Fortran應(yīng)用程序必須有一個且只能有一個主程序單元。主程序單元可以調(diào)用子程序單元,各子程序單元之間也可互相調(diào)用。調(diào)用子程序的程序單元稱為調(diào)用程序單元,被調(diào)用的子程序單元稱為被調(diào)用程序單元 。,第八講 子程

2、序,Fortran的子程序單元有函數(shù)子程序、子例行程序和數(shù)據(jù)塊子程序。 函數(shù)子程序單元用以計算一個值。 子例行程序單元不僅可以計算一個或一批值,還可進行某些非數(shù)值計算。 數(shù)據(jù)塊子程序單元用以給公用區(qū)中的數(shù)據(jù)賦初值。,第八講 子程序,8.1 語句函數(shù),8.5 可調(diào)數(shù)組,8.2 函數(shù)子程序,8.3 子例行子程序,8.4 虛實結(jié)合,8.6 程序舉例,8.1語句函數(shù),語句函數(shù)通過一句代碼定義來實現(xiàn)某種特定的處理功能,它是Fortran 77時代的遺留產(chǎn)物。嚴格來說,語句函數(shù)不屬于程序單元的范疇。但是在實際應(yīng)用中,語句函數(shù)以其靈活的應(yīng)用、小巧的結(jié)構(gòu)在程序中發(fā)揮著重要的作用。 在實際的編程過程中,程序員往

3、往會遇到這種情況:一些簡單的函數(shù)會在一個程序單元中的不同地方重復用到,而Fortran系統(tǒng)并不提供這種內(nèi)部函數(shù)。此時可采用語句函數(shù)。,一、語句函數(shù)的概念,引例:計算W0.2P(X)+0.3P(Y)+0.5P(Z) 其中P(T)=0.812T3+1.256T2-3.378T+0.689,WRITE(*,*)請輸入X,Y,Z的值: READ(*,*)X,Y,Z P1 0.812*X*3+1.256*X*2-3.378*X+0.689 P2 0.812*Y*3+1.256*Y*2-3.378*Y+0.689 P3 0.812*Z*3+1.256*Z*2-3.378*Z+0.689 W0.2*P1+0

4、.3*P2+0.5*P3 WRITE(*,*)W END,如果能定義一個函數(shù)p(t),然后分別使用x,y,z等參數(shù)來調(diào)用p(t),將會有效簡化程序量:,P(T) 0.812*T*3+1.256*T*2-3.378*T+0.689 WRITE(*,*)請輸入X,Y,Z的值: READ(*,*)X,Y,Z P1P(X) P2 P(Y) P3 P(Z) W0.2*P1+0.3*P2+0.5*P3 WRITE(*,*)W,W END,注意:只有當函數(shù)可以用一個表達式表示時才能定義成語句函數(shù),而對于那些不能用表達式表示的功能或分段表示的函數(shù)是不能定義成FORTRAN語句函數(shù)的。,在程序中有時可能在好幾處

5、需要進行同樣的某種表達式計算,而這種計算又不是某個內(nèi)部函數(shù)所能完成的,這時,程序設(shè)計者可以自已來定義一個語句函數(shù),通過引用語句函數(shù)來實現(xiàn)這種特殊運算。,二、語句函數(shù)的定義,語句函數(shù)定義的形式: f_name(x,x)=e,使用規(guī)定,1)語句函數(shù)定義語句必須位于該程序段的說明語句之后,第一個可執(zhí)行語句之前。它是非執(zhí)行語句。,2)語句函數(shù)名的命名規(guī)則與變量名相同,若語句函數(shù)前面沒有用類型說明語句進行顯式說明,則語句函數(shù)的返回值遵循默認的IN規(guī)則。在一個程序單位內(nèi),語句函數(shù)名不能與其它名字(如變量名、數(shù)組名等)相同。,使用規(guī)定,3)語句函數(shù)定義中的虛參只能是變量名,不能是常量、表達式或數(shù)組元素,虛參

6、表中的各虛參之間用逗號分隔,各虛參不能同名,虛參的類型說明與變量相同。由于虛參不代表實在的變量,因此虛參名可以與程序中的其他變量同名。 4)語句函數(shù)中的虛擬參數(shù),本身沒有具體的數(shù)值。只有當程序中的語句函數(shù)被引用時,用實際的變量(實參)代替虛參的情況下,才能得到語句函數(shù)的返回值。,F(X)=X*X+2*X X=3.0 Z=F(1.0)+F(X) WRITE(*,*)X END,5)e是含有x1,x2,xn的表達式,在這個表達式中,除必須包含有關(guān)虛參外,還可以包含常量,變量,外部和內(nèi)部函數(shù)和已定義過的語句函數(shù)。語句函數(shù)通過表達式得到一個函數(shù)值,此函數(shù)值的類型必須與函數(shù)名的類型一致。,6)語句函數(shù)的

7、類型即是語句函數(shù)名的類型,當需要用類型說明語句說明語句函數(shù)名的類型時,其類型說明語句必須在語句函數(shù)的定義之前。語句函數(shù)只能在定義它的程序段使用。,使用規(guī)定,三、語句函數(shù)的引用,語句函數(shù)的引用就是對語句函數(shù)定義的使用。它和內(nèi)部函數(shù)一樣,總是在表達式中作為一個運算分量或單獨作為一個表達式出現(xiàn)。它的一般引用形式為: f_name( a1,a2),注:實參的個數(shù)、類型及排列順序必須 與相應(yīng)的形參一致!,FORTRAN允許在語句函數(shù)定義中沒有形參,此時在引用時也不能有實參,但一對括號不能省略。 語句函數(shù)的引用可以嵌套。,CONST( )=SQRT(2.0)+SQRT(3.0) A=CONST( ),三、

8、語句函數(shù)的引用,三、語句函數(shù)的引用,REALA,B,C SUM(A,B,C)A+B*B+C*3 DATAA,B,C/ 1.0,2.0,3.0/ Y1SUM(0.5,0.7,0.8) Y2SUM(2*A,B,C) Y3SUM(C,B,A) ZY1+Y2+Y3 WRITE(*,*)Y1,Y2,Y3,Z END,Y10.5+0.72+0.83,Y22.0+2.02+3.03,Y13.0+2.02+1.03,語句函數(shù)的引用過程,當程序執(zhí)行到一個語句函數(shù)的引用時,要經(jīng)過下列幾個過程:, 當實元為表達式時,先求出表達式的值,然后控制轉(zhuǎn)到語句函數(shù)定義語句去執(zhí)行;, 實元和對應(yīng)的虛元進行結(jié)合,即實元的值傳給虛

9、元(稱為虛實結(jié)合過程);, 求表達式e的值;,這一過程是由計算機系統(tǒng)來完成的,用戶可不必擔心。, 根據(jù)語句函數(shù)名的類型和表達式e求值結(jié)果,按賦值規(guī)則得到函數(shù)引用的值由函數(shù)名帶回,并控制返回到原表達式函數(shù)引用處,繼續(xù)計算表達式值。,語句函數(shù)的引用過程,三、語句函數(shù)的引用,DATAA/ 2.0/ F(X)X+1 BF(F(F(A) WRITE(*,*)B END,F(F(F(2.0),F(F(3.0),F(4.0),例1 :二分法:,1、基本思路:把區(qū)間(x1,x2)二 等分,找到中點x求出f(x)值,然后 判斷f(x)和f(x1)是否同號,如同 號則說明根在(x,x2)區(qū)間,否則, 根在(x,x

10、1)區(qū)間。依次方法對有根 區(qū)間再折半,直到滿足條件為止。,例:用二分法求f(x)=x3-6x-1=0在x=2附近的一個實根 區(qū)間為x1=0,x2=5,x,y,x1,x2,x,f(x1),f(x),f(x2),0,F(X)=X*3-6.0*X-1.0 100 READ(*,*)X1,X2 FX1=F(X1) FX2=F(X2) IF(FX1*FX2.GT.0.0)GOTO 100 10 X=(X1+X2)/2.0 FX=F(X) IF(SIGN(FX,FX1).EQ.FX)THEN X1=X FX1=FX END IF IF(SIGN(FX,FX2).EQ.FX)THEN X2=X FX2=FX

11、 END IF IF(ABS(X1-X2).GT.1E-5).AND.(ABS(FX).GT.1E-6) & GOTO 10 IF(FX.GT.1E-6)X=(X1+X2)/2.0 WRITE(*,*)X END,SIGN(x1,x2)是符號傳遞函數(shù),函數(shù)值取x2的的符號,取x1的絕對值,算法:弦截法的基本思路與“二分法” 相似,它是取f(x1)與f(x2)連線與x軸的 交點x,從(x1,x)與(x,x2)兩個區(qū)間中舍 去一個,舍取的方法為: 1、如果f(x)與f(x1)異號,則用x作為新 的x2,這就舍去了原來的(x,x2)區(qū)間。 2、如果f(x)與f(x1)同號,則用x作為新 的x1,這就

12、舍去了原來的(x1,x)區(qū)間。 如果f(x1)與f(x2)異號,則它們之間的連線必然交x軸于x點 有x=x2-(x2-x1)*f(x2)/(f(x2)-f(x1) 3、再根據(jù)新的x1,x2,找到與x軸的交點x,重復上述步驟。,例 2:用語句函數(shù)采用弦截法求X3-2X2-7X+4=0的根。,LOGICAL S F(X)=X*3-2.0*X*2-7.0*X+4.0 S(A,B)=SIGN(A,B).EQ.A 10 READ(*,*)X1,X2 F1=F(X1) F2=F(X2) IF(S(F1,F2)GOTO 10 F0=1.0 20 IF(ABS(X1-X2).GT.1E-5).AND.(ABS

13、(F0).GT.1E-6)THEN X=X2-(X2-X1)/(F2-F1)*F2 F0=F(X) IF(S(F0,F1)THEN X1=X F1=F0 END IF,IF(S(F0,F2)THEN X2=X F2=F0 END IF GOTO 20 END IF IF(ABS(F0).GT.1E-6)X=(X1+X2)/2.0 WRITE(*,*)X END,語句函數(shù)小結(jié):, 語句函數(shù)必須先定義,后引用。且語句函數(shù)只可在包含該語句函數(shù)定義的程序單位中引用,即不能引用其他程序單位所定義的語句函數(shù)。, 語句函數(shù)定義語句是非執(zhí)行語句。它應(yīng)該放在所有可執(zhí)行語句之前和有關(guān)的類型說明語句之后。, 語句函

14、數(shù)定義中的函數(shù)名和虛元是具有類型的,可以用類型說明語句說明其類型 或按隱含約定確定其類型。如:,INTEGER G, X, Y,G(X,Y,N) = X*X+N*Y,以上語句說明G函數(shù)是整型函數(shù),即函數(shù)值為整型,且說明虛元X,Y為整型,隱含約定N為整型。,語句函數(shù)小結(jié):, 在語句函數(shù)定義的語句中,也可出現(xiàn)其他的語句函數(shù)引用,但被引用的語句函和須在它前面已定義。不允許引用自身或在它后面定義的語句函數(shù)。,例:S(A, B, C) = (A+B+C) / 2.0,PP (A, B, C) = SQRT (S(A, B, C) A),PP 函數(shù)引用了它前面所定義的S函數(shù),語句函數(shù)小結(jié):, 引用語句函數(shù)

15、時,給定的實元必須和對應(yīng)的虛元個數(shù)相等,類型一致,位置相符。在進行虛實結(jié)合時,虛元與實元不是以名字相同傳值,而是按位置類型一一傳值。,語句函數(shù)小結(jié):,例:,F(X) =XXX1.0,X =3.0,Y=(X+3.0)/2.0,Z=F(1.0)+F(2.0)+F(3.0),T=F(X), 在同一程序單位中不允許變量名與函數(shù)名同名,但允許變量與虛元同名。,程序第一行的X是語句函數(shù)的虛擬參數(shù),第二行的X是變量名,它們彼此獨立,無任何關(guān)系。第三行計算出Y的值等于2.0。第四行引用語句函數(shù),分別將1.0,2.0,3.0代替語句函數(shù)定義語句中右邊表達式的X,計算出F(1.0),F(2.0),F(3.0)。第

16、五行F(x)中的X是變量名,其值為3.0,此時F(X)相當于F(3.0),8.2 函數(shù)子程序(外部函數(shù)),語句函數(shù)只能用一個語句定義,而且只能在定義它的程序段中使用。,分析:函數(shù)f(X)是用兩個表達式定義的,不能用簡單的語句函數(shù)來表示。怎么辦?FORTRAN提供了一種方法,就是把函數(shù)的計算部份從程序中獨立出來,并按一定的格式編成一個單獨的子程序段,稱為外部函數(shù)或函數(shù)子程序。,FUNCTIONF(X) IF(X.GE.0)F=2*X+1 IF(X.LT.0)F=-3*X+1 END,引 用,返回,一、引例,二、外部函數(shù)的定義,函數(shù)子程序通常稱為外部函數(shù),它也是根據(jù)程序設(shè)計者的需要由自己定義的函數(shù)

17、。和語句函數(shù)不同的是,函數(shù)子程序是一個由若干語句組成的獨立的程序單位。當某些函數(shù)的值不可能用一條語句來求得時,就可借助函數(shù)子程序來定義一個函數(shù)。,二、外部函數(shù)的定義,一般形式:,類型說明 FUNCTION 函數(shù)名(虛參表) 函數(shù)子程序體 END,FUNCTION 函數(shù)名(虛參表) 類型說明 函數(shù)名 函數(shù)子程序體 END,說明:,1、FUNCTION語句 FUNCTION語句是函數(shù)子程序的聲明語句。它表示函數(shù)子程序定義開始。同時給出函數(shù)子程序所需的各種虛擬參數(shù)(簡稱虛參、形參),在函數(shù)子程序調(diào)用之前虛參沒有值,只有函數(shù)子程序被調(diào)用時,由調(diào)用程序單元將實在參數(shù)(簡稱實參)的數(shù)據(jù)傳遞給虛參,虛參才有

18、數(shù)據(jù)。當有多個虛參時,必須用逗號將虛參隔開;若沒有虛參時,括號不能省略。虛參可以是變量名、數(shù)組名、子程序名。,說明:,1、FUNCTION語句 函數(shù)名用以標識函數(shù)子程序的名稱,它在函數(shù)體中存放函數(shù)值,故函數(shù)名具有類型,函數(shù)名的命名方法與變量名相同。類型說明用來顯式說明函數(shù)名的類型,若省略類型說明,則按I-N規(guī)則確定函數(shù)名的類型。,例:function rdh(n,h) 實型函數(shù) Integer function rdh(n,h)整型函數(shù),說明:,2、函數(shù)體 包括說明語句(對虛參變量和實參變量的說明,也包括對函數(shù)中所用變量、數(shù)組和符號常量的說明)和執(zhí)行語句(用來完成求函數(shù)值的運算。在程序的執(zhí)行流

19、程返回調(diào)用程序之前,必須把所求得的函數(shù)值返回給函數(shù)名)。 由于函數(shù)子程序的計算結(jié)果(即函數(shù)值)存放在函數(shù)名中,故函數(shù)名必須在函數(shù)體中,至少要有一次出現(xiàn)在賦值語句的左邊,即:函數(shù)名=表達式,說明:,2、函數(shù)體 RETURN語句只允許出現(xiàn)在子程序中,可以有任意多條,并可放在任何位置。END語句在子程序中只能有一條。而且必須放在子程序的最后,不能省略,但RETURN語句可省略。,三、函數(shù)子程序的引用,函數(shù)子程序是不能直接執(zhí)行的,只有在其他程序單位中對它引用時,才能控制轉(zhuǎn)移到它的內(nèi)部執(zhí)行。調(diào)用函數(shù)子程序目的是將外部函數(shù)子程序的計算結(jié)果(即函數(shù)值)作為表達式的一個運算分量參與表達式的運算。函數(shù)子程序的調(diào)

20、用可以出現(xiàn)在表達式出現(xiàn)的任何地方,即只能出現(xiàn)在賦值語句的右邊或WRITE語句中。,三、函數(shù)子程序的引用,調(diào)用函數(shù)子程序時應(yīng)注意的問題 在調(diào)用程序中,必須對被調(diào)用的函數(shù)子程序名如變量那樣進行類型說明(也可以遵循隱含規(guī)則),并且,在調(diào)用程序中,其他的名字(如變量名、數(shù)組名等)不能與被調(diào)用的函數(shù)子程序名相同。 在調(diào)用一個函數(shù)子程序時,其實參必須在個數(shù)、類型與順序上與函數(shù)子程序中的形參一致。 子程序不能直接或間接的調(diào)用子程序本身,即在F77中不支持遞歸調(diào)用。如果函數(shù)是遞歸的,則應(yīng)以RECURSIVE開頭(F90標準)。,三、函數(shù)子程序的引用,- 如果一個FORTRAN程序由一個主程序和若干個子程序組成

21、,則主程序和子程序可以分別存放在幾個文件中,它們可以獨立編譯,最后才連接成一個完整的可執(zhí)行程序;也可以將主程序和所有的子程序存放在同一個文件中,此時將一起編譯,最后連接成一個可執(zhí)行程序。 - 函數(shù)子程序可以沒有形參,但函數(shù)名后面的一對括號不能省略;同時在調(diào)用該函數(shù)子程序時也不要實參,但函數(shù)名后的一對括號也不能省略。,調(diào)用函數(shù)子程序時應(yīng)注意的問題,函數(shù)子程序的執(zhí)行過程,函數(shù)子程序是一個外部過程,它不能直接單獨控制執(zhí)行,只有在其他程序單位中引用該函數(shù)名時才會控制轉(zhuǎn)到函數(shù)子程序內(nèi)部。大致分為四步:,第一步:首先對實元是表達式的項求出表達式的值,然后將控制轉(zhuǎn)移到函數(shù)子程序的FUNCTION語句。,第二

22、步:按排列順序依次讓對應(yīng)的虛元和實元結(jié)合(程序單位之間的數(shù)據(jù)的傳遞),這個過程稱為虛實結(jié)合。,INTEGER SQ L = 6 M = SQ (10,L 4/5) WRITE (,10) M 10 FORMAT (1X,M,15) END,第三步:執(zhí)行函數(shù)體中的各語句。,第四步:當執(zhí)行遇到END語句或RETURN語句時,函數(shù)子程序名帶著賦給它的值返回到引用處繼續(xù)執(zhí)行程序。,函數(shù)子程序的執(zhí)行過程,INTEGER SQ L = 6 M = SQ (10,L 4/5) WRITE (,10) M 10 FORMAT (1X,M,15) END,FUNCTION SQ(N,K) INTEGER SQ

23、SQ NK END,四、函數(shù)子程序應(yīng)用舉例,例1:已知三角形三邊a,b,c,求面積S。,*函數(shù)子程序 FUNCTIONS(X,Y,Z) T(X+Y+Z)/2.0 SSQRT(T*(T-X)*(T-Y)*(T-Z) END,*主程序 WRITE(*,*)輸入A,B,C: READ(*,*)A,B,C AREA=S(A,B,C) WRITE(*,*)面積=,AREA END,FUNCTION GF(X) IF(X0)THEN GF=X+1 ELSEIF(X0)THEN GF=X-1 ELSE GF=0 ENDIF END,PROGRAM MAIN2 N=3 Y=(S(N)+S(N+1)+S(N+2

24、)/(S(N+3)+S(N+4) WRITE(*,100) Y=,Y 100 FORMAT(1X,A,E13.6) END,例3、求下列函數(shù)表達式的值。,例4:已知 , 其中 求sinh(x) PROGRAM MAIN3 REAL MYEXP WRITE(*,*) 輸入X: READ(*,*) X Y=(MYEXP(X)-MYEXP(-X)/2.0 WRITE(*,100) X,Y 100 FORMAT(1X,sinh(,F5.2,)=,E13.6) END,FUNCTION MYEXP(X) REAL MYEXP,S,T,X INTEGER N N=0 T=1 S=1 DO 10 WHILE

25、(ABS(T).GT.1E-5) N=N+1 T=T*X/N S=S+T 10 CONTINUE MYEXP=S END,* Sub(1) FUNCTION FAC(L) FAC=1.0 DO I=2,L FAC=FAC*I ENDDO END,* Sub(2) FUNCTION COM(N,M) COM=FAC(N)/FAC(M) $ /FAC(N-M) END,* MAIN PROGRAM DEMENSION C(11) C(1)=1.0 DO N=1,10 DO M=1,N C(M+1)=COM(N,M) ENDDO WRITE(*,10)(C(I), % I=1,N+1) ENDDO

26、10 FORMAT(1x,11F6.0) END,8.3子例程子程序,子例行子程序也是Fortran的外部過程,它與函數(shù)子程序的主要差別在于: 名字的作用不同。函數(shù)子程序名除了供調(diào)用外,還代表函數(shù)值,而子例行子程序名只供調(diào)用。 要求返回值的方式不同。函數(shù)子程序是通過函數(shù)名將函數(shù)值帶回調(diào)用程序,而子例行子程序是通過“虛實結(jié)合”將其新值轉(zhuǎn)送回調(diào)用程序。 調(diào)用方式不同。函數(shù)子程序的調(diào)用總是出現(xiàn)在表達式中,而子例行子程序必須用一條獨立的語句調(diào)用。,SUBROUTINE 子例行程序名 (虛參表) (子例程子程序體) END,一、子例行子程序的定義,(1) SUBROUTINE語句是子例行程序的聲明語句。

27、它表示子例行程序定義開始。同時給出子例行程序所需的各種虛參。 (2)程序體包括:說明部分和執(zhí)行語句。 說明部分:對形參和子例行程序中所用變量、數(shù)組等說明 執(zhí)行語句:完成子例行程序的運算和操作功能。 (3)子例行程序中的END或RETURN語句使執(zhí)行流程返回到調(diào)用程序。,說明幾點: 子例行程序名的命名規(guī)則與變量名相同。(但不標識類型) 如果沒有虛參,括號可以省略。 例:subroutine abc 虛參可以是變量名、數(shù)組名和過程名,但不允許用常量和數(shù)組元素。 子例行子程序的名字只起標識作用,沒有值的概念,僅僅為了調(diào)用。因此,在子程序體中,它不允許出現(xiàn)。,三、子例行子程序的調(diào)用 一般形式: cal

28、l 子例行程序名(實參表) call 子例行程序名 執(zhí)行過程:類似函數(shù)子程序,(1)在調(diào)用程序單元中,計算實參值(若實參是表達式)。 (2)將實參值傳遞給對應(yīng)虛參,即虛實結(jié)合。 (3)執(zhí)行子程序體,實現(xiàn)其功能。 (4)執(zhí)行END語句,將返回值帶回給調(diào)用程序單元。,與函數(shù)子程序的不同之處: (1)子例行程序名只供調(diào)用時使用,不得在子程序體內(nèi)賦值;函數(shù)子程序名除了供調(diào)用時使用外,還代表著函數(shù)值,必須在返回前在函數(shù)體內(nèi)給函數(shù)名賦予函數(shù)值。 (2)函數(shù)子程序的調(diào)用總是出現(xiàn)在表達式中,并將所得的函數(shù)值參與表達式的運算;子例行程序必須用一條CALL語句調(diào)用。 (3)若通過子程序得到一個值,一般采用函數(shù)子程

29、序;若只是通過子程序進行運算操作,則采用子例行程序。,三、子例行子程序的調(diào)用,無參子例程,四、子例程序應(yīng)用舉例,例:編寫子例行程序分別求出55矩陣兩個對角線上元素之和。 program main subroutineopp(a,s1,s2) real w(5,5) real a(5,5) read *,(w(i,j),j=1,5),i=1,5) s1=0.0 call opp(w,x1,x2) do i=1,5 write(*,50)x1,x2 s1=s1+a(i,i) 50 format(1x,x1=,f5.2, end do $2x,x2=,f5.2) s2=0.0 end do i=1,

30、5 j=5-i+1 運行結(jié)果: s2=s2+a(i,j) x1=15.00 x2=25.00 enddo end,數(shù)組傳遞 的首地址,8.4 實參和虛參之間的數(shù)據(jù)傳遞,在Fortran程序設(shè)計中子程序的虛參可以是變量名、數(shù)組名、函數(shù)名、子例行程序和星號。 下面討論當虛參為變量名和數(shù)組名時的實參和虛參之間的數(shù)據(jù)傳遞問題,也稱“虛實結(jié)合”問題。 一、變量名作虛參時的虛實結(jié)合 對應(yīng)的實參可為同類型的常量、變量或數(shù)組元素。 結(jié)合方式 是按地址結(jié)合的。即虛參和實參共用一個存儲單元。, 結(jié)合過程 program main integer a,b,c,d data a,b/10,15/ call sub(a

31、,b,c,d) print *,a,b,c,d end subroutine sub(w,x,y,z) integer w,x,y,z y=w*x z=x*y w=x x=y end,注意:當實參是數(shù)組元素時,虛實結(jié)合的過程和變量名相同。 例:program main subroutine sub(x,a) integer a,c(3) integer x,a data c/1,2,3/ a=2*x a=100 x=2*a call sub(a,c(2) end print *,a=,a,c(2)=,c(2) end,子程序:x a,主程序:a c(2),C,C(1),二、數(shù)組名作虛參時的虛實

32、結(jié)合 (僅說明數(shù)值型數(shù)組) 此時,對應(yīng)的實參必須為同類型的數(shù)組名或數(shù)組元素。 實參為數(shù)組名時的虛實結(jié)合 是按地址結(jié)合的。即實參數(shù)組的第一個元素與對應(yīng)虛參數(shù)組的第一個元素結(jié)合; 實參數(shù)組的第二個元素與對應(yīng)虛參數(shù)組的第二個元素結(jié)合,依此類推。,幾種情況: 同維同體積(不同體積): 例: program main subroutine ctx(b) dimension a(8) dimension b(5) call ctx(a) end end,若數(shù)組a,b均為二維數(shù)組,如a(2,3),b(2,3)則: 不同體積:如:b(2,2),不同維不同體積: 若主程序中a(2,3),子程序中b(5),則:,

33、總結(jié):數(shù)組的虛實結(jié)合與維數(shù)無關(guān)。 結(jié)合原則:按照存儲結(jié)構(gòu)一一結(jié)合 但注意:虛參數(shù)組的體積應(yīng)小于實參數(shù)組的體積 最好是同維同體積,不易出錯,程序可讀性強。, 實參為數(shù)組元素時的虛實結(jié)合 仍按地址結(jié)合,但該數(shù)組元素與對應(yīng)虛參數(shù)組的第一個元素結(jié)合;該數(shù)組元素的下一個元素與對應(yīng)虛參數(shù)組的第二個元素結(jié)合,依此類推。,例: program main subroutine ctx(y) dimension x(6) dimension y(3) call ctx(x(3) end end,注:虛參數(shù)組的最后一個元素必須落在實參數(shù)組范圍內(nèi)。 對上例而言,若定義y(6),則會出現(xiàn)“超界錯”。,例:分別計算二維數(shù)

34、組a(15,15),b(15,15)的主對角線元素之積P,Q,再求P*Q。,Function acc(x) dimension x(15,15) Acc=x(1,1) do 10 i=2,15 acc=acc*x(i,i) 10 continue end,Main program Dimension a(15,15),b(15,15) Read *,(a(I,J),j=1,15),I=1,15) Read *,(b(I,J),j=1,15),I=1,15) P=acc(a) Q=acc(b) R=p*q Print *,p=,p,q=,q,result=,r end,考慮:若只需求A數(shù)組主對角

35、線的前三個元素之積呢?,我們前面所用的數(shù)組,維界都是常數(shù),其大小不可改變。要求解n階線性方程組,對不同的n都要各編一套程序,這顯然不合適。于是提出使用可調(diào)數(shù)組的想法,數(shù)組說明符中的維界用變量。,上例中,將函數(shù)子程序或子例程中的A(20)改為 A(N),此數(shù)組即為可調(diào)數(shù)組。但是,A與N均需出現(xiàn) 在形參中。 可調(diào)數(shù)組的使用規(guī)則: (1)可調(diào)數(shù)組只能在子程序中使用 (2)可調(diào)數(shù)組與可調(diào)維中的變量均需列在形參中,PROGRAM MAIN DIMENSIONA(10),B(4,3) M14 M23 CALLSUB(A,10,B,M1,M2) END SUBROUTINE SUB(X,NX,Y,N1,N2

36、) DIMENSIONX(NX),Y(N1,N2) . END,(1)可調(diào)數(shù)組只能在子程序中使用。 (2)可調(diào)數(shù)組與可調(diào)維中的變量均需列在形參中。,從數(shù)組的虛實結(jié)合規(guī)則可知,如果虛參數(shù)組的下標不可調(diào),那么就會極大地影響子程序的通用性和靈活性。設(shè)計可調(diào)數(shù)組可以較好地解決這一問題。,1、可調(diào)數(shù)組的概念: 常界數(shù)組:上、下界和維數(shù)都是整型常數(shù)。如:a(15,15) 主程序中用的定義數(shù)組語句中必須是整型常量,即常界數(shù)組。,8.5可調(diào)數(shù)組,可調(diào)數(shù)組:只能在子程序中使用,其上、下界可以是整型虛參變量,其值可以通過對應(yīng)的實參傳遞過來。,Function acc(x,n) dimension x(n,n) A

37、cc=x(1,1) do 10 i=2,n acc=acc*x(i,i) 10 continue end,主程序中可以這樣調(diào)用: DIMENSION A(30,30),B(60,60) P=acc(a,30) Q=acc(b,60) WRITE(*,*)P=,P WRITE(*,*)Q=,Q END,求方陣主對角上元素的乘積。,如果只想求一部分元素之積,可以再多設(shè)一個虛參變量,增加靈活性。,Function acc(x,n,m) dimension x(n,n) Acc=x(1,1) do 10 i=2,m acc=acc*x(i,i) 10 continue end,主程序中可以這樣調(diào)用:

38、P=acc(a,30,20) Q=acc(b,60,40) ,重申一下: 1、可調(diào)數(shù)組只能出現(xiàn)在子程序中,不允許出現(xiàn)在主程序里。 2、可調(diào)數(shù)組的數(shù)組名和界都必須作為虛參出現(xiàn)在虛參表中。這樣,通過虛實結(jié)合后,它們就會被賦值。 例: program main subroutine sub(x,nx,y,n1,n2) parameter(m1=4,m2=3) dimension x(nx),y(n1,n2) dimension a(10),b(m1,m2) call sub(a,10,b,m1,m2) end end,函數(shù)和子例程復習與小結(jié),例1讀程序,寫結(jié)果: PROGRAMMAIN1 M5 N3 CALLS(M,N) WRITE(*,*)M,N END SUBROUTINE S(N,M) M=M+1 N+N*2+M M=N*M END,例2讀程序,寫結(jié)果: PROGRAMMAIN2 DATA A,B,C/1.,2.,3./ CALLS(B,C,A,F) WRITE(*,10)A,B,C,F 10 FORMAT(1x,4F5.1) END SUBROUTINE S(A,B,C,D) A=C B=A+C C=A+B D=

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論