c語言函數(shù)章節(jié)經(jīng)典教案_第1頁
c語言函數(shù)章節(jié)經(jīng)典教案_第2頁
c語言函數(shù)章節(jié)經(jīng)典教案_第3頁
c語言函數(shù)章節(jié)經(jīng)典教案_第4頁
c語言函數(shù)章節(jié)經(jīng)典教案_第5頁
已閱讀5頁,還剩64頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、c語言程序設(shè)計,lec 4 函數(shù),西安電子科技大學(xué)計算機學(xué)院,2,引言,例:求一些圓盤的面積,圓盤半徑分別為:3.24、2.13、0.865、3.746、12.3364、8.421,設(shè)圓周率為 3.1416,可寫出下面程序: #include int main () printf(radius:%f, area:%fn, 3.24, 3.24 * 3.24 * 3.1416); printf(radius:%f, area:%fn, 2.13, 2.13 * 2.12 * 3.1415);,繁瑣的東西很容易弄錯,不易修改,標準函數(shù)有限,需求無限,西安電子科技大學(xué)計算機學(xué)院,3,引言,如果有求圓

2、面積的函數(shù)double c_area(double r) 如果有打印圓面積的函數(shù) pc_area(double r,int main () printf(radius:%f, area:%fn, 3.24, c_area(3.24) ); printf(radius:%f, area:%fn, 2.13, c_area(2.13) );,函數(shù)能使程序變短, 變得易寫/易理解/易修改,int main () pc_area(3.24); pc_area(2.13);,西安電子科技大學(xué)計算機學(xué)院,4,引言,半徑3.24高2.4的圓錐體積: 外半徑5.3,內(nèi)半徑3.07,高4.2的空心圓柱體積,2.

3、4 * c_area( 3.24 ) / 3.0,c_area(5.3) - c_area(3.07) )*4.2,西安電子科技大學(xué)計算機學(xué)院,5,目標,學(xué)會把常用的代碼定義為函數(shù) 學(xué)會在程序中使用函數(shù) 掌握c語言提供的常用庫函數(shù) 了解遞歸的基本原理,西安電子科技大學(xué)計算機學(xué)院,6,主要內(nèi)容,函數(shù)定義 函數(shù)調(diào)用 c語言常用函數(shù) 函數(shù)與遞歸 變量作用域,西安電子科技大學(xué)計算機學(xué)院,7,4.1 函數(shù)定義,將實現(xiàn)某個功能的代碼變成函數(shù),西安電子科技大學(xué)計算機學(xué)院,8,函數(shù)定義,把一段計算定義成函數(shù)并給以命名,定義后就可以在任何需要的地方通過名字調(diào)用,定義函數(shù) c_area 的程序片段: double

4、 c_area (double r) return r * r * 3.1416;,9,定義函數(shù)的要素,函數(shù)頭 函數(shù)名:使用函數(shù)需要的名稱,合法標識符 返回值類型函數(shù)計算結(jié)果的數(shù)據(jù)類型 參數(shù)表完成計算需要的數(shù)據(jù)(數(shù)量和類型) 函數(shù)體,實現(xiàn)函數(shù)功能的代碼, 由一對大括號包圍,西安電子科技大學(xué)計算機學(xué)院,10,函數(shù)返回值,函數(shù)返回值表示函數(shù)內(nèi)代碼計算的結(jié)果 一個函數(shù)最多只能有一個返回值,返回值通常是計算結(jié)果或者表示計算狀態(tài)的信息,由調(diào)用者使用 如果函數(shù)有返回值函數(shù)必須指定返回值類型,如果函數(shù)不需要返回值必須使用void作為函數(shù)返回值類型。 函數(shù)返回值通過return語句返回,return語句一旦執(zhí)

