版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
C語言程序設計主編:連衛(wèi)民何櫻第7章函數本章主要內容:7.1函數概述7.2函數的定義與調用(重點)7.3函數的嵌套與遞歸(重點)7.4局部變量與全局變量7.5變量的存儲類型7.6內部函數與外部函數本章教學要求:了解函數的基本概念和分類
熟悉變量存儲屬性的概念及其應用
掌握函數的定義形式、函數的參數和函數的返回值、函數的嵌套調用和遞歸函數的設計方法
7.1函數概述7.1.1函數的概念C語言的函數與數學的函數十分相似。數學函數“y=f(x)”表示:對于自變量x的每個給定值,總是按照一定的規(guī)律f給出它的結果y。例如:對于函數式y(tǒng)=x2+3x+4,C語言可定義為:函數就是具有一定功能的可以單獨命名的程序段。
一個函數一般完成單一的功能。函數是C程序的基本模塊,通過對函數模塊的調用實現特定的功能。第7章函數7.1函數概述7.1.2函數分類在C語言中,可以從不同的角度對函數分類。1.根據函數自身形式劃分(1)無參函數:函數名后括號中沒有參數(調用時無數據傳送)。(2)有參函數:函數名后括號中有參數(調用時有數據傳送)。2.從用戶角度劃分(1)標準函數(即庫函數):是C語言的系統(tǒng)軟件為用戶提供的無需定義就可以直接使用的函數。
(2)自定義函數:是由用戶按照需要編寫的函數。第7章函數7.1函數概述7.1.2函數分類3.C語言程序總體結構C語言程序是由一個或多個函數模塊組成,每個函數都具有相對獨立的單一功能。所以,我們說C語言程序是函數的集合體。有且只有一個函數稱為主函數,程序的執(zhí)行總是從主函數開始。
主函數中的所有語句執(zhí)行完,則程序執(zhí)行結束。假設某個程序由main函數和其它五個函數組成,如圖7-1所示。
第7章函數7.2函數的定義及調用C語言中的標準函數用戶可以直接使用,而自定義函數需要用戶先定義后使用。
7.2.1函數的定義1.函數定義的格式定義格式:圖。說明:任何函數都是由函數首部和函數體兩部分組成。函數首部由函數類型、函數名和函數參數組成,函數體由說明部分和執(zhí)行部分組成。
【例7-1】定義一個求兩個整數和的函數?!纠?-2】定義輸出一串字符的函數。注意:在函數定義時,函數名要反映函數的功能;每一個函數要完成一個具體的功能;函數定義不能嵌套,也就是說在函數體內不能再定義函數。第7章函數7.2函數的定義及調用7.2.1函數的定義2.函數參數函數參數分為形參和實參兩種,作用是實現數據傳送。定義函數時的參數稱為形式參數,簡稱形參。因為該參數在該函數被調用之前是沒有確定值的,只是形式上的參數,這種參數只有在函數被調用時通過實參來獲取值。調用函數時的參數稱為實際參數,簡稱實參。強調:函數的參數表示實現該函數功能所必需的已知條件,在定義函數時以形參的形式給出?!纠?-3】定義一個求n個整數和的函數。說明:數組作為形參時其長度可省略。第7章函數7.2函數的定義及調用7.2.1函數的定義3.函數的類型和返回值函數的類型在函數名前面給出,表明該函數返回值的類型。函數返回值是指函數被調用之后,用return語句返回主調函數的值。return語句的格式:
return表達式;
或
return(表達式);
或
return;一般地,函數的類型應與return語句后表達式的類型一致。當函數體沒有return語句或return后沒有表達式,表示函數沒有明確的返回值,此時函數的類型一般定義為空類型,即void類型。如例7-2的hello函數。return控制程序流程返回主調函數,宣告函數調用結束。第7章函數7.2函數的定義及調用7.2.2函數的調用1.函數調用方式
一般形式:
函數名(實參表列)三種方式:(1)函數語句:函數調用的一般形式加上分號。例如:hello();(2)函數表達式:函數出現在一個表達式中,這種表達式稱為函數表達式。例如:x=max(a,b)+2;
(3)函數參數:函數作為另一個函數調用的實際參數出現。
例如:m=max(a,max(b,c));說明:三種調用方式中后兩種要求函數必須有明確的返回值。第7章函數7.2函數的定義及調用7.2.2函數的調用2.函數調用中的參數參數是函數調用時進行信息交換的載體,其傳遞方式是單向傳送,即數據由實參傳給形參。要求實參與形參個數相等、類型對應一致,并且實參的值必須確定。
參數之間的數據傳遞一般有兩種形式:
(1)傳值(普通變量作為函數參數)函數調用時,系統(tǒng)給形式參數分配存儲空間,按數據復制的方式,實參把數據傳遞給形參。數據傳遞是單向的值傳送,形參與實參分別占用不同的存儲空間。調用結束后,被調函數中所有變量(包含形參)的存儲空間釋放,不能再被使用,其值也不會再傳回給實參。例如:調用例7-2中sum函數的完整程序第7章函數7.2函數的定義及調用7.2.2函數的調用2.函數調用中的參數(2)傳地址(數組名作為函數參數)當需要把數組的全部元素傳遞到另一函數中處理時使用。數組名作參數,實參和形參都應使用數組名,并且在主調函數和被調函數中分別進行定義。例如:調用例7-3中sumn函數的完整程序當執(zhí)行“s=sumn(x,10)”語句時,將數組x的首地址(假設為1020)傳送給形參數組a,從而形參數組a與實參數組array共用相同的一組存儲單元,如圖7-2所示。值得強調:在被調函數中并沒有為形參數組另外開辟存儲單元,也沒有進行復制式傳遞數組元素的值,而是通過與實參數組共享存儲單元而達到目的。第7章函數7.2函數的定義及調用7.2.2函數的調用3.被調函數的聲明若函數定義放在調用它的函數之前,主調函數中可以直接使用該函數。否則要在主調函數中先聲明該函數。函數聲明的一般格式為:類型標識符函數名(函數參數表);函數聲明的內容就是函數定義的首部內容,也稱函數模型(或函數原型)。向編譯系統(tǒng)提供函數名、函數類型、函數參數的個數、類型等信息?!纠?-4】函數聲明可以省略形參名,僅有形參類型,也可二者均省略。如:
floatmax(float,float);
或floatmax();函數聲明可以函數定義的外部。省略函數聲明:整型函數、被調函數放在主調函數之前,在程序開頭對定義的所有函數進行聲明。第7章函數7.3函數的嵌套和遞歸7.3.1函數的嵌套調用在調用一個函數的過程中又調用了另一個函數,稱為函數的嵌套調用。
【例7-5】求組合數。分析:由于運算式中,多次用到階乘運算,所以把階乘運算定義成一個函數,供多次使用。
C語言中函數的定義是平行的、獨立的,不允許在一個函數體內定義另一個函數,但是C語言允許在一個函數的定義中調用另一個函數。這樣就出現了函數的嵌套調用,如圖7-3所示。函數嵌套的級數是不受限制的。但是,函數嵌套的級數越多,執(zhí)行效率就越低。第7章函數7.3.2函數的遞歸調用函數的遞歸調用是在調用一個函數的過程中又直接或間接地調用該函數本身。在調用函數的過程中又調用了本函數,這稱為直接遞歸調用。而在調用函數中通過調用其他函數調用本函數,這稱為間接遞歸調用?!纠?-6】設計一個遞歸函數計算n!。(1)遞歸調用的條件:原問題化為新問題,新問題與原問題的解決辦法相同;經過有限次數的劃分,最終獲得解決。
(2)遞歸調用的特點:程序簡潔清晰,可讀性強,但開銷比較大。
(3)遞歸調用的過程:“遞推”階段;“回歸”階段。圖第7章函數7.3函數的嵌套和遞歸7.4局部變量和全局變量定義一個變量后,只有在該變量的作用域內才能使用這個變量。在C語言中,按作用域可以把變量分為局部變量和全局變量。7.4.1局部變量在函數體內定義的變量稱為局部變量,也稱內部變量局部變量只在定義它的函數體內有效。在不同的函數體內可以定義同名的變量,這些變量互不干擾。【例7-8】閱讀下列程序,注意同名的局部變量的使用。說明:
(1)主函數中定義的變量只在主函數中有效。(2)不同函數中可以使用相同變量名,不會發(fā)生沖突。(3)形參也是局部變量。(4)在一個函數內部可以使用復合語句來定義變量,這樣的變量只在本復合語句中有效。
第7章函數7.4局部變量和全局變量7.4.2全局變量在函數體外定義的變量稱為全局變量,也稱外部變量。全局變量可以被本文件中的函數所共用,它的有效范圍是從定義變量的位置開始到本源文件結束。
【例7-9】用函數實現兩個變量值的交換
普通變量作函數參數時是單向的“值”傳遞,形參和實參都是局部變量,各自作用域不同。此時用全局變量實現(修改程序)說明:(1)全局變量可以為多個函數共用,降低函數的獨立性。
建議只有在必要時才設置全局變量。(2)當全局變量名與局部變量名相同時,在局部變量的有效范圍內全局變量不起作用。(3)全局變量的作用域是從定義處開始到整個程序結束。若想在定義點之前引用,需要用關鍵字“extern”作引用說明。第7章函數7.5變量的存儲類型變量是對程序中數據存儲空間的抽象,完整的變量定義應該確定它的兩種屬性:存儲類型和數據類型。數據類型是變量的操作屬性,表明變量的取值范圍和可以執(zhí)行的操作。存儲類型是變量的存儲屬性,表明變量在內存中的存儲方法。7.5.1存儲空間的劃分計算機的存儲器:內存儲器、外存儲器和寄存器。
計算機的內存可以分為程度區(qū)、靜態(tài)存儲區(qū)和動態(tài)存儲區(qū)靜態(tài)存儲是指在程序運行期間分配固定的存儲空間,該存儲空間直到程序運行結束后才被釋放;動態(tài)存儲是在程序運行期間根據需要進行動態(tài)的分配存儲空間,該存儲空間不需要時立即釋放。變量的存儲方式實質上描述了變量的時間特性。第7章函數7.5變量的存儲類型在C語言中,變量的存儲類型有四種:自動的(auto)、靜態(tài)的(static)、寄存器的(register)、和外部的(extern)。7.5.2局部變量的存儲類型1.自動(auto)局部變量定義局部變量時,如果沒有指定存儲類型或使用了auto說明符,系統(tǒng)就認為所定義的變量具有自動存儲類型。自動存儲類型用關鍵字auto表示,其中“auto”也可以省略。
int
a,b;
等價于
autoint
a,b;自動變量的存儲單元被分配在內存的動態(tài)存儲區(qū)。自動變量“用之則建,用完即撤”。強調:自動變量定義后如果沒有賦值,其初始值是不確定的。第7章函數7.5變量的存儲類型7.5.2局部變量的存儲類型2.靜態(tài)(static)局部變量定義局部變量時,指定存儲類型為static的變量,稱該變量為靜態(tài)局部變量。靜態(tài)變量的存儲單元分配在靜態(tài)存儲區(qū)。函數調用結束后,靜態(tài)局部變量所占的存儲單元不釋放。在下一次函數調用時,該變量可以保存上次函數調用后的值。【例7-10】編程計算1!、2!、3!、4!和5!說明:(1)靜態(tài)變量是在編譯時賦初值一次。如定義靜態(tài)變量時沒有賦值,系統(tǒng)會自動賦初值0或空字符。(2)靜態(tài)局部變量在函數調用后仍然存在,但其它函數不能用。(3)靜態(tài)局部變量降低了程序的可讀性,盡量少用。第7章函數7.5變量的存儲類型7.5.2局部變量的存儲類型3.寄存器(register)局部變量定義局部變量時,指定存儲類型為register的變量,稱該變量為寄存器變量。寄存器變量具有與自動變量完全相同的性質。區(qū)別在于:寄存器變量的值保存在CPU的寄存器中,這樣執(zhí)行速度更快。通常把使用頻率較高的變量(如循環(huán)次數較多的循環(huán)變量)定義為register類型。
如:registerint
i,j
;說明:(1)計算機系統(tǒng)中的寄存器數目不等,寄存器的長度也不同。當不能實現時,系統(tǒng)會自動處理成自動(auto)變量。。(2)只有局部變量(包括形參)才能定義為寄存器類型,全局變量不可定義為該存儲類型。第7章函數7.5變量的存儲類型7.5.3全局變量的存儲類型
全局變量是在函數外面定義的,它的存儲單元在編譯時被分配在內存的靜態(tài)存儲區(qū)。
當一個程序由多個源文件組成時,全局變量可分為靜態(tài)(static)全局變量和非靜態(tài)全局變量。1.靜態(tài)(static)全局變量所謂靜態(tài)全局變量是指在定義全局變量的前面加static,從而限定該全局變量只在本文件中使用。如:好處:當多人編寫一個程序的不同文件時,可以按照需要命名變量,而不必考慮因與其他文件中的變量同名而導致錯誤發(fā)生,以保證文件的獨立性。第7章函數7.5變量的存儲類型7.5.3全局變量的存儲類型2.非靜態(tài)全局變量所謂非靜態(tài)全局變量是指在定義全局變量的前面不加static(相當于省略extern),使該全局變量可被別的文件使用。非靜態(tài)全局變量在使用它的文件中要用extern作聲明。如:說明:(1)全局變量(靜態(tài)、非靜態(tài))都是在編譯時分配存儲單元的,其存儲單元分配在靜態(tài)存儲區(qū),生存期是整個程序的運行周期。(2)使用外部的全局變量應十分慎重,盡量少用。(3)多文件C程序的執(zhí)行方法之一:用include命令在一個文件中把其它文件包含進來一起進行編譯。第7章函數7.6內部函數和外部函數
函數的本質是全局的,它可以被本文件中的其他函數任意調用。當一個程序由多個源文件組成時,函數可分為內部(static)函數和外部(extern)函數。7.6.1內部函數用static聲明的函數為內部函數,也稱為靜態(tài)函數。使用內部函數,可以使函數只局限于所在文件。
通常把只能由同一文件使用的函數和外部變量放在一個文件中,在它們前面都冠以static使之局部化,其他文件不能引用。
7.6.2外部函數用extern聲明的函數為外部函數。在定義函數中,凡是不加存儲類型說明的函數都為外部函數。
【例7-12】編程計算學生考試的平均分(分析)。第7章函數7.6內部函數和外部函數7.6.3程序的分割編譯源程序由多個源文件組成,可以按照一個個的源文件為單位對它們進行分別編譯,然后再把分別編譯后生成的目標文件鏈接成一個可執(zhí)行文件。這樣的編譯過程稱為分割編譯。
分割編譯處理方式為大型軟件的集體開發(fā)提供了有力的支持,為軟件的維護和擴充提供了便利。在VC++環(huán)境下,實現分割編譯的步驟:第一步:創(chuàng)建各個源程序文件。第二步:建立工作區(qū)。選擇:文件→新建→工作區(qū),建空白工作區(qū)第三步:建立工程文件。選擇:文件→新建→工程→Win32ConsoleApplication第四步:將源程序文件添加到工程。選擇:工程→增加到工程→文件第五步:像一個文件程序一樣編譯、連接運行程序。第7章函數7.7函數的程序設計舉例【例7-13】求20以內的素數,要求編寫一個判斷素數的函數。分析:素數是指只能被1和自身整除的自然數。設計一個判斷素數的函數,它從主函數得到一個
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年國家公務員申論寫作精講及訓練重點題庫
- 脆弱地質條件土方施工方案
- 醫(yī)院手術室管理流程方案
- 土方工程臨時排水系統(tǒng)方案
- 食堂提升服務效率方案
- 建筑項目階段性評估方案
- 消防安全評價指標體系方案
- 施工隊伍管理與考核方案
- 兒童病房營養(yǎng)咨詢服務方案
- 土石方開挖技術創(chuàng)新方案
- 干部教育培訓行業(yè)跨境出海戰(zhàn)略研究報告
- 車庫使用協議合同
- 組件設計文檔-MBOM構型管理
- 《不在網絡中迷失》課件
- 山東省泰安市2024-2025學年高一物理下學期期末考試試題含解析
- 竹子產業(yè)發(fā)展策略
- 【可行性報告】2023年硫精砂項目可行性研究分析報告
- 2024-2025年上海中考英語真題及答案解析
- 新醫(yī)改下醫(yī)院藥學轉型與發(fā)展
- 2023年內蒙古呼倫貝爾市海拉爾區(qū)公開招聘公辦幼兒園控制數人員80名高頻筆試、歷年難易點考題(共500題含答案解析)模擬試卷
- 一年級數學質量分析強桂英
評論
0/150
提交評論