国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

C語言程序設(shè)計中的函數(shù)分解與函數(shù)定義

2015-05-30 10:48周百順
計算機教育 2015年4期
關(guān)鍵詞:C語言模塊化

周百順

摘要:分而治之的模塊化編程思想是C語言程序設(shè)計的指導(dǎo)思想,對復(fù)雜程序的函數(shù)分解則是對這一思想的實踐。文章分析函數(shù)分解的時機和意義,討論通過函數(shù)定義對分解后的子模塊進行封裝的一般原則,旨在指導(dǎo)C語言程序設(shè)計實踐。

關(guān)鍵詞:C語言:函數(shù)分解;函數(shù)定義;模塊化

引 言

C語言是一種面向過程的結(jié)構(gòu)化程序設(shè)計語言,是UNIX操作系統(tǒng)的主要編寫語言,也是很多高級語言發(fā)展的基石。C語言與計算機底層結(jié)合緊密、執(zhí)行效率高,使得其在追求性能和效率的嵌入式編程、系統(tǒng)級軟件開發(fā)、數(shù)據(jù)通信等領(lǐng)域有著突出的優(yōu)勢。

結(jié)構(gòu)化程序設(shè)計( structured progra-ming)的思想是由荷蘭學(xué)者E.W.Dijikstra在20世紀(jì)60年代后期提出的,以過程為中心,強調(diào)功能分解和模塊化設(shè)計。核心理念是采用“自頂向下逐步求精、分而治之”的方法進行大型程序設(shè)計。基本思想是:從待解決的初始問題出發(fā),運用科學(xué)抽象的方法,把它分解成若干相對獨立的小問題,依次細(xì)化,直至各個小問題獲得解決為止,最后通過這些小問題的解逆向構(gòu)造初始問題的解。C語言中的函數(shù)機制是實現(xiàn)結(jié)構(gòu)化程序設(shè)計的重要保障,提供了將程序巾的代碼片段抽取出來作為整體來使用和處理的手段,滿足了復(fù)雜計算的分解和重組需要 。編寫大型程序時應(yīng)特別注意程序的功能分解,以及分解后的模塊封裝,對C語言程序設(shè)計而言主要是程序的函數(shù)分解和函數(shù)定義。

1 函數(shù)分解的時機和意義

程序開發(fā)過程中,隨著需要處理的問題變得復(fù)雜,程序也會變得越來越長。長的程序牽扯情況復(fù)雜,編程人員更難把握,同時長程序的閱讀和理解也更困難,這又反過來影響程序的開發(fā)和維護。處理復(fù)雜問題的基本方法就是化繁為簡,分而治之。依據(jù)結(jié)構(gòu)化程序設(shè)計思想,借助C語言中函數(shù)的抽象機制,對復(fù)雜程序進行函數(shù)劃分的過程就是程序的函數(shù)分解。

針對復(fù)雜問題求解所采用的模塊劃分通常是從功能的角度進行,劃分后的模塊要具備“相對獨立,功能單一”的特征。也就是說,一個好的模塊必須具有高度的獨立性和較強的功能。實際應(yīng)用中通常用“耦合度”和“內(nèi)聚度”兩個指標(biāo)從不同角度對模塊的劃分情況加以度量。耦合度是對模塊之間相互依賴性大小的度量,耦合度越小,模塊的相對獨立性越大。高耦合的系統(tǒng)中,一個模塊的修改往往會影響其他模塊,低耦合系統(tǒng)中這種影響相對較小。內(nèi)聚度是對模塊內(nèi)各元素之間相互依賴性大小的度量,內(nèi)聚度越大,模塊內(nèi)各元素之間聯(lián)系越緊密,其功能越強;反之,低內(nèi)聚模塊內(nèi)各元素的關(guān)系較為松散。因此,模塊劃分時應(yīng)當(dāng)盡可能降低不同模塊間的關(guān)聯(lián),提升單一模塊自身的功能性,做到“耦合度盡量小,內(nèi)聚度盡量大”。

此外,隨著程序變大,程序中會出現(xiàn)許多不同位置需要做相同或類似工作的情況,分別寫出這樣的代碼片段既使程序變長,又增加了不同部分間的相互關(guān)聯(lián)。對于這些重復(fù)出現(xiàn)的相同或相似的片段,可從中抽取出共用的部分定義為子函數(shù),原有程序中相關(guān)部分通過簡單的函數(shù)調(diào)用語句代替。這樣做不但可能縮短程序的代碼,也將大大提高程序的可讀性和易修改性,使得整個程序里同樣的計算片段僅描述一次,如果需要修改這部分計算,只需要修改其對應(yīng)的函數(shù)定義部分即可。

