FORTRAN90第九章 模塊.ppt_第1頁(yè)
FORTRAN90第九章 模塊.ppt_第2頁(yè)
FORTRAN90第九章 模塊.ppt_第3頁(yè)
FORTRAN90第九章 模塊.ppt_第4頁(yè)
FORTRAN90第九章 模塊.ppt_第5頁(yè)
已閱讀5頁(yè),還剩26頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、9 模塊,9.1 模塊的定義 9.2 USE語(yǔ)句 9.3 接口塊 9.4 重載和定義操作符 9.5 模塊的應(yīng)用,模塊是一種不能直接執(zhí)行的程序單元,可以包含數(shù)據(jù)說(shuō)明和過(guò)程,通過(guò)USE語(yǔ)句對(duì)模塊進(jìn)行引用,可提供數(shù)據(jù)類(lèi)型、數(shù)據(jù)和過(guò)程的共享。,9.1 模塊的定義,定義的格式 MODULE 模塊名 類(lèi)型說(shuō)明部分 Contains 內(nèi)部過(guò)程子程序1 內(nèi)部過(guò)程子程序2 內(nèi)部過(guò)程子程序n END MODULE模塊名,模塊名是全局標(biāo)識(shí)符,必須是唯一的,不能與其它程序單元或本模塊內(nèi)的局部變量同名。 模塊如果有內(nèi)部過(guò)程子程序,則子程序必須完全定義在模塊內(nèi),各模塊的書(shū)寫(xiě)順序是任意的。 說(shuō)明部分可以是類(lèi)型說(shuō)明語(yǔ)句、派生

2、類(lèi)定義、接口塊,不能有執(zhí)行語(yǔ)句或Format語(yǔ)句。,9.1 模塊的定義,模塊引用是通過(guò)Use語(yǔ)句進(jìn)行的,格式為: Use 模塊名,9.2 Use語(yǔ)句,當(dāng)程序單元引用多個(gè)模塊時(shí),可能存在名字沖突:兩個(gè)模塊中用到的變量有相同的名字,但卻有不同的意義。這時(shí)可用更名的方法: Use 模塊名,更名表 更名表的格式為:局部名=引用名,局部名=引用名,局部名=引用名,局部名=引用名,Use Beam, Area=Ar,Force=St 引用模塊Beam時(shí),通過(guò)使用名Area,F(xiàn)orce來(lái)訪問(wèn)模塊中的對(duì)象Ar,St。,模塊中可以定義許多內(nèi)部子過(guò)程和數(shù)據(jù),如果只要使用模塊中的部分對(duì)象,則可在Use語(yǔ)句中加入On

3、ly選項(xiàng),格式為: Use 模塊名,Only:Only表,9.2 Use語(yǔ)句,Only表的形式: 局部名=引用名,局部名=引用名, 局部名=引用名,Use Beam,Only: Area=Ar,Force 只引用模塊Beam的Force和Ar,并用Area來(lái)訪問(wèn)模塊中的對(duì)象Ar, Force 用原名訪問(wèn)。,例如: MODULE MY_MODULE REAL,PARAMETER:PI=3.14159 CONTAINS SUBROUTINE SWAP(X,Y) REAL TEMP,X,Y TEMP=X X=Y Y=TEMP END SUBROUTINE SWAP END MODULE MY_MOD

4、ULE,PROGRAMUSE_MODULE UES MY_MODULE IMPLICIT NONE REAL A,B READ*,A B=PI CALL SWAP(A,B) PRINT*,A,B END,格式: Interface 類(lèi)屬說(shuō)明 接口體 模塊過(guò)程說(shuō)明語(yǔ)句 END Interface,接口塊中只能有說(shuō)明語(yǔ)句,不能有執(zhí)行語(yǔ)句或FORMAT語(yǔ)句。 類(lèi)屬說(shuō)明可以是:類(lèi)屬名,或OPERATOR,或ASSIGNMENT(=),分別用于定義類(lèi)屬過(guò)程, 定義運(yùn)算 ,重載賦值運(yùn)算符。 接口塊不允許出現(xiàn)在Block Data程序單元中。,9.3 接口語(yǔ)句,接口塊中的語(yǔ)句稱(chēng)接口體。形式為: 過(guò)程語(yǔ)句 !

5、函數(shù)語(yǔ)句或子程序語(yǔ)句 過(guò)程的說(shuō)明部分 過(guò)程的END語(yǔ)句,用接口塊說(shuō)明模塊的內(nèi)部過(guò)程時(shí),必須用模塊過(guò)程語(yǔ)句加以說(shuō)明。形式為: Module Procedure 過(guò)程名表 過(guò)程名表中的各過(guò)程必須是其宿主中可見(jiàn)的。用模塊過(guò)程語(yǔ)句時(shí),接口塊中必須含有一個(gè)類(lèi)屬說(shuō)明。,例如: MODULE INTERVAL_ARITHMETIC TYPE INTERVAL REAL LOWER, UPPER END TYPE INTERVAL INTERFACE OPERATOR(+) MODULE PROCEDURE COMB_INTERVALS END INTERFACE CONTAINS FUNCTION COMB

