fortran第11章_過程和模塊_第1頁
fortran第11章_過程和模塊_第2頁
fortran第11章_過程和模塊_第3頁
fortran第11章_過程和模塊_第4頁
fortran第11章_過程和模塊_第5頁
已閱讀5頁,還剩113頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、下一頁上一頁停止放映第十一章第十一章: : 過程和模塊過程和模塊 11.1 概述概述FORTRANFORTRAN程序應由一個主程序單元和若干個過程程序單元組成。程序應由一個主程序單元和若干個過程程序單元組成。編程前應先作結構化分析,把問題分解為若干個子功能,每個子編程前應先作結構化分析,把問題分解為若干個子功能,每個子功能編成一個獨立的程序單元,稱為過程程序單元。再編一個主功能編成一個獨立的程序單元,稱為過程程序單元。再編一個主程序單元,控制整個解題過程。在主程序單元中用簡練的形式調程序單元,控制整個解題過程。在主程序單元中用簡練的形式調用每個過程,每次調用就是執(zhí)行該過程單元,完成該子功能,從

2、用每個過程,每次調用就是執(zhí)行該過程單元,完成該子功能,從而最終完成解題任務。而最終完成解題任務。F90F90中,共有四種程序單元:中,共有四種程序單元: 主程序主程序 過程或輔程序過程或輔程序 塊數(shù)據(jù)單元塊數(shù)據(jù)單元 模塊模塊 ( (F90) 通過使用模塊,可以方便地共享數(shù)據(jù)和過程。通過使用模塊,可以方便地共享數(shù)據(jù)和過程。 各種程序單元中,除主程序外,各程序單元可以被其他各種程序單元中,除主程序外,各程序單元可以被其他程序單元甚至自身調用。程序單元甚至自身調用。 一個程序單元不需要包含可執(zhí)行語句。一個程序單元不需要包含可執(zhí)行語句。下一頁上一頁停止放映程序單元程序單元定義定義主程序主程序主程序是程

3、序開始執(zhí)行的標志,其第一條語句不能是主程序是程序開始執(zhí)行的標志,其第一條語句不能是SUBROUTINESUBROUTINE,F(xiàn)UNCTIONFUNCTION,MODULEMODULE和和BLOCK DATABLOCK DATA。主程序可以用。主程序可以用PROGRAMPROGRAM語句作為第語句作為第一條語句,但不是必需的一條語句,但不是必需的過程過程子程序或函數(shù)子程序或函數(shù)塊數(shù)據(jù)單元塊數(shù)據(jù)單元在命名的公共塊中提供變量初始值的程序單元在命名的公共塊中提供變量初始值的程序單元模塊模塊包含數(shù)據(jù)對象定義、類型定義、函數(shù)或子程序接口和其它程序可訪包含數(shù)據(jù)對象定義、類型定義、函數(shù)或子程序接口和其它程序可

4、訪問的函數(shù)或子程序問的函數(shù)或子程序程序單元之間的關系:程序單元之間的關系: 聯(lián)合:這種機制允許不同的程序單元共享變量,從而聯(lián)合:這種機制允許不同的程序單元共享變量,從而不用重新定義變量就可以以不同的名字處理同一數(shù)據(jù)。不用重新定義變量就可以以不同的名字處理同一數(shù)據(jù)。 范圍:它描述的是一個名稱范圍:它描述的是一個名稱( (或者是全局的或者是局部的或者是全局的或者是局部的) )作用的范圍。作用的范圍。下一頁上一頁停止放映11.2 主程序主程序程序的執(zhí)行始終是開始于主程序的第一條可執(zhí)行語句,所程序的執(zhí)行始終是開始于主程序的第一條可執(zhí)行語句,所以每個完整的以每個完整的FortranFortran程序必須

5、有且僅有一個主程序。程序必須有且僅有一個主程序。其形式為:其形式為:PROGRAM PROGRAM 程序名程序名 說明部分說明部分 可執(zhí)行部分可執(zhí)行部分 CONTAINSCONTAINS內部過程內部過程 END PROGRAMEND PROGRAM程序名程序名可以看到,主程序單元中允許包含內部過程。主程序名和外可以看到,主程序單元中允許包含內部過程。主程序名和外部過程名和公共塊名都被認為是部過程名和公共塊名都被認為是全局名稱全局名稱。全局名稱在一個全局名稱在一個程序中必須是唯一的。程序中必須是唯一的。 下一頁上一頁停止放映例:例:PROGRAM MAINPROGRAM MAIN REAL X(

6、10),A(10,10),B(10) REAL X(10),A(10,10),B(10) ! !說明部分說明部分 CALL GAUSS(A,B,X) CALL GAUSS(A,B,X) ! !執(zhí)行部分,調用內部過程執(zhí)行部分,調用內部過程GAUSSGAUSS CONTAINSCONTAINS SUBROUTINE GAUSS(R,S,T) SUBROUTINE GAUSS(R,S,T) ! !內部過程的開始內部過程的開始 END SUBROUTINE GAUSS END SUBROUTINE GAUSS ! !內部過程的結束內部過程的結束 EHD PROGRAM MAINEHD PROGRAM

7、MAIN下一頁上一頁停止放映下圖顯示的是一個下圖顯示的是一個F90F90程序的標準結構。每個框都可程序的標準結構。每個框都可以是一個獨立的源文件:以是一個獨立的源文件:Program A1Use module ACall BContains內部子程序或內部函數(shù)End Program A1Module AContains模塊子程序或函數(shù)Subroutine B(外部子程序)下一頁上一頁停止放映 Fortran Fortran可以定義一個過程就是指它是一個函數(shù)或是一個子程序??梢远x一個過程就是指它是一個函數(shù)或是一個子程序。 過程的引用就是調用一個過程。過程的引用就是調用一個過程。 建立過程的目的

8、就是建立可多次重復執(zhí)行的程序段,以便多次建立過程的目的就是建立可多次重復執(zhí)行的程序段,以便多次調用它們。通常過程是帶有參數(shù)的,在調用它們。通常過程是帶有參數(shù)的,在FortranFortran中把參數(shù)稱為變元中把參數(shù)稱為變元(實元或啞元),過程定義中的變元是啞元,過程引用中的變元是(實元或啞元),過程定義中的變元是啞元,過程引用中的變元是實元。在調用過程時,要用實元代替啞元,這就是啞實結合。實元。在調用過程時,要用實元代替啞元,這就是啞實結合。 11.3過程過程下一頁上一頁停止放映 類型:類型: 外部過程:外部過程:它是在某個外部程序單元中定義的獨立過程,或它是在某個外部程序單元中定義的獨立過程

9、,或是用非是用非FortranFortran語言編寫的過程。語言編寫的過程。 內部過程:內部過程:在程序單元內部定義而且只能被該程序單元調用。在程序單元內部定義而且只能被該程序單元調用。 內在過程:內在過程:由編譯系統(tǒng)內部定義,不用任何附加聲明或說明就由編譯系統(tǒng)內部定義,不用任何附加聲明或說明就可以可直接引用??梢钥芍苯右?。模塊過程:模塊過程:它在模塊中定義,可以被所有使用該模塊的程序調它在模塊中定義,可以被所有使用該模塊的程序調用。包含過程的模塊稱為宿主。用。包含過程的模塊稱為宿主。啞過程啞過程 :如果一個啞元被指明為過程或作為過程名出現(xiàn)在過如果一個啞元被指明為過程或作為過程名出現(xiàn)在過程引

10、用中,那么該啞元代表的過程為一個啞過程。程引用中,那么該啞元代表的過程為一個啞過程。語句函數(shù):語句函數(shù):它是由單個語句定義的函數(shù),其形式為:它是由單個語句定義的函數(shù),其形式為: 函數(shù)名函數(shù)名(啞元名表啞元名表)標量表達式標量表達式 F90F90不推薦使用,因為它不符合過程的一般規(guī)則。不推薦使用,因為它不符合過程的一般規(guī)則。 下一頁上一頁停止放映 特性特性 將過程分為將過程分為函數(shù)函數(shù)和和子程序子程序的分類特性和它的啞元的特性,的分類特性和它的啞元的特性,對于函數(shù)還包括有結果的特性。對于函數(shù)還包括有結果的特性。 一個啞元可以是一個一個啞元可以是一個虛擬數(shù)據(jù)對象、啞過程或作為選擇返虛擬數(shù)據(jù)對象、啞

11、過程或作為選擇返回指示符的星號回指示符的星號。當一個啞元不是星號時,它可有。當一個啞元不是星號時,它可有OPTIONALOPTIONAL屬屬性,表示對該過程引用時不需要有實元與該啞元結合。性,表示對該過程引用時不需要有實元與該啞元結合。 一個一個啞元啞元數(shù)據(jù)對象的主要特性包括它的類型、種別值、形數(shù)據(jù)對象的主要特性包括它的類型、種別值、形狀、輸入輸出意向狀、輸入輸出意向(INTENT)(INTENT)、是否可選、是否可選(OPTIONAL)(OPTIONAL)、是否一個、是否一個指針指針(POINTER)(POINTER)或目標或目標(TARGET)(TARGET)。 啞過程的特性啞過程的特性包

12、括其接口是否顯式給出、作為過程的特性包括其接口是否顯式給出、作為過程的特性( (如果其接口顯式給出如果其接口顯式給出) )以及它是否可選。以及它是否可選。 函數(shù)結果函數(shù)結果的主要特性包括它的類型、類別值、秩以及是否的主要特性包括它的類型、類別值、秩以及是否指針等。指針等。 下一頁上一頁停止放映 1外部過程外部過程 如果過程是一個獨立于主程序單元的程序單元,它就是外如果過程是一個獨立于主程序單元的程序單元,它就是外部過程。部過程。 外部過程也可以通過非外部過程也可以通過非FortranFortran語言語言( (通常是匯編語言通常是匯編語言) )來定義。來定義。 外部過程可以單獨以源文件存儲和編

13、譯,也可以包括在主程序外部過程可以單獨以源文件存儲和編譯,也可以包括在主程序源代碼的源代碼的ENDEND語句后。語句后。 外部過程本身也可以包含有內部函數(shù)或內部子程序。外部過程本身也可以包含有內部函數(shù)或內部子程序。外部過程的形式有兩種:外部過程的形式有兩種:外部函數(shù)外部函數(shù) :FUNCTIONFUNCTION語句語句 說明部分說明部分 可執(zhí)行部分可執(zhí)行部分 CONTAINSCONTAINS內部過程內部過程 END FUNTIONEND FUNTION函數(shù)名函數(shù)名 外部子程序:外部子程序:SUBROUTINESUBROUTINE語句語句 說明部分說明部分 可執(zhí)行部分可執(zhí)行部分 CONTAINSC

14、ONTAINS內部過程內部過程 END SUBROUTINEEND SUBROUTINE子程序名子程序名 下一頁上一頁停止放映 外部子程序外部子程序:SUBROUTINESUBROUTINE一般形式為:一般形式為: 前綴前綴SUBROUTINESUBROUTINE 子程序子程序名名(啞元列表啞元列表) . END SUBROUTINE END SUBROUTINE子程序名子程序名前綴前綴是是F90F90中新增的,它可以是:中新增的,它可以是: 類型說明類型說明 關鍵詞關鍵詞 或或關鍵詞關鍵詞 類型說明類型說明 。 關鍵詞關鍵詞是:是:RECURSIVE RECURSIVE (F90)(F90)

15、 RECURSIVERECURSIVE表示過程時可以直接或間接地調用自身,即遞表示過程時可以直接或間接地調用自身,即遞歸調用,其過程是遞歸過程。歸調用,其過程是遞歸過程。 子程序名只是用來作標識,不代表任何值。子程序名只是用來作標識,不代表任何值。下一頁上一頁停止放映啞元可以是變量名、數(shù)組名、過程名、指針名等均啞元可以是變量名、數(shù)組名、過程名、指針名等均可作為啞元??勺鳛閱≡?。 啞元表中的啞元個數(shù),理論上不受限制,但從軟件啞元表中的啞元個數(shù),理論上不受限制,但從軟件工程觀點看,不宜過多,一般不應超過六、七個。如工程觀點看,不宜過多,一般不應超過六、七個。如果太多,意味著該子程序的算法較復雜,應

16、該把該過果太多,意味著該子程序的算法較復雜,應該把該過程再分解為幾個子功能分別編寫成幾個子程序程再分解為幾個子功能分別編寫成幾個子程序 啞元列表啞元列表是子程序與調用單元之間進行數(shù)據(jù)傳送的主是子程序與調用單元之間進行數(shù)據(jù)傳送的主要渠道,當有一個以上啞元時,它們之間用逗號隔開,要渠道,當有一個以上啞元時,它們之間用逗號隔開,如果沒有啞元,則一對括號可以省略。如果沒有啞元,則一對括號可以省略。 從從SUBROUTINESUBROUTINE語句后面一直到語句后面一直到ENDEND語句則是子程序語句則是子程序體。它的說明部分應包括對啞元和子程序中所用變量、體。它的說明部分應包括對啞元和子程序中所用變量

17、、數(shù)組等的說明,它的執(zhí)行語句部分完成運算和操作功數(shù)組等的說明,它的執(zhí)行語句部分完成運算和操作功能。其中的能。其中的ENDEND語句或語句或RETURNRETURN語句使執(zhí)行流程返回到調語句使執(zhí)行流程返回到調用單元。用單元。下一頁上一頁停止放映調用子程序形式為:調用子程序形式為: CALLCALL子程序名子程序名(實元列表實元列表) 調用子程序時的實元是和啞元相同類型的變量、數(shù)組元調用子程序時的實元是和啞元相同類型的變量、數(shù)組元素、數(shù)組和常數(shù)。當用素、數(shù)組和常數(shù)。當用CALLCALL語句予以調用時,啞元和實元語句予以調用時,啞元和實元才按列表順序一一對應,取得同一數(shù)值。才按列表順序一一對應,取得

18、同一數(shù)值。注意:注意:但使用常數(shù)時要避免下例中的常數(shù)替換式,否則但使用常數(shù)時要避免下例中的常數(shù)替換式,否則將導致不可預料的錯誤,應盡可能用變量作實元。將導致不可預料的錯誤,應盡可能用變量作實元。s=1.s=1.CALL bai(1.)CALL bai(1.)PRINTPRINT* *,s,sEND END 例:例:SUBROUTINE bai(xSUBROUTINE bai(x) ) REAL : x REAL : x x x=2.=2.* *x x END END下一頁上一頁停止放映 外部函數(shù)外部函數(shù) :FUNCTIONFUNCTION的一般形式為:的一般形式為: f77f77 類型說明類型

19、說明FUNCTION FUNCTION 函數(shù)函數(shù)名名(啞元列表啞元列表) . END END f90f90 前綴前綴 FUNCTION FUNCTION 函數(shù)函數(shù)名名(啞元列表啞元列表)RESULT(RESULT(結果名結果名) . . END FUNCTION END FUNCTION函數(shù)函數(shù)名名 下一頁上一頁停止放映 如果沒有啞元,則啞元表是一個空括號。如果沒有啞元,則啞元表是一個空括號。 RESULTRESULT是關鍵字,要照寫,后面括號內的變量名就是函是關鍵字,要照寫,后面括號內的變量名就是函數(shù)計算的結果值。數(shù)計算的結果值。 函數(shù)結果變量名有值,必須在說明語句中說明類型,在函數(shù)結果變量

20、名有值,必須在說明語句中說明類型,在程序執(zhí)行部分中至少賦值一次。在引用時,它的值就是程序執(zhí)行部分中至少賦值一次。在引用時,它的值就是函數(shù)值。函數(shù)值。 函數(shù)結果名不可列入啞元表。如果沒有結果名,則函數(shù)函數(shù)結果名不可列入啞元表。如果沒有結果名,則函數(shù)名就是結果名。名就是結果名。 F90F90中之所以增添了結果名功能,就是為了區(qū)別函數(shù)字中之所以增添了結果名功能,就是為了區(qū)別函數(shù)字面上的名稱面上的名稱( (函數(shù)名函數(shù)名) )和實際運算結果變量的名稱。和實際運算結果變量的名稱。下一頁上一頁停止放映函數(shù)調用一般形式:函數(shù)調用一般形式: 函數(shù)名函數(shù)名( (實元表實元表) ) 函數(shù)名函數(shù)名()() 系統(tǒng)在該位

21、置上返回以該實元為自變量的函數(shù)結果值,系統(tǒng)在該位置上返回以該實元為自變量的函數(shù)結果值,參加表達式的運算。參加表達式的運算。例如,下面都是合法的例如,下面都是合法的FUNCTIONFUNCTION語句:語句:FUNCTION FUN1FUNCTION FUN1FUNCTION FUN2()FUNCTION FUN2()INTEGER FUNCTION FUN3(A,B)INTEGER FUNCTION FUN3(A,B)RECURSIVE FUNCTION FUN4(X,Y,Z)RECURSIVE FUNCTION FUN4(X,Y,Z)REAL RECURSIVE FUNCTION FUN5(

22、M,N) RESULT(R_FUN5)REAL RECURSIVE FUNCTION FUN5(M,N) RESULT(R_FUN5)下一頁上一頁停止放映 FUNCTION FUNCTION hexhex(n)(n) CHARACTER(LEN=8) : hex CHARACTER(LEN=8) : hex CHARACTER(LEN=1) : h(0:15) = CHARACTER(LEN=1) : h(0:15) = (/ 0, 1, 2, 3, 4, & (/ 0, 1, 2, 3, 4, & 5, 6,7, 8, 9, A, B, C, D, E, F /)5, 6,7

23、, 8, 9, A, B, C, D, E, F /) INTEGER, INTENT(IN) : n INTEGER, INTENT(IN) : n INTEGER : nin, j, nn INTEGER : nin, j, nn hex = hex = nin nin = n ! n = n ! n僅用于輸入,不能再被賦值。僅用于輸入,不能再被賦值。 DO j = 8, 1, -1DO j = 8, 1, -1nnnn = nin/16 = nin/16hexhex(j:j) = h(nin-16(j:j) = h(nin-16* *nnnn) )IF(nnIF(nn = 0) EXIT

24、 = 0) EXITnin = nnnin = nn END DO END DO END FUNCTION END FUNCTION例:將一個例:將一個4 4字節(jié)的整數(shù)用字節(jié)的整數(shù)用1616進制表示出來。進制表示出來。 下一頁上一頁停止放映PROGRAM mainPROGRAM mainCHARACTER(LEN=8) : CHARACTER(LEN=8) : hex hex ! !函數(shù)名的類型在引用側也須加以聲明函數(shù)名的類型在引用側也須加以聲明INTEGER : iINTEGER : iPRINT PRINT * *, , Input a positive Integer or negati

25、ve one to stop:Input a positive Integer or negative one to stop:DODO READ READ * *, i; IF( i0 ) EXIT , i; IF( i0)SUM(A,DIM=2,MASK=A0)。 下一頁上一頁停止放映編寫有可選擇變元的過程時,編寫有可選擇變元的過程時,可選擇變元必須說明具有可選擇變元必須說明具有OPTIONALOPTIONAL屬性,并要使用屬性,并要使用PRESETPRESET內在函數(shù)內在函數(shù)。 一個啞元是否為可選啞元,看它是否有一個啞元是否為可選啞元,看它是否有OPTIONALOPTIONAL屬性,屬性

26、,有有OPTIONALOPTIONAL屬性的啞元是可選變元,沒有屬性的啞元是可選變元,沒有OPTIONALOPTIONAL屬性的屬性的啞元是必選的。啞元是必選的。 內在函數(shù)內在函數(shù)PRESETPRESET用來反映它的自變量是否在程序執(zhí)用來反映它的自變量是否在程序執(zhí)行部分中出現(xiàn)。行部分中出現(xiàn)。 PRESET(A)PRESET(A)的值是一個邏輯值,當?shù)闹凳且粋€邏輯值,當A A出現(xiàn)(被使用到)出現(xiàn)(被使用到)時,函數(shù)值為真,否則為假。利用時,函數(shù)值為真,否則為假。利用PRESETPRESET函數(shù)的真假值,函數(shù)的真假值,可以通過可以通過IFIF構造作出變元是否出現(xiàn)時的不同算法。構造作出變元是否出現(xiàn)時

27、的不同算法。 下一頁上一頁停止放映例如,要求編一子程序,既能求四邊形周長例如,要求編一子程序,既能求四邊形周長(A+B+C+D)(A+B+C+D)的的值,也能求三角形周長值,也能求三角形周長(A+B+C)(A+B+C)的值。此時的值。此時D D就是可選擇變就是可選擇變元,并規(guī)定當元,并規(guī)定當D D不出現(xiàn)時,置不出現(xiàn)時,置D D值為零。值為零。子程序如下:子程序如下:SUBROUTINE SUM(S,A,B,C,D)SUBROUTINE SUM(S,A,B,C,D)IMPLICIT NONEIMPLICIT NONEREAL,INTENT(IN) : A,B,CREAL,INTENT(IN) :

28、 A,B,CREAL,INTENT(IN),OPTIONAL : DREAL,INTENT(IN),OPTIONAL : DREAL,INTENT(OUT) : SREAL,INTENT(OUT) : SREAL : TEMPREAL : TEMPIF(IF(PRESET(D)PRESET(D) THEN) THENTEMP=DTEMP=DELSEELSETEMP=0.TEMP=0.END IFEND IFS=A+B+C+S=A+B+C+TEMPTEMPEND SUBROUTINE SUM END SUBROUTINE SUM 下一頁上一頁停止放映 類屬過程類屬過程 類屬過程是過程的一種,它允

29、許用不同類型的實元與類屬過程是過程的一種,它允許用不同類型的實元與同一個啞元結合,也即放寬了啞實元結合時類型必須一致同一個啞元結合,也即放寬了啞實元結合時類型必須一致的條件。的條件。 編寫類屬過程的方法是先編寫若干個功能相同的過程,編寫類屬過程的方法是先編寫若干個功能相同的過程,它們分別以整型、實型、復型等作啞元類型。而后在主調它們分別以整型、實型、復型等作啞元類型。而后在主調程序中編寫接口,為接口取一個統(tǒng)一的名,接口內分別列程序中編寫接口,為接口取一個統(tǒng)一的名,接口內分別列出啞元類型不同的過程說明部分語句。這個出啞元類型不同的過程說明部分語句。這個統(tǒng)一的接口名統(tǒng)一的接口名就是類屬過程名就是類

30、屬過程名,可以在后面執(zhí)行部分中用不同類型的實,可以在后面執(zhí)行部分中用不同類型的實元作啞實結合。元作啞實結合。下一頁上一頁停止放映例如,要編寫求兩數(shù)之和的類屬函數(shù)時,分別編寫啞元例如,要編寫求兩數(shù)之和的類屬函數(shù)時,分別編寫啞元是實型和整型的函數(shù):是實型和整型的函數(shù):FUNCTION SUM_REAL(A,B) RESULT(SUM_REAL_RESULT)FUNCTION SUM_REAL(A,B) RESULT(SUM_REAL_RESULT)REAL : A,BREAL : A,B,SUM_REAL_RESULT,SUM_REAL_RESULTSUM_REAL_RESULT=A+BSUM_R

31、EAL_RESULT=A+BEND FUNCTION SUM_REALEND FUNCTION SUM_REALFUNCTION SUM_INTEGER(A,B) RESULT(SUM_INTEGER_RESULT)FUNCTION SUM_INTEGER(A,B) RESULT(SUM_INTEGER_RESULT)INTEGER :INTEGER : A,BA,B,SUM_INTEGER_RESULT,SUM_INTEGER_RESULTSUM_INTEGER_RESULT=A+BSUM_INTEGER_RESULT=A+BEND FUNCTION SUM_INTEGEREND FUNCT

32、ION SUM_INTEGER下一頁上一頁停止放映PROGRAM SUMMATIONPROGRAM SUMMATIONIMPLICIT NONEIMPLICIT NONEINTERFACEINTERFACE MY_SUM MY_SUMFUNCTION SUM_REAL(A,B) RESULT(SUM_REAL_RESULT)FUNCTION SUM_REAL(A,B) RESULT(SUM_REAL_RESULT)REAL : A,B,SUM_REAL_RESULTREAL : A,B,SUM_REAL_RESULTEND FUNCTION SUM_REALEND FUNCTION SUM_R

33、EALFUNCTION SUM_INTEGER(A,B) RESULT(SUM_INTEGER_RESULT)FUNCTION SUM_INTEGER(A,B) RESULT(SUM_INTEGER_RESULT)INTEGER : A,B,SUM_INTEGER_RESULTINTEGER : A,B,SUM_INTEGER_RESULTEND FUNCTION SUM_INTEGEREND FUNCTION SUM_INTEGEREND INTERFACEEND INTERFACEREAL : X,YREAL : X,YINTEGER : I,JINTEGER : I,JREAD READ

34、 * *, X,Y,I,J, X,Y,I,JPRINT PRINT * *, , MY_SUM(X,Y),MY_SUM(I,J)MY_SUM(X,Y),MY_SUM(I,J)END PROGRAM SUMMATION END PROGRAM SUMMATION 現(xiàn)在把這兩個函數(shù)過程綜合成一個類屬函數(shù),類屬函數(shù)名取現(xiàn)在把這兩個函數(shù)過程綜合成一個類屬函數(shù),類屬函數(shù)名取為為MY_SUMMY_SUM,在主調程序應寫明如下接口:,在主調程序應寫明如下接口:下一頁上一頁停止放映 啞元改名啞元改名過程的優(yōu)點是具有廣泛通用性,一旦編好,解各種問題的過程的優(yōu)點是具有廣泛通用性,一旦編好,解各種問題的主程序都可調

35、用它。但是在為不同目的而使用時,具體問主程序都可調用它。但是在為不同目的而使用時,具體問題的物理名稱不同。為了加強可讀性與可維護性,在不同題的物理名稱不同。為了加強可讀性與可維護性,在不同領域使用過程時,需把啞元名稱改為與該領域中的物理名領域使用過程時,需把啞元名稱改為與該領域中的物理名稱一致,而稱一致,而F90F90允許改變變元名稱。名稱的改變是在接口允許改變變元名稱。名稱的改變是在接口塊中進行的,所以主調程序中要寫出接口塊。塊中進行的,所以主調程序中要寫出接口塊。 例如,對于上面求周長的子程序,如調用時欲把啞元名例如,對于上面求周長的子程序,如調用時欲把啞元名A,B,C,DA,B,C,D改

36、為物理意義明確的名稱改為物理意義明確的名稱UPPER,DOWN,LEFT,RIGHTUPPER,DOWN,LEFT,RIGHT,只需在主調程序中寫入接口塊,在接口塊的啞元表中用新的只需在主調程序中寫入接口塊,在接口塊的啞元表中用新的啞元名即可:啞元名即可:下一頁上一頁停止放映PROGRAM SUMMATIONPROGRAM SUMMATIONINTERFACEINTERFACESUBROUTINE SUM(S,UPPER,DOWN,LEFT,RIGHT)SUBROUTINE SUM(S,UPPER,DOWN,LEFT,RIGHT)IMPLICIT NONEIMPLICIT NONEREAL,I

37、NTENT(IN) : UPPER,DOWN,LEFTREAL,INTENT(IN) : UPPER,DOWN,LEFTREAL,INTENT(IN),OPTIONAL : RIGHTREAL,INTENT(IN),OPTIONAL : RIGHTREAL,INTENT(OUT) : SREAL,INTENT(OUT) : SREAL : TEMPREAL : TEMPEND SUBROUTINE SUMEND SUBROUTINE SUMEND INTERFACEEND INTERFACEREAD READ * *, UPPER,DOWN,LEFT,RIGHT, UPPER,DOWN,LEF

38、T,RIGHTCALL SUBROUTINE SUM(S,UPPER,DOWN,LEFT,RIGHT)CALL SUBROUTINE SUM(S,UPPER,DOWN,LEFT,RIGHT) END PROGRAM SUMMATION END PROGRAM SUMMATION 下一頁上一頁停止放映 2內部過程內部過程內部過程內部過程是包含于外部過程、模塊或主程序單元之中的程是包含于外部過程、模塊或主程序單元之中的程序單元序單元。在宿主程序單元中,以。在宿主程序單元中,以CONTAINSCONTAINS(包含)語句把(包含)語句把內部過程與其他部分分開。內部過程也具有兩種形式:內部過程與其他部

39、分分開。內部過程也具有兩種形式:內部函數(shù)內部函數(shù) :FUNCTIONFUNCTION語句語句 說明部分說明部分 可執(zhí)行部分可執(zhí)行部分 END FUNTIONEND FUNTION函數(shù)名函數(shù)名 注意注意: :內部過程中不能再包含內部過程,即內部過程中不能再包含內部過程,即F90F90不是過程嵌套不是過程嵌套式語言。式語言。 內部子程序內部子程序:SUBROUTINESUBROUTINE語句語句 說明部分說明部分 可執(zhí)行部分可執(zhí)行部分 END SUBROUTINEEND SUBROUTINE子程序名子程序名 下一頁上一頁停止放映在在F77F77中,中,個源文件可以包含一個主程序和幾個分別個源文件可

40、以包含一個主程序和幾個分別獨立的函數(shù)或子程序(相當于獨立的函數(shù)或子程序(相當于F90F90中的外部過程)。中的外部過程)。在在F90F90中,可以中,可以將若干個過程用將若干個過程用CONTAINSCONTAINS結構包含在主結構包含在主程序里,它們與宿主程序單元共享變量名程序里,它們與宿主程序單元共享變量名。而且,外部。而且,外部過程等其它程序單元都可以有自己的內部過程。過程等其它程序單元都可以有自己的內部過程。 例:例:program internalprogram internal real a,b,c real a,b,c call find call find print print

41、 * *,c,c containscontains subroutine find subroutine find read read * *, a,b, a,b c=sqrt(a c=sqrt(a* * *2+b2+b* * *2)2) end subroutine find end subroutine find end end下一頁上一頁停止放映使用內部過程的規(guī)則:使用內部過程的規(guī)則:在宿主中不要定義子程序名和函數(shù)名的類型,也不能指在宿主中不要定義子程序名和函數(shù)名的類型,也不能指定它們是有定它們是有EXTERNALEXTERNAL屬性。屬性。宿主中的變量名和數(shù)組名等在內部過程中有效,有相

42、同宿主中的變量名和數(shù)組名等在內部過程中有效,有相同的數(shù)值。但同一名若在內部過程中又進行了類型聲明,則的數(shù)值。但同一名若在內部過程中又進行了類型聲明,則此名被視為其過程中的獨立變量,無相同的數(shù)值。此名被視為其過程中的獨立變量,無相同的數(shù)值。內部過程中也可引用另一內部過程。內部過程中也可引用另一內部過程。下一頁上一頁停止放映內部過程的重要特征:內部過程的重要特征:沒有說明語句。它們的變量與主程序同名變量的值是沒有說明語句。它們的變量與主程序同名變量的值是相通的。主程序內可以直接引用內部過程變量的值,或相通的。主程序內可以直接引用內部過程變量的值,或賦之以值,也即主程序內定義的變量是全局的,作用于賦

43、之以值,也即主程序內定義的變量是全局的,作用于以以PROGRAMPROGRAM語句到語句到END PROGRAMEND PROGRAM語句之間的所有場合。語句之間的所有場合。一般沒有啞元。調用內部過程時只要簡單地寫一個過一般沒有啞元。調用內部過程時只要簡單地寫一個過程名。這是內部過程與外部過程的很大區(qū)別。程名。這是內部過程與外部過程的很大區(qū)別。在特殊情況下,內部過程也可保留由自己單獨說明的在特殊情況下,內部過程也可保留由自己單獨說明的少量啞元。如果變量是在內部子程序中單獨說明的,它少量啞元。如果變量是在內部子程序中單獨說明的,它只是局部變量,作用域只能是局部的,對其主程序的其只是局部變量,作用

44、域只能是局部的,對其主程序的其它部分不起作用。主程序調用時仍需通過啞實結合來傳它部分不起作用。主程序調用時仍需通過啞實結合來傳送數(shù)據(jù)。送數(shù)據(jù)。下一頁上一頁停止放映 3內在過程內在過程內在過程是內在過程是FortranFortran含于編譯器程序庫中的過程,它不需含于編譯器程序庫中的過程,它不需任何其它聲明或說明即可使用。任何其它聲明或說明即可使用。F90F90中定義了中定義了113113個內在過個內在過程,它們?yōu)榭茖W計算提供了極大方便,其具體使用方法請程,它們?yōu)榭茖W計算提供了極大方便,其具體使用方法請查看查看Visual FortranVisual Fortran的聯(lián)機幫助。內在過程共分為四類

