




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第4章 函數(shù)與程序結構譚曉華 .cn高級語言程序設計內容提要函數(shù)定義、函數(shù)調用難點:函數(shù)的參數(shù)傳遞與返回值 結構設計與模塊化全局變量、自動變量、靜態(tài)變量、寄存器變量難點:變量的作用域與存儲類型 函數(shù)定義(definition)類型 函數(shù)名(類型 參數(shù)1, 類型 參數(shù)2, )函數(shù)體;return 表達式;返回值類型標識符參數(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ù)沒有運算結果,沒有返回值return語句可不用,或之后不需要任何表達式用void定義參數(shù)或省略,表示沒有參數(shù)參數(shù)表里的參數(shù)(叫形式參數(shù),parameter)也是函數(shù)的語句塊內的變量函數(shù)名命名函數(shù)名應該有實際意義,能見名知意Windows風格函數(shù)名命名用大寫字母開頭的單詞組合而成 ,如VariableName函數(shù)名形式“動詞”或者“動詞+名詞”(動賓詞組)如函數(shù)名GetMax()等 變量名形式“名詞”或者“形容詞+名詞”如變量名oldValue與newValu
3、e等對函數(shù)定義加以注釋說明 /* 函數(shù)功能:實現(xiàn)功能 函數(shù)參數(shù):參數(shù)1,表示 參數(shù)2,表示 函數(shù)返回值: */返回值類型 函數(shù)名 (參數(shù)表)函數(shù)體return 表達式;例 計算兩個整數(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ù)調用(call)函數(shù)名(表達式1, 表達式2, )b=4; max(3,b+5)調用一個函數(shù)之前,先要對其返回值類型、函數(shù)名和參數(shù)進
4、行聲明(declare)不對函數(shù)進行聲明是非常危險的通過函數(shù)原型聲明(函數(shù)頭加分號,P181)例如:int max(a,b);函數(shù)定義也有聲明函數(shù)的效果調用函數(shù)時,提供的表達式(叫實際參數(shù), argument)和該函數(shù)的形式參數(shù)必須匹配數(shù)目一致類型一一對應(會發(fā)生自動類型轉換)表達式的值賦值給對應的參數(shù)返回值可以按需處理函數(shù)語句: 例 printstar(); printf(“Hello,World!n”);函數(shù)表達式: 例 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ù)調用的過程函數(shù)的每次執(zhí)行都會建立一個全新的獨立的環(huán)境為函數(shù)的每個變量(包括形式參數(shù))分配內存把實際參數(shù)的值復制給形式參數(shù)函數(shù)內的代碼在這個獨立的環(huán)境內工作依次執(zhí)行函數(shù)體內的語句函數(shù)退出時求出返回值,將其存入一個可以被調用者訪問的地方(x86中通常使用EAX寄存器)收回分配給形式參數(shù)和函數(shù)體內聲明變量的內存程序控制權交給調用
7、者,調用者拿到返回值,將其作為函數(shù)調用的結果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ù)調用函數(shù)時才能確定的數(shù)據定義為函數(shù)參
8、數(shù)。希望通過調用函數(shù)得到的結果為返回值,返回值的類型為函數(shù)類型。函數(shù)體中采用各種算法,得到返回值,即return后的表達式。函數(shù)聲明函數(shù)調用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ù)的嵌套調用main()a();.a 函數(shù)b();b函數(shù)C規(guī)定:函數(shù)定義不可嵌套,但可以嵌套調用函數(shù)程序總是從main函數(shù)開始,到main函數(shù)結束。#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ù)的嵌套調用函數(shù)的遞歸調用1、遞歸的概念直接遞歸調用 調用函數(shù)的過程中又調用該函數(shù)本身間接遞歸調用 調用f1函數(shù)的過程中調用f2函數(shù),而f2中又需要調用f1。 以上均為無終止遞歸調用。 為此,一般要用if語句來控制使遞歸過程到某一條件滿足時結束。19函數(shù)的遞歸調用202、遞歸算法 類似于數(shù)學證明中的反推法
10、,從后一結果與前一結果的關系中尋找其規(guī)律性。 歸納法可以分為:遞推法 從初值出發(fā),歸納出新值與舊值間直到最后值為止存在的關系。 要求通過分析得到: 初值+遞推公式 編程:通過循環(huán)控制結構實現(xiàn)(循環(huán)的終值是最后值)遞歸法 從結果出發(fā),歸納出后一結果與前一結果直到初值為止存在的關系。 要求通過分析得到: 初值+遞歸函數(shù) 編程:設計一個函數(shù)(遞歸函數(shù)),這個函數(shù)不斷使用下一級值調用自身,直到結果已知處選擇控制結構。【例】用遞歸法求n!分析比較:21 實際上,遞歸程序分兩個階段執(zhí)行 回推(調用):欲求n! 先求 (n-1)! (n-2)! 1! 若1!已知,回推結束。 遞推(回代):知道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ù)如下: 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ù)的遞歸調用遞歸算法的一般形式26其一般形式是:在主函數(shù)中用終值n調用遞歸函數(shù),而在遞歸函數(shù)中:遞歸函數(shù)名f(參數(shù)x) if (x=初值) 結果=; else 結果=含f(x-1)的表達式; 返回結果(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= ) 什么是好的程序設計好的算法設計運行速度快,空間占
14、用少,是程序的靈魂好的結構設計可重用,可擴展,易維護,是程序的肉體采用順序、選擇和循環(huán)三種基本結構模塊化基本思想:將一個大的程序按功能分割成一些小模塊。特點:各模塊相對獨立、功能單一、結構清晰、接口簡單每個模塊可以獨立設計算法,單獨編寫和測試一個模塊中的錯誤不易擴散和蔓延到其它模塊眾人可同時進行集體性開發(fā)作用:控制了程序設計的復雜性提高元件的可靠性縮短開發(fā)周期避免程序開發(fā)的重復勞動易于維護和功能擴充開發(fā)方法: 自上向下,逐步分解,分而治之模塊化設計與函數(shù)C是模塊化程序設計語言C程序結構模塊化設計與函數(shù)在VC中,一個程序就是一個項目,在所有的源文件中只能有一個main函數(shù)函數(shù)是C語言中模塊化編程
15、的最小單位可以把每個函數(shù)看作一個最小的模塊若干相關的函數(shù)可以合并為一個大的“模塊”main()printf()scanf()power()putchar()getchar()main()stdio:printf()scanf()putchar()getchar()mymdl:power()模塊化設計與函數(shù)31模塊化設計與函數(shù)P170例7.1 void printstar() printf(*n);void printmessage() printf(“How do you do!n);void main() printstar(); printmessage(); printstar();32
16、模塊化設計與函數(shù)【例】編寫一個兒童算術能力測試軟件main() char ans = y; cover( ); /*調用軟件封面顯示函數(shù)*/ password( ); /*調用密碼檢查函數(shù)*/ while (ans =y| ans =Y) question( ); /*調用產生題目函數(shù)*/ answers( ); /*調用接受回答函數(shù)*/ marks( ); /*調用評分函數(shù)*/ results( ); /*調用結果顯示函數(shù)*/ printf(“是否繼續(xù)練習?(Y/N)n”); ans=getch ( ); printf(“謝謝使用,再見!”); 自定義函數(shù)33模塊化設計與函數(shù)【例4.1】編寫
17、一個兒童算術能力測試軟件main() char ans = y; cover( ); /*調用軟件封面顯示函數(shù)*/ password( ); /*調用密碼檢查函數(shù)*/ while (ans =y| ans =Y) question( ); /*調用產生題目函數(shù)*/ answers( ); /*調用接受回答函數(shù)*/ marks( ); /*調用評分函數(shù)*/ results( ); /*調用結果顯示函數(shù)*/ printf(是否繼續(xù)練習?(Y/N)n); ans=getch ( ); printf(謝謝使用,再見!);/*定義所用函數(shù)*/cover() /*軟件封面顯示函數(shù)*/password()
18、/*密碼檢查函數(shù)*/question() /*產生題目函數(shù)*/answers() /*接受回答函數(shù)*/marks() /*評分函數(shù)*/results() /*結果顯示函數(shù)*/ 這些函數(shù)現(xiàn)在不編程或還不會編程,可先空放。可以多人合作,每人完成若干個函數(shù)(模塊化)。可在另一個源程序文件中定義。Lets try34模塊化設計與函數(shù) 如果把編程比做生產一臺電腦,函數(shù)就好比是分別負責輸入、輸出、存儲、計算、圖像處理、聲音處理的各個組件??蓪⑦@些“組件”單獨設計、調試、測試好,得到“鍵盤”、 “顯示器”、 “內存條”、 “硬盤”、 “CPU”、 “顯卡”、 “聲卡”,用時拿出來組裝,再總體調試。這些“組件
19、”可以是自己設計制造/別人設計制造/現(xiàn)在的標準產品變量的存儲類別變量兩大屬性: 數(shù)據類型 存儲類別351、存儲類別 規(guī)定了變量在計算機內部的存放位置決定變量的“壽命”(何時“生”,何時“滅”) 一個完整的變量說明格式如下: 存儲類別 數(shù)據類型 變量名 如 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)點同一內存區(qū)可被不同變量反復使用。以上兩種變量均屬于“動態(tài)存儲型”,即調用函數(shù)時才為這些變量分配單元,函數(shù)調用結束其值自動消失。C程序的變量存儲類別38變量的生存期 靜態(tài)存儲區(qū)中的變量 與程序“共存亡” 動態(tài)存儲區(qū)中的變量 與函數(shù)“共存亡” 寄存器中的變量 同動態(tài)存儲區(qū) static型(靜態(tài)變量型)變量值存放在主存儲器的靜態(tài)存儲區(qū)程序執(zhí)行開始至結束,始終占用該存儲空間 extern型(外部變量型)同上,其值可供其他源文件使用以上兩種均屬于“靜態(tài)存儲”性質,即從變量定義處開始,在整個程序執(zhí)行期間其值都存在(都可用!)未說明存儲類別時,函數(shù)內定義的變量默認為auto型函數(shù)外定義的變量默認為extern型。局部變量與全局變量1、局部變量函數(shù)內部或復合語
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年濾水瓶項目投資價值分析報告
- 招聘輔導員考試反饋溝通技巧探討試題及答案
- 江西藥企面試題及答案
- 完美花藝作品的條件的試題及答案
- 2025至2030年浮凸式點焊機項目投資價值分析報告
- 2024年園藝師考試追蹤研究試題及答案
- 2025至2030年油井多項存儲收集器項目投資價值分析報告
- 高校輔導員社會服務試題及答案
- 護師基礎考試試題及答案
- 辦公室節(jié)能試題及答案解析
- 佛教協(xié)會學習管理制度
- 2023年司法鑒定科學研究院事業(yè)編制招聘14人筆試參考題庫(共500題)答案詳解版
- 《爺爺?shù)臓敔斈睦飦怼饭沧x指導設計
- 個人業(yè)績相關信息采集表
- 宣傳片專題片視頻拍攝方案(技術方案)
- 水準測量平差表(含公式可自動計算)
- 機電安裝工程危險源識別評價清單1-發(fā)網上
- 腫瘤療效評估新標準-mRECIST標準
- 全國普通高等學校招生統(tǒng)一考試(上海卷)考試手冊
- 260噸汽車吊地基承載力驗算
- 群文閱讀指導課-二年級《一個一個連下去》課件
評論
0/150
提交評論