適當(dāng)?shù)暮瘮?shù)分解使得復(fù)雜問題更容易分析和把握,提高了代碼重用率,也使得程序設(shè)計中的分工合作成為可能。大型應(yīng)用程序在開發(fā)過程中通常都會依據(jù)上述原則進行模塊劃分,由于模塊間具有較高的獨立性,在設(shè)計好模塊間接口的情況下可將各個模塊分配給不同的編程人員實現(xiàn)。對于程序中常用的基礎(chǔ)功能模塊,也可由專門的編程人員將其封裝為子函數(shù),集成到自定義的函數(shù)庫中,供程序開發(fā)人員共用,既避免了重復(fù)開發(fā),也有利于提升代碼質(zhì)量。這種分工合作使得軟件開發(fā)效率有了顯著的提高,同時也促進了代碼編寫的標(biāo)準(zhǔn)化。

2 函數(shù)定義與模塊的封裝

經(jīng)過不斷細(xì)化和函數(shù)分解,整個程序已經(jīng)劃分為若干個功能相對獨立的子模塊,接下來需要通過定義子函數(shù)來實現(xiàn)對單個模塊的封裝。函數(shù)的定義包括函數(shù)頭部和函數(shù)體兩部分。函數(shù)頭部給出了函數(shù)的名字和類型特征,函數(shù)體則是函數(shù)功能的代碼實現(xiàn)部分。定義一個函數(shù)就是根據(jù)模塊的功能描述,對其進行函數(shù)封裝,設(shè)計出函數(shù)頭部信息并編寫函數(shù)體相關(guān)代碼,函數(shù)定義的一般格式如下 :

函數(shù)本身是一個相對獨立的功能實體,是對完成一定功能的程序代碼的封裝,能夠?qū)σ欢ǖ妮斎藬?shù)據(jù)進行加工,產(chǎn)生預(yù)期的輸出結(jié)果。因此,編寫函數(shù)定義的過程和完成一個程序是類似的,都需要根據(jù)問題的描述,設(shè)計出解決方案,并編寫相關(guān)的實現(xiàn)代碼。兩者一個很重要的區(qū)別在于其與外界交互的方式不同:程序是可以獨立運行的,通過輸入輸出和使用該程序的終端用戶通信;函數(shù)不能獨立運行,只能被主程序調(diào)用執(zhí)行,通過參數(shù)和返回值與它的調(diào)用程序之間進行信息交互,接收調(diào)用程序傳遞的輸人數(shù)據(jù),并將運行結(jié)果返回給調(diào)用程序。

可見,在針對具體問題編寫函數(shù)定義時,同樣需要首先分析出問題的輸入和輸出,然后通過自頂向下逐步求精的方法來設(shè)計解決問題的主要步驟,最后使用函數(shù)對其進行封裝。一般情況下,問題的輸入固定對應(yīng)于函數(shù)的形式參數(shù),而問題的輸出則有兩種方法返回給調(diào)用程序。。

第一種方法是通過返回值將輸出結(jié)果返回給調(diào)用程序。函數(shù)體內(nèi)通過return語句顯式結(jié)束函數(shù)的執(zhí)行,并返回一個特定類型的值作為函數(shù)調(diào)用的結(jié)果。此時,函數(shù)調(diào)用結(jié)果與該類型的變量相當(dāng),可以作為表達(dá)式的一部分參與運算。

例如,數(shù)學(xué)函數(shù)庫中的sqrt函數(shù)就是通過返回值來傳遞計算結(jié)果,返回值類型為double型。當(dāng)發(fā)生函數(shù)調(diào)用時,會將調(diào)用程序傳人的實際參數(shù)的平方根作為結(jié)果返回。該函數(shù)調(diào)用的作用與任意double型變量一樣,可以參與到相關(guān)運算中。

如:double result=5.3+sqrt(3);這樣的語句是合法的,先執(zhí)行函數(shù)調(diào)用,計算常數(shù)3的平方根并將其作為結(jié)果返回,然后在函數(shù)的調(diào)用點處用返回值代替函數(shù)調(diào)用參與加法運算,相加后的結(jié)果賦值給result變量。

第二種方法是通過指針形式的參數(shù)將輸出結(jié)果返回給調(diào)用程序。在定義函數(shù)時,除了與輸入相對應(yīng)的形式參數(shù)外,額外增加一個或多個指針型參數(shù),用于傳遞函數(shù)的輸出結(jié)果。發(fā)生函數(shù)調(diào)川時,凋用程序在傳人實際輸入數(shù)據(jù)給函數(shù)的同時,還要在指針型參數(shù)的位置傳人本地變量的地址作為實際參數(shù),從而在函數(shù)調(diào)用結(jié)束時將結(jié)果通過該變量帶回到調(diào)用程序中。

例如使用scanfo函數(shù)從鍵盤上讀人數(shù)據(jù)時,輸入會存儲到作為參數(shù)提供的地址中。