45、:的聯(lián)機幫助。內在過程共分為四類:1 1、查詢函數(shù)、查詢函數(shù):它們的返回值是:它們的返回值是根據(jù)變元的性質根據(jù)變元的性質而非變元而非變元的取值。的取值。2 2、基本過程、基本過程:由變元指明的基本過程由變元指明的基本過程,但可以用標量或,但可以用標量或數(shù)組實元進行調用。有許多函數(shù)是這種基本函數(shù),并有一數(shù)組實元進行調用。有許多函數(shù)是這種基本函數(shù),并有一種基本內在子程序。如果變元是標量,則結果也是標量。種基本內在子程序。如果變元是標量,則結果也是標量。如果變元是數(shù)組,則對數(shù)組的每個元素施加過程,其結果如果變元是數(shù)組,則對數(shù)組的每個元素施加過程,其結果是與變元形狀相同的數(shù)組。是與變元形狀相同的數(shù)組。

46、 例如,例如,a a是數(shù)組的話,則是數(shù)組的話,則b=sin(a)b=sin(a)也是數(shù)組。也是數(shù)組。 下一頁上一頁停止放映3 3、變換函數(shù)、變換函數(shù):其變元是數(shù)組,但過程不施加于每個元素,而:其變元是數(shù)組,但過程不施加于每個元素,而是把變元變換成另一數(shù)組。是把變元變換成另一數(shù)組。4 4、非基本過程、非基本過程:只能以標量實元進行調用,內在子程序都是:只能以標量實元進行調用,內在子程序都是非基本過程。非基本過程。如果要用內在過程名作為其它過程的實元,需要用如果要用內在過程名作為其它過程的實元,需要用INTRINSICINTRINSIC語句語句加以聲明。加以聲明。下一頁上一頁停止放映 11.4 共