6、_INTERVALS (A,B) TYPE(INTERVAL ) COMB_INTERVALS ,A,B COMB_INTERVALS %LOWER=MIN(A%LOWER ,B%LOWER) COMB_INTERVALS % UPPER =MAX(A%UPPER ,B% UPPER) END FUNCTION COMB_INTERVALS END MODULE INTERVAL_ARITHMETIC,9.3 接口語(yǔ)句,一個(gè)接口塊中可以有多個(gè)接口體。程序單元的接口塊中不能含有本程序單元定義的過(guò)程的接口體。換言之,過(guò)程用接口塊或內(nèi)部過(guò)程與宿主聯(lián)系是兩種方式,不能同時(shí)并用。,當(dāng)然可以用接口塊代替E

7、XTERNAL語(yǔ)句來(lái)說(shuō)明外部過(guò)程或虛過(guò)程,此種方法為過(guò)程提供了顯式的調(diào)用接口,提高了程序的可讀性。,9.4 超載和定義操作符,類(lèi)屬過(guò)程是一種過(guò)程,它允許不同類(lèi)型的實(shí)參和同一個(gè)虛參結(jié)合,使得過(guò)程調(diào)用更方便。 類(lèi)屬過(guò)程的方法是根據(jù)實(shí)參的不同類(lèi)型,定義了幾個(gè)函數(shù)或子程序過(guò)程,它們屬于一類(lèi),然后用類(lèi)屬過(guò)程接口塊給它們另取一個(gè)共同的名字(類(lèi)屬名),程序中使用類(lèi)屬名可以調(diào)用它們中的任何一個(gè),由編譯系統(tǒng)根據(jù)實(shí)參類(lèi)型確定究竟是調(diào)用哪個(gè)過(guò)程。使用這些過(guò)程的專(zhuān)用名調(diào)用也是可以的,但必須注意保持參數(shù)類(lèi)型的一致性。,9.4.1 類(lèi)屬過(guò)程,例:整數(shù),實(shí)數(shù),點(diǎn)的坐標(biāo)的交換 module swap_them implici

8、t none TYPE POINT REAL X,Y,Z END TYPE POINT interface swap module procedure swapi,swapr,swapp end interface contains subroutine swapi(a,b) integer a,b,t t=a;a=b;b=t end subroutine swapi,subroutine swapr(a,b) real a,b,t t=a;a=b;b=t end subroutine swapr subroutine swapp(a,b) type(point):a,b,t t=a;a=b;

9、b=t end subroutine swapp end module swap_them,use swap_them real a,b integer c,d type(point):p,q a = 1.1;b=2.2;c=3;d=4 p = point(5,6,7);q=point(8,9,10) print *,a,b,c,d print *,p,q call swap(p,q) !交換點(diǎn)的坐標(biāo) call swap(a,b) !交換實(shí)數(shù)值 call swap(c,d) !交換整數(shù)值 print *,a,b,c,d print *,p,q end,9.4 超載和定義操作符,所謂超載(Ove

10、rLoad)也稱(chēng)為重載,在現(xiàn)代面向?qū)ο蟮某绦蛟O(shè)計(jì)中廣泛應(yīng)用。 通常的賦值語(yǔ)句要求賦值號(hào)兩端的類(lèi)型是賦值兼容的,可以重載賦值號(hào),對(duì)賦值的意義進(jìn)行重新定義。 重載賦值號(hào)的過(guò)程有兩個(gè)參數(shù),第一個(gè)屬性為INTENT(out),第二個(gè)為INTENT(IN),9.4.2 超載賦值號(hào),例:將百分制的成績(jī)用四級(jí)記分制表示。 module level interface Assignment(=) ! 重載賦值號(hào) module procedure slevel end interface contains subroutine Slevel(b,a) !賦值的新定義 integer,intent(in):a c

11、haracter(2),intent(out):b Select case(a) case(90:);b = 優(yōu); case(75:89);b=良 case(60:74);b=中;case(:59);b=差 End select end subroutine slevel end module level,簡(jiǎn)單的主程序如下: use level integer a character(2) b print *,請(qǐng)輸入百分制成績(jī) read*,a b=a print (I4,2a),a,分的等級(jí)為,b end,9.4 超載和定義操作符,運(yùn)算符的意義也可以重新定義,這就是所謂重載運(yùn)算符。 重載固有運(yùn)

12、算符時(shí),不能引起二義性。例如:對(duì)于數(shù)值型操作數(shù),不能重載+,-,*,/等運(yùn)算符。 重載運(yùn)算符的函數(shù)子程序有一個(gè)或兩個(gè)參數(shù),其屬性為Intent(in)。例如,-號(hào)作為減號(hào)時(shí)有兩個(gè)參數(shù),是雙目運(yùn)算符;而作為負(fù)號(hào)是只有一個(gè)參數(shù),是單目運(yùn)算符。,9.4.3 超載運(yùn)算符,9.4 超載和定義操作符,例:重載加號(hào)運(yùn)算符,用于矢量加法。 module operate implicit none TYPE POINT REAL X,Y,Z END TYPE POINT interface Operator(+) !雙目運(yùn)算符 module procedure vectp end interface,9.4.3

