




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第4章 函數(shù)與程序結(jié)構(gòu)譚曉華 .cn高級(jí)語(yǔ)言程序設(shè)計(jì)內(nèi)容提要函數(shù)定義、函數(shù)調(diào)用難點(diǎn):函數(shù)的參數(shù)傳遞與返回值 結(jié)構(gòu)設(shè)計(jì)與模塊化全局變量、自動(dòng)變量、靜態(tài)變量、寄存器變量難點(diǎn):變量的作用域與存儲(chǔ)類(lèi)型 函數(shù)定義(definition)類(lèi)型 函數(shù)名(類(lèi)型 參數(shù)1, 類(lèi)型 參數(shù)2, )函數(shù)體;return 表達(dá)式;返回值類(lèi)型標(biāo)識(shí)符參數(shù)表返回值(函數(shù)值)函數(shù)出口例 有參函數(shù) int max(int x,int y) int z; z=xy?x:y; return(z); 例 有參函數(shù) int max(int x, y) int z; z=xy?x:y; return(z); 例 空函數(shù) void dummy
2、( void) 函數(shù)體為空例 無(wú)參函數(shù) void printstar( ) printf(“*n”); 注意:用void定義返回值類(lèi)型函數(shù)沒(méi)有運(yùn)算結(jié)果,沒(méi)有返回值return語(yǔ)句可不用,或之后不需要任何表達(dá)式用void定義參數(shù)或省略,表示沒(méi)有參數(shù)參數(shù)表里的參數(shù)(叫形式參數(shù),parameter)也是函數(shù)的語(yǔ)句塊內(nèi)的變量函數(shù)名命名函數(shù)名應(yīng)該有實(shí)際意義,能見(jiàn)名知意Windows風(fēng)格函數(shù)名命名用大寫(xiě)字母開(kāi)頭的單詞組合而成 ,如VariableName函數(shù)名形式“動(dòng)詞”或者“動(dòng)詞+名詞”(動(dòng)賓詞組)如函數(shù)名GetMax()等 變量名形式“名詞”或者“形容詞+名詞”如變量名oldValue與newValu
3、e等對(duì)函數(shù)定義加以注釋說(shuō)明 /* 函數(shù)功能:實(shí)現(xiàn)功能 函數(shù)參數(shù):參數(shù)1,表示 參數(shù)2,表示 函數(shù)返回值: */返回值類(lèi)型 函數(shù)名 (參數(shù)表)函數(shù)體return 表達(dá)式;例 計(jì)算兩個(gè)整數(shù)的平均數(shù)/* 函數(shù)功能: 計(jì)算平均數(shù) 函數(shù)入口參數(shù): 整型x,存儲(chǔ)第一個(gè)運(yùn)算數(shù) 整型y,存儲(chǔ)第二個(gè)運(yùn)算數(shù) 函數(shù)返回值: 平均數(shù)*/float Average(int x, int y)float result;result = (x + y) / 2;return result;函數(shù)調(diào)用(call)函數(shù)名(表達(dá)式1, 表達(dá)式2, )b=4; max(3,b+5)調(diào)用一個(gè)函數(shù)之前,先要對(duì)其返回值類(lèi)型、函數(shù)名和參數(shù)進(jìn)
4、行聲明(declare)不對(duì)函數(shù)進(jìn)行聲明是非常危險(xiǎn)的通過(guò)函數(shù)原型聲明(函數(shù)頭加分號(hào),P181)例如:int max(a,b);函數(shù)定義也有聲明函數(shù)的效果調(diào)用函數(shù)時(shí),提供的表達(dá)式(叫實(shí)際參數(shù), argument)和該函數(shù)的形式參數(shù)必須匹配數(shù)目一致類(lèi)型一一對(duì)應(yīng)(會(huì)發(fā)生自動(dòng)類(lèi)型轉(zhuǎn)換)表達(dá)式的值賦值給對(duì)應(yīng)的參數(shù)返回值可以按需處理函數(shù)語(yǔ)句: 例 printstar(); printf(“Hello,World!n”);函數(shù)表達(dá)式: 例 m=max(a,b)*2;函數(shù)參數(shù): 例 printf(“%d”,max(a,b); m=max(a,max(b,c);main()int a = 10;int b =
5、100;float ave;ave = Average(a, b);printf(Average of %d and %d is %d.n, a, b, ave);float Average(int x, int y) /*函數(shù)定義,可作函數(shù)聲明float result;result = (float)(x + y) / 2;return result;main()int a = 10;int b = 100;float ave; float Average(int x, int y); /*函數(shù)聲明*/ave = Average(a, b);printf(Average of %d and
6、%d is %d.n, a, b, ave);float Average(int x, int y) /*函數(shù)定義,可作函數(shù)聲明*/float result;result = (float)(x + y) / 2;return result;main()a();.a 函數(shù)函數(shù)調(diào)用的過(guò)程函數(shù)的每次執(zhí)行都會(huì)建立一個(gè)全新的獨(dú)立的環(huán)境為函數(shù)的每個(gè)變量(包括形式參數(shù))分配內(nèi)存把實(shí)際參數(shù)的值復(fù)制給形式參數(shù)函數(shù)內(nèi)的代碼在這個(gè)獨(dú)立的環(huán)境內(nèi)工作依次執(zhí)行函數(shù)體內(nèi)的語(yǔ)句函數(shù)退出時(shí)求出返回值,將其存入一個(gè)可以被調(diào)用者訪問(wèn)的地方(x86中通常使用EAX寄存器)收回分配給形式參數(shù)和函數(shù)體內(nèi)聲明變量的內(nèi)存程序控制權(quán)交給調(diào)用
7、者,調(diào)用者拿到返回值,將其作為函數(shù)調(diào)用的結(jié)果10010main()int a = 10;int b = 100;float ave;ave = Average(a, b);printf(Average of %d and %d is %d.n, a, b, ave);55float Average(int x, int y)float result;result = (float)(x + y) / 2;return result;xyresulta10b100輸出: Average of 10 and 100 is 55. 值傳遞ave5555怎樣定義函數(shù)調(diào)用函數(shù)時(shí)才能確定的數(shù)據(jù)定義為函數(shù)參
8、數(shù)。希望通過(guò)調(diào)用函數(shù)得到的結(jié)果為返回值,返回值的類(lèi)型為函數(shù)類(lèi)型。函數(shù)體中采用各種算法,得到返回值,即return后的表達(dá)式。函數(shù)聲明函數(shù)調(diào)用int Max(int x,int y);max(3,4)=4;int Add2(int a, int b);Add2(3,4)=7;int Add3(int a, int b,int c);Add3(3,4,5)=12;float Round(float f);Round(1.23456)=1.23;函數(shù)的嵌套調(diào)用main()a();.a 函數(shù)b();b函數(shù)C規(guī)定:函數(shù)定義不可嵌套,但可以嵌套調(diào)用函數(shù)程序總是從main函數(shù)開(kāi)始,到main函數(shù)結(jié)束。#in
9、clude void main() int n,sn;n=3;sn=fact1(n);printf( %dn,sn); int fact1(int x) int y;y=x+1;y=fact2(y);return(y); int fact2(int z) z=z+2; return(z); 函數(shù)的嵌套調(diào)用函數(shù)的遞歸調(diào)用1、遞歸的概念直接遞歸調(diào)用 調(diào)用函數(shù)的過(guò)程中又調(diào)用該函數(shù)本身間接遞歸調(diào)用 調(diào)用f1函數(shù)的過(guò)程中調(diào)用f2函數(shù),而f2中又需要調(diào)用f1。 以上均為無(wú)終止遞歸調(diào)用。 為此,一般要用if語(yǔ)句來(lái)控制使遞歸過(guò)程到某一條件滿(mǎn)足時(shí)結(jié)束。19函數(shù)的遞歸調(diào)用202、遞歸算法 類(lèi)似于數(shù)學(xué)證明中的反推法
10、,從后一結(jié)果與前一結(jié)果的關(guān)系中尋找其規(guī)律性。 歸納法可以分為:遞推法 從初值出發(fā),歸納出新值與舊值間直到最后值為止存在的關(guān)系。 要求通過(guò)分析得到: 初值+遞推公式 編程:通過(guò)循環(huán)控制結(jié)構(gòu)實(shí)現(xiàn)(循環(huán)的終值是最后值)遞歸法 從結(jié)果出發(fā),歸納出后一結(jié)果與前一結(jié)果直到初值為止存在的關(guān)系。 要求通過(guò)分析得到: 初值+遞歸函數(shù) 編程:設(shè)計(jì)一個(gè)函數(shù)(遞歸函數(shù)),這個(gè)函數(shù)不斷使用下一級(jí)值調(diào)用自身,直到結(jié)果已知處選擇控制結(jié)構(gòu)?!纠坑眠f歸法求n!分析比較:21 實(shí)際上,遞歸程序分兩個(gè)階段執(zhí)行 回推(調(diào)用):欲求n! 先求 (n-1)! (n-2)! 1! 若1!已知,回推結(jié)束。 遞推(回代):知道1!2!可求出
11、3! n!程序如下:main() int n; float s; float fac(); clrscr(); printf(Input n=); scanf(%d,&n); s=fac(n); printf(%d!=%.0f,n,s);float fac(int x) int f; if (x=0|x=1) f=1; else f=fac(x-1)*x; return f; 22【例】有5個(gè)人,第5個(gè)人說(shuō)他比第4個(gè)人大2歲,第4個(gè)人說(shuō)他對(duì)第3個(gè)人大2歲,第3個(gè)人說(shuō)他對(duì)第2個(gè)人大2歲,第2個(gè)人說(shuō)他比第1個(gè)人大2歲,第1個(gè)人說(shuō)他10歲。求第5個(gè)人多少歲。 通過(guò)分析,設(shè)計(jì)遞歸函數(shù)如下: 10 (n
12、=1) age(n)= age(n-1)+2 (n1)2324 遞歸函數(shù): 10 (n=1) age(n)= age(n-1)+2 (n1)int age(int n) int c; if (n=1) c=10; else c=age(n-1)+2; return c; main() printf(%d,age(5);程序如下:請(qǐng)看看單步運(yùn)行的情況25 age(5) c=age(4)+2; return c;int age(int n) int c; if (n=1) c=10; else c=age(n-1)+2; return c; age(4) c=age(3)+2; return c;
13、 age(3) c=age(2)+2; return c; age(2) c=age(1)+2; return c; age(1) c=10 return c;c=10c=12c=14c=16c=18函數(shù)的遞歸調(diào)用遞歸算法的一般形式26其一般形式是:在主函數(shù)中用終值n調(diào)用遞歸函數(shù),而在遞歸函數(shù)中:遞歸函數(shù)名f(參數(shù)x) if (x=初值) 結(jié)果=; else 結(jié)果=含f(x-1)的表達(dá)式; 返回結(jié)果(return);f(x) f(x-1) main() f(n) f(x-1) f(x-2) f(x-2) f(x-3) f(x0) f(x0= ) 什么是好的程序設(shè)計(jì)好的算法設(shè)計(jì)運(yùn)行速度快,空間占
14、用少,是程序的靈魂好的結(jié)構(gòu)設(shè)計(jì)可重用,可擴(kuò)展,易維護(hù),是程序的肉體采用順序、選擇和循環(huán)三種基本結(jié)構(gòu)模塊化基本思想:將一個(gè)大的程序按功能分割成一些小模塊。特點(diǎn):各模塊相對(duì)獨(dú)立、功能單一、結(jié)構(gòu)清晰、接口簡(jiǎn)單每個(gè)模塊可以獨(dú)立設(shè)計(jì)算法,單獨(dú)編寫(xiě)和測(cè)試一個(gè)模塊中的錯(cuò)誤不易擴(kuò)散和蔓延到其它模塊眾人可同時(shí)進(jìn)行集體性開(kāi)發(fā)作用:控制了程序設(shè)計(jì)的復(fù)雜性提高元件的可靠性縮短開(kāi)發(fā)周期避免程序開(kāi)發(fā)的重復(fù)勞動(dòng)易于維護(hù)和功能擴(kuò)充開(kāi)發(fā)方法: 自上向下,逐步分解,分而治之模塊化設(shè)計(jì)與函數(shù)C是模塊化程序設(shè)計(jì)語(yǔ)言C程序結(jié)構(gòu)模塊化設(shè)計(jì)與函數(shù)在VC中,一個(gè)程序就是一個(gè)項(xiàng)目,在所有的源文件中只能有一個(gè)main函數(shù)函數(shù)是C語(yǔ)言中模塊化編程
15、的最小單位可以把每個(gè)函數(shù)看作一個(gè)最小的模塊若干相關(guān)的函數(shù)可以合并為一個(gè)大的“模塊”main()printf()scanf()power()putchar()getchar()main()stdio:printf()scanf()putchar()getchar()mymdl:power()模塊化設(shè)計(jì)與函數(shù)31模塊化設(shè)計(jì)與函數(shù)P170例7.1 void printstar() printf(*n);void printmessage() printf(“How do you do!n);void main() printstar(); printmessage(); printstar();32
16、模塊化設(shè)計(jì)與函數(shù)【例】編寫(xiě)一個(gè)兒童算術(shù)能力測(cè)試軟件main() char ans = y; cover( ); /*調(diào)用軟件封面顯示函數(shù)*/ password( ); /*調(diào)用密碼檢查函數(shù)*/ while (ans =y| ans =Y) question( ); /*調(diào)用產(chǎn)生題目函數(shù)*/ answers( ); /*調(diào)用接受回答函數(shù)*/ marks( ); /*調(diào)用評(píng)分函數(shù)*/ results( ); /*調(diào)用結(jié)果顯示函數(shù)*/ printf(“是否繼續(xù)練習(xí)?(Y/N)n”); ans=getch ( ); printf(“謝謝使用,再見(jiàn)!”); 自定義函數(shù)33模塊化設(shè)計(jì)與函數(shù)【例4.1】編寫(xiě)
17、一個(gè)兒童算術(shù)能力測(cè)試軟件main() char ans = y; cover( ); /*調(diào)用軟件封面顯示函數(shù)*/ password( ); /*調(diào)用密碼檢查函數(shù)*/ while (ans =y| ans =Y) question( ); /*調(diào)用產(chǎn)生題目函數(shù)*/ answers( ); /*調(diào)用接受回答函數(shù)*/ marks( ); /*調(diào)用評(píng)分函數(shù)*/ results( ); /*調(diào)用結(jié)果顯示函數(shù)*/ printf(是否繼續(xù)練習(xí)?(Y/N)n); ans=getch ( ); printf(謝謝使用,再見(jiàn)!);/*定義所用函數(shù)*/cover() /*軟件封面顯示函數(shù)*/password()
18、/*密碼檢查函數(shù)*/question() /*產(chǎn)生題目函數(shù)*/answers() /*接受回答函數(shù)*/marks() /*評(píng)分函數(shù)*/results() /*結(jié)果顯示函數(shù)*/ 這些函數(shù)現(xiàn)在不編程或還不會(huì)編程,可先空放??梢远嗳撕献?,每人完成若干個(gè)函數(shù)(模塊化)。可在另一個(gè)源程序文件中定義。Lets try34模塊化設(shè)計(jì)與函數(shù) 如果把編程比做生產(chǎn)一臺(tái)電腦,函數(shù)就好比是分別負(fù)責(zé)輸入、輸出、存儲(chǔ)、計(jì)算、圖像處理、聲音處理的各個(gè)組件??蓪⑦@些“組件”單獨(dú)設(shè)計(jì)、調(diào)試、測(cè)試好,得到“鍵盤(pán)”、 “顯示器”、 “內(nèi)存條”、 “硬盤(pán)”、 “CPU”、 “顯卡”、 “聲卡”,用時(shí)拿出來(lái)組裝,再總體調(diào)試。這些“組件
19、”可以是自己設(shè)計(jì)制造/別人設(shè)計(jì)制造/現(xiàn)在的標(biāo)準(zhǔn)產(chǎn)品變量的存儲(chǔ)類(lèi)別變量?jī)纱髮傩裕?數(shù)據(jù)類(lèi)型 存儲(chǔ)類(lèi)別351、存儲(chǔ)類(lèi)別 規(guī)定了變量在計(jì)算機(jī)內(nèi)部的存放位置決定變量的“壽命”(何時(shí)“生”,何時(shí)“滅”) 一個(gè)完整的變量說(shuō)明格式如下: 存儲(chǔ)類(lèi)別 數(shù)據(jù)類(lèi)型 變量名 如 static int x , y ;C程序的存儲(chǔ)類(lèi)別有: register型(寄存器型) auto型(自動(dòng)變量型) static型(靜態(tài)變量型) extern型(外部變量型)C程序的變量存儲(chǔ)位置36變量的生存期 靜態(tài)存儲(chǔ)區(qū)中的變量:與程序“共存亡” 動(dòng)態(tài)存儲(chǔ)區(qū)中的變量:與函數(shù)“共存亡” 寄存器中的變量:同動(dòng)態(tài)存儲(chǔ)區(qū)C程序的變量存儲(chǔ)類(lèi)別37變量
20、的生存期 靜態(tài)存儲(chǔ)區(qū)中的變量 與程序“共存亡” 動(dòng)態(tài)存儲(chǔ)區(qū)中的變量 與函數(shù)“共存亡” 寄存器中的變量 同動(dòng)態(tài)存儲(chǔ)區(qū) register型(寄存器型)變量值存放在運(yùn)算器的寄存器中存取速度快,一般只允許23個(gè),且限于char型和int型,通常用于循環(huán)變量 auto型(自動(dòng)變量型)變量值存放在主存儲(chǔ)器的動(dòng)態(tài)存儲(chǔ)區(qū)(堆棧方式);優(yōu)點(diǎn)同一內(nèi)存區(qū)可被不同變量反復(fù)使用。以上兩種變量均屬于“動(dòng)態(tài)存儲(chǔ)型”,即調(diào)用函數(shù)時(shí)才為這些變量分配單元,函數(shù)調(diào)用結(jié)束其值自動(dòng)消失。C程序的變量存儲(chǔ)類(lèi)別38變量的生存期 靜態(tài)存儲(chǔ)區(qū)中的變量 與程序“共存亡” 動(dòng)態(tài)存儲(chǔ)區(qū)中的變量 與函數(shù)“共存亡” 寄存器中的變量 同動(dòng)態(tài)存儲(chǔ)區(qū) static型(靜態(tài)變量型)變量值存放在主存儲(chǔ)器的靜態(tài)存儲(chǔ)區(qū)程序執(zhí)行開(kāi)始至結(jié)束,始終占用該存儲(chǔ)空間 extern型(外部變量型)同上,其值可供其他源文件使用以上兩種均屬于“靜態(tài)存儲(chǔ)”性質(zhì),即從變量定義處開(kāi)始,在整個(gè)程序執(zhí)行期間其值都存在(都可用!)未說(shuō)明存儲(chǔ)類(lèi)別時(shí),函數(shù)內(nèi)定義的變量默認(rèn)為auto型函數(shù)外定義的變量默認(rèn)為extern型。局部變量與全局變量1、局部變量函數(shù)內(nèi)部或復(fù)合語(yǔ)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國(guó)螺旋埋弧焊管行業(yè)發(fā)展?fàn)顩r及營(yíng)銷(xiāo)戰(zhàn)略研究報(bào)告
- 2025-2030年中國(guó)營(yíng)養(yǎng)煲行業(yè)運(yùn)行動(dòng)態(tài)分析與營(yíng)銷(xiāo)策略研究報(bào)告
- 2025-2030年中國(guó)花椒大料行業(yè)運(yùn)營(yíng)狀況及發(fā)展前景分析報(bào)告
- 2025-2030年中國(guó)膦酸脲行業(yè)運(yùn)行狀況與前景趨勢(shì)分析報(bào)告
- 2025-2030年中國(guó)膠合板行業(yè)十三五規(guī)劃及發(fā)展盈利分析報(bào)告
- 2025-2030年中國(guó)聚丁烯管行業(yè)現(xiàn)狀調(diào)研及發(fā)展?jié)摿Ψ治鰣?bào)告
- 2025-2030年中國(guó)紙杯機(jī)行業(yè)運(yùn)行狀況及前景趨勢(shì)分析報(bào)告
- 2025-2030年中國(guó)粽子行業(yè)十三五規(guī)劃及發(fā)展盈利分析報(bào)告
- 2025江西省建筑安全員-B證考試題庫(kù)附答案
- 珠海科技學(xué)院《邊緣計(jì)算》2023-2024學(xué)年第二學(xué)期期末試卷
- JJG875-2005數(shù)字壓力計(jì)檢定規(guī)程
- 單價(jià)、數(shù)量、總價(jià)-教學(xué)課件【A3演示文稿設(shè)計(jì)與制作】
- 中小學(xué)生安全教育手冊(cè)全面版
- 09《馬克思主義政治經(jīng)濟(jì)學(xué)概論(第二版)》第九章
- 公司與個(gè)人合伙買(mǎi)車(chē)經(jīng)營(yíng)協(xié)議書(shū)
- DDI-能力解構(gòu)詞典
- 2015-2022年江西電力職業(yè)技術(shù)學(xué)院高職單招語(yǔ)文/數(shù)學(xué)/英語(yǔ)筆試參考題庫(kù)含答案解析
- 1 聚聚散散 教案人教版美術(shù)四年級(jí)下冊(cè)
- 綜合實(shí)踐活動(dòng)勞動(dòng)與技術(shù)八年級(jí)下冊(cè)教案
- GB/T 36196-2018蛋鴿飼養(yǎng)管理技術(shù)規(guī)程
- GB/T 21653-2008鎳及鎳合金線(xiàn)和拉制線(xiàn)坯
評(píng)論
0/150
提交評(píng)論