47、享方式共享方式 共享就是讓編譯系統(tǒng)把兩個變量名分配在同一個內存單共享就是讓編譯系統(tǒng)把兩個變量名分配在同一個內存單元中。已知訪問一個變量名,實際上就是訪問它所分配的元中。已知訪問一個變量名,實際上就是訪問它所分配的內存單元中存貯的值。既然內存單元中存貯的值。既然A A程序單元中的變量程序單元中的變量X X與與B B程序單程序單元中的變量元中的變量Y Y分配在同一存貯單元中,訪問分配在同一存貯單元中,訪問X X或訪問或訪問Y Y都是訪都是訪問同一個內存單元,取得的數(shù)也是相同的。問同一個內存單元,取得的數(shù)也是相同的。 如果兩個變量共享存貯單元,當如果兩個變量共享存貯單元,當A A程序單元中程序單元中

48、X=2X=2時,時,B B程程序單元中序單元中Y Y也是也是2 2。如果。如果A A程序單元中執(zhí)行語句程序單元中執(zhí)行語句X=X+1X=X+1,則,則B B程程序單元中序單元中Y Y的值也變?yōu)榈闹狄沧優(yōu)? 3,反之也然。當然,前提是,反之也然。當然,前提是X X和和Y Y的的類型必須一致。如果類型不一致,其結果將很難預料。類型必須一致。如果類型不一致,其結果將很難預料。共享方式有以下幾種:共享方式有以下幾種: COMMONCOMMON語句語句 EQUIVALENCEEQUIVALENCE語句語句 模塊模塊 INCLUDEINCLUDE語句可進行語句段復制。語句可進行語句段復制。 (F77)(F7

49、7)(F90)(F90)下一頁上一頁停止放映 一、一、 COMMON語句語句 F77F77中不同程序單元間數(shù)據(jù)的共享通常是用中不同程序單元間數(shù)據(jù)的共享通常是用COMMONCOMMON和和EQUIVALENCEEQUIVALENCE語句,使用這些語句共享數(shù)據(jù)的效率不高,編程語句,使用這些語句共享數(shù)據(jù)的效率不高,編程時容易出錯。但時容易出錯。但F90F90仍保留了這兩個語句以兼容以前的標準。仍保留了這兩個語句以兼容以前的標準。 COMMONCOMMON語句用于語句用于在不同程序單元之間進行實體的數(shù)據(jù)批量在不同程序單元之間進行實體的數(shù)據(jù)批量傳遞,傳遞,它比啞實結合的方法進行數(shù)據(jù)傳遞的速度要快。其方法