13、 超載運(yùn)算符,interface Operator(-) !單目運(yùn)算符 module procedure vectm end interface interface Operator(-) !雙目運(yùn)算符 module procedure vects end interface contains Function vectm(a)Result(b) type(point),intent(in):a type(point):b b%x = -a%x b%y=-a%y b%z=-a%z end function vectm,Function vectp(p,q)Result(b) type(poin

14、t),intent(in):p,q type(point):b b%x=p%x+q%x; b%y=p%y+q%y b%z=p%z+q%z end function vectp Function vects(p,q)Result(b) type(point),intent(in):p,q type(point):b b%x=p%x-q%x; b%y=p%y-q%y b%z=p%z-q%z; end function vects end module operate,簡(jiǎn)單的測(cè)試主程序: use operate type(point):p,q,s print *,請(qǐng)輸入兩個(gè)點(diǎn)的坐標(biāo) read*,p,

15、q s = p+q !矢量相加 print *,p print *,q print *,s Print *,-p !負(fù)矢量 Print *,p-q !矢量相減 end,9.4 超載和定義操作符,把某種變換看作是運(yùn)算,給它定義一種運(yùn)算符,這就是用戶(hù)定義的運(yùn)算符。 用戶(hù)定義的運(yùn)算符用一個(gè)夾在兩個(gè)點(diǎn).之間的字符串表示,這個(gè)字符串不能與邏輯常量相同,也不能是固有運(yùn)算符。其長(zhǎng)度不大于31。 定義運(yùn)算符的函數(shù)子程序有一個(gè)或兩個(gè)參數(shù),其屬性為Intent(in)。 自定義的雙目運(yùn)算符優(yōu)先級(jí)別低于其他運(yùn)算符,自定義的單目運(yùn)算符優(yōu)先級(jí)別高于其他運(yùn)算符。,9.4.4 用戶(hù)定義的運(yùn)算符,例:定義運(yùn)算符.conj.計(jì)

16、算兩電阻的并聯(lián)電阻 module operate implicit none interface Operator(.conj.) module procedure combr end interface contains Function combr(r1,r2)Result(r) real,intent(in):r1,r2 real r r = r1*r2/(r1+r2) end function combr end module operate,簡(jiǎn)單的測(cè)試主程序: use operate real a,b,c print *,請(qǐng)輸入兩個(gè)電阻值 read*,a,b c=a.conj.b p

17、rint (3f8.2), a,b,c end,9.4 超載和定義操作符,重載固有函數(shù)的辦法與定義類(lèi)屬過(guò)程的方法幾乎一樣,只不過(guò)類(lèi)屬名不能由用戶(hù)自定,而必須與所要重載的固有函數(shù)相同。,9.4.5 超載固有函數(shù),例:重載ABS()函數(shù),計(jì)算矢量的長(zhǎng)度。 module overloadabs implicit none TYPE POINT REAL X,Y,Z END TYPE POINT interface abs module procedure vectabs end interface,contains Function vectabs(p)Result(d) type(point),i

18、ntent(in):p real d d = sqrt(p%x*2+p%y*2+p%z*2) end function vectabs end module overloadabs !主程序如下: use overloadabs type(point):p;real d print *,“請(qǐng)輸入點(diǎn)的坐標(biāo)”;read*,p d = abs(p) print *,p,d END,利用模塊的特性和用法,可以實(shí)現(xiàn)數(shù)據(jù)的共享。將所有或部分程序單元用到的數(shù)據(jù)有組織地放在一些模塊中,通過(guò)Use語(yǔ)句引用,就可以在相關(guān)的程序單元之間傳遞數(shù)據(jù)。這是有別于虛實(shí)結(jié)合方法的一種新方法。必要時(shí),可以用Use語(yǔ)句的Only選項(xiàng)選擇過(guò)濾共享數(shù)據(jù);也可以利用Use語(yǔ)句的變量更名功能避免名字沖突。,9.5 模塊的應(yīng)用,9.5.1 數(shù)據(jù)共享,將派生類(lèi)型的定義放在一個(gè)模塊內(nèi),在使用這些派生類(lèi)型的程序單元中就不必再定義這些派生類(lèi)型了,通過(guò)Use語(yǔ)句引用,可以實(shí)現(xiàn)多個(gè)程序單元共享這些派生類(lèi)型。,9.5 模塊的應(yīng)用,9.5.2 公用派生類(lèi)型,9.5.3 可分配數(shù)組的共享,作為數(shù)據(jù)共享的一個(gè)特例,將在多個(gè)程序單元中使用的可分配數(shù)組的定義放在一個(gè)模塊內(nèi),就實(shí)現(xiàn)了可分配數(shù)組的共享。,抽象數(shù)據(jù)類(lèi)型可以用派生類(lèi)型來(lái)實(shí)現(xiàn),前面定義的派生類(lèi)型point可以當(dāng)作矢量來(lái)用。關(guān)于矢量的運(yùn)算有:負(fù)矢量、矢量加減、矢量長(zhǎng)度與方向、點(diǎn)積、叉

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論