版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第4章 函數(shù)與程序結(jié)構(gòu)譚曉華 .cn高級語言程序設(shè)計內(nèi)容提要函數(shù)定義、函數(shù)調(diào)用難點:函數(shù)的參數(shù)傳遞與返回值 結(jié)構(gòu)設(shè)計與模塊化全局變量、自動變量、靜態(tài)變量、寄存器變量難點:變量的作用域與存儲類型 函數(shù)定義(definition)類型 函數(shù)名(類型 參數(shù)1, 類型 參數(shù)2, )函數(shù)體;return 表達(dá)式;返回值類型標(biāo)識符參數(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ù)體為空例 無參函數(shù) void printstar( ) printf(“*n”); 注意:用void定義返回值類型函數(shù)沒有運算結(jié)果,沒有返回值return語句可不用,或之后不需要任何表達(dá)式用void定義參數(shù)或省略,表示沒有參數(shù)參數(shù)表里的參數(shù)(叫形式參數(shù),parameter)也是函數(shù)的語句塊內(nèi)的變量函數(shù)名命名函數(shù)名應(yīng)該有實際意義,能見名知意Windows風(fēng)格函數(shù)名命名用大寫字母開頭的單詞組合而成 ,如VariableName函數(shù)名形式“動詞”或者“動詞+名詞”(動賓詞組)如函數(shù)名GetMax()等 變量名形式“名詞”或者“形容詞+名詞”如變量名oldValue與newValu
3、e等對函數(shù)定義加以注釋說明 /* 函數(shù)功能:實現(xiàn)功能 函數(shù)參數(shù):參數(shù)1,表示 參數(shù)2,表示 函數(shù)返回值: */返回值類型 函數(shù)名 (參數(shù)表)函數(shù)體return 表達(dá)式;例 計算兩個整數(shù)的平均數(shù)/* 函數(shù)功能: 計算平均數(shù) 函數(shù)入口參數(shù): 整型x,存儲第一個運算數(shù) 整型y,存儲第二個運算數(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)用一個函數(shù)之前,先要對其返回值類型、函數(shù)名和參數(shù)進(jìn)
4、行聲明(declare)不對函數(shù)進(jìn)行聲明是非常危險的通過函數(shù)原型聲明(函數(shù)頭加分號,P181)例如:int max(a,b);函數(shù)定義也有聲明函數(shù)的效果調(diào)用函數(shù)時,提供的表達(dá)式(叫實際參數(shù), argument)和該函數(shù)的形式參數(shù)必須匹配數(shù)目一致類型一一對應(yīng)(會發(fā)生自動類型轉(zhuǎn)換)表達(dá)式的值賦值給對應(yīng)的參數(shù)返回值可以按需處理函數(shù)語句: 例 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)用的過程函數(shù)的每次執(zhí)行都會建立一個全新的獨立的環(huán)境為函數(shù)的每個變量(包括形式參數(shù))分配內(nèi)存把實際參數(shù)的值復(fù)制給形式參數(shù)函數(shù)內(nèi)的代碼在這個獨立的環(huán)境內(nèi)工作依次執(zhí)行函數(shù)體內(nèi)的語句函數(shù)退出時求出返回值,將其存入一個可以被調(diào)用者訪問的地方(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ù)據(jù)定義為函數(shù)參
8、數(shù)。希望通過調(diào)用函數(shù)得到的結(jié)果為返回值,返回值的類型為函數(shù)類型。函數(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ù)開始,到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ù)的過程中又調(diào)用該函數(shù)本身間接遞歸調(diào)用 調(diào)用f1函數(shù)的過程中調(diào)用f2函數(shù),而f2中又需要調(diào)用f1。 以上均為無終止遞歸調(diào)用。 為此,一般要用if語句來控制使遞歸過程到某一條件滿足時結(jié)束。19函數(shù)的遞歸調(diào)用202、遞歸算法 類似于數(shù)學(xué)證明中的反推法
10、,從后一結(jié)果與前一結(jié)果的關(guān)系中尋找其規(guī)律性。 歸納法可以分為:遞推法 從初值出發(fā),歸納出新值與舊值間直到最后值為止存在的關(guān)系。 要求通過分析得到: 初值+遞推公式 編程:通過循環(huán)控制結(jié)構(gòu)實現(xiàn)(循環(huán)的終值是最后值)遞歸法 從結(jié)果出發(fā),歸納出后一結(jié)果與前一結(jié)果直到初值為止存在的關(guān)系。 要求通過分析得到: 初值+遞歸函數(shù) 編程:設(shè)計一個函數(shù)(遞歸函數(shù)),這個函數(shù)不斷使用下一級值調(diào)用自身,直到結(jié)果已知處選擇控制結(jié)構(gòu)。【例】用遞歸法求n!分析比較:21 實際上,遞歸程序分兩個階段執(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個人,第5個人說他比第4個人大2歲,第4個人說他對第3個人大2歲,第3個人說他對第2個人大2歲,第2個人說他比第1個人大2歲,第1個人說他10歲。求第5個人多少歲。 通過分析,設(shè)計遞歸函數(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);程序如下:請看看單步運行的情況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è)計好的算法設(shè)計運行速度快,空間占
14、用少,是程序的靈魂好的結(jié)構(gòu)設(shè)計可重用,可擴展,易維護(hù),是程序的肉體采用順序、選擇和循環(huán)三種基本結(jié)構(gòu)模塊化基本思想:將一個大的程序按功能分割成一些小模塊。特點:各模塊相對獨立、功能單一、結(jié)構(gòu)清晰、接口簡單每個模塊可以獨立設(shè)計算法,單獨編寫和測試一個模塊中的錯誤不易擴散和蔓延到其它模塊眾人可同時進(jìn)行集體性開發(fā)作用:控制了程序設(shè)計的復(fù)雜性提高元件的可靠性縮短開發(fā)周期避免程序開發(fā)的重復(fù)勞動易于維護(hù)和功能擴充開發(fā)方法: 自上向下,逐步分解,分而治之模塊化設(shè)計與函數(shù)C是模塊化程序設(shè)計語言C程序結(jié)構(gòu)模塊化設(shè)計與函數(shù)在VC中,一個程序就是一個項目,在所有的源文件中只能有一個main函數(shù)函數(shù)是C語言中模塊化編程
15、的最小單位可以把每個函數(shù)看作一個最小的模塊若干相關(guān)的函數(shù)可以合并為一個大的“模塊”main()printf()scanf()power()putchar()getchar()main()stdio:printf()scanf()putchar()getchar()mymdl:power()模塊化設(shè)計與函數(shù)31模塊化設(shè)計與函數(shù)P170例7.1 void printstar() printf(*n);void printmessage() printf(“How do you do!n);void main() printstar(); printmessage(); printstar();32
16、模塊化設(shè)計與函數(shù)【例】編寫一個兒童算術(shù)能力測試軟件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)用評分函數(shù)*/ results( ); /*調(diào)用結(jié)果顯示函數(shù)*/ printf(“是否繼續(xù)練習(xí)?(Y/N)n”); ans=getch ( ); printf(“謝謝使用,再見!”); 自定義函數(shù)33模塊化設(shè)計與函數(shù)【例4.1】編寫
17、一個兒童算術(shù)能力測試軟件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)用評分函數(shù)*/ results( ); /*調(diào)用結(jié)果顯示函數(shù)*/ printf(是否繼續(xù)練習(xí)?(Y/N)n); ans=getch ( ); printf(謝謝使用,再見!);/*定義所用函數(shù)*/cover() /*軟件封面顯示函數(shù)*/password()
18、/*密碼檢查函數(shù)*/question() /*產(chǎn)生題目函數(shù)*/answers() /*接受回答函數(shù)*/marks() /*評分函數(shù)*/results() /*結(jié)果顯示函數(shù)*/ 這些函數(shù)現(xiàn)在不編程或還不會編程,可先空放??梢远嗳撕献?,每人完成若干個函數(shù)(模塊化)??稍诹硪粋€源程序文件中定義。Lets try34模塊化設(shè)計與函數(shù) 如果把編程比做生產(chǎn)一臺電腦,函數(shù)就好比是分別負(fù)責(zé)輸入、輸出、存儲、計算、圖像處理、聲音處理的各個組件??蓪⑦@些“組件”單獨設(shè)計、調(diào)試、測試好,得到“鍵盤”、 “顯示器”、 “內(nèi)存條”、 “硬盤”、 “CPU”、 “顯卡”、 “聲卡”,用時拿出來組裝,再總體調(diào)試。這些“組件
19、”可以是自己設(shè)計制造/別人設(shè)計制造/現(xiàn)在的標(biāo)準(zhǔn)產(chǎn)品變量的存儲類別變量兩大屬性: 數(shù)據(jù)類型 存儲類別351、存儲類別 規(guī)定了變量在計算機內(nèi)部的存放位置決定變量的“壽命”(何時“生”,何時“滅”) 一個完整的變量說明格式如下: 存儲類別 數(shù)據(jù)類型 變量名 如 static int x , y ;C程序的存儲類別有: register型(寄存器型) auto型(自動變量型) static型(靜態(tài)變量型) extern型(外部變量型)C程序的變量存儲位置36變量的生存期 靜態(tài)存儲區(qū)中的變量:與程序“共存亡” 動態(tài)存儲區(qū)中的變量:與函數(shù)“共存亡” 寄存器中的變量:同動態(tài)存儲區(qū)C程序的變量存儲類別37變量
20、的生存期 靜態(tài)存儲區(qū)中的變量 與程序“共存亡” 動態(tài)存儲區(qū)中的變量 與函數(shù)“共存亡” 寄存器中的變量 同動態(tài)存儲區(qū) register型(寄存器型)變量值存放在運算器的寄存器中存取速度快,一般只允許23個,且限于char型和int型,通常用于循環(huán)變量 auto型(自動變量型)變量值存放在主存儲器的動態(tài)存儲區(qū)(堆棧方式);優(yōu)點同一內(nèi)存區(qū)可被不同變量反復(fù)使用。以上兩種變量均屬于“動態(tài)存儲型”,即調(diào)用函數(shù)時才為這些變量分配單元,函數(shù)調(diào)用結(jié)束其值自動消失。C程序的變量存儲類別38變量的生存期 靜態(tài)存儲區(qū)中的變量 與程序“共存亡” 動態(tài)存儲區(qū)中的變量 與函數(shù)“共存亡” 寄存器中的變量 同動態(tài)存儲區(qū) static型(靜態(tài)變量型)變量值存放在主存儲器的靜態(tài)存儲區(qū)程序執(zhí)行開始至結(jié)束,始終占用該存儲空間 extern型(外部變量型)同上,其值可供其他源文件使用以上兩種均屬于“靜態(tài)存儲”性質(zhì),即從變量定義處開始,在整個程序執(zhí)行期間其值都存在(都可用!)未說明存儲類別時,函數(shù)內(nèi)定義的變量默認(rèn)為auto型函數(shù)外定義的變量默認(rèn)為extern型。局部變量與全局變量1、局部變量函數(shù)內(nèi)部或復(fù)合語
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 放射治療護(hù)士協(xié)助放療
- 體育休閑行業(yè)美工體育品牌廣告休閑活動海報
- 房地產(chǎn)行業(yè)銷售培訓(xùn)
- 產(chǎn)前檢測室護(hù)理工作心得
- 幼兒園大班體育教案《轉(zhuǎn)》含反思
- 第七次人口普查先進(jìn)個人材料(15篇)
- 安全管理讀后感范文6篇
- 2024年度消費金融貸款合同范本詳解3篇
- 2024年房地產(chǎn)代理服務(wù)合同范本(含法律咨詢)3篇
- 2024年供應(yīng)鏈金融擔(dān)保人反擔(dān)保合同標(biāo)準(zhǔn)模板3篇
- 中藥材的性狀及真?zhèn)舞b別培訓(xùn)-課件
- Go語言Hyperledger區(qū)塊鏈開發(fā)實戰(zhàn)PPT完整全套教學(xué)課件
- 高速公路綠色品質(zhì)工程建設(shè)
- 小學(xué)語文《黃山奇松》第1課時教學(xué)設(shè)計
- qingming scroll《清明上河圖新解》英文PPT
- 09《馬克思主義政治經(jīng)濟(jì)學(xué)概論(第二版)》第九章
- DG-TJ 08-2367-2021 既有建筑外立面整治設(shè)計標(biāo)準(zhǔn)
- 關(guān)于反恐防暴的應(yīng)急預(yù)案范文(精選10篇)
- 馬拉松氧探頭操作手冊(范本模板)
- 兒童自閉癥康復(fù)中心項目可行性論證報告
- LS 8010-2014植物油庫設(shè)計規(guī)范
評論
0/150
提交評論