50、它比啞實結合的方法進行數(shù)據(jù)傳遞的速度要快。其方法是開辟一個公共塊,公共塊可以是無名的是開辟一個公共塊,公共塊可以是無名的( (只能有一個只能有一個) ),也可,也可以是有名稱的,其一般形式為:以是有名稱的,其一般形式為:COMMON /COMMON /公共塊名公共塊名1/1/變量名表變量名表1,/1,/公共塊名公共塊名2/2/變量名表變量名表2.2.公共塊名可以和變量名相同,變量實體名不得是啞元、可分配公共塊名可以和變量名相同,變量實體名不得是啞元、可分配數(shù)組、自動對象、函數(shù)名或函數(shù)結果名或數(shù)組、自動對象、函數(shù)名或函數(shù)結果名或ENTRYENTRY名,并且不得有名,并且不得有PARAMETERP

51、ARAMETER屬性。屬性。不同程序單元中相同公用名下的變量名可以是不同的。相同公不同程序單元中相同公用名下的變量名可以是不同的。相同公用名中的變量在不同程序單元中,用名中的變量在不同程序單元中,按位置一一對應共享同一存儲按位置一一對應共享同一存儲單元中的數(shù)值。單元中的數(shù)值。由于由于COMMONCOMMON語句是說明語句,它的位置必須在可執(zhí)行語句之前,語句是說明語句,它的位置必須在可執(zhí)行語句之前,通常是緊跟在程序單元的起始句之后,一個程序單元可以有多條通常是緊跟在程序單元的起始句之后,一個程序單元可以有多條COMMONCOMMON語句。語句。下一頁上一頁停止放映例如:下面的例如:下面的COMM

