• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

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

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

      周百順

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

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

      引 言

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

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

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

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

      針對(duì)復(fù)雜問(wèn)題求解所采用的模塊劃分通常是從功能的角度進(jìn)行,劃分后的模塊要具備“相對(duì)獨(dú)立,功能單一”的特征。也就是說(shuō),一個(gè)好的模塊必須具有高度的獨(dú)立性和較強(qiáng)的功能。實(shí)際應(yīng)用中通常用“耦合度”和“內(nèi)聚度”兩個(gè)指標(biāo)從不同角度對(duì)模塊的劃分情況加以度量。耦合度是對(duì)模塊之間相互依賴性大小的度量,耦合度越小,模塊的相對(duì)獨(dú)立性越大。高耦合的系統(tǒng)中,一個(gè)模塊的修改往往會(huì)影響其他模塊,低耦合系統(tǒng)中這種影響相對(duì)較小。內(nèi)聚度是對(duì)模塊內(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)許多不同位置需要做相同或類似工作的情況,分別寫(xiě)出這樣的代碼片段既使程序變長(zhǎng),又增加了不同部分間的相互關(guān)聯(lián)。對(duì)于這些重復(fù)出現(xiàn)的相同或相似的片段,可從中抽取出共用的部分定義為子函數(shù),原有程序中相關(guān)部分通過(guò)簡(jiǎn)單的函數(shù)調(diào)用語(yǔ)句代替。這樣做不但可能縮短程序的代碼,也將大大提高程序的可讀性和易修改性,使得整個(gè)程序里同樣的計(jì)算片段僅描述一次,如果需要修改這部分計(jì)算,只需要修改其對(duì)應(yīng)的函數(shù)定義部分即可。

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

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

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

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

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

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

      例如,數(shù)學(xué)函數(shù)庫(kù)中的sqrt函數(shù)就是通過(guò)返回值來(lái)傳遞計(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);這樣的語(yǔ)句是合法的,先執(zhí)行函數(shù)調(diào)用,計(jì)算常數(shù)3的平方根并將其作為結(jié)果返回,然后在函數(shù)的調(diào)用點(diǎn)處用返回值代替函數(shù)調(diào)用參與加法運(yùn)算,相加后的結(jié)果賦值給result變量。

      第二種方法是通過(guò)指針形式的參數(shù)將輸出結(jié)果返回給調(diào)用程序。在定義函數(shù)時(shí),除了與輸入相對(duì)應(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é)果通過(guò)該變量帶回到調(diào)用程序中。

      例如使用scanfo函數(shù)從鍵盤(pán)上讀人數(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é)果返回方式的選擇,主要取決于待封裝問(wèn)題的輸入輸出特征。從某種意義上講,參數(shù)提供了函數(shù)的輸入,返回值是它的輸出,輸出返回給調(diào)用程序。因此,一般情況下,優(yōu)先考慮通過(guò)返回值傳遞函數(shù)調(diào)用結(jié)果,只有當(dāng)返同值無(wú)法很好地滿足需要時(shí),才會(huì)考慮通過(guò)指針型參數(shù)來(lái)傳遞調(diào)用結(jié)果。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      函數(shù)定義原則5:如果待封裝問(wèn)題的輸入或輸出為數(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ù)組中對(duì)應(yīng)元素的值。

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

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

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

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

      4 結(jié)語(yǔ)

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

      猜你喜歡
      模塊化
      模塊化自主水下機(jī)器人開(kāi)發(fā)與應(yīng)用
      基于模塊化控制系統(tǒng)在一體化教學(xué)中的應(yīng)用
      模塊化住宅
      馬勒推出新型模塊化混動(dòng)系統(tǒng)
      考慮模塊化和退貨率的供應(yīng)鏈大規(guī)模定制模型
      ACP100模塊化小型堆研發(fā)進(jìn)展
      從模塊化中得到的二氧化碳
      模塊化VS大型工廠
      非模塊化設(shè)計(jì)四合一爐對(duì)流室的模塊化吊裝
      機(jī)械制造技術(shù)模塊化教學(xué)改革研究
      临漳县| 敦化市| 额尔古纳市| 那坡县| 青神县| 美姑县| 苍溪县| 泉州市| 广汉市| 黑龙江省| 宜州市| 鹤峰县| 准格尔旗| 如皋市| 永丰县| 买车| 桂林市| 神木县| 泾阳县| 西盟| 醴陵市| 南平市| 策勒县| 宾阳县| 肃南| 鹤山市| 盖州市| 囊谦县| 平顶山市| 嘉兴市| 乌鲁木齐市| 武威市| 大安市| 阜康市| 龙门县| 淮北市| 六盘水市| 滨州市| 南涧| 宁都县| 府谷县|