版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第11講 函數(shù)(一),函數(shù)概述 函數(shù)定義 函數(shù)參數(shù)和函數(shù)的值 函數(shù)調(diào)用及函數(shù)原型,模塊化程序設(shè)計(jì)方法 自頂向下 逐步細(xì)化 模塊化程序特點(diǎn) 層次分明 結(jié)構(gòu)清晰 資源共享 編程高效,模塊化:是一種對(duì)復(fù)雜性問題“分而治之”的策略 模塊化程序的主要特征 函數(shù)式的程序結(jié)構(gòu) 數(shù)據(jù)的存儲(chǔ)類型 預(yù)編譯的處理功能,函數(shù)概述,main() . f1(); . f2(); ,f1() . . ,f2() . f21(); . f22(); . ,f21() . ,f22() . ,函數(shù)的調(diào)用過程,一個(gè)簡單的函數(shù)調(diào)用的例子,main() printstar(); *調(diào)用printstaar函數(shù)* print_mess
2、age();*調(diào)用print_message函數(shù)* printstar(); *調(diào)用printstar函數(shù)* printstar() *printstar函數(shù)* printf(“*n”); print_message() *print_message函數(shù)* printf(“how do you don”); ,運(yùn)行情況如下: * how do you do *,返回,1一個(gè)源程序文件由一個(gè)或多個(gè)函數(shù)組成。一個(gè)源程序文件是一個(gè)編譯單位,而不是以函數(shù)為單位進(jìn)行編譯。,2一個(gè)C程序由一個(gè)或多個(gè)源程序文件組成。對(duì)較大的程序,可以分別編寫,分別編譯,提高調(diào)試效率。一個(gè)源文件可以為多個(gè)C程序公用。,3C程
3、序的執(zhí)行從main函數(shù)開始,調(diào)用其它函數(shù)后流程回到main函數(shù),在main函數(shù)中結(jié)束整個(gè)程序的運(yùn)行。,4從用戶使用的角度看,函數(shù)有兩種: (1)標(biāo)準(zhǔn)函數(shù),即庫函數(shù)。這是由系統(tǒng)提供的,用戶不必自己定義這些函數(shù),可以直接使用它們。 (2)用戶自己定義的函數(shù),以解決用戶的專門需要。,函數(shù)說明,函數(shù)說明(con.),5. 從函數(shù)的形式看,函數(shù)分兩類 (1)無參函數(shù)。 如8.1例中的printstar和print_message就是無參函數(shù)。在調(diào)用無參函數(shù)時(shí),主調(diào)函數(shù)并不將數(shù)據(jù)傳送給被調(diào)用函數(shù),一般用來執(zhí)行指定的一組操作(例如上例那樣,以printstar函數(shù)的作用就是輸出18個(gè)星號(hào))。無參函數(shù)可以帶回
4、或不帶回函數(shù)值,但一般以不帶回函數(shù)值的居多。 (2)有參函數(shù)。 在調(diào)用函數(shù)時(shí),在主調(diào)函數(shù)和被調(diào)用函數(shù)之間有參數(shù)傳遞,也就是說,主調(diào)函數(shù)可以將數(shù)據(jù)傳給被調(diào)用函數(shù)使用,被調(diào)用函數(shù)中的數(shù)據(jù)也可以帶回來供主調(diào)函數(shù)使用。,函數(shù)定義,兩種定義形式:現(xiàn)代風(fēng)格(ANSI C)和傳統(tǒng)風(fēng)格, Turbo C全部支持兩種定義風(fēng)格。,函數(shù)定義示例,int max (int x,int y)/*形式參數(shù)說明*/ int z; /*函數(shù)體中的說明部分*/ z=xy?x:y; return(z); ,x,y為形式參數(shù),不能寫成 “int x,y”。 return語句的作用是將z的值作為函數(shù)值帶回到主調(diào)函數(shù)中。return后
5、面的括弧中的值作為函數(shù)帶回的值(括弧可省略) 在函數(shù)定義時(shí)已指定為整型,在函數(shù)體中定義z為整型,二者是一致的,將之作為函數(shù)max的值帶回調(diào)用函數(shù),形式為: 類型說明符 函數(shù)名() 如:dummy() ,在程序設(shè)計(jì)中往往根據(jù)需要確定若干模塊,分別由一些函數(shù)來實(shí)現(xiàn)。而在第一階段只設(shè)計(jì)最基本的模塊,其它一些功能則在以后補(bǔ)上。在編寫程序的開始階段,可以在將來準(zhǔn)備擴(kuò)充功能的地方寫上一個(gè)空函數(shù),函數(shù)名取將來采用的實(shí)際函數(shù)名,只是這些函數(shù)未編好,先占一個(gè)位置,以后用一個(gè)編好的函數(shù)代替它。,這樣做,程序的結(jié)構(gòu)清楚,可讀性好,以后擴(kuò)充新功能方便,對(duì)程序結(jié)構(gòu)影響不大。空函數(shù)在程序設(shè)計(jì)中常常是有用的。,空函數(shù),在調(diào)
6、用函數(shù)時(shí),大多數(shù)情況下,主調(diào)函數(shù)和被調(diào)用函數(shù)之間有數(shù)據(jù)傳遞關(guān)系。這就是前面提到的有參函數(shù)。 在定義函數(shù)時(shí)函數(shù)名后面括弧中的變量名稱為“形式參數(shù)”,在調(diào)用函數(shù)時(shí),函數(shù)名后面括弧中的表達(dá)式稱為“實(shí)際參數(shù)”(簡稱“實(shí)參”)。,main( ) int a,b,c; scanf(”%d,%d”, ,max(int x,int y) /*定義有參函數(shù)max*/ int z; zxy?x,y; return(z); ,運(yùn)行如下: 7,8 Max is 8,函數(shù)參數(shù)和函數(shù)的值,2實(shí)參可以是常量、變量或表達(dá)式,如:max(3,a+b); 但要求它們有確定的值。調(diào)用時(shí)將實(shí)參的值賦給形參變量。,3在被定義的函數(shù)中,
7、必須指定形參的類型。,4實(shí)參與形參的類型應(yīng)一致。如果實(shí)參為整型,形參為實(shí)型,或者相反,則發(fā)生“類型不匹配”的錯(cuò)誤。字符型與整型可以互相通用。,1在定義函數(shù)中指定的形參變量,在未出現(xiàn)函數(shù)調(diào)用時(shí),它們并不占內(nèi)存中的存儲(chǔ)單元。只有在發(fā)生函數(shù)調(diào)用時(shí)函數(shù)max中的形參才被分配內(nèi)存單元。在調(diào)用結(jié)束后,形參所占的內(nèi)存單元也被釋放。,形參與實(shí)參說明,5C語言規(guī)定,實(shí)參變量對(duì)形參變量的傳遞是“值傳遞 “,即單向傳遞。在內(nèi)存中,實(shí)參單元對(duì)形參單元是不同的 單元。,在調(diào)用函數(shù)時(shí),給形參分配存儲(chǔ)單元,并將實(shí)參對(duì)應(yīng)的值傳遞給形參,調(diào)用結(jié)束后,形參單元被釋放,實(shí)參單元仍保留并維持原值。 因此,在執(zhí)行一個(gè)被調(diào)用函數(shù)時(shí),形參
8、的值如果發(fā)生改變,并不會(huì)改變主調(diào)函數(shù)的實(shí)參的值。例如,若在執(zhí)行函數(shù)過程中x和y的值變?yōu)?0和15,而a和b仍為2和3。,形參與實(shí)參說明(con.),/*使用直接編程的方法*/ main() float r,area; printf(“Input r:”); scanf(“%f”, ,/*使用函數(shù)的方法*/ float area_fun(float x)/*函數(shù)定義*/ float t; t=3.14159*x*x; return(t); main() float r,area; printf(“Input r:”); scanf(“%f”, ,用函數(shù)計(jì)算圓的面積,在主函數(shù)中輸入圓的半徑, 顯示
9、計(jì)算結(jié)果。,函數(shù)示例,函數(shù)定義說明,函數(shù)的缺省類型為: int或char類型 無參函數(shù): 形參表可以缺??; 若用void 說明該函數(shù)無參數(shù)傳遞,利于參數(shù)傳遞過程的檢驗(yàn)。 例:void display(void) /*.*/ ,函數(shù)體: 包括變量定義和語句執(zhí)行兩部分; 可以只有執(zhí)行部分; 可以是空函數(shù) 不作任何操作 例: void display(void) ,返回語句關(guān)鍵字return 無參格式: return;指返回控制點(diǎn)(流程) 有參格式: return 表達(dá)式;返回控制點(diǎn)時(shí)帶回計(jì)算結(jié)果,函數(shù)類型與返回語句,函數(shù)類型 指函數(shù)返回值的類型,可以是任意類型 缺省的函數(shù)類型:表示返回int型或c
10、har型值(隱式說明) void型函數(shù):表示該函數(shù)無任何返回值(無值型函數(shù)),void函數(shù)一般不使用return語句 一個(gè)函數(shù)中允許使用多個(gè)return語句 返回值與函數(shù)類型不一致時(shí),自動(dòng)向函數(shù)類型轉(zhuǎn)換,參數(shù)類型示例,運(yùn)行情況如下: 1.5,2.5,max(float x,float y) float z ; zxy?x:y; return(z); ,例:(注意變量的類型) main() float a,b; int c; scanf(“%f,%f”, ,如果將main函數(shù)中的c定義為實(shí)型,用f格式符輸出,將輸出,2.000000,max is 2,return說明,main() int a,
11、b,c; a = printstar(); b = print_message(); c = printstar(); printf(“%d,%d,%d”,a,b,c); ,void printstar() void print_message() ,用“void”定義“無類型” ,系統(tǒng)就保證不使函數(shù)帶回任何值。,如果被調(diào)用函數(shù)中沒有return語句,并不帶回一個(gè)確定的、用戶所希望得到的函數(shù)值,但實(shí)際上,函數(shù)并不是不帶回值,而只是不帶回有用的值,帶回的是一個(gè)不確定的值。,函數(shù)示例,int y_fun(int a) if(a0) return 1; else return 0; ,求函數(shù) y(x
12、)的解,main() int x; scanf(“%d”, ,函數(shù)調(diào)用的一般形式: 函數(shù)名(實(shí)參表列); 如果實(shí)參表列包含多個(gè)實(shí)參則各參數(shù)間用逗號(hào)隔開;實(shí)參與形參的個(gè)數(shù)應(yīng)相等,類型應(yīng)一致;實(shí)參與形參按順序?qū)?yīng),一一傳遞數(shù)據(jù)。 函數(shù)調(diào)用方式(3種) 調(diào)用條件:函數(shù)已經(jīng)存在(庫函數(shù)或自定義函數(shù)) 語句調(diào)用 printstar(); 不要求函數(shù)帶回值,只要求函數(shù)完成一定的操作。 表達(dá)式調(diào)用 n=2*2+min(a,b); 函數(shù)表達(dá)式,要求帶回一個(gè)確定的值。 參數(shù)調(diào)用 putchar(getchar(); 函數(shù)調(diào)用作為一個(gè)函數(shù)的實(shí)參; 又如 printf(”d”,max(a,b);,函數(shù)調(diào)用,函數(shù)調(diào)用
13、-實(shí)參求值,main( ) int i=2,p; p=f(i,+i); printf(“%d”,p); int f(int a,int b) int c; if(ab)c=1; else if(a=b)c=0; else c =-1; return(c);,結(jié)果: 0,如果按自左至右順序求實(shí)參的值,則程序運(yùn)行應(yīng)的結(jié)果為“-1”. 若按自右至左順序求實(shí)參的值,則程序運(yùn)行結(jié)果為“0”。 因此應(yīng)當(dāng)避免這種容易引起不同理解的情況。,這種情況在printf函數(shù)中也同樣存在,如 printf(”%d,%d”,i,i+); 也發(fā)生上述同樣的問題,若i的原值為3,在PC機(jī)上運(yùn)行結(jié)果為:4,3。應(yīng)該避免這種容易
14、搞混淆的用法,對(duì)實(shí)參表求值的順序并不是確定的,有的系統(tǒng)按自左至右順序求實(shí)參的值,有的系統(tǒng)則按自右至左順序。,被調(diào)用函數(shù)需要具備的條件: 首先被調(diào)用的函數(shù)必須是已經(jīng)存在的函數(shù)(是庫函數(shù)或用戶自己定義的函數(shù))。 如果使用庫函數(shù),一般還應(yīng)該在本文件開頭用inc1ude命令將調(diào)用有關(guān)庫函數(shù)時(shí)所需用到的信息包含到本文件來。例如, include “stdio.h” 如果使用用戶自己定義的函數(shù),而且該函數(shù)與調(diào)用它的函數(shù)(即主調(diào)函數(shù))在同一個(gè)文件中,一般還應(yīng)該在主調(diào)函數(shù)中對(duì)被調(diào)用函數(shù)的返回值的類型作聲明,即向編譯系統(tǒng)聲明將要調(diào)用此函數(shù),并將有關(guān)信息通知編譯系統(tǒng),以便檢驗(yàn)。 類型聲明的一般形式為: 類型標(biāo)識(shí)符
15、 被調(diào)用函數(shù)的函數(shù)名();,函數(shù)聲明,main() float add(float x,float y); *對(duì)被調(diào)用函數(shù)的聲明* float a,b,c; scanf(”%f,%f”, ,float add(float x,float y) *定義add函數(shù)* f1oat z; z=x+y; return(z);,運(yùn)行情況如下: 3.6, 5.5 sum is 9.100000,函數(shù)聲明示例,函數(shù)聲明與定義的區(qū)別,對(duì)函數(shù)的“定義”和“聲明”不是一回事。“定義”是指對(duì)函數(shù)功能的確立,包括指定函數(shù)名,函數(shù)值類型、形參及其類型、函數(shù)體等,它是一個(gè)完整的、獨(dú)立的函數(shù)單位。 而“聲明”的作用則是把函數(shù)
16、的名字、函數(shù)類型以及形參的類型、個(gè)數(shù)和順序通知編譯系統(tǒng),以便在調(diào)用該函數(shù)時(shí)系統(tǒng)按此進(jìn)行對(duì)照檢查(例如函數(shù)名是否正確,實(shí)參與形參的類型和個(gè)數(shù)是否一致)。函數(shù)定義是唯一的,但函數(shù)的聲明可以多次。 在函數(shù)聲明中也可以不寫形參名,而只寫形參的類型。如:float add(float ,float);(也允許在函數(shù)原型中加上參數(shù)名)C語言中,把以上形式的函數(shù)聲明稱為函數(shù)原型。作用主要是利用它在程序的編譯階段對(duì)調(diào)用函數(shù)的合法性進(jìn)行全面檢查。,函數(shù)聲明特例,如果函數(shù)的返回值是整型或字符型,可以不必進(jìn)行聲明,系統(tǒng)對(duì)它們自動(dòng)按整型聲明。但為清晰起見,建議都加以聲明為好。 如果被調(diào)用函數(shù)的定義出現(xiàn)在主調(diào)函數(shù)之前,可以不必加以聲明。因?yàn)榫幾g系統(tǒng)已經(jīng)先知道了已定義的函數(shù)類型,會(huì)自動(dòng)處理的。 如果已在所有函數(shù)定義之前,在文件的開頭,在函數(shù)的外部已聲明了函數(shù)類型,則在各個(gè)主調(diào)函數(shù)中不必對(duì)所調(diào)用的函數(shù)再作類型聲明。 除了以上三種情況外,都應(yīng)該按上述介紹的方法對(duì)所調(diào)用函數(shù)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度養(yǎng)老服務(wù)業(yè)招標(biāo)文件編制與養(yǎng)老服務(wù)標(biāo)準(zhǔn)合同3篇
- 二零二五版E管材國際環(huán)境友好采購合同3篇
- 2025年度環(huán)保型包裝材料研發(fā)與市場銷售合同3篇
- 2025年度綠色有機(jī)大米直供采購合同3篇
- 2025年無證房買賣合同范本解讀與實(shí)施手冊(cè)6篇
- 二零二五年度裝配式建筑構(gòu)件安裝質(zhì)量保修合同3篇
- 現(xiàn)代文學(xué)史自考知識(shí)點(diǎn):郭沫若的作品
- 二零二四年體育場館高空作業(yè)腳手架勞務(wù)分包合同2篇
- 2024版煙酒零售購銷協(xié)議樣本一
- 2025年度新型環(huán)保儲(chǔ)藏室設(shè)施買賣合同協(xié)議書3篇
- GB/T 12914-2008紙和紙板抗張強(qiáng)度的測定
- GB/T 1185-2006光學(xué)零件表面疵病
- ps6000自動(dòng)化系統(tǒng)用戶操作及問題處理培訓(xùn)
- 家庭教養(yǎng)方式問卷(含評(píng)分標(biāo)準(zhǔn))
- 城市軌道交通安全管理課件(完整版)
- 線纜包覆擠塑模設(shè)計(jì)和原理
- TSG ZF001-2006 安全閥安全技術(shù)監(jiān)察規(guī)程
- 部編版二年級(jí)語文下冊(cè)《蜘蛛開店》
- 鍋爐升降平臺(tái)管理
- 200m3╱h凈化水處理站設(shè)計(jì)方案
- 個(gè)體化健康教育記錄表格模板1
評(píng)論
0/150
提交評(píng)論