版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
C語言程序設計主編:連衛(wèi)民何櫻第7章函數(shù)本章主要內容:7.1函數(shù)概述7.2函數(shù)的定義與調用(重點)7.3函數(shù)的嵌套與遞歸(重點)7.4局部變量與全局變量7.5變量的存儲類型7.6內部函數(shù)與外部函數(shù)本章教學要求:了解函數(shù)的基本概念和分類
熟悉變量存儲屬性的概念及其應用
掌握函數(shù)的定義形式、函數(shù)的參數(shù)和函數(shù)的返回值、函數(shù)的嵌套調用和遞歸函數(shù)的設計方法
7.1函數(shù)概述7.1.1函數(shù)的概念C語言的函數(shù)與數(shù)學的函數(shù)十分相似。數(shù)學函數(shù)“y=f(x)”表示:對于自變量x的每個給定值,總是按照一定的規(guī)律f給出它的結果y。例如:對于函數(shù)式y(tǒng)=x2+3x+4,C語言可定義為:函數(shù)就是具有一定功能的可以單獨命名的程序段。
一個函數(shù)一般完成單一的功能。函數(shù)是C程序的基本模塊,通過對函數(shù)模塊的調用實現(xiàn)特定的功能。第7章函數(shù)7.1函數(shù)概述7.1.2函數(shù)分類在C語言中,可以從不同的角度對函數(shù)分類。1.根據(jù)函數(shù)自身形式劃分(1)無參函數(shù):函數(shù)名后括號中沒有參數(shù)(調用時無數(shù)據(jù)傳送)。(2)有參函數(shù):函數(shù)名后括號中有參數(shù)(調用時有數(shù)據(jù)傳送)。2.從用戶角度劃分(1)標準函數(shù)(即庫函數(shù)):是C語言的系統(tǒng)軟件為用戶提供的無需定義就可以直接使用的函數(shù)。
(2)自定義函數(shù):是由用戶按照需要編寫的函數(shù)。第7章函數(shù)7.1函數(shù)概述7.1.2函數(shù)分類3.C語言程序總體結構C語言程序是由一個或多個函數(shù)模塊組成,每個函數(shù)都具有相對獨立的單一功能。所以,我們說C語言程序是函數(shù)的集合體。有且只有一個函數(shù)稱為主函數(shù),程序的執(zhí)行總是從主函數(shù)開始。
主函數(shù)中的所有語句執(zhí)行完,則程序執(zhí)行結束。假設某個程序由main函數(shù)和其它五個函數(shù)組成,如圖7-1所示。
第7章函數(shù)7.2函數(shù)的定義及調用C語言中的標準函數(shù)用戶可以直接使用,而自定義函數(shù)需要用戶先定義后使用。
7.2.1函數(shù)的定義1.函數(shù)定義的格式定義格式:圖。說明:任何函數(shù)都是由函數(shù)首部和函數(shù)體兩部分組成。函數(shù)首部由函數(shù)類型、函數(shù)名和函數(shù)參數(shù)組成,函數(shù)體由說明部分和執(zhí)行部分組成。
【例7-1】定義一個求兩個整數(shù)和的函數(shù)?!纠?-2】定義輸出一串字符的函數(shù)。注意:在函數(shù)定義時,函數(shù)名要反映函數(shù)的功能;每一個函數(shù)要完成一個具體的功能;函數(shù)定義不能嵌套,也就是說在函數(shù)體內不能再定義函數(shù)。第7章函數(shù)7.2函數(shù)的定義及調用7.2.1函數(shù)的定義2.函數(shù)參數(shù)函數(shù)參數(shù)分為形參和實參兩種,作用是實現(xiàn)數(shù)據(jù)傳送。定義函數(shù)時的參數(shù)稱為形式參數(shù),簡稱形參。因為該參數(shù)在該函數(shù)被調用之前是沒有確定值的,只是形式上的參數(shù),這種參數(shù)只有在函數(shù)被調用時通過實參來獲取值。調用函數(shù)時的參數(shù)稱為實際參數(shù),簡稱實參。強調:函數(shù)的參數(shù)表示實現(xiàn)該函數(shù)功能所必需的已知條件,在定義函數(shù)時以形參的形式給出?!纠?-3】定義一個求n個整數(shù)和的函數(shù)。說明:數(shù)組作為形參時其長度可省略。第7章函數(shù)7.2函數(shù)的定義及調用7.2.1函數(shù)的定義3.函數(shù)的類型和返回值函數(shù)的類型在函數(shù)名前面給出,表明該函數(shù)返回值的類型。函數(shù)返回值是指函數(shù)被調用之后,用return語句返回主調函數(shù)的值。return語句的格式:
return表達式;
或
return(表達式);
或
return;一般地,函數(shù)的類型應與return語句后表達式的類型一致。當函數(shù)體沒有return語句或return后沒有表達式,表示函數(shù)沒有明確的返回值,此時函數(shù)的類型一般定義為空類型,即void類型。如例7-2的hello函數(shù)。return控制程序流程返回主調函數(shù),宣告函數(shù)調用結束。第7章函數(shù)7.2函數(shù)的定義及調用7.2.2函數(shù)的調用1.函數(shù)調用方式
一般形式:
函數(shù)名(實參表列)三種方式:(1)函數(shù)語句:函數(shù)調用的一般形式加上分號。例如:hello();(2)函數(shù)表達式:函數(shù)出現(xiàn)在一個表達式中,這種表達式稱為函數(shù)表達式。例如:x=max(a,b)+2;
(3)函數(shù)參數(shù):函數(shù)作為另一個函數(shù)調用的實際參數(shù)出現(xiàn)。
例如:m=max(a,max(b,c));說明:三種調用方式中后兩種要求函數(shù)必須有明確的返回值。第7章函數(shù)7.2函數(shù)的定義及調用7.2.2函數(shù)的調用2.函數(shù)調用中的參數(shù)參數(shù)是函數(shù)調用時進行信息交換的載體,其傳遞方式是單向傳送,即數(shù)據(jù)由實參傳給形參。要求實參與形參個數(shù)相等、類型對應一致,并且實參的值必須確定。
參數(shù)之間的數(shù)據(jù)傳遞一般有兩種形式:
(1)傳值(普通變量作為函數(shù)參數(shù))函數(shù)調用時,系統(tǒng)給形式參數(shù)分配存儲空間,按數(shù)據(jù)復制的方式,實參把數(shù)據(jù)傳遞給形參。數(shù)據(jù)傳遞是單向的值傳送,形參與實參分別占用不同的存儲空間。調用結束后,被調函數(shù)中所有變量(包含形參)的存儲空間釋放,不能再被使用,其值也不會再傳回給實參。例如:調用例7-2中sum函數(shù)的完整程序第7章函數(shù)7.2函數(shù)的定義及調用7.2.2函數(shù)的調用2.函數(shù)調用中的參數(shù)(2)傳地址(數(shù)組名作為函數(shù)參數(shù))當需要把數(shù)組的全部元素傳遞到另一函數(shù)中處理時使用。數(shù)組名作參數(shù),實參和形參都應使用數(shù)組名,并且在主調函數(shù)和被調函數(shù)中分別進行定義。例如:調用例7-3中sumn函數(shù)的完整程序當執(zhí)行“s=sumn(x,10)”語句時,將數(shù)組x的首地址(假設為1020)傳送給形參數(shù)組a,從而形參數(shù)組a與實參數(shù)組array共用相同的一組存儲單元,如圖7-2所示。值得強調:在被調函數(shù)中并沒有為形參數(shù)組另外開辟存儲單元,也沒有進行復制式傳遞數(shù)組元素的值,而是通過與實參數(shù)組共享存儲單元而達到目的。第7章函數(shù)7.2函數(shù)的定義及調用7.2.2函數(shù)的調用3.被調函數(shù)的聲明若函數(shù)定義放在調用它的函數(shù)之前,主調函數(shù)中可以直接使用該函數(shù)。否則要在主調函數(shù)中先聲明該函數(shù)。函數(shù)聲明的一般格式為:類型標識符函數(shù)名(函數(shù)參數(shù)表);函數(shù)聲明的內容就是函數(shù)定義的首部內容,也稱函數(shù)模型(或函數(shù)原型)。向編譯系統(tǒng)提供函數(shù)名、函數(shù)類型、函數(shù)參數(shù)的個數(shù)、類型等信息?!纠?-4】函數(shù)聲明可以省略形參名,僅有形參類型,也可二者均省略。如:
floatmax(float,float);
或floatmax();函數(shù)聲明可以函數(shù)定義的外部。省略函數(shù)聲明:整型函數(shù)、被調函數(shù)放在主調函數(shù)之前,在程序開頭對定義的所有函數(shù)進行聲明。第7章函數(shù)7.3函數(shù)的嵌套和遞歸7.3.1函數(shù)的嵌套調用在調用一個函數(shù)的過程中又調用了另一個函數(shù),稱為函數(shù)的嵌套調用。
【例7-5】求組合數(shù)。分析:由于運算式中,多次用到階乘運算,所以把階乘運算定義成一個函數(shù),供多次使用。
C語言中函數(shù)的定義是平行的、獨立的,不允許在一個函數(shù)體內定義另一個函數(shù),但是C語言允許在一個函數(shù)的定義中調用另一個函數(shù)。這樣就出現(xiàn)了函數(shù)的嵌套調用,如圖7-3所示。函數(shù)嵌套的級數(shù)是不受限制的。但是,函數(shù)嵌套的級數(shù)越多,執(zhí)行效率就越低。第7章函數(shù)7.3.2函數(shù)的遞歸調用函數(shù)的遞歸調用是在調用一個函數(shù)的過程中又直接或間接地調用該函數(shù)本身。在調用函數(shù)的過程中又調用了本函數(shù),這稱為直接遞歸調用。而在調用函數(shù)中通過調用其他函數(shù)調用本函數(shù),這稱為間接遞歸調用?!纠?-6】設計一個遞歸函數(shù)計算n!。(1)遞歸調用的條件:原問題化為新問題,新問題與原問題的解決辦法相同;經過有限次數(shù)的劃分,最終獲得解決。
(2)遞歸調用的特點:程序簡潔清晰,可讀性強,但開銷比較大。
(3)遞歸調用的過程:“遞推”階段;“回歸”階段。圖第7章函數(shù)7.3函數(shù)的嵌套和遞歸7.4局部變量和全局變量定義一個變量后,只有在該變量的作用域內才能使用這個變量。在C語言中,按作用域可以把變量分為局部變量和全局變量。7.4.1局部變量在函數(shù)體內定義的變量稱為局部變量,也稱內部變量局部變量只在定義它的函數(shù)體內有效。在不同的函數(shù)體內可以定義同名的變量,這些變量互不干擾?!纠?-8】閱讀下列程序,注意同名的局部變量的使用。說明:
(1)主函數(shù)中定義的變量只在主函數(shù)中有效。(2)不同函數(shù)中可以使用相同變量名,不會發(fā)生沖突。(3)形參也是局部變量。(4)在一個函數(shù)內部可以使用復合語句來定義變量,這樣的變量只在本復合語句中有效。
第7章函數(shù)7.4局部變量和全局變量7.4.2全局變量在函數(shù)體外定義的變量稱為全局變量,也稱外部變量。全局變量可以被本文件中的函數(shù)所共用,它的有效范圍是從定義變量的位置開始到本源文件結束。
【例7-9】用函數(shù)實現(xiàn)兩個變量值的交換
普通變量作函數(shù)參數(shù)時是單向的“值”傳遞,形參和實參都是局部變量,各自作用域不同。此時用全局變量實現(xiàn)(修改程序)說明:(1)全局變量可以為多個函數(shù)共用,降低函數(shù)的獨立性。
建議只有在必要時才設置全局變量。(2)當全局變量名與局部變量名相同時,在局部變量的有效范圍內全局變量不起作用。(3)全局變量的作用域是從定義處開始到整個程序結束。若想在定義點之前引用,需要用關鍵字“extern”作引用說明。第7章函數(shù)7.5變量的存儲類型變量是對程序中數(shù)據(jù)存儲空間的抽象,完整的變量定義應該確定它的兩種屬性:存儲類型和數(shù)據(jù)類型。數(shù)據(jù)類型是變量的操作屬性,表明變量的取值范圍和可以執(zhí)行的操作。存儲類型是變量的存儲屬性,表明變量在內存中的存儲方法。7.5.1存儲空間的劃分計算機的存儲器:內存儲器、外存儲器和寄存器。
計算機的內存可以分為程度區(qū)、靜態(tài)存儲區(qū)和動態(tài)存儲區(qū)靜態(tài)存儲是指在程序運行期間分配固定的存儲空間,該存儲空間直到程序運行結束后才被釋放;動態(tài)存儲是在程序運行期間根據(jù)需要進行動態(tài)的分配存儲空間,該存儲空間不需要時立即釋放。變量的存儲方式實質上描述了變量的時間特性。第7章函數(shù)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章函數(shù)7.5變量的存儲類型7.5.2局部變量的存儲類型2.靜態(tài)(static)局部變量定義局部變量時,指定存儲類型為static的變量,稱該變量為靜態(tài)局部變量。靜態(tài)變量的存儲單元分配在靜態(tài)存儲區(qū)。函數(shù)調用結束后,靜態(tài)局部變量所占的存儲單元不釋放。在下一次函數(shù)調用時,該變量可以保存上次函數(shù)調用后的值。【例7-10】編程計算1!、2!、3!、4!和5!說明:(1)靜態(tài)變量是在編譯時賦初值一次。如定義靜態(tài)變量時沒有賦值,系統(tǒng)會自動賦初值0或空字符。(2)靜態(tài)局部變量在函數(shù)調用后仍然存在,但其它函數(shù)不能用。(3)靜態(tài)局部變量降低了程序的可讀性,盡量少用。第7章函數(shù)7.5變量的存儲類型7.5.2局部變量的存儲類型3.寄存器(register)局部變量定義局部變量時,指定存儲類型為register的變量,稱該變量為寄存器變量。寄存器變量具有與自動變量完全相同的性質。區(qū)別在于:寄存器變量的值保存在CPU的寄存器中,這樣執(zhí)行速度更快。通常把使用頻率較高的變量(如循環(huán)次數(shù)較多的循環(huán)變量)定義為register類型。
如:registerint
i,j
;說明:(1)計算機系統(tǒng)中的寄存器數(shù)目不等,寄存器的長度也不同。當不能實現(xiàn)時,系統(tǒng)會自動處理成自動(auto)變量。。(2)只有局部變量(包括形參)才能定義為寄存器類型,全局變量不可定義為該存儲類型。第7章函數(shù)7.5變量的存儲類型7.5.3全局變量的存儲類型
全局變量是在函數(shù)外面定義的,它的存儲單元在編譯時被分配在內存的靜態(tài)存儲區(qū)。
當一個程序由多個源文件組成時,全局變量可分為靜態(tài)(static)全局變量和非靜態(tài)全局變量。1.靜態(tài)(static)全局變量所謂靜態(tài)全局變量是指在定義全局變量的前面加static,從而限定該全局變量只在本文件中使用。如:好處:當多人編寫一個程序的不同文件時,可以按照需要命名變量,而不必考慮因與其他文件中的變量同名而導致錯誤發(fā)生,以保證文件的獨立性。第7章函數(shù)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章函數(shù)7.6內部函數(shù)和外部函數(shù)
函數(shù)的本質是全局的,它可以被本文件中的其他函數(shù)任意調用。當一個程序由多個源文件組成時,函數(shù)可分為內部(static)函數(shù)和外部(extern)函數(shù)。7.6.1內部函數(shù)用static聲明的函數(shù)為內部函數(shù),也稱為靜態(tài)函數(shù)。使用內部函數(shù),可以使函數(shù)只局限于所在文件。
通常把只能由同一文件使用的函數(shù)和外部變量放在一個文件中,在它們前面都冠以static使之局部化,其他文件不能引用。
7.6.2外部函數(shù)用extern聲明的函數(shù)為外部函數(shù)。在定義函數(shù)中,凡是不加存儲類型說明的函數(shù)都為外部函數(shù)。
【例7-12】編程計算學生考試的平均分(分析)。第7章函數(shù)7.6內部函數(shù)和外部函數(shù)7.6.3程序的分割編譯源程序由多個源文件組成,可以按照一個個的源文件為單位對它們進行分別編譯,然后再把分別編譯后生成的目標文件鏈接成一個可執(zhí)行文件。這樣的編譯過程稱為分割編譯。
分割編譯處理方式為大型軟件的集體開發(fā)提供了有力的支持,為軟件的維護和擴充提供了便利。在VC++環(huán)境下,實現(xiàn)分割編譯的步驟:第一步:創(chuàng)建各個源程序文件。第二步:建立工作區(qū)。選擇:文件→新建→工作區(qū),建空白工作區(qū)第三步:建立工程文件。選擇:文件→新建→工程→Win32ConsoleApplication第四步:將源程序文件添加到工程。選擇:工程→增加到工程→文件第五步:像一個文件程序一樣編譯、連接運行程序。第7章函數(shù)7.7函數(shù)的程序設計舉例【例7-13】求20以內的素數(shù),要求編寫一個判斷素數(shù)的函數(shù)。分析:素數(shù)是指只能被1和自身整除的自然數(shù)。設計一個判斷素數(shù)的函數(shù),它從主函數(shù)得到一個
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 房屋出售代理人合同(2篇)
- 2024音響設備展會展覽策劃及組織服務合同3篇
- 2024石材加工廠安全生產與風險管理的合同范本
- 二零二五版農產品市場調研與營銷策劃合同4篇
- 2025年度婚紗攝影情侶寫真拍攝服務合同2篇
- 2025年版智慧社區(qū)門衛(wèi)及智能安防系統(tǒng)運營合同4篇
- 二零二五年度面粉質量檢測與認證合同4篇
- 二零二五年度土地租賃抵押借款合同范本
- 2025年度土地儲備開發(fā)合同范本3篇
- 2025版新能源行業(yè)農民工勞動合同示范文本3篇
- SYT 6968-2021 油氣輸送管道工程水平定向鉆穿越設計規(guī)范-PDF解密
- 冷庫制冷負荷計算表
- 肩袖損傷護理查房
- 設備運維管理安全規(guī)范標準
- 辦文辦會辦事實務課件
- 大學宿舍人際關系
- 2023光明小升初(語文)試卷
- GB/T 14600-2009電子工業(yè)用氣體氧化亞氮
- 申請使用物業(yè)專項維修資金征求業(yè)主意見表
- 房屋買賣合同簡單范本 房屋買賣合同簡易范本
- 無抽搐電休克治療規(guī)范
評論
0/150
提交評論