5、行,整個函數(shù)就結(jié)束,西安電子科技大學(xué)計算機學(xué)院,11,函數(shù)返回值,一個函數(shù)中可以有多條return語句,但只會執(zhí)行其中一條。 return語句形式:return 表達式; return語句中表達式求值的類型應(yīng)該和函數(shù)返回值類型一致,如果不一致會自動進行類型轉(zhuǎn)換 返回值類型為void時,不需要return語句或者寫成return,12,函數(shù)定義示例,void pc_area(double r) printf(r = %f, s = %fn, r, 3.14159265 * r * r);,double c_area (double r) return r * r * 3.1416;,int ma

6、x(int a, int b) if(ab) return a; return b;,int compare( int x, int y ) if( x = y ) return 0; else if( x y ) return 1; else return -1;,13,關(guān)于return語句,double c_area (double r) return r * r * 3.1416; int main() double v=2.4 * c_area( 3.24 ) / 3.0; printf(v=%fn,v);,int main() double s = c_area( 3.24 ); d

7、ouble v=2.4 * s / 3.0; printf(v=%fn,v);,需要注意返回值類型為void的函數(shù)不能放在表達式中參與運算,西安電子科技大學(xué)計算機學(xué)院,14,函數(shù)參數(shù)表,函數(shù)可以有0個或多個參數(shù),這些參數(shù)稱為形式參數(shù) 每個參數(shù)必須指明類型和參數(shù)名稱 函數(shù)參數(shù)是函數(shù)內(nèi)的局部變量,只在函數(shù)體內(nèi)有效 函數(shù)參數(shù)只有在函數(shù)被調(diào)用時才有效 函數(shù)參數(shù)的初始值由調(diào)用者傳入(通過實際參數(shù)以值拷貝的方式傳入,西安電子科技大學(xué)計算機學(xué)院,15,形參和實參,形參:在函數(shù)定義中括號內(nèi)的標識符,與函數(shù)調(diào)用時的實參一一對應(yīng) 實參:在調(diào)用函數(shù)的括號中使用的表達式,它的值被傳入函數(shù)并賦值給函數(shù)的對應(yīng)形參,西安電

8、子科技大學(xué)計算機學(xué)院,16,形參和實參,include /定義函數(shù) double c_area (double r ) return r * r * 3.1416; int main () double v,radius=3.24; /調(diào)用函數(shù) v=2.4 * c_area( radius ) / 3.0; return 0;,形參,實參,西安電子科技大學(xué)計算機學(xué)院,17,函數(shù)定義不能嵌套,include #include double c_area (double r) return pow(r, 2) * 3.1416; int main () double v; v=2.4 * c_ar

9、ea( 3.24 ) / 3.0; return 0;,include #include int main () double c_area (double r) return pow(r, 2) * 3.1416; double v; v=2.4 * c_area( 3.24 ) / 3.0; return 0;,西安電子科技大學(xué)計算機學(xué)院,18,4.2 函數(shù)調(diào)用,西安電子科技大學(xué)計算機學(xué)院,19,調(diào)用系統(tǒng)函數(shù),包含必要的頭文件,其本質(zhì)是將函數(shù)原型添加到程序中 在需要的地方使用函數(shù),傳入類型和數(shù)量正確的實際參數(shù),函數(shù)返回值可以作為表達式的一部分,include #include int ma

10、in() double sum=0; int n=1; while(n=100) sum=sum+ sin(1.0/n) ; n=n+1; printf(sum=%fn,sum); return 0;,函數(shù)原型就是函數(shù)頭部加上分號, 其作用是告訴編譯器函數(shù)應(yīng)該以什么形式調(diào)用,西安電子科技大學(xué)計算機學(xué)院,20,調(diào)用自定義函數(shù),方法1(函數(shù)定義放在調(diào)用函數(shù)之前): 在需要的地方使用函數(shù),傳入類型和數(shù)量正確的實際參數(shù),函數(shù)返回值可以作為表達式的一部分,include /c_area函數(shù)在調(diào)用前定義 double c_area (double r) return r * r * 3.1416; int

11、 main () double v; printf(radius:%f, area:%fn, 3.24, c_area(3.24) ); v=2.4 * c_area( 3.24 ) / 3.0; return 0;,西安電子科技大學(xué)計算機學(xué)院,21,調(diào)用自定義函數(shù),方法2(函數(shù)定義放在調(diào)用函數(shù)之后): 在函數(shù)調(diào)用之前給出函數(shù)原型 在需要的地方使用函數(shù),傳入類型和數(shù)量正確的實際參數(shù),函數(shù)返回值可以作為表達式的一部分,include /函數(shù)原型在調(diào)用之前 double c_area (double r); int main () double v; printf(radius:%f, area:

12、%fn, 3.24, c_area(3.24) ); v=2.4 * c_area( 3.24 ) / 3.0; return 0; /函數(shù)定義在調(diào)用之后 double c_area (double r) return r * r * 3.1416;,西安電子科技大學(xué)計算機學(xué)院,22,函數(shù)調(diào)用的若干問題,c語言是一個函數(shù)式語言,所有可執(zhí)行語句都必須放在某個函數(shù)體內(nèi) 調(diào)用函數(shù)的函數(shù)稱為主調(diào)函數(shù),被調(diào)用的函數(shù)稱為被調(diào)函數(shù) 當(dāng)函數(shù)調(diào)用發(fā)生時,主調(diào)函數(shù)暫停,程序控制轉(zhuǎn)入被調(diào)函數(shù),被調(diào)函數(shù)執(zhí)行結(jié)束后,主調(diào)函數(shù)繼續(xù),西安電子科技大學(xué)計算機學(xué)院,23,函數(shù)調(diào)用的若干問題,include #include d

13、ouble c_area (double r) return pow(r, 2) * 3.1416; int main () double v; v=2.4 * c_area( 3.24 ) / 3.0; return 0;,西安電子科技大學(xué)計算機學(xué)院,24,參數(shù)傳遞機制,形式參數(shù)在函數(shù)調(diào)用時才分配存儲空間,并接受實際參數(shù)的值 實際參數(shù)可以為復(fù)雜的表達式,在函數(shù)調(diào)用前獲得計算 形式參數(shù)與實際參數(shù)可同名,也可不同名,西安電子科技大學(xué)計算機學(xué)院,25,參數(shù)傳遞機制,參數(shù)較多時,實際參數(shù)值逐一賦值,它們必須保持數(shù)目、類型、順序的一致 參數(shù)的賦值過程單向不可逆,函數(shù)內(nèi)部對形式參數(shù)值的修改不會反映到實際

14、參數(shù)中 函數(shù)參數(shù)一般為函數(shù)輸入集的一部分,函數(shù)輸出集一般使用返回值表示,只有使用特殊的手段(指針/數(shù)組)才可以將函數(shù)參數(shù)作為函數(shù)輸出集的一部分,西安電子科技大學(xué)計算機學(xué)院,26,參數(shù)傳遞機制,void swap( int a, int b ) int t; t = a; a = b; b = t;,int main() int a=5, b=3; printf( before swap: a= %d; b= %dn, a, b ); swap(a, b); printf( after swap: a= %d; b=%dn, a, b ); return 0;,swap函數(shù)中的a和b與main函

15、數(shù)中的a和b是什么關(guān)系? 兩個printf輸出的結(jié)果是什么,swap函數(shù)數(shù)據(jù)區(qū),main函數(shù)數(shù)據(jù)區(qū),void swap( int a, int b ) int t; / 2 t = a; a = b; b = t; / 3,int main() int a=5, b=3; / 1 swap(a, b); / 4 return 0;,西安電子科技大學(xué)計算機學(xué)院,28,函數(shù)示例,1. 請寫一個程序,給出指定整數(shù)范圍1,10000內(nèi)的所有完數(shù)。判斷是不是完數(shù)用一個函數(shù)完成,int isperfectnumber(int n) int i; for(i=1,sum=0;i=n/2;i+) if(n%i

16、=0) sum+=i; return sum=n;,西安電子科技大學(xué)計算機學(xué)院,29,函數(shù)示例,2. 寫一個函數(shù)求兩個整數(shù)的最大公約數(shù),int gcd( int m, int n) int i; int min=m1;i-) if(m%i=0,西安電子科技大學(xué)計算機學(xué)院,30,函數(shù)示例,3. 寫一個函數(shù)判斷一個數(shù)是不是素數(shù),用函數(shù)返回值表示判斷結(jié)果(非0表示是素數(shù),0 表示不是素數(shù),int isprime(int n) int i, isprime=1; for(i=2; in; i+) if(n%i=0) isprime=0; break; return i=n;,西安電子科技大學(xué)計算機學(xué)院

17、,31,課堂練習(xí),寫一個函數(shù)判斷傳入的整數(shù)n(100n1000)是不是“水仙花數(shù)”,是返回1,否則返回0 如果一個3位整數(shù)各位數(shù)字的立方和等于這個數(shù)就是水仙花數(shù),西安電子科技大學(xué)計算機學(xué)院,32,4.3 變量作用域(教材5.4,西安電子科技大學(xué)計算機學(xué)院,33,swap函數(shù)的問題,參數(shù)傳遞是賦值傳遞,修改函數(shù)參數(shù)(形參)對原來的數(shù)據(jù)(實參)沒有影響,因此不能完成交換數(shù)據(jù)的任務(wù) 解決方法 方法1:修改需要交換的數(shù)據(jù)的作用域,將其變?yōu)槿肿兞?方法2:通過參數(shù)傳遞需要交換的數(shù)據(jù)的地址,西安電子科技大學(xué)計算機學(xué)院,34,變量作用域,作用域:變量的有效范圍,也就是變量的生存范圍 局部變量: 函數(shù)參數(shù),

18、其作用域為整個函數(shù) 函數(shù)內(nèi)的變量,其作用域為變量定義位置到函數(shù)結(jié)束位置 復(fù)合語句內(nèi)的變量,其作用域為變量定義位置到復(fù)合語句結(jié)束位置 全局變量 定義在所有函數(shù)之外的變量,其作用域為變量定義位置到程序結(jié)束位置,include int a=10,b=10; /全局變量 void func1() printf(func1:a=%d,b=%dn,a,b); void func2() int a=30,b=30; printf(func2:a=%d,b=%dn,a,b); int c=1,d=1; void func3(int a,int b) printf(fuc3:a=%d,b=%dn,a,b); i

19、nt main() int a=20,b=20; int a=40,b=40;,全局變量a,b的作用域,全局變量c,d的作用域,局部變量a,b的作用域,函數(shù)參數(shù)a,b的作用域,main函數(shù)局部變量a,b的作用域,復(fù)合結(jié)構(gòu)內(nèi)a,b的作用域,西安電子科技大學(xué)計算機學(xué)院,36,使用全局變量的swap函數(shù),void swap() int t; t = a; a = b; b = t;,int main() printf( before swap: a= %d; b= %dn, a, b ); swap(); printf( after swap: a= %d; b=%dn, a, b ); retur

20、n 0;,int a=5, b=3,西安電子科技大學(xué)計算機學(xué)院,37,4.4 c語言常用函數(shù),西安電子科技大學(xué)計算機學(xué)院,38,數(shù)學(xué)函數(shù),include double sin(double rad); double sqrt(int n); double pow(double,double); double fabs(double); double log( double x ); double log10( double x,西安電子科技大學(xué)計算機學(xué)院,39,輸入輸出函數(shù),include printf格式化輸出 scanf格式化輸入 getchar輸入一個字符 putchar輸出一個字符,西

21、安電子科技大學(xué)計算機學(xué)院,40,輸入輸出函數(shù),int scanf( const char *format ,argument. ); 可變參數(shù)-參數(shù)個數(shù)=1 返回值表示正確轉(zhuǎn)換并賦值的字段數(shù),經(jīng)常用來判斷輸入格式是否正確,西安電子科技大學(xué)計算機學(xué)院,41,scanf返回值示例(scanf.c,include int main() int n=0; int a=0,b=0; n=scanf(%d %d,輸入1: 3 4,輸入2: 3 4.5,輸入3: 3 a,輸出1: n=2 a=3 b=4,輸出2: n=2 a=3 b=4,輸出1: n=1 a=3 b=0,西安電子科技大學(xué)計算機學(xué)院,42,輸

22、入輸出函數(shù),int getchar()從標準輸入流(stdin)讀取一個字符 緩沖輸入,需要按下回車后才能獲取到值 正常情況下,返回值表示讀入的字符 如果返回值是eof(-1)表示讀錯誤或到了流結(jié)束位置 int putchar(int ch)將字符ch寫入標準輸出流(stdout) 示例:將輸入的一行小寫字符轉(zhuǎn)換成大寫字符。(chario.c,西安電子科技大學(xué)計算機學(xué)院,43,時間函數(shù),include time_t time(time_t *timer)獲得從1970/1/1至今的秒數(shù) time_t可以看作整數(shù)類型 clock_t clock();獲得從程序開始運行至今處理器經(jīng)過的時鐘數(shù) cl

23、ock_t可以看作整數(shù)類型 clocks_per_sec表示每秒有多少個時鐘的常數(shù),西安電子科技大學(xué)計算機學(xué)院,44,時間函數(shù)(time.c,include #include int main() int start,finish; double time; start=clock(); . finish=clock(); time=(finish-start)*1.0/clocks_per_sec; . return 0;,對這一段程序計時,西安電子科技大學(xué)計算機學(xué)院,45,隨機數(shù)函數(shù),include int rand()產(chǎn)生一個0,rand_max范圍內(nèi)的偽隨機數(shù) rand_max是一個系

24、統(tǒng)常數(shù),可以直接使用 void srand( unsigned int seed )設(shè)置偽隨機數(shù)序列的種子 如果不設(shè)定隨機數(shù)系列的種子,同一個程序兩次運行得到的隨機數(shù)完全相同 通常以時間作為隨機數(shù)種子,西安電子科技大學(xué)計算機學(xué)院,46,隨機數(shù)函數(shù),產(chǎn)生5個隨機數(shù)(rand1.c,include #include int main() int i; printf( rand_max is %d.n, rand_max ); printf( five numbers generated as follows:n ); for( i = 0; i 5; i+ ) printf( “%d , rand

25、() ); printf( n ); return 0;,西安電子科技大學(xué)計算機學(xué)院,47,隨機函數(shù),用時間做種子產(chǎn)生5個隨機數(shù)(rand2.c,include #include #include int main() int i; printf( five numbers generated as follows:n ); srand( (int)time(null) ); for( i = 0; i 5; i+ ) printf( %d; , rand() ); printf( n ); return 0;,西安電子科技大學(xué)計算機學(xué)院,48,隨機函數(shù),生成5個low,high范圍內(nèi)的隨機數(shù)

26、(rand3.c,include #include #include int main() int i, low=10, high=20; srand( (int)time(null) ); for( i = 0; i 5; i+ ) printf( %d; , low+(rand()%(high-low) ); printf( n ); return 0;,西安電子科技大學(xué)計算機學(xué)院,49,4.5 函數(shù)與遞歸(教材4.3,西安電子科技大學(xué)計算機學(xué)院,50,引言,函數(shù)調(diào)用可以嵌套,即在一個函數(shù)中調(diào)用另一個函數(shù) 如果一個函數(shù)調(diào)用自己就會構(gòu)成遞歸調(diào)用,double c_area (double r

27、) return pow(r, 2) * 3.1416;,西安電子科技大學(xué)計算機學(xué)院,51,遞歸函數(shù)示例,求n,fibonacci數(shù)列,int fac(int n) if(n=0) return 1; return n*fac(n-1) ;,int fib(int n) if(n=0|n=1) return 1; return fib(n-1)+fib(n-2) ;,int main() printf(3!=%d,fac(3);,int main() printf(f(5)=%d,fib(5);,西安電子科技大學(xué)計算機學(xué)院,52,遞歸函數(shù)的調(diào)用過程,西安電子科技大學(xué)計算機學(xué)院,53,使用遞歸的

28、條件,具有遞歸定義的形式 有明確的結(jié)束條件,結(jié)束條件,遞歸定義,西安電子科技大學(xué)計算機學(xué)院,54,漢諾塔(hanoi)問題,假設(shè)有三個分別命名為 x、y 和 z 的塔座,在塔座 x 上插有 n 個直徑大小不同、依小到大分別編號為 1, 2, ., n 的圓盤,如圖所示: 要求將塔座x上的 n 個圓盤移動到塔座 z 上并按相同順序疊放,圓盤移動時必須遵循下述規(guī)則: 每次只能移動一個圓盤; 圓盤可以插在x、y與z中的任意塔座上; 任何時刻都不能將較大的圓盤壓在較小的圓盤上。 如何實現(xiàn)移動圓盤的操作呢,西安電子科技大學(xué)計算機學(xué)院,55,漢諾塔(hanoi)問題,西安電子科技大學(xué)計算機學(xué)院,56,漢諾

29、塔(hanoi)問題,待解決的問題 q1:是否存在某種簡單情形,問題很容易解決 q2:是否可將原始問題分解成性質(zhì)相同但規(guī)模較小的子問題,且新問題的解答對原始問題有關(guān)鍵意義,西安電子科技大學(xué)計算機學(xué)院,57,漢諾塔(hanoi)問題,解決方案 a1:只有一個圓盤時是最簡單情形 a2:對于 n 1,考慮 n 1 個圓盤,如果能將 n - 1 個圓盤移動到某個塔座上,則可以移動第 n 個圓盤 策略:首先將 n 1 個圓盤移動到塔座 y 上,然后將第 n 個圓盤移動到 z 上,最后再將 n - 1 個圓盤從 y 上移動到 z 上,西安電子科技大學(xué)計算機學(xué)院,58,漢諾塔(hanoi)問題,void m

30、ovehanoi( unsigned int n, /圓盤數(shù)量 char from, /起始位置 char tmp, /中轉(zhuǎn)位置 char to )/目標位置 if( n = 1 ) /遞歸結(jié)束條件 將圓盤1從 from 移動到 to else 將 n 1 個圓盤從 from 以 to 為中轉(zhuǎn)移動到 tmp; /遞歸 將圓盤 n 從 from 移動到 to 將 n - 1個圓盤從 tmp 以 from 為中轉(zhuǎn)移動到 to; /遞歸,西安電子科技大學(xué)計算機學(xué)院,59,遞歸的缺點,函數(shù)調(diào)用需要額外的空間(棧)來完成,在調(diào)用次數(shù)很多的情況下會降低程序效率 遞歸調(diào)用中的重復(fù)計算,西安電子科技大學(xué)計算機學(xué)院,60,fibonacci數(shù)列的兩種求解方法(fib.c,使用遞歸求fibonacci數(shù)列 int fib_recursion(int n) if(n=0 | n=1) return 1; return fib_recursion(n-1) + fib_recursion(n-2);,使用循環(huán)求fibonacci數(shù)列 int fib_loop(int n) int fn,fn_1=1,fn_2=1,i; if(n=0|n=1)return 1; for(i=2;i=

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論