亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

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

        周百順

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

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

        引 言

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        全局變量能夠?yàn)槌绦蛑械亩鄠€(gè)函數(shù)所共享,是函數(shù)間相互通信的一種手段,可以通過全局變量將子函數(shù)的計(jì)算結(jié)果帶回給主程序 ,但是子函數(shù)中對全局變量的使用會(huì)顯著放大函數(shù)的耦合度,破壞函數(shù)定義的獨(dú)立性,不建議使用。

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

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

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

        分析:這個(gè)問題中的兩個(gè)整型變量既是輸入義是輸出,需要在子函數(shù)中交換兩個(gè)輸入?yún)?shù)變量的值,并在函數(shù)調(diào)用結(jié)束后將交換的結(jié)果返回調(diào)用程序。適合在函數(shù)定義中設(shè)置兩個(gè)指針型參數(shù),首先用于接收主程序中待交換的兩個(gè)整型變量的地址,函數(shù)體內(nèi)通過間接訪問的方式實(shí)現(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ù)的數(shù)組的存儲(chǔ)空間被形式參數(shù)所共享,改變形參數(shù)組中某一元素的值也會(huì)改變實(shí)參數(shù)組中對應(yīng)元素的值。

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

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

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

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

        4 結(jié)語

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

        猜你喜歡
        模塊化
        模塊化自主水下機(jī)器人開發(fā)與應(yīng)用
        基于模塊化控制系統(tǒng)在一體化教學(xué)中的應(yīng)用
        模塊化住宅
        馬勒推出新型模塊化混動(dòng)系統(tǒng)
        考慮模塊化和退貨率的供應(yīng)鏈大規(guī)模定制模型
        ACP100模塊化小型堆研發(fā)進(jìn)展
        中國核電(2017年2期)2017-08-11 08:00:56
        從模塊化中得到的二氧化碳
        模塊化VS大型工廠
        非模塊化設(shè)計(jì)四合一爐對流室的模塊化吊裝
        機(jī)械制造技術(shù)模塊化教學(xué)改革研究
        强d乱码中文字幕熟女1000部| 少妇无码太爽了不卡视频在线看| 无码人妻精品一区二区三区66| 亚洲一区二区三区久久不卡| 国产剧情亚洲一区二区三区| 欧美亅性猛交内射| 情爱偷拍视频一区二区| 久久久久亚洲av成人网人人网站 | 国产精品.xx视频.xxtv| 国产av无码专区亚洲草草| 国产精品麻豆一区二区三区| 久久精品国产99国产精品亚洲| 亚瑟国产精品久久| 女同亚洲女同精品| 国产av一区二区三区国产福利| 欲女在线一区二区三区| 亚洲精品乱码久久久久久日本蜜臀| 国产熟妇搡bbbb搡bbbb搡| 亚洲色无码中文字幕| 最新中文字幕亚洲一区| 乱子伦在线观看| 中文字幕日韩高清| 中文字幕一区二区三区在线看一区| 国产精品亚洲av无人区一区香蕉 | 欧美人与动人物牲交免费观看| 喷潮出白浆视频在线观看| 穿着白丝啪啪的av网站| 人妻av鲁丝一区二区三区| 无码片久久久天堂中文字幕| 在线观看高清视频一区二区三区 | 欧美国产日本精品一区二区三区 | 国产国拍亚洲精品mv在线观看| 免费无码成人av在线播| 国产av91在线播放| 中文字幕一区二区精品视频| 97久久精品亚洲中文字幕无码| 国产午夜精品久久久久99| 毛片精品一区二区二区三区| 成人免费直播| 国产一级毛片AV不卡尤物| 少妇又色又爽又刺激的视频|