已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Fortran95/2003程序設(shè)計(jì),第七章過程,本章學(xué)習(xí)目標(biāo):學(xué)習(xí)Fortran語言中的過程如何幫助實(shí)現(xiàn)好的程序設(shè)計(jì)了解子程序與函數(shù)的不同掌握創(chuàng)建和調(diào)用子程序理解并學(xué)會(huì)使用INTENT屬性理解使用地址傳遞方案實(shí)現(xiàn)變量傳遞理解顯式結(jié)構(gòu)的形參數(shù)組、不定結(jié)構(gòu)的形參數(shù)組和不定大小的形參數(shù)組之間的區(qū)別理解為什么不再使用不定大小的數(shù)組掌握在過程之間使用模塊實(shí)現(xiàn)共享數(shù)據(jù)理解顯式接口,以及為什么在模塊內(nèi)部定義過程更好能創(chuàng)建并且調(diào)用用戶自定義函數(shù)掌握如何把Fortran過程調(diào)用參數(shù)傳遞給其他過程。,Fortran提供了一個(gè)特定機(jī)制,使得可以在構(gòu)建最終的程序前容易地獨(dú)立開發(fā)和調(diào)試子任務(wù)。可以把每個(gè)子任務(wù)作為獨(dú)立的程序單元來編碼,該獨(dú)立程序單元被稱為外部過程(externalprocedure),每個(gè)外部過程都可以獨(dú)立于程序中的其它子任務(wù)(過程)來進(jìn)行編譯、調(diào)試。,Fortran中有兩種外部過程:子程序(subroutine)和函數(shù)子程序(functionsubprogram)(或者就叫函數(shù),function),子程序通過在一個(gè)單獨(dú)的CALL語句中引入子程序名來進(jìn)行調(diào)用,并且可以通過調(diào)用參數(shù)來返回多個(gè)結(jié)果。函數(shù)通過在表達(dá)式中引入函數(shù)名來進(jìn)行調(diào)用,它的結(jié)果是單個(gè)數(shù)值,該值用來為表達(dá)式賦值。,在實(shí)際編程時(shí),把一個(gè)大程序任務(wù)分解為若干個(gè)子過程,可以獲得很多好處:獨(dú)立測(cè)試組件、復(fù)用子過程,隔離無意的副作用。,7.1子程序,SUBROUTINE語句標(biāo)志著子程序的開始,定義了子程序名和相關(guān)參數(shù)表。子程序名必須遵循標(biāo)準(zhǔn)的Fortran命名規(guī)則由字母和數(shù)字組成,最大長(zhǎng)度可以到31個(gè)字符,但第一個(gè)字符必須是字母。參數(shù)表含有一系列變量和/或數(shù)組,這些變量、數(shù)組的值將從調(diào)用程序傳遞給子程序。這些變量被稱為形參(dummyagument,形式參數(shù)),子程序?qū)嶋H上沒有為它們真正分配任何內(nèi)存空間。對(duì)從調(diào)用程序單元傳遞來的實(shí)際參數(shù)(實(shí)參)來說它們僅僅是占位符。,當(dāng)程序調(diào)用子程序時(shí),調(diào)用程序的執(zhí)行暫時(shí)被掛起,子程序執(zhí)行部分開始運(yùn)行。當(dāng)運(yùn)行到子程序的RETURN語句或ENDSUBROUTINE語句時(shí),調(diào)用程序又開始運(yùn)行調(diào)用子程序語句下面的程序代碼。,每個(gè)子程序是一個(gè)獨(dú)立的程序單元,它開始于SUBROUTINE語句,結(jié)束于ENDSUBROUTINE語句。,任何可執(zhí)行程序單元都可以調(diào)用子程序,包括另一個(gè)子程序。(但是,子程序不能調(diào)用它自身,除非它被定義為遞歸類型(recursive)。,例7-1用直角三角形兩直角邊計(jì)算斜邊。,子程序中的RETURN語句是可選的。當(dāng)運(yùn)行到ENDSUBROUTINE語句時(shí),程序會(huì)自動(dòng)返回到調(diào)用程序。只有需要在子程序結(jié)束之前返回到調(diào)用程序時(shí),才需要用到RETURN語句。,例7-2數(shù)據(jù)排序,7.1.2INTENT屬性,子程序的形參可以與一個(gè)INTENT屬性聯(lián)合使用。INTENT屬性與類型聲明語句聯(lián)合使用,來聲明每個(gè)形參的類型,告訴編譯器如何使用形參。,7.1.3Fortran中的變量傳遞:地址傳遞方案,主程序和子程序之間用地址傳遞(pass-by-reference)方案來進(jìn)行通信。主程序傳遞一個(gè)指針來指向?qū)崊⒈碇懈鱾€(gè)參數(shù)的存儲(chǔ)位置,子程序查找調(diào)用程序所指向的內(nèi)存位置,獲得形參值。,參數(shù)列表中的值與子程序的調(diào)用參數(shù)在個(gè)數(shù)、類型、次序方面都必須完全匹配。如果存在不匹配,F(xiàn)ortran程序不能識(shí)別這種現(xiàn)象,會(huì)在沒有任何提示的情況下錯(cuò)用這些參數(shù),產(chǎn)生錯(cuò)誤結(jié)果。,例7-3調(diào)用子程序形參不匹配示例,7.1.4傳遞數(shù)組給子程序,通過內(nèi)存位置指針將參數(shù)傳遞給子程序,如果參數(shù)是個(gè)數(shù)組,那么指針指向的就是數(shù)組中的第一個(gè)值。為此,子程序既需要知道數(shù)組的地址,也需要知道數(shù)組的大小。,有3種可能的方式來指明形參數(shù)組的大小:(1)把數(shù)組的大小作為形參傳遞。,(2)把子程序中的所有形參數(shù)組聲明為不定結(jié)構(gòu)的形參數(shù)組(assumed-shapedummyarray),以創(chuàng)建一個(gè)子程序的顯式接口。(7.3節(jié)介紹),(3)用星號(hào)(*)來聲明形參數(shù)組的長(zhǎng)度,定義不定大小的形參數(shù)組(assumed-sizedummyarray)。不會(huì)進(jìn)行越界檢測(cè)。,如果數(shù)組datal和data2的長(zhǎng)度大于或等于比nvals,則正常,否則出錯(cuò)。是早期版本的一個(gè)過渡行為,不再使用。,7.1.5傳遞字符變量給子程序,例7-4子程序數(shù)組越界,7.1.6子程序中錯(cuò)誤處理,字符變量作為子程序的形參時(shí),用*來聲明字符變量的長(zhǎng)度。因?yàn)闆]有給形參分配內(nèi)存,所以在編譯時(shí)無需知道字符參數(shù)的長(zhǎng)度。,不是最佳處理方式,因?yàn)橐坏┩V?,將丟失調(diào)用該子程序之前的數(shù)據(jù)信息。,永遠(yuǎn)不要在子程序中使用STOP語句。如果在一個(gè)子程序中可能存在錯(cuò)誤條件,那么應(yīng)該對(duì)錯(cuò)誤進(jìn)行檢測(cè),并設(shè)置錯(cuò)誤標(biāo)志,返回給調(diào)用程序。,7.2用模塊共享數(shù)據(jù),模塊(module)是一個(gè)獨(dú)立編譯的程序單元,它包含了程序單元間共享的數(shù)據(jù)的定義和初始值。如果程序單元中使用了包含模塊名的USE語句,那么在那個(gè)程序單元中可以使用模塊中定義的數(shù)據(jù)。,SAVE語句使得模塊中的數(shù)據(jù)能夠被所有的引用修改保存。,USE語句必須出現(xiàn)在程序單元中的其他語句之前。,例7-5使用模塊示例。,使用use后模塊對(duì)于該子程序是可見的,但是對(duì)于調(diào)用該子程序的程序是不可見的,除非該程序也use了該模塊。,例7-6生成隨機(jī)數(shù),一個(gè)簡(jiǎn)單的隨機(jī)數(shù)生成算法:,ni是一個(gè)非負(fù)整數(shù),上式生成一系列數(shù)據(jù),它們?nèi)≈翟?,134455之間?,F(xiàn)設(shè)計(jì)一個(gè)隨機(jī)數(shù)發(fā)生器,它將輸出一個(gè)范圍為0.0,1.0的實(shí)數(shù)。,7.3模塊過程(moduleprocedures),除了數(shù)據(jù)之外,模塊還可以含有完整的子程序和函數(shù),它們被稱為模塊過程(moduleprocedure),7.3.1使用模塊創(chuàng)建顯式接口,既然任何子程序和函數(shù)可以獨(dú)立編譯和調(diào)用,那么為什么還要費(fèi)周折放到模塊中呢?,在模塊內(nèi)編譯并通過use關(guān)聯(lián)的子程序稱為有顯式接口(explicitinterface),該子程序在任何時(shí)候使用時(shí),F(xiàn)ortran編譯器清楚地知道過程的每個(gè)參數(shù)的所有細(xì)節(jié),并通過檢測(cè)接口來確保正確使用該子程序。,反之,不在模塊內(nèi)的子程序稱為隱式接口(implicitinterface),編譯器在編譯調(diào)用該子程序時(shí),不知道其任何信息,不對(duì)該子程序的參數(shù)個(gè)數(shù)、類型、intent等信息進(jìn)行檢查。,例7-7模塊中的子程序,7.4Fortran函數(shù)子程序,Fortran函數(shù)(function)是這樣一個(gè)過程,它的結(jié)果是單個(gè)數(shù)值、邏輯值、字符串或、數(shù)組。,函數(shù)名必須至少出現(xiàn)在賦值語句的左側(cè)一次。當(dāng)返回調(diào)用程序單元時(shí),賦給函數(shù)名的值是函數(shù)的返回值。,必須為函數(shù)指定一個(gè)類型。如果使用IMPLICITNONE語句,那么在函數(shù)和調(diào)用程序中都應(yīng)該聲明函數(shù)類型。如果沒有使用IMPLICITNONE語句,除非它們用類型聲明語句說明,否則函數(shù)的缺省類型將會(huì)遵循Fortran語言的標(biāo)準(zhǔn)規(guī)則來確定。,確保在函數(shù)子程序自身和調(diào)用它的程序中聲明函數(shù)類型。,7.4.1函數(shù)的副作用,函數(shù)使用參數(shù)傳遞模式,函數(shù)獲取的是指向參數(shù)位置的指針,它可能會(huì)有意或無意地修改了其中的內(nèi)容。修改了它的參數(shù)表值的函數(shù)會(huì)產(chǎn)生副作用(sideeffect)。,函數(shù)應(yīng)該永遠(yuǎn)不修改自身的輸入值,如果需要一個(gè)過程生成多個(gè)輸出值,那么應(yīng)該把過程寫成為子程序而不是函數(shù)。為了確保函數(shù)的參數(shù)不被無意識(shí)地修改,應(yīng)該總是用INTENT(IN)屬性聲明輸入?yún)?shù)。,例7-8計(jì)算f(x)=ax2+bx+c,7.5過程作為參數(shù)傳遞給其他過程,函數(shù)和子程序都可以被當(dāng)作調(diào)用參數(shù)來傳遞。,7.5.1用戶自定義函數(shù)作為參數(shù)傳遞,Fun1,fun2是兩個(gè)用戶函數(shù),只有被聲明為外部量(extemal)時(shí),用戶自定義函數(shù)才可以當(dāng)作調(diào)用參數(shù)傳遞。當(dāng)參數(shù)表中的某個(gè)名字被聲明為外部變量,相當(dāng)于告訴編
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 紙盒制作工崗前操作評(píng)估考核試卷含答案
- 麻料作物栽培工常識(shí)評(píng)優(yōu)考核試卷含答案
- 泥釉漿料制備輸送工安全防護(hù)測(cè)試考核試卷含答案
- 溫差電電池制造工成果轉(zhuǎn)化能力考核試卷含答案
- 賓客行李員崗前創(chuàng)新意識(shí)考核試卷含答案
- 木地板制造工誠(chéng)信品質(zhì)模擬考核試卷含答案
- 煤間接液化分離操作工操作水平競(jìng)賽考核試卷含答案
- 懷孕不參加培訓(xùn)的請(qǐng)假條
- 2025年坦克玻璃系列合作協(xié)議書
- 2025年針織、編織制品項(xiàng)目發(fā)展計(jì)劃
- 淮安市2022-2023學(xué)年七年級(jí)上學(xué)期期末道德與法治試題【帶答案】
- 大轉(zhuǎn)爐氧槍橡膠軟管和金屬軟管性能比較
- 四川省內(nèi)江市2023-2024學(xué)年高二上學(xué)期期末檢測(cè)生物試題
- 02-廢氣收集系統(tǒng)-風(fēng)管設(shè)計(jì)課件
- 2022ABBUMC100.3智能電機(jī)控制器
- 天津東疆我工作圖0718
- GB/T 19367-2022人造板的尺寸測(cè)定
- 北京春季化學(xué)會(huì)考試卷及答案
- 數(shù)學(xué)建模插值與擬合
- GB/T 34528-2017氣瓶集束裝置充裝規(guī)定
- GB/T 3299-2011日用陶瓷器吸水率測(cè)定方法
評(píng)論
0/150
提交評(píng)論