999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

C語言程序設計中的函數分解與函數定義

2015-05-30 10:48:04周百順
計算機教育 2015年4期
關鍵詞:模塊化

周百順

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

關鍵詞:C語言:函數分解;函數定義;模塊化

引 言

C語言是一種面向過程的結構化程序設計語言,是UNIX操作系統的主要編寫語言,也是很多高級語言發展的基石。C語言與計算機底層結合緊密、執行效率高,使得其在追求性能和效率的嵌入式編程、系統級軟件開發、數據通信等領域有著突出的優勢。

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

1 函數分解的時機和意義

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

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

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

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

2 函數定義與模塊的封裝

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

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

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

第一種方法是通過返回值將輸出結果返回給調用程序。函數體內通過return語句顯式結束函數的執行,并返回一個特定類型的值作為函數調用的結果。此時,函數調用結果與該類型的變量相當,可以作為表達式的一部分參與運算。

例如,數學函數庫中的sqrt函數就是通過返回值來傳遞計算結果,返回值類型為double型。當發生函數調用時,會將調用程序傳人的實際參數的平方根作為結果返回。該函數調用的作用與任意double型變量一樣,可以參與到相關運算中。

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

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

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

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

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

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

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

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

分析:問題描述中明確指出函數要能夠對輸入的3個整數進行處理,找出最大值。因此,對應函數定義的參數列表中至少應該有3個int類型的形式參數,用于在函數調用時接收調用程序傳人的3個整數。

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

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

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

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

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

各參數的功能說明如下:

double number,接收輸入實數的輸入型形參

char*p_sign,返回實數的符號位

int*p_int,返回實數的整數部分

double*p_frac,返回實數的小數部分

對于函數返回結果為多個數值的情況,還可以通過全局變量和結構體變量進行結果傳遞。

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

函數的返回值可以是C語言中允許的任意合法數據類型,包括結構體類型。為了能夠通過一個返回值返回多個結果,可以將函數的返同值類型定義為包含多個成員變量的結構體類型,函數體內將多個計算結果分別保存給結構體變量的不同成員,并最終返回結構體變量。調用程序里可以通過對返回的結構體變量成員的訪問,來使用返回結果。這種傳遞方式增加了調用程序對子函數輸出結果使用的復雜度,一般也不建議使用。

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

示例3:編寫函數定義,實現兩個整型變量的數值交換。

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

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

示例4:編寫函數定義,實現對一個無序整型數組進行有序排列。

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

3 標準庫函數與函數分解

標準庫函數由編譯系統提供,能夠獨立完成一定功能,也是程序函數分解思想的一種體現。庫函數帶來的這種分解不是針對某一具體應用,而是對程序設計中常用功能的一種抽取和封裝,是由編譯系統完成的系統級函數分解。程序設計中對標準庫函數的使用,既降低了程序設計的復雜度和難度,也提升了編程的效率 。

4 結語

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

猜你喜歡
模塊化
模塊化自主水下機器人開發與應用
基于模塊化控制系統在一體化教學中的應用
模塊化住宅
現代裝飾(2020年5期)2020-05-30 13:01:56
馬勒推出新型模塊化混動系統
考慮模塊化和退貨率的供應鏈大規模定制模型
ACP100模塊化小型堆研發進展
中國核電(2017年2期)2017-08-11 08:00:56
從模塊化中得到的二氧化碳
流程工業(2017年4期)2017-06-21 06:29:52
模塊化VS大型工廠
流程工業(2017年4期)2017-06-21 06:29:50
非模塊化設計四合一爐對流室的模塊化吊裝
機械制造技術模塊化教學改革研究
主站蜘蛛池模板: 国产成人成人一区二区| 亚洲中文字幕久久精品无码一区| 国产尹人香蕉综合在线电影| 在线日韩日本国产亚洲| 2021国产乱人伦在线播放| 国产在线高清一级毛片| 精品偷拍一区二区| 免费毛片网站在线观看| 国产成人h在线观看网站站| 亚洲综合九九| 亚洲永久视频| 日韩欧美国产三级| 91精品国产91欠久久久久| 黄色在线不卡| 国产乱人伦偷精品视频AAA| 激情综合五月网| 幺女国产一级毛片| 999国内精品久久免费视频| 亚洲视频免费播放| 亚洲综合日韩精品| 一级做a爰片久久毛片毛片| 国产精品对白刺激| 在线看片国产| 国产精品区视频中文字幕| 欧美色99| av尤物免费在线观看| 日本午夜影院| 久久中文字幕2021精品| 午夜视频免费一区二区在线看| 亚洲国产看片基地久久1024| 在线无码九区| 永久免费精品视频| 精品国产污污免费网站| 亚欧乱色视频网站大全| 色综合婷婷| 亚洲高清无码精品| 成人永久免费A∨一级在线播放| 久久国产高潮流白浆免费观看| 国产91色在线| 久久www视频| 亚洲91在线精品| 制服丝袜 91视频| 中文字幕av一区二区三区欲色| 国产又色又爽又黄| 精品1区2区3区| 亚洲资源站av无码网址| 亚洲天堂免费| 免费无码又爽又刺激高| 国产精品视频导航| 中国特黄美女一级视频| 亚洲人网站| 播五月综合| 国产精品永久不卡免费视频| 久久99精品久久久久久不卡| 亚洲欧美另类日本| 久久a级片| 婷婷激情五月网| 国产经典三级在线| 成人伊人色一区二区三区| 在线免费看片a| 一本色道久久88综合日韩精品| 亚洲日韩高清在线亚洲专区| 日韩亚洲高清一区二区| 性69交片免费看| 国产欧美亚洲精品第3页在线| 综合五月天网| 亚洲人成亚洲精品| 日韩无码视频专区| 色欲色欲久久综合网| 精品91自产拍在线| 色国产视频| 台湾AV国片精品女同性| 国产精品网址你懂的| 久久黄色毛片| 鲁鲁鲁爽爽爽在线视频观看 | 亚洲手机在线| 亚洲精品少妇熟女| 亚洲欧美在线精品一区二区| 国产精品人人做人人爽人人添| 国产精品视频导航| 欧美另类视频一区二区三区| 久久综合亚洲鲁鲁九月天|