據(jù)此,從參數(shù)功能的角度可以將函數(shù)定義中的參數(shù)進一步細(xì)分為輸入型參數(shù)和輸出型參數(shù)。前者用于接收調(diào)用程序傳遞給函數(shù)的輸入數(shù)據(jù),后者則用于將函數(shù)的計算結(jié)果返回給調(diào)用程序。輸出型參數(shù)一般表現(xiàn)為指針類型的變量。

實際應(yīng)用中,輸出結(jié)果返回方式的選擇,主要取決于待封裝問題的輸入輸出特征。從某種意義上講,參數(shù)提供了函數(shù)的輸入,返回值是它的輸出,輸出返回給調(diào)用程序。因此,一般情況下,優(yōu)先考慮通過返回值傳遞函數(shù)調(diào)用結(jié)果,只有當(dāng)返同值無法很好地滿足需要時,才會考慮通過指針型參數(shù)來傳遞調(diào)用結(jié)果。

綜上,通過對待封裝問題輸入輸出特征的分析,結(jié)合實際應(yīng)用中的函數(shù)設(shè)計經(jīng)驗,可以總結(jié)出如下函數(shù)定義的一般原則:

函數(shù)定義原則1:一般情況下,待封裝問題功能描述巾的輸入同定對應(yīng)于函數(shù)定義中的形式參數(shù)。即問題描述中有多少輸入,函數(shù)定義中就要設(shè)置相應(yīng)數(shù)量的形式參數(shù)與之對應(yīng)。如果問題描述中沒有明確的輸入數(shù)據(jù),則函數(shù)定義中可以沒有形式參數(shù),但函數(shù)名后面的括號必須有。

示例1:定義一個函數(shù),用于計算3個整數(shù)巾的最大值。

分析:問題描述中明確指出函數(shù)要能夠?qū)斎氲?個整數(shù)進行處理,找出最大值。因此,對應(yīng)函數(shù)定義的參數(shù)列表中至少應(yīng)該有3個int類型的形式參數(shù),用于在函數(shù)調(diào)用時接收調(diào)用程序傳人的3個整數(shù)。

函數(shù)定義原則2:如果待封裝問題的功能描述中,輸出結(jié)果為單一數(shù)值,適合通過返問值將問題的輸出返回給調(diào)用程序。

同樣針對上面的問題,輸出結(jié)果為3個整數(shù)中的最大值,屬于單一數(shù)值,可用返回值將結(jié)果返回。根據(jù)題意,最大值是整數(shù)類型。故,函數(shù)定義中的返回值類型可定義為int。函數(shù)頭部的完整定義為:int Maxln3(int num_l,int num_2,intnum_3)。

函數(shù)定義原則3:如果待封裝問題的功能描述中,輸出結(jié)果為多個數(shù)值,適合通過輸…型參數(shù)將問題的輸出返回給調(diào)用程序。

示例2:編寫函數(shù)定義,實現(xiàn)對實數(shù)進行分解,找出實數(shù)的符號位,整數(shù)部分和小數(shù)部分。

分析:問題的輸人為1個實數(shù),輸出包含3部分:符號位、整數(shù)部分和小數(shù)部分。依據(jù)上述原則,函數(shù)定義中需要設(shè)置1個輸入型參數(shù)對應(yīng)于輸入的實數(shù),設(shè)置3個輸個型參數(shù)用于傳遞實數(shù)分解后需要返回的三部分結(jié)果。返同值無實際意義,定義為void。函數(shù)頭部的完整定義為:void Separate(double num, char*p_sign, int*p_int,double*p_frac)。

各參數(shù)的功能說明如下:

double number,接收輸入實數(shù)的輸入型形參

char*p_sign,返回實數(shù)的符號位

int*p_int,返回實數(shù)的整數(shù)部分

double*p_frac,返回實數(shù)的小數(shù)部分

對于函數(shù)返回結(jié)果為多個數(shù)值的情況,還可以通過全局變量和結(jié)構(gòu)體變量進行結(jié)果傳遞。

全局變量能夠為程序中的多個函數(shù)所共享,是函數(shù)間相互通信的一種手段,可以通過全局變量將子函數(shù)的計算結(jié)果帶回給主程序 ,但是子函數(shù)中對全局變量的使用會顯著放大函數(shù)的耦合度,破壞函數(shù)定義的獨立性,不建議使用。

函數(shù)的返回值可以是C語言中允許的任意合法數(shù)據(jù)類型,包括結(jié)構(gòu)體類型。為了能夠通過一個返回值返回多個結(jié)果,可以將函數(shù)的返同值類型定義為包含多個成員變量的結(jié)構(gòu)體類型,函數(shù)體內(nèi)將多個計算結(jié)果分別保存給結(jié)構(gòu)體變量的不同成員,并最終返回結(jié)構(gòu)體變量。調(diào)用程序里可以通過對返回的結(jié)構(gòu)體變量成員的訪問,來使用返回結(jié)果。這種傳遞方式增加了調(diào)用程序?qū)ψ雍瘮?shù)輸出結(jié)果使用的復(fù)雜度,一般也不建議使用。