52、ONCOMMON語句段語句段COMMON/happy/we,you,theyCOMMON/happy/we,you,theyCOMMON/ /our,your,theirCOMMON/ /our,your,theirCOMMON/happy/i,he,sheCOMMON/happy/i,he,sheCOMMON/angry/dog,cat,mouseCOMMON/angry/dog,cat,mouseCOMMON my,his,herCOMMON my,his,her等價于語句段,等價于語句段,COMMON/happy/we,you,they,i,he,sheCOMMON/happy/we,y

53、ou,they,i,he,sheCOMMON/angry/dog,cat,mouseCOMMON/angry/dog,cat,mouseCOMMON/ /our,your,their,my,his,herCOMMON/ /our,your,their,my,his,her其中,有兩條有名公共塊語句,而其中,有兩條有名公共塊語句,而/是無名的。是無名的。 下一頁上一頁停止放映由于各個程序單元中的變量名是獨立的,它們并不會因由于各個程序單元中的變量名是獨立的,它們并不會因為名字相同而建立起數(shù)值的聯(lián)系。為名字相同而建立起數(shù)值的聯(lián)系。例如,主程序中名為例如,主程序中名為X X的變量和子程序中的的變量和

54、子程序中的X X變量雖然同變量雖然同名,但它們各有自己的存儲單元,互不相關。名,但它們各有自己的存儲單元,互不相關。但如果我們在主程序和子程序的說明部分各自都增加一但如果我們在主程序和子程序的說明部分各自都增加一條無名共用區(qū)語句:條無名共用區(qū)語句:COMMON XCOMMON X,則,則FORTRANFORTRAN編譯程序在編譯程序在存儲區(qū)中開辟了一個公用數(shù)據(jù)區(qū),主程序和子程序中的存儲區(qū)中開辟了一個公用數(shù)據(jù)區(qū),主程序和子程序中的COMMONCOMMON語句中的第一個變量共同占用公共塊的第一個存語句中的第一個變量共同占用公共塊的第一個存儲單元,達到數(shù)據(jù)共享。儲單元,達到數(shù)據(jù)共享。下一頁上一頁停止

