




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、制作人:制作人: 黃黃 熒熒制作人單位:河師大數(shù)學與信息科學學院制作人單位:河師大數(shù)學與信息科學學院第八章 函數(shù)& C函數(shù)的定義與使用 (重點 ) ( C函數(shù)的定義、函數(shù)的調(diào)用、函數(shù)參數(shù)的傳遞、函數(shù)的返回值)& C函數(shù)的說明& 地址傳遞:數(shù)組作為參數(shù)(重點 )& 局部變量與全局變量& 遞歸函數(shù)& 局部變量的存儲形式& 內(nèi)部函數(shù)和外部函數(shù)8.1 函數(shù)概述一一 什么樣的實際問題通常用什么樣的實際問題通常用c函數(shù)來解決函數(shù)來解決?1 當實際問題有多項任務(wù)時當實際問題有多項任務(wù)時,通常用通常用來實現(xiàn)它的來實現(xiàn)它的.如如, 軟件程序有成千上萬行,由幾十人來編寫軟件程序有成千上萬行,由幾十人來編寫,如何分
2、配任如何分配任務(wù)最合適?務(wù)最合適? 2 當一段當一段功能代碼功能代碼可能在程序中反復出現(xiàn)時可能在程序中反復出現(xiàn)時,可以將這段可以將這段代碼編成代碼編成c函數(shù)函數(shù),反復調(diào)用反復調(diào)用.如如, 計算組合數(shù):計算組合數(shù):)!57100(!57!1008.1 函數(shù)概述 C C函數(shù)是一個函數(shù)是一個被命名的被命名的、獨立的代碼段獨立的代碼段。它往往用來執(zhí)行一個特。它往往用來執(zhí)行一個特定的任務(wù),如計算某一個值做為函數(shù)值返回定的任務(wù),如計算某一個值做為函數(shù)值返回, ,當然也可以只作一當然也可以只作一些動作些動作, ,如畫一個圖形等等如畫一個圖形等等, ,不返回值。不返回值。 1) 1) 從用戶使用的角度分從用戶
3、使用的角度分: : 標準函數(shù)標準函數(shù) ( (庫函數(shù)庫函數(shù)) ) 自定義自定義函數(shù)函數(shù)(!)(!) 2) 2)從函數(shù)的形式的角度分從函數(shù)的形式的角度分 無參函數(shù)無參函數(shù) 有參函數(shù)有參函數(shù)float max(float x,floatfloat x,float y y) float z; z=xy?x:y; void mycat() printf( / - / n); printf( ( = T =) n); printf( ( oy?x:y; void mycat() printf( / - / n); printf( ( = T =) n); printf( ( o ) nn);指出函數(shù)返回值
4、的類型指出函數(shù)返回值的類型為函數(shù)傳遞計算時為函數(shù)傳遞計算時的數(shù)據(jù)的數(shù)據(jù)返回返回(送回送回)函數(shù)的計算結(jié)果函數(shù)的計算結(jié)果這段代碼的名字這段代碼的名字對對C C函數(shù)調(diào)用的感性認識函數(shù)調(diào)用的感性認識例例 求兩個實數(shù)的最大值求兩個實數(shù)的最大值#include stdio.h#include /=/=/函數(shù)功能函數(shù)功能: :求兩個實數(shù)求兩個實數(shù)x,yx,y的最大值的最大值/入口參數(shù)入口參數(shù): : 兩個實數(shù)兩個實數(shù)x,yx,y/ / 用變量用變量 float x,floatfloat x,float y y來傳遞來傳遞/返回值返回值: x,y: x,y的最大值的最大值/=/=float max(float
5、 x,floatfloat x,float y y) /函數(shù)的定義 xy?x:y;/=/=主函數(shù)主函數(shù) void main()void main() float x,y,z1,z2; float x,y,z1,z2; printf printf(請輸入實數(shù)請輸入實數(shù)x y:nx y:n);); scanf(%f%f,&x,&y scanf(%f%f,&x,&y);); z1= z1=; ; /函數(shù)的調(diào)用 z2=z2=; ; printf(max1=%.1fn,z1); printf(max1=%.1fn,z1); printf(max2=%.1fn,z2); printf(max2=%.1fn
6、,z2); 例例 輸出兩個輸出兩個 小貓小貓 字符圖形字符圖形#include stdio.h#include /=/=/函數(shù)功能函數(shù)功能: : 輸出輸出 小貓小貓 字符圖形字符圖形/入口參數(shù)入口參數(shù): :無無/返回值返回值: : 無無/=/=void mycatvoid mycat() /() /無參函數(shù)無參函數(shù) printf printf( / - / ( / - / nn); ; printf printf( (= T =) n)( (= T =) n); ; printf( ( oo ) nn);); /=/=主函數(shù)主函數(shù)void main()void main() ; ; print
7、f(nprintf(n); ; ; ; 例例 輸出帶位置控制的字符圖形輸出帶位置控制的字符圖形#include stdio.h#include /=/=/函數(shù)功能函數(shù)功能: : 輸出輸出n n個個空格空格/入口參數(shù)入口參數(shù): : 空格個數(shù)空格個數(shù) / / 用變量用變量 intint n n 來傳遞來傳遞/返回值返回值: : 無無/=/=void nblank(intvoid nblank(int n) n) intint i; i; for(i=0;in;i+)for(i=0;ioo) nn);); /=/=主函數(shù)主函數(shù)void main()void main() ; ; ; ; ; ; 分析
8、分析: : 將輸出將輸出n n個空格個空格單獨編成函數(shù)單獨編成函數(shù). .例例 編寫一個函數(shù)編寫一個函數(shù), ,判斷整數(shù)判斷整數(shù)n n是否是一個完數(shù)是否是一個完數(shù), ,并在主函數(shù)利用此函數(shù)找出并在主函數(shù)利用此函數(shù)找出200200以內(nèi)的完數(shù)以內(nèi)的完數(shù). .算法分析算法分析: :函數(shù)功能函數(shù)功能: : 判斷整數(shù)判斷整數(shù)n n是否是一個完數(shù)是否是一個完數(shù). .整數(shù)整數(shù)n n判斷結(jié)果判斷結(jié)果 ( (真真, ,假假(1,0) (1,0) #include stdio.h#include /=/=/函數(shù)功能函數(shù)功能: :判斷整數(shù)判斷整數(shù)n n是否是一個完數(shù)是否是一個完數(shù)/入口參數(shù)入口參數(shù): :整數(shù)整數(shù)n ,n
9、 ,用變量用變量intint n n 來傳遞來傳遞/返回值返回值: :判斷結(jié)果判斷結(jié)果( (真真, ,假假(1,0)(1,0)/=/=int iswanshu(intint iswanshu(int n) n) int int flag=0,sum=0,i; flag=0,sum=0,i; if( sum=n)flagif( sum=n)flag=1; =1; /=/=主函數(shù)主函數(shù) void main()void main() int int n; n; for(n for(n=1;n200;n+)=1;n200;n+) if( if()printf(%4d,n);)printf(%4d,n)
10、; printf(n printf(n);); 作業(yè): P202Ex 8.1 8.3Ex 8.1 8.38.3 函數(shù)的參數(shù)和函數(shù)的值函數(shù)的參數(shù)和函數(shù)的值(細說函數(shù)細說函數(shù))例例8.28.2 #include stdio.h#include /=/=/函數(shù)功能函數(shù)功能: :求兩個整數(shù)的最大值來傳遞求兩個整數(shù)的最大值來傳遞/入口參數(shù)入口參數(shù): :兩個整數(shù)兩個整數(shù), ,用用int x,intint x,int y y來傳遞來傳遞/返回值返回值: :兩個整數(shù)的最大值兩個整數(shù)的最大值/=/=int max(int x,intint max(int x,int y) y) /函數(shù)的定義函數(shù)的定義 int
11、int z; z; z= xy? x: y;z= xy? x: y; return(zreturn(z);); /=/=主函數(shù)主函數(shù)void main()void main() intint a,b,c; a,b,c; printf(Enter printf(Enter a,b: ); a,b: ); scanf(%d,%d,&a,&b scanf(%d,%d,&a,&b); ); c= c=max(a,bmax(a,b) ); ; /函數(shù)的調(diào)用函數(shù)的調(diào)用 printf(printf(maxmax= %dn= %dn,c);,c); 形式參數(shù):函數(shù)定義中的參數(shù). (占位置的參數(shù))實際參數(shù):函數(shù)
12、調(diào)用中的參數(shù).(真正應用的參數(shù))必須是一一對應必須是一一對應!8.3 函數(shù)的參數(shù)和函數(shù)的值函數(shù)的參數(shù)和函數(shù)的值(細說函數(shù)細說函數(shù))2 2 函數(shù)參數(shù)的傳遞過程函數(shù)參數(shù)的傳遞過程: :#include /函數(shù)功能:求兩個整數(shù)的最大值/入口參數(shù): 兩個整數(shù)/返回值:兩個整數(shù)的最大值int max(int x,int y) /函數(shù)的定義 int z; z= xy? x: y; return(z);/=void main() int a,b,c; a=5; b=9; c=max(a,b); /函數(shù)的調(diào)用 printf(max= %dn,c);59ab:調(diào)用前:調(diào)用結(jié)束:59a:b:9z:Copy!Cop
13、y!return()9c59x:y:59a:b:調(diào)用時:1 1 形式形式參數(shù)參數(shù)和實在和實在參數(shù)參數(shù)8.3 函數(shù)的參數(shù)和函數(shù)的值函數(shù)的參數(shù)和函數(shù)的值(細說函數(shù)細說函數(shù))練習練習: :分析程序的執(zhí)行過程分析程序的執(zhí)行過程, ,寫出輸出結(jié)果寫出輸出結(jié)果#include /=自定義函數(shù)int pp(int a,int b) /函數(shù)的定義 int c; a+; b+; c= a+b; printf(pp:a= %d,b=%d,c=%dn,a,b,c); return c;/=主函數(shù)void main() int a,b,c; a=5; b=9; c=pp(a,b); /函數(shù)的調(diào)用 printf(主:a
14、= %d,b=%d,c=%dn,a,b,c);pp:a=6,b=10,c=16主:a=5,b=9,c=168.3 函數(shù)的參數(shù)和函數(shù)的值函數(shù)的參數(shù)和函數(shù)的值(細說函數(shù)細說函數(shù))如如, ,intint max(int max(int x,int x,int y) y) intint z; z;z=(xy)?x:yz=(xy)?x:y; ;return(zreturn(z);); 函數(shù)的返回值函數(shù)的返回值就是就是, 如如, ,int max(int x,intint max(int x,int y) y) if(x if(xy) return x;y) return x; return y; ret
15、urn y; 如如, ,int max(int x,intint max(int x,int y) y) return (xy)?x:y return (xy)?x:y; ; 關(guān)于返回函數(shù)值的幾點說明關(guān)于返回函數(shù)值的幾點說明: 如果函數(shù)有返回值,就必須使用如果函數(shù)有返回值,就必須使用 return return 語句語句 一個函數(shù)中可以有一個以上的一個函數(shù)中可以有一個以上的 return 語句,但不論執(zhí)行到哪個語句,但不論執(zhí)行到哪個 return 都將結(jié)束都將結(jié)束函數(shù)的調(diào)用返回主調(diào)函數(shù)函數(shù)的調(diào)用返回主調(diào)函數(shù),所以所以。 return return 語句中的括號可以省略;語句中的括號可以省略;r
16、eturn return 后面的值可以是一個表達式。后面的值可以是一個表達式。 當當 return 語句中的語句中的數(shù)值數(shù)值表達式的類型表達式的類型與函數(shù)類型不符時與函數(shù)類型不符時,系統(tǒng)會做自動類型轉(zhuǎn)換系統(tǒng)會做自動類型轉(zhuǎn)換函數(shù)的類型就是函數(shù)值的類型函數(shù)的類型就是函數(shù)值的類型.8.4 函數(shù)的調(diào)用一一 函數(shù)調(diào)用的一般形式函數(shù)調(diào)用的一般形式說明:說明: 調(diào)用無參函數(shù),省略實參,但括號不能省調(diào)用無參函數(shù),省略實參,但括號不能省 實參與形參實參與形參必須必須,個數(shù)相等,個數(shù)相等,對應類型相同,必要時使用強制類型轉(zhuǎn)換對應類型相同,必要時使用強制類型轉(zhuǎn)換二二 函數(shù)調(diào)用的兩種方式函數(shù)調(diào)用的兩種方式1 函數(shù)語句
17、函數(shù)語句如如, printf (%d, p); 和和 mycat();* 這種方式不考慮函數(shù)有沒有返回值,因此對這種方式不考慮函數(shù)有沒有返回值,因此對任何類型任何類型的函數(shù)都適用的函數(shù)都適用2 函數(shù)表達式函數(shù)表達式: 函數(shù)的返回值函數(shù)的返回值參與參與運算運算如如, m =;m = 3 * ;printf( Max is %d, );* 這種調(diào)用方式不能用于這種調(diào)用方式不能用于 void 型函數(shù)型函數(shù)!#include /函數(shù)功能:求最大值int max(int x,int y) return xy?x:y;/=void main() int a,b,c; a=5; b=9; c=; print
18、f(max= %dn,c);8.4 函數(shù)的調(diào)用三三 函數(shù)的聲明和原型函數(shù)的聲明和原型例例#include void main() float a,b,c; printf(Enter a,b: ); scanf(%f,%f,&a,&b); c=max(a,b); printf(max= %fn,c);/函數(shù)功能函數(shù)功能:求實數(shù)求實數(shù)x和和y的最大值的最大值max( float x, float y) /函數(shù)的定義 return xy? x: y; 函數(shù)聲明(三種形式)如: float max(float x, float y ); 或 float max (float, float ); 或 f
19、loat max ( );編寫函數(shù)注意事項小結(jié)編寫函數(shù)注意事項小結(jié)1 C函數(shù)函數(shù): 一個一個C函數(shù)往往是用于完成某一函數(shù)往往是用于完成某一2 函數(shù)參數(shù)函數(shù)參數(shù): 完成此完成此,需要設(shè)置函數(shù)參數(shù)進行傳遞,需要設(shè)置函數(shù)參數(shù)進行傳遞3 函數(shù)體的執(zhí)行部分函數(shù)體的執(zhí)行部分: 就是實現(xiàn)此就是實現(xiàn)此的的4 函數(shù)的返回值函數(shù)的返回值: 如果此如果此有有,可以,可以作為返作為返回值回值8.5 函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用嵌套調(diào)用嵌套調(diào)用C C規(guī)定:規(guī)定:函數(shù)定義不可嵌套函數(shù)定義不可嵌套,但但函數(shù)調(diào)用可以嵌套函數(shù)調(diào)用可以嵌套例例 輸出帶位置控制的字符小貓圖形輸出帶位置控制的字符小貓圖形#include stdio
20、.h#include /=/=/函數(shù)功能函數(shù)功能: : 輸出輸出n n個個空格空格/入口參數(shù)入口參數(shù): : 空格個數(shù)空格個數(shù), ,用變量用變量intint n n來傳遞來傳遞/返回值返回值: : 無無/=/= void nblank(int void nblank(int n) n) intint i; i; for(i=0;in;i+)for(i=0;ioo0真 假 y=f(x) x=xpoint(x1,x2)y1=f(x1)#include stdio.h#include #include math.h#include /=/=/函數(shù)功能:求多項式的值函數(shù)功能:求多項式的值/入口參數(shù)入口參
21、數(shù): : 自變量自變量: : 用變量用變量float xfloat x來傳遞來傳遞/返回值返回值: : 多項式的值多項式的值/=/=float f(float x)float f(float x) return (x-5.0) return (x-5.0)* *x+16.0)x+16.0)* *x-80.0;x-80.0;/=/=/函數(shù)功能:求弦與函數(shù)功能:求弦與x x軸的交點(弦截點:根的近似值)軸的交點(弦截點:根的近似值)/入口參數(shù)入口參數(shù):x:x區(qū)間的兩個端點區(qū)間的兩個端點, ,用變量用變量float x1,float x2float x1,float x2來傳遞來傳遞/返回值返回值:
22、x:x軸上的弦截點軸上的弦截點/=/=float xpoint(floatfloat xpoint(float x1,float x2) x1,float x2) float x; float x;x=(x1x=(x1* *f(x2)-x2f(x2)-x2* *f(x1)/(f(x2)-f(x1);f(x1)/(f(x2)-f(x1);return x;return x; 程序程序: 求求多項式的值多項式的值和和弦截點弦截點的子函數(shù)的子函數(shù))()()()(121221xfxfxfxxfxx08016523xxx/=/=/函數(shù)功能:用弦截法求方程的近似根函數(shù)功能:用弦截法求方程的近似根/入口參數(shù)
23、入口參數(shù): x: x區(qū)間的兩個端點區(qū)間的兩個端點: x1, x2: x1, x2/返回值返回值: : 方程的近似根方程的近似根/=/=float root(float x1,float x2)float root(float x1,float x2) float x,y,y1; float x,y,y1; y1=f(x1); y1=f(x1); do do x=xpoint(x1,x2); x=xpoint(x1,x2); /求弦截點求弦截點y=f(xy=f(x);); if(y if(y* *y10)x1=x;y1=y; y10)x1=x;y1=y; /取端點函數(shù)值異號的小區(qū)間取端點函數(shù)值異
24、號的小區(qū)間 else x2=x;else x2=x; while( while(););return x;return x; 程序程序: : 中心子函數(shù)中心子函數(shù): : 用用弦截法弦截法求求方程的近似根方程的近似根返回近似根 x x2=x|y|1e-6x1=x, y1=yy*y10真 假 y=f(x) x=xpoint(x1,x2) y1=f(x1)xyf(x )0 x1x2xf(x1)f(x2)/主函數(shù)主函數(shù)void main()void main() float x1,x2,x,f1,f2; /x1=2,x2=6 (0,10) float x1,x2,x,f1,f2; /x1=2,x2=6
25、 (0,10) 近似根近似根=5.00=5.00 do do printf(input printf(input x1,x2: n); x1,x2: n); scanf(%f%f,&x1,&x2); scanf(%f%f,&x1,&x2); f1=f(x1); f2=f(x2); f1=f(x1); f2=f(x2); while(f1 while(f1* *f20);f20); / /* *輸入的容錯處理輸入的容錯處理* */ / x=root(x1,x2); x=root(x1,x2); printf printf(方程的一個近似根是方程的一個近似根是: %.4fn,x);: %.4fn,
26、x); 程序程序: 主函數(shù)主函數(shù)遞歸調(diào)用v定義:l 函數(shù)的嵌套調(diào)用是指一個函數(shù)調(diào)用另一個函數(shù);l 函數(shù)的遞歸調(diào)用則是指函數(shù)自身調(diào)用自身v 分類:l直接遞歸:自身調(diào)用自身l間接遞歸:函數(shù)A調(diào)用B,B又調(diào)用A。8.6 函數(shù)的遞歸調(diào)用分析:分析: 要求出要求出 f(4)f(3)f(2)f(1)f(0)f(4)f(3)f(2)f(1)f(0)(此為回歸過程)(此為回歸過程) 31 15 7 3 1 31 15 7 3 1 (此為遞推過程)(此為遞推過程)如,給出一個函數(shù)的遞推公式:如,給出一個函數(shù)的遞推公式: f(nf(n)= 1 n=0()= 1 n=0(遞推初始值遞推初始值) ) 2f(n-1)+
27、1 n0( 2f(n-1)+1 n0(遞推公式遞推公式) )求求f(4). f(4). 又如又如: Fibonacci數(shù)列數(shù)列f fn n= = 1 n=1,21 n=1,2 f fn-1n-1+f+fn-2n-2 n n3 3例例 8.7 8.7 用用c c函數(shù)實現(xiàn)遞歸函數(shù)函數(shù)實現(xiàn)遞歸函數(shù) 5 5個人坐在一起,后一個人總比前個人坐在一起,后一個人總比前一個人大一個人大2 2歲,且第一個人是歲,且第一個人是1010歲,求歲,求第五個人的歲數(shù)。第五個人的歲數(shù)。依題意可得:依題意可得:age(nage(n)= 10 n=1()= 10 n=1(第一人第一人) ) age(n-1)+2 n1 age
28、(n-1)+2 n1 后一人與前一人的年齡關(guān)系后一人與前一人的年齡關(guān)系#include stdio.h#include /=/=/函數(shù)功能函數(shù)功能: : 計算遞歸函數(shù)的值計算遞歸函數(shù)的值/入口參數(shù)入口參數(shù): : 整數(shù)整數(shù)n n/返回值返回值: :遞歸函數(shù)在遞歸函數(shù)在n n處的值處的值/=/=intint age(intage(int n) n) int int c; c; if(n if(n=1) c=10;=1) c=10; else c= else c=; ; return c; return c; /主函數(shù)主函數(shù)void main()void main() int int n=5; n=
29、5; printf(age(%d)=%dn, printf(age(%d)=%dn, , ,);); age(5)age(5)輸出結(jié)果輸出結(jié)果c=age(4)+2c=age(4)+2c=18c=18c=age(3)+2c=age(3)+2c=16c=16c=age(2)+2c=age(2)+2c=14c=14c=age(1)+2c=age(1)+2c=12c=12c=10c=10void mainvoid mainageagen=5n=5ageagen=4n=4ageagen=3n=3ageagen=2n=2ageagen=1n=1注意要點注意要點: 遞歸函數(shù)實際上是一個分段函數(shù)遞歸函數(shù)實際上
30、是一個分段函數(shù).一一般用般用if語句來編寫就可以語句來編寫就可以. 不過還應注意到不過還應注意到,遞歸函數(shù)有遞歸函數(shù)有自身調(diào)自身調(diào)用自身用自身的特性的特性,按按,寫好寫好其中的其中的函數(shù)調(diào)用函數(shù)調(diào)用才行才行.例例8.8 8.8 求求n n的階乘的階乘) 1()!1() 1 , 0(1!nnnnn#include stdio.h#include /=/=/函數(shù)功能函數(shù)功能: :求求n n的階乘的階乘/入口參數(shù)入口參數(shù): : 整數(shù)整數(shù)n n/返回值返回值: n: n的階乘的階乘/=/=double fac(intdouble fac(int n) n) double f; double f; if
31、(n0) printf(n if(n0) printf(n0,data error!);0,data error!); else if(n=0|n=1) f=1; else if(n=0|n=1) f=1; else else f= nf= n* * ; ; return f ; return f ; /主函數(shù)主函數(shù)void main()void main() int int n; n; double y; double y; printf printf(請輸入一個整數(shù)請輸入一個整數(shù): );: ); scanf(%d,&n scanf(%d,&n);); y=fac(n y=fac(n););
32、 printf(%d! =%g,n,y printf(%d! =%g,n,y);); ABC這是一個古老的數(shù)學問題這是一個古老的數(shù)學問題: 古代有一個梵塔,塔內(nèi)有古代有一個梵塔,塔內(nèi)有3 3個針個針A A、B B、C C,開始時,開始時A A針上有針上有6464個盤子,個盤子,盤子大小不等,大的在下小的在上。盤子大小不等,大的在下小的在上。 有個老和尚想把這有個老和尚想把這6464個盤子從個盤子從A A針移到針移到C C針上:但要求針上:但要求 1)1)一次只能移動一個一次只能移動一個 2)2)大盤子不能放在小盤子之上。大盤子不能放在小盤子之上。例8.9 Hanoi問題小小C,中中B,小小B,
33、大大C,小小A,中中C,小小C.借助借助C,C,將小、中盤移到將小、中盤移到B B上上一次到位的直接移動一次到位的直接移動借助借助A,A,將小、中盤移到將小、中盤移到C C上上先考慮先考慮3 3個盤子:個盤子:ABC更一般的,對更一般的,對n n個盤子:個盤子:同樣分為三步:同樣分為三步: 設(shè)設(shè)hanoi(nhanoi(n, A, B, C ), A, B, C )表示將表示將n n個盤子從個盤子從A A借助借助B B移到移到C C上。上。1 1)將)將A A上的上邊的上的上邊的n-1n-1個盤子借助個盤子借助C C移到移到B B上。上。 hanoi(n-1, A, C, B )hanoi(n
34、-1, A, C, B )2 2)將)將A A上剩下的一個盤子,直接移到上剩下的一個盤子,直接移到C C上。上。 move(A, C)move(A, C)3) 3) 將將B B上的上的n-1n-1個盤子借助個盤子借助A A移到移到C C上。上。 hanoi(n-1, B, A, C )hanoi(n-1, B, A, C )完成此三步即完成了完成此三步即完成了n n個盤子的移動。個盤子的移動。#include stdio.h#include /函數(shù)功能函數(shù)功能: :顯示一次直接移動顯示一次直接移動/入口參數(shù)入口參數(shù): :代表兩個針的字符代表兩個針的字符void move(char getone
35、, char putonevoid move(char getone, char putone) ) printf(%c-%cn,getone,putone printf(%c-%cn,getone,putone););/函數(shù)功能函數(shù)功能: : 顯示顯示n n個盤子的移動過程個盤子的移動過程/入口參數(shù)入口參數(shù): :盤子個數(shù)和代表三個針的字符盤子個數(shù)和代表三個針的字符void hanoi(intvoid hanoi(int n,char one,char two,char three) n,char one,char two,char three) if(n=1)move(one,three);
36、 if(n=1)move(one,three); else else hanoi(n-1,one,three,two);hanoi(n-1,one,three,two); move(one,threemove(one,three);); hanoi(n-1,two,one,three);hanoi(n-1,two,one,three); /主函數(shù)主函數(shù)void main()void main() int int m; m; printf printf(請輸入盤子的個數(shù)請輸入盤子的個數(shù):(=5):(=5): );); scanf(%d,&m scanf(%d,&m);); printf prin
37、tf( %3d ( %3d 個盤子的移動過程為個盤子的移動過程為:n,m:n,m);); hanoi(m,A,B,C hanoi(m,A,B,C);); onetwothree對對n n個盤子:個盤子:1 1)hanoi(n-1, A, C, B )hanoi(n-1, A, C, B )2 2) move(A, C)move(A, C)3) hanoi(n-1, B, A, C )3) hanoi(n-1, B, A, C )作業(yè): P202Ex 8.13Ex 8.131 1 數(shù)組數(shù)組作為函數(shù)實參作為函數(shù)實參 與簡單變量一樣與簡單變量一樣, ,數(shù)組元素作實參也是數(shù)組元素作實參也是. . 如:
38、如:printf(%5d,ai);printf(%5d,ai);2 2 作為函數(shù)的實參作為函數(shù)的實參 數(shù)組作為函數(shù)參數(shù)的傳遞過程數(shù)組作為函數(shù)參數(shù)的傳遞過程- 8.7 數(shù)組作為函數(shù)的參數(shù) 與與 的比較的比較: :例例1 1#include stdio.h#include /=/=自定義函數(shù)自定義函數(shù)void pp(int x,intvoid pp(int x,int y) y) /函數(shù)的定義函數(shù)的定義 x+; y+; x+; y+; printf(pp: printf(pp:%d, %dn%d, %dn,x,y,x,y);); /=/=主函數(shù)主函數(shù)void main()void main() i
39、ntint a,b a,b; ; a=5; b=9; a=5; b=9; pp(a,b pp(a,b) ); ; / /函數(shù)的調(diào)用函數(shù)的調(diào)用 printfprintf(主:主:%d, %dn%d, %dn,a,b,a,b);); 例例2 2#include stdio.h#include /=/=自定義函數(shù)自定義函數(shù)void pp(void pp() ) x0+; x1+; x0+; x1+; printf(pp: printf(pp:%d,%dn%d,%dn,x0,x1);,x0,x1); /=/=主函數(shù)主函數(shù)void main()void main() intint a2; a2; a0=
40、5; a1=9; a0=5; a1=9; pp( pp( ) ); ; printf printf(主主: :%d,%dn%d,%dn,a0,a1);,a0,a1); a0a1 注意注意: 當要當要時時, 需要需要,傳遞傳遞!例8.11 利用函數(shù)求10個學生的平均成績。#include stdio.h#include #define N0 10#define N0 10/=/=/函數(shù)功能函數(shù)功能: :求求n n個分數(shù)的平均值個分數(shù)的平均值/入口參數(shù)入口參數(shù): : / 2)/ 2)分數(shù)的個數(shù)(數(shù)組長度)分數(shù)的個數(shù)(數(shù)組長度) /返回值返回值:n:n個分數(shù)的平均值個分數(shù)的平均值/=/=float
41、average(float average(,int,int n) n) float aver,sum=0; int float aver,sum=0; int i; i; aver=sum/n; aver=sum/n; return(aver); return(aver); /主函數(shù)主函數(shù)void main()void main() float float aver, aver, scoreN0 scoreN0 ; ; intint i; i; printfprintf(請鍵入請鍵入%d%d個分數(shù)個分數(shù):n,N0);:n,N0); aver=average(aver=average(,N0)
42、;,N0); printf printf(平均分數(shù)平均分數(shù)=%5.2fn,aver);=%5.2fn,aver); 例例8.13 8.13 定義函數(shù)實現(xiàn)選擇法排序定義函數(shù)實現(xiàn)選擇法排序 算法分析:算法分析: a a0 0 a a1 1 a a2 2 a a3 3 a a4 4 a a5 5a a1 1 a a2 2 a a3 3 a a4 4 a a5 5a a2 2 a a3 3 a a4 4 a a5 5a a3 3 a a4 4 a a5 5a a4 4 a a5 5注意,這種方法是在注意,這種方法是在 一趟一趟 比較中找到比較中找到, ,交換一次交換一次, ,將最小數(shù)交換到前面將最小數(shù)
43、交換到前面!k=0,akk=0,akk=1,akk=1,akk=2,akk=2,akk=3,akk=3,akk=4,akk=4,ak#include stdio.h#include #define N0 10#define N0 10/=/=/ / 函數(shù)功能:排序整型數(shù)組函數(shù)功能:排序整型數(shù)組/ / 與數(shù)據(jù)的個數(shù)與數(shù)據(jù)的個數(shù)/ / 返回值返回值: : 無無/=/=void sort(void sort(,int,int n) n) int t,i,j,k int t,i,j,k; ; for(i for(i=0;in-1;i+) =0;in-1;i+) if(k if(k!=i)!=i) t=
44、ak;ak=ai;ai t=ak;ak=ai;ai=t;=t; 例例8.13 8.13 用選擇法排序用選擇法排序/=/=/ / 函數(shù)功能:輸出整型數(shù)組函數(shù)功能:輸出整型數(shù)組/ 與數(shù)據(jù)的個數(shù)與數(shù)據(jù)的個數(shù)/ / 返回值返回值: : 無無/=/=void outputa(void outputa(,int,int n) n) intint i; i; for(i=0;in;ifor(i=0;in;i+)+) if(i%10=0)printf(n); if(i%10=0)printf(n); printf(%4d, ai printf(%4d, ai); ); printf(n printf(n);
45、); /=/=主函數(shù)主函數(shù)void main()void main() int int ; ; printf printf(排序前排序前:n);:n); outputa( outputa( ,N0);,N0); sort( sort( ,N0);,N0); printf printf(排序后排序后:n); :n); outputa( outputa( ,N0);,N0); 3 名作為函數(shù)的參數(shù):名作為函數(shù)的參數(shù):例例8.14 8.14 求求3 34 4矩陣的最大值。矩陣的最大值。#include stdio.h#include /=/=/ / 函數(shù)功能:求二維數(shù)組的最大值函數(shù)功能:求二維數(shù)組的
46、最大值/入口參數(shù):入口參數(shù): /返回值:返回值: 二維數(shù)組的最大值二維數(shù)組的最大值/=/=int max_value(intint max_value(int) ) int i,j,max int i,j,max; ; max=array00; max=array00; for(i for(i=0;i3;i+) =0;i3;i+) for(j for(j=0;j4;j+) =0;jmax)max) max=arrayij max=arrayij; return max; return max; /=/=主函數(shù)主函數(shù)void main()void main() intint a34=1,3,5,
47、7, a34=1,3,5,7,2,4,6,8,15,17,34,12;2,4,6,8,15,17,34,12; printf printf(矩陣的最大值是矩陣的最大值是:%dn:%dn, );); 實參實參形參形參傳遞方式傳遞方式 常量、變量、常量、變量、表達式、數(shù)組元素表達式、數(shù)組元素變量變量值傳遞值傳遞( () )(不可能改變實參)(不可能改變實參)數(shù)組名數(shù)組名數(shù)組數(shù)組地址傳遞地址傳遞( () )(可以改變實參數(shù)組)(可以改變實參數(shù)組)值傳遞值傳遞, , z1=; z2=;地址傳遞地址傳遞, , sort( ,N0); m=max_value( )3 3 字符數(shù)組作為形式參數(shù)字符數(shù)組作為形
48、式參數(shù)#include stdio.h#include /=/=/函數(shù)功能函數(shù)功能: : 連接兩個字符串連接兩個字符串/入口參數(shù)入口參數(shù): : /, ,傳遞傳遞/ / /返回值返回值: :無無/=/=int mystrcat(int mystrcat() ) int i,j int i,j; ; for(i=0; ai;i for(i=0; ai;i+)+) for(j=0; ai+j=bj;j for(j=0; ai+j=bj;j+)+) /=/=主函數(shù)主函數(shù)void main()void main() char s150,s250; char s150,s250; printf print
49、f(請輸入兩個字符串請輸入兩個字符串:n);:n); gets(s1); gets(s2); gets(s1); gets(s2); printf printf(串串s1: %sn,s1);s1: %sn,s1); printf printf(串串s2: %sn,s2);s2: %sn,s2); Ex8.6 Ex8.6 編寫一個函數(shù)編寫一個函數(shù), ,將兩個字符串連接將兩個字符串連接, ,在主函數(shù)中輸入兩個字符在主函數(shù)中輸入兩個字符串輸出連接結(jié)果。串輸出連接結(jié)果。作業(yè): P202Ex 8.4 8.11 Ex 8.4 8.11 8.8 局部變量與全局變量一、一、局部局部變量變量(內(nèi)部變量內(nèi)部變量)
50、float f1 ( int n ) int i , j ;char f2 ( float x, float y ) float z ;void main ( ) int a , b , c ;(三種三種):1、在一個函數(shù)內(nèi)部定義的變量、在一個函數(shù)內(nèi)部定義的變量2、函數(shù)的形式參數(shù)、函數(shù)的形式參數(shù)3、在某個復合語句中定義的變量、在某個復合語句中定義的變量 i,j 有效有效 z 有效有效 a,b,c 有效有效 n 有效有效 x,y 有效有效void main ( )int a , b , c ;int d ;d = a + b ; d 有效有效說明:說明: 1 1、局部變量只在、局部變量只在 本函
51、數(shù)內(nèi)本函數(shù)內(nèi) 有效有效2 2、如果局部變量的有效范圍有重、如果局部變量的有效范圍有重疊,則有效范圍小的優(yōu)先疊,則有效范圍小的優(yōu)先3 3 局部變量的一個重要用途是局部變量的一個重要用途是, ,利于分模塊集體編程利于分模塊集體編程 如,如,void main()void main() intint a,b,ca,b,c; ;a=1;b=2;c=0;a=1;b=2;c=0; intint c; c;c=a+bc=a+b; ;printf(1printf(1:%dn,c%dn,c);); printf(2 printf(2:%dn,c%dn,c); ); 局部優(yōu)先局部優(yōu)先 c有效有效8.8 局部變量與
52、全局變量一、一、局部局部變量變量(內(nèi)部變量內(nèi)部變量)1、在一個函數(shù)內(nèi)部定義的變量、在一個函數(shù)內(nèi)部定義的變量2、函數(shù)的形式參數(shù)、函數(shù)的形式參數(shù)3、在某個復合語句中定義的變量、在某個復合語句中定義的變量float float f(intf(int a) a) int int b ; b ;. . intint f2(int a) f2(int a) int int b ; b ;. void main()void main() int m,nint m,n; ;. . . . . . . 在在函數(shù)之外定義的變量函數(shù)之外定義的變量全局變量的有效范圍是:全局變量的有效范圍是: 從定義變量的位置開始到源
53、文從定義變量的位置開始到源文件結(jié)束。件結(jié)束。全局變量的用途:全局變量的用途: 利用全局變量可以在函數(shù)間傳利用全局變量可以在函數(shù)間傳遞數(shù)據(jù),遞數(shù)據(jù),。 p, q有效有效8.8 局部變量與全局變量 在函數(shù)內(nèi)部定義的變量在函數(shù)內(nèi)部定義的變量,用以用以例8.12 有10個學生的學習成績,在一個函數(shù)中求平均分、最高分和最低分。#include #include /=/=函數(shù)功能函數(shù)功能: :求平均分、最高最低分求平均分、最高最低分/入口參數(shù):放分數(shù)的數(shù)組和長度入口參數(shù):放分數(shù)的數(shù)組和長度/=/=返回值:平均分返回值:平均分float average(float score,intfloat averag
54、e(float score,int n) n) int int i ; float sum=score0; i ; float sum=score0; max=min=score0; max=min=score0; for(i=1;in;i for(i=1;i) ) =scorei=scorei; else if(scorei else if(scoreimin)min) =scorei=scorei; ; return sum/n ;return sum/n ; /=/=主函數(shù)主函數(shù)void main()void main() float ave,score10= float ave,sco
55、re10=90,80,60,50,98,78,68,99,76,88;90,80,60,50,98,78,68,99,76,88; printf(Max=%fnMin= %fn printf(Max=%fnMin= %fn Average=%6.2fn,max,min,ave); Average=%6.2fn,max,min,ave); 例例8.16 8.16 全局變量與局部變量同名時,全局變量被全局變量與局部變量同名時,全局變量被 屏蔽屏蔽 : #include stdio.h#include int max(int a,intint max(int a,int b) b) int int
56、c; c; c=ab?a:b; c=ab?a:b; return c; return c;void main()void main() printf(%dn printf(%dn , max(a,b); , max(a,b); 僅局部變量僅局部變量a a和全局變量和全局變量b b在在mainmain中有效。中有效。運行結(jié)果:8例8.12 有10個學生的學習成績,在一個函數(shù)中求平均分、最高分和最低分。(方法2)#include #include /=/=函數(shù)功能函數(shù)功能: :求平均分、最高最低分求平均分、最高最低分/入口參數(shù):放分數(shù)的數(shù)組和長度入口參數(shù):放分數(shù)的數(shù)組和長度/=/=返回值:平均分返
57、回值:平均分float average(float score,intfloat average(float score,int n, n, ) ) int i ; float m,s,sum int i ; float m,s,sum=score0;=score0; m=s=score0; m=s=score0; for(i=1;in;i for(i=1;im)m) m=scorei m=scorei; else if(scorei else if(scoreis)s) s=scorei s=scorei; ; return sum/n ;return sum/n ; /主函數(shù)主函數(shù)void
58、 main()void main() float avefloat ave, ,score10=score10=90,80,60,50,98,78,68,99,76,88;90,80,60,50,98,78,68,99,76,88; printf(Max=%fnMin= %fn printf(Max=%fnMin= %fn Average=%6.2fn,max,min,ave); Average=%6.2fn,max,min,ave); 作業(yè): P202Ex 8.9 (Ex 8.9 (要求用兩種方法做要求用兩種方法做.).)8.9 8.9 變量的變量的( (變量的第二個屬性變量的第二個屬性,
59、,變量的又一分類方式變量的又一分類方式) )分配固定存儲單元分配固定存儲單元,如全如全局變量、靜態(tài)局部變量(局變量、靜態(tài)局部變量(static變量)等等變量)等等使用時分配存儲單元,不用使用時分配存儲單元,不用時釋放。時釋放。如,形式參數(shù)、一般的局部變量等等如,形式參數(shù)、一般的局部變量等等程序區(qū)程序區(qū)靜態(tài)存儲區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)動態(tài)存儲區(qū)用戶能用的存儲區(qū)域用戶能用的存儲區(qū)域一一 變量的變量的靜態(tài)存儲靜態(tài)存儲和和動態(tài)存儲動態(tài)存儲分配固定存儲單元分配固定存儲單元使用時分配存儲單元,不用時釋放使用時分配存儲單元,不用時釋放1) 1) 自動變量自動變量:動態(tài)存儲區(qū):動態(tài)存儲區(qū) 如如, auto in
60、t, auto int i; i; intint i; i; 2) 2) : : 靜態(tài)存儲區(qū)靜態(tài)存儲區(qū) 如如, , int int a; a; 例例8.17 8.17 考察靜態(tài)考察靜態(tài)局部變量局部變量的值。的值。#include #include void main()void main() intint f(intf(int) ); ; int int a=2,i;a=2,i; for( for(i i=1;=1;i=i=3;3;i+)i+) printf(%d printf(%d, , ,f(f(a a);); intint f( f( intint a )a ) auto int aut
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度綠色建筑設(shè)計與施工合同-@-6
- 2024-2025學年福建省福州市馬尾第一中學等六校高一上學期期中聯(lián)考化學試卷
- 2024-2027年中國電子實驗記錄(ELN)系統(tǒng)行業(yè)發(fā)展監(jiān)測及投資戰(zhàn)略研究報告
- Unit 2 Going to school (Period 1)(教學設(shè)計) -2024-2025學年滬教牛津版(深圳用)英語五年級上冊
- 2025年度幼兒園幼兒用品定制承包合同范本
- 2025-2030年中國高酯酒項目投資可行性研究分析報告
- 2025年度數(shù)字經(jīng)濟眾籌合伙人合作協(xié)議
- 2025年度藥品零售連鎖經(jīng)營合作協(xié)議模板
- 2025年度二手車輛租賃合同范本及保險條款
- 2025年度自駕游團隊協(xié)作及后勤保障合同
- TTT培訓教材(-55張)課件
- 煤炭物流園區(qū)總體規(guī)劃(2016-2030)參考范本
- 道德與法治《上學路上》教案教學設(shè)計(公開課)
- XXX酒店預收款收據(jù) Deposit Receipt辦公模板
- 六郁湯-古今醫(yī)鑒卷四-方劑加減變化匯總
- 汽車公司APQP質(zhì)量門檢查表
- 哈工大微電子工藝緒論01單晶硅
- 數(shù)據(jù)結(jié)構(gòu)教學課件:chapter8
- 玉米雜交種制種技術(shù)匯總
- T∕ACSC 01-2022 輔助生殖醫(yī)學中心建設(shè)標準(高清最新版)
- 線性空間的定義與性質(zhì)
評論
0/150
提交評論