函數(shù)定義原則4:如果待封裝問題的功能描述中,要求對輸入的數(shù)據(jù)進行修改并返回的,適合通過指針型參數(shù)來進行數(shù)據(jù)傳遞。此時,問題的輸入和輸出是重疊的,由相同的參數(shù)變量承載,指針型參數(shù)既能正確的將需要加工的輸人數(shù)據(jù)傳遞給子函數(shù),又能夠在子函數(shù)內(nèi)通過指針變量間接訪問的特點實現(xiàn)子函數(shù)和調(diào)用程序間的數(shù)據(jù)共享,從而達(dá)到在子函數(shù)內(nèi)修改主程序中數(shù)據(jù)的目的一

示例3:編寫函數(shù)定義,實現(xiàn)兩個整型變量的數(shù)值交換。

分析:這個問題中的兩個整型變量既是輸入義是輸出,需要在子函數(shù)中交換兩個輸入?yún)?shù)變量的值,并在函數(shù)調(diào)用結(jié)束后將交換的結(jié)果返回調(diào)用程序。適合在函數(shù)定義中設(shè)置兩個指針型參數(shù),首先用于接收主程序中待交換的兩個整型變量的地址,函數(shù)體內(nèi)通過間接訪問的方式實現(xiàn)對主程序中對應(yīng)整型變量的使用,并完成數(shù)值的交換。返回值設(shè)置為空。函數(shù)頭部可描述為:voidSwap(int*p_numl, int *p_num2)。

函數(shù)定義原則5:如果待封裝問題的輸入或輸出為數(shù)組結(jié)構(gòu)的數(shù)據(jù),通常采用數(shù)組作為形式參數(shù),調(diào)用時傳人待處理數(shù)組的名字作為實參。數(shù)組名字代表了實參數(shù)組的首地址,從而使得用作實際參數(shù)的數(shù)組的存儲空間被形式參數(shù)所共享,改變形參數(shù)組中某一元素的值也會改變實參數(shù)組中對應(yīng)元素的值。

示例4:編寫函數(shù)定義,實現(xiàn)對一個無序整型數(shù)組進行有序排列。

分析:問題的輸入和輸出為同一數(shù)組,輸入時數(shù)組中的數(shù)據(jù)是無序的,輸出時變?yōu)橛行颉?稍O(shè)置一個數(shù)組型形參來表示待處理的數(shù)組,返回值無實際意義,設(shè)置為空。函數(shù)頭部可描述如為:void Sort(inta[])。

3 標(biāo)準(zhǔn)庫函數(shù)與函數(shù)分解

標(biāo)準(zhǔn)庫函數(shù)由編譯系統(tǒng)提供,能夠獨立完成一定功能,也是程序函數(shù)分解思想的一種體現(xiàn)。庫函數(shù)帶來的這種分解不是針對某一具體應(yīng)用,而是對程序設(shè)計中常用功能的一種抽取和封裝,是由編譯系統(tǒng)完成的系統(tǒng)級函數(shù)分解。程序設(shè)計中對標(biāo)準(zhǔn)庫函數(shù)的使用,既降低了程序設(shè)計的復(fù)雜度和難度,也提升了編程的效率 。

4 結(jié)語

計算機程序設(shè)計語言是輔助人們實現(xiàn)想法,指揮計算機工作的工具。在程序設(shè)計課程學(xué)習(xí)過程中,要重視編程思想的理解和分析問題方法的培養(yǎng),以及算法程序化能力的養(yǎng)成,這樣才能做到學(xué)以致用。C語言程序設(shè)計的核心是分而治之的模塊化編程思想,如何針對復(fù)雜問題進行函數(shù)分解,以及如何對分解后的子模塊進行封裝和使用是使用C語言編寫程序的關(guān)鍵所在。

猜你喜歡
C語言模塊化
模塊化自主水下機器人開發(fā)與應(yīng)用
基于模塊化控制系統(tǒng)在一體化教學(xué)中的應(yīng)用
基于Visual Studio Code的C語言程序設(shè)計實踐教學(xué)探索
模塊化住宅
基于C語言的計算機軟件編程
C語言程序設(shè)計課程教學(xué)與學(xué)科專業(yè)相結(jié)合的探索
ACP100模塊化小型堆研發(fā)進展
從模塊化中得到的二氧化碳
模塊化VS大型工廠
高職高專院校C語言程序設(shè)計教學(xué)改革探索