55、放映例如:主程序中的語句例如:主程序中的語句COMMON X,Y,Z(3),ICOMMON X,Y,Z(3),I和子程序中的語句和子程序中的語句COMMON A,B,C(3),JCOMMON A,B,C(3),J使得無名公共塊中變量使得無名公共塊中變量X X和和A A,Y Y和和B B,數(shù)組,數(shù)組Z Z和和C C,I I和和J J分分別被分配在相同的存儲單元中。占同一個存儲單元的那別被分配在相同的存儲單元中。占同一個存儲單元的那些變量在不同的程序單位中,它們的名字不需要相同。些變量在不同的程序單位中,它們的名字不需要相同。COMMONCOMMON語句還可用來聲明數(shù)組,例如:語句還可用來聲明數(shù)組

56、,例如:COMMON /food/restruant(100),McDonald(10)COMMON /food/restruant(100),McDonald(10)這條語句已經(jīng)按這條語句已經(jīng)按I-NI-N規(guī)則聲明了實型數(shù)組和整型數(shù)組,規(guī)則聲明了實型數(shù)組和整型數(shù)組,無需用無需用DIMENSIONDIMENSION語句或屬性對數(shù)組名重新說明。如果語句或屬性對數(shù)組名重新說明。如果要重新定義類型的話,則數(shù)組大小不得在要重新定義類型的話,則數(shù)組大小不得在COMMONCOMMON語句和語句和類型說明語句中重復出現(xiàn)。類型說明語句中重復出現(xiàn)。 下一頁上一頁停止放映SUBROUTINE unit1SUBRO

