版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Chap 10 函數(shù)與程序結(jié)構(gòu)10.1 函數(shù)的組織10.2 遞歸函數(shù)10.3 宏定義10.4 編譯預(yù)處理本章要點(diǎn)怎樣把多個函數(shù)組織起來?怎樣用結(jié)構(gòu)化程序設(shè)計(jì)的思想解決問題?怎樣用函數(shù)嵌套求解復(fù)雜的問題?怎樣用函數(shù)遞歸解決問題?如何使用宏?使用結(jié)構(gòu)化程序設(shè)計(jì)方法解決復(fù)雜的問題把大問題分解成若干小問題,小問題再進(jìn)一步分解成若干更小的問題寫程序時,用main()解決整個問題,它調(diào)用解決小問題的函數(shù)這些函數(shù)又進(jìn)一步調(diào)用解決更小問題的函數(shù),從而形成函數(shù)的嵌套調(diào)用10.1 函數(shù)的組織main( )函數(shù)1函數(shù)2函數(shù)m函數(shù)1_1函數(shù)1_2函數(shù)m_1函數(shù)m_n程序結(jié)構(gòu)例10-1 設(shè)計(jì)一個常用圓形體體積計(jì)算器,采
2、用命令方式輸入1、2、3,分別選擇計(jì)算球體、圓柱體、圓錐體的體積,并輸入計(jì)算所需相應(yīng)參數(shù)。分析:輸入1、2、3選擇計(jì)算3種體積,其他輸入結(jié)束計(jì)算設(shè)計(jì)一個控制函數(shù)cal(),經(jīng)它辨別圓形體的類型再調(diào)用計(jì)算球體、圓柱體、圓錐體體積的函數(shù)設(shè)計(jì)單獨(dú)的函數(shù)計(jì)算不同圓形體的體積10.1.1 程序解析-計(jì)算常用圓形體體積3層結(jié)構(gòu),5個函數(shù)降低程序的構(gòu)思、編寫、調(diào)試的復(fù)雜度可讀性好程序結(jié)構(gòu)main( )cal ( )vol_ball ( )vol_cylind ( )vol_cone ( )例10-1源程序#define PI 3.141592654void cal ( int sel ); int main
3、(void) int sel; while( 1 ) printf( 1-計(jì)算球體體積n); printf( 2-計(jì)算圓柱體積n); printf( 3-計(jì)算圓錐體積n); printf( 其他-退出程序運(yùn)行n); printf(“請輸入計(jì)算命令:”); scanf(%d,&sel); if (sel 3) break; /* 輸入非13,循環(huán)結(jié)束 */ else cal (sel );/* 輸入13,調(diào)用cal() */ return 0;/* 常用圓形體體積計(jì)算器的主控函數(shù) */void cal ( int sel ) double vol_ball(void ); double vol_
4、cylind(void ); double vol_cone(void ); switch (sel) case 1: printf(球體積為:%.2fn, vol_ball( );break; case 2: printf(圓柱體積為:%.2fn, vol_cylind( ) );break; case 3: printf(圓錐體積為:%.2fn, vol_cone( ) );break;/* 計(jì)算球體體積 V=4/3*PI*r*r*r */double vol_ball( ) double r ; printf(請輸入球的半徑:); scanf(%lf,&r); return(4.0/3.
5、0*PI*r*r*r);/* 計(jì)算圓柱體積 V=PI*r*r*h */double vol_cylind( ) double r , h ; printf(請輸入圓柱的底圓半徑和高:); scanf(%lf%lf,&r,&h); return(PI*r*r*h);/* 計(jì)算圓錐體積 V=h/3*PI*r*r */double vol_cone( ) double r , h ; printf(請輸入圓錐的底圓半徑和高:); scanf(%lf%lf,&r,&h); return(PI*r*r*h/3.0);10.1.2 函數(shù)的嵌套調(diào)用順序調(diào)用int main(void) y = fact(3)
6、; z = mypow(3.5, 2); double fact(int n) double mypow(double x, in n) mainfactmypowmainfactmypow函數(shù)的嵌套調(diào)用嵌套調(diào)用int main(void) cal (sel); void cal (int sel) vol_ball() double vol_ball( ) maincalvol_ballmaincalvol_ball例9-1 分析int main(void) cal (sel);void cal (int sel) vol_ball(); vol_cylind(); vol_cone();d
7、ouble vol_ball( ) double vol_cylind( ) double vol_cone( ) main( )cal ( )vol_ball ( )vol_cylind ( )vol_cone ( )函數(shù)的嵌套調(diào)用在一個函數(shù)中再調(diào)用其它函數(shù)的情況稱為函數(shù)的嵌套調(diào)用。如果函數(shù)A調(diào)用函數(shù)B,函數(shù)B再調(diào)用函數(shù)C,一個調(diào)用一個地嵌套下去,構(gòu)成了函數(shù)的嵌套調(diào)用。具有嵌套調(diào)用函數(shù)的程序,需要分別定義多個不同的函數(shù)體,每個函數(shù)體完成不同的功能,它們合起來解決復(fù)雜的問題。10.1.3 文件包含程序文件模塊為了避免一個文件過長,可以把程序分別保存為幾個文件。一個大程序會由幾個文件組成,每一個
8、文件又可能包含若干個函數(shù)。保存有一部分程序的文件稱為程序文件模塊。程序文件函數(shù)大程序若干程序文件模塊各程序文件模塊分別編譯,再連接整個程序只允許有一個main()函數(shù)問題:如何把若干程序文件模塊連接成一個完整的可執(zhí)行程序?當(dāng)一個語言程序由多個文件模塊組成時,整個程序只允許有一個main()函數(shù)。為了能調(diào)用寫在其它文件模塊中的函數(shù),文件包含是一個有效的解決方法。文件包含格式 # include # include “需包含的文件名”作用把指定的文件模塊內(nèi)容插入到 #include 所在的位置,當(dāng)程序編譯連接時,系統(tǒng)會把所有 #include 指定的文件拼接生成可執(zhí)行代碼。注意編譯預(yù)處理命令,以#
9、開頭。在程序編譯時起作用,不是真正的C語句,行尾沒有分號。文件包含將例10-1的5個函數(shù)分別存儲在2個.C文件上,要求通過文件包含把它們聯(lián)結(jié)起來。例10-2ctype.h 字符處理math.h 與數(shù)學(xué)處理函數(shù)有關(guān)的說明與定義stdio.h 輸入輸出函數(shù)中使用的有關(guān)說明和定義string.h 字符串函數(shù)的有關(guān)說明和定義stddef.h 定義某些常用內(nèi)容stdlib.h 雜項(xiàng)說明time.h 支持系統(tǒng)時間函數(shù)常用標(biāo)準(zhǔn)頭文件10.1.4 全局變量與程序文件模塊 局部變量作用范圍:函數(shù)(復(fù)合語句)內(nèi)部生命周期:從函數(shù)調(diào)用開始函數(shù)調(diào)用結(jié)束全局變量作用范圍:從定義處到源文件結(jié)束生命周期:從程序執(zhí)行開始程序
10、運(yùn)行結(jié)束靜態(tài)局部變量作用范圍:局部變量生命周期:全局變量外部變量(extern)在某個程序文件模塊中定義了全局變量該全局變量可以在整個程序的所有文件模塊中起作用在其他模塊中如果要使用該全局變量,必須將它聲明為外部變量說明這是一個在其他模塊中定義的全局變量int x;void main() 文件名 file1.cextern x;/*使用file1.c中的全局變量 x */f1( ) 文件名 file2.c擴(kuò)大全局變量的作用域static int x;void main()使全局變量只限于本文件引用,而不能被其他文件引用 文件名 file1.cextern x;/*使用file1.c中的全局變量
11、 x */int f1( ) 文件名 file2.c無法引用靜態(tài)全局變量普通全局變量 整個程序靜態(tài)全局變量 文件模塊函數(shù)的局部變量 函數(shù)復(fù)合語句的局部變量 復(fù)合語句10.1.5 寄存器變量和外部變量寄存器變量register int 變量表;外部變量extern 變量名表;只起說明作用,不分配存儲單元,對應(yīng)的存儲單元在全局變量定義處分配。10.1.6 函數(shù)與程序文件模塊外部函數(shù)函數(shù)能夠被程序中的其他程序文件模塊調(diào)用在其他文件模塊中調(diào)用該函數(shù)前,聲明為外部函數(shù)extern 函數(shù)類型 函數(shù)名(參數(shù)表說明);extern int f1(); int main(void) f1( ); 文件名 fil
12、e1.cint f1( ) 文件名 file2.c調(diào)用另一模塊中的函數(shù)extern int f1(); int main(void) f1( ); static int f1( ) 內(nèi)部函數(shù)使函數(shù)只能在本程序文件模塊中被調(diào)用static 函數(shù)類型 函數(shù)名(參數(shù)表說明); 文件名 file1.c 文件名 file2.c無法調(diào)用10.2 遞歸函數(shù)10.2.1 程序解析10.2.2 遞歸函數(shù)基本概念10.2.3 遞歸程序設(shè)計(jì)10.2.1 程序解析例10-3 用遞歸函數(shù)求n!。#include double fact(int n);int main(void) int n; scanf (%d, &n
13、); printf (%f, fact (n) ); return 0;double fact(int n) /* 函數(shù)定義 */ double result; if (n=1 | n = 0) /* 遞歸出口 */ result = 1; else result = n * fact(n-1); return result;10.2.2 遞歸函數(shù)基本概念遞推法與遞歸法求階乘遞推法n!=1*2*3*.*nfor (result = 1, i = 1; i 1) n! = 1 (n = 0,1)遞歸函數(shù) fact(n)遞歸式遞歸出口例9-3分析求n! 遞歸定義n! = n * (n-1)! (n
14、 1) n! = 1 (n = 0,1)#include double fact(int n);int main(void) int n; scanf (%d, &n); printf (%f, fact (n) ); return 0;double fact(int n) double result; if (n=1 | n = 0) result = 1; else result = n * fact(n-1); return result;fact(n)=n*fact(n-1);main() fact(3) fact(2) fact(1) . . . . printf(fact(3) f
15、=3*fact(2) f=2*fact(1) f=1 return(f) return(f) return(f) 遞歸函數(shù) fact( n )的實(shí)現(xiàn)過程fact(3)= 3*fact(2) 2*fact(1) fact(1)12*1=23*2=6同時有4個函數(shù)在運(yùn)行,且都未完成例10-4 寫輸出結(jié)果# include long fib(int g) switch(g) case 0: return(0); case 1: case 2: return(2); printf(g=%d, g); return ( fib(g-1) + fib(g-2) );void main() long k;
16、k = fib(4); printf(k=%ldn, k);fib(g) = 0 g=0fib(g) = 2 g=1, 2fib(g) = fib(g-1)+fib(g-2) g=3g=4, g=3, k=6如何求Fibonacci數(shù)列?遞歸式遞歸出口10.2.3 遞歸程序設(shè)計(jì)用遞歸實(shí)現(xiàn)的問題,滿足兩個條件:問題可以逐步簡化成自身較簡單的形式(遞歸式)n! = n * (n-1)! n n-1i = n + i i=1 i=1遞歸最終能結(jié)束(遞歸出口)兩個條件缺一不可解決遞歸問題的兩個著眼點(diǎn)舉例:題目:有5個人坐在一起,問第五個人多少歲?他說比第4個人大2歲。問第4個人歲數(shù),他說比第3個人大2
17、歲。問第三個人,又說比第2人大兩歲。問第2個人,說比第一個人大兩歲。最后 問第一個人,他說是10歲。請問第五個人多大?程序分析:利用遞歸的方法,遞歸分為回推和遞推兩個階段。要想知道第五個人歲數(shù),需知道第四人的歲數(shù),依次類推,推到第一人(10歲),再往回推。 #includeint main(void) int age(int n);printf(%dn,age(5);int age(int n)int c;if(n=1) c=10;else c=age(n-1)+2;return(c);例10-5 漢諾(Hanoi)塔 將64 個盤從座A搬到座B(1) 一次只能搬一個盤子(2) 盤子只能插在A
18、、B、C三個桿中(3) 大盤不能壓在小盤上 A B C分析 A B C分析 A B C A B Cnn-1分析 A B C A B Cnn-1算法hanio(n個盤,AB) / C為過渡 if (n = 1) 直接把盤子AB else hanio(n-1個盤,AC) / B為過渡 把n號盤 AB hanio(n-1個盤,CB) / A為過渡 A B Cn-1函數(shù) /* 搬動n個盤,從a到b,c為中間過渡 */void hanio(int n, char a, char b, char c) if (n = 1) printf(%c-%cn, a, b); else hanio(n-1, a,
19、c, b); printf(%c-%cn, a, b); hanio(n-1, c, b, a); hanio(n個盤,AB) / C為過渡 if (n = 1) 直接把盤子AB else hanio(n-1個盤, AC) 把n號盤 AB hanio(n-1個盤, CB) 源程序 /* 搬動n個盤,從a到b,c為中間過渡 */void hanio(int n, char a, char b, char c) if (n = 1) printf(%c-%cn, a, b); else hanio(n-1, a, c, b); printf(%c-%cn, a, b); hanio(n-1, c,
20、 b, a); int main(void) int n; printf(input the number of disk: ); scanf(%d, &n); printf(the steps for %d disk are:n,n); hanio(n, a, b, c) ; return 0;練習(xí)10-1用遞歸方法編寫斐波那契函數(shù)。函數(shù)類型是整型。f(n)= f(n-2)+ f(n-1) n1,其中f(0)=0,f(1)=1#include long func(long n) if(n=0|n=1) return n; else return func(n-1)+func(n-2); in
21、t main(void) long n; printf(please input n:); scanf(%ld,&n); printf(the result is %ld,func(n); return 0;10.3 宏定義#define 宏名標(biāo)識符 宏定義字符串編譯時,把程序中所有與宏名相同的字符串,用宏定義字符串替代#define PI 3.14#define arr_size 4說明:宏名一般用大寫字母,以與變量名區(qū)別宏定義不是語句,后面不得跟分號宏定義可以嵌套使用#define PI 3.14#define S 2*PI*PI多用于符號常量宏定義可以寫在程序中任何位置,它的作用范圍從定
22、義書寫處到文件尾??梢酝ㄟ^“#undef”強(qiáng)制指定宏的結(jié)束范圍。10.3.1 宏基本定義#define A “This is the first macro”void f1() printf( “An” );#define B “This is the second macro”A 的有效范圍void f2( ) printf( B ) ; B 的有效范圍#undef Bint main(void) f1( ); f2( ); return 0;例10-6 宏的作用范圍10.3.2 帶參數(shù)的宏定義例: #define f(a) a*a*a int main(void) /* 水仙花數(shù) */ i
23、nt i,x,y,z; for (i=1; i1000; i+) x=i%10; y=i/10%10; z=i/100 ; if (x*x*x+y*y*y+z*z*z=i) printf(“%dn” ,i); return 0; #define f(a) (a)*(a)*(a)各位數(shù)字的立方和等于它本身的數(shù)。例如153的各位數(shù)字的立方和是13+53+33=153= x+y*x+y*x+y(f(x)+f(y)+f(z)=i)f(x+y) = (x+y)3 ?帶參數(shù)的宏定義實(shí)現(xiàn)簡單的函數(shù)功能例10-7 簡單的帶參數(shù)的宏定義。#include #define MAX(a, b) (a) (b) ? (a): (b)#define SQR(x) (x) * (x)int main (void) int x , y; scanf (“
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《100 以內(nèi)的加法和減法(二)-不進(jìn)位加》(說課稿)-2024-2025學(xué)年二年級上冊數(shù)學(xué)人教版
- 13《人物描寫一組》第二課時《巧用多種方法寫“活”身邊人物》說課稿-2023-2024學(xué)年五年級語文下冊統(tǒng)編版
- Revision Being a good guest Period 2(說課稿)-2024-2025學(xué)年人教PEP版(2024)英語三年級上冊
- 2024秋九年級語文上冊 第五單元 18《懷疑與學(xué)問》說課稿 新人教版
- Unit5 What will you do this weekend?Lesson25(說課稿)-2023-2024學(xué)年人教精通版英語四年級下冊
- 5 國家機(jī)構(gòu)有哪些 第三課時 《國家機(jī)關(guān)的產(chǎn)生》 說課稿-2024-2025學(xué)年道德與法治六年級上冊統(tǒng)編版
- 《 關(guān)注新詞新語讓語言鮮活生動》說課稿 2024-2025學(xué)年統(tǒng)編版高中語文必修上冊
- 1~5的認(rèn)識和加減法《第幾》(說課稿)-2024-2025學(xué)年一年級上冊數(shù)學(xué)人教版
- Module 9 Unit 1 It's winter.(說課稿)-2024-2025學(xué)年外研版(一起)英語二年級上冊
- 1《水到哪里去了》說課稿-2023-2024學(xué)年科學(xué)五年級下冊冀人版
- 西安經(jīng)濟(jì)技術(shù)開發(fā)區(qū)管委會招聘筆試真題2024
- 2025屆浙江省高三歷史選考總復(fù)習(xí)模擬測試(八)歷史試題(含答案)
- 六年級2025寒假特色作業(yè)
- 2025年江蘇轄區(qū)農(nóng)村商業(yè)銀行招聘筆試參考題庫含答案解析
- 人教版六年級數(shù)學(xué)下冊完整版教案及反思
- 少兒財(cái)商教育講座課件
- (八省聯(lián)考)云南省2025年普通高校招生適應(yīng)性測試 物理試卷(含答案解析)
- 2025藥劑科工作人員工作計(jì)劃
- 春節(jié)節(jié)后安全教育培訓(xùn)
- 2025年新高考數(shù)學(xué)一輪復(fù)習(xí)第5章重難點(diǎn)突破02向量中的隱圓問題(五大題型)(學(xué)生版+解析)
- 水土保持方案投標(biāo)文件技術(shù)部分
評論
0/150
提交評論