57、UTINE unit1REAL(8)x(5)REAL(8)x(5)INTEGER JINTEGER JCHARACTER strCHARACTER str* *1212TYPE(member) club(50)TYPE(member) club(50)COMMON/blocka/x,j,str,clubCOMMON/blocka/x,j,str,club . .SUBROUTINE unit2SUBROUTINE unit2REAL(8) z(5)REAL(8) z(5)INTEGER mINTEGER mCHARACTER chrCHARACTER chr* *1212TYPE(member

58、TYPE(member) myclub(50) myclub(50)COMMON/blocka/z,m,chr,myclubCOMMON/blocka/z,m,chr,myclub 下一頁上一頁停止放映 二、二、 EQUIVALENCE語句語句 EQUIVALENCEEQUIVALENCE語句是說明語句,它必須出現(xiàn)在程序單元的語句是說明語句,它必須出現(xiàn)在程序單元的執(zhí)行語句之前。執(zhí)行語句之前。變量表中,可以是變量名、數(shù)組名或數(shù)組元素等,但至少應該變量表中,可以是變量名、數(shù)組名或數(shù)組元素等,但至少應該有兩個變量名,之間用逗號分開。有兩個變量名,之間用逗號分開。作用:作用: 使使同一個程序單元中的兩

59、個或更多的變量共用同一同一個程序單元中的兩個或更多的變量共用同一個存儲單元個存儲單元,以節(jié)省內存。這里特別需要強調的是同一個程序,以節(jié)省內存。這里特別需要強調的是同一個程序單元。單元。 允許用兩個或更多的變量名代表同一個量。允許用兩個或更多的變量名代表同一個量。等價語句的形式為:等價語句的形式為:EQUIVALENCE (EQUIVALENCE (變量名表變量名表1),(1),(變量名表變量名表2),2),例如,例如,EQUIVALENCE (A,B)EQUIVALENCE (A,B)語句指定本程序單位中的變量語句指定本程序單位中的變量A A和和B B同占一個存儲單元,也就是說這兩個變量都從同

60、一個存儲單元同占一個存儲單元,也就是說這兩個變量都從同一個存儲單元中取值,只要其中一個變量得到某個值,其它一個變量也就必中取值,只要其中一個變量得到某個值,其它一個變量也就必須具有相同的值。須具有相同的值。 如果數(shù)組出現(xiàn)在變量名表中,則它們的大小必須相同,等如果數(shù)組出現(xiàn)在變量名表中,則它們的大小必須相同,等價時按數(shù)組元素的排列順序一一對應。價時按數(shù)組元素的排列順序一一對應。 下一頁上一頁停止放映 三、塊數(shù)據(jù)三、塊數(shù)據(jù) 塊數(shù)據(jù)單元是塊數(shù)據(jù)單元是一種為有名公用塊中的變量定義初始值的一種為有名公用塊中的變量定義初始值的一種程序單元一種程序單元,它只包含數(shù)據(jù)聲明和初始值,不包含可執(zhí)行,它只包含數(shù)據(jù)聲明和初始值,不包含

溫馨提示

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

評論

0/150

提交評論