第4章函數(shù)與C程序結構_第1頁
第4章函數(shù)與C程序結構_第2頁
第4章函數(shù)與C程序結構_第3頁
第4章函數(shù)與C程序結構_第4頁
第4章函數(shù)與C程序結構_第5頁
已閱讀5頁,還剩140頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、C程序程序源文件源文件1源文件源文件i源文件源文件n函數(shù)函數(shù)1預處理語句預處理語句函數(shù)函數(shù)m說明說明/定義部分定義部分執(zhí)行語句部分執(zhí)行語句部分圖圖4.1 C程序的一般結構程序的一般結構返回值類型返回值類型 函數(shù)名函數(shù)名(形式參數(shù)列表形式參數(shù)列表) 函數(shù)體函數(shù)體return; 程序實現(xiàn)了計算從鍵盤程序實現(xiàn)了計算從鍵盤輸入一個整數(shù)輸入一個整數(shù)n n,并求,并求其階乘的功能。如果在其階乘的功能。如果在今后的應用中,需要將今后的應用中,需要將求某數(shù)階乘的功能作為求某數(shù)階乘的功能作為程序中相對獨立的一個程序中相對獨立的一個部分(功能)部分(功能), ,則需要則需要將上述功能用自編函數(shù)將上述功能用自編函數(shù)

2、的方式實現(xiàn)的方式實現(xiàn) long為函數(shù)返回值類型Return語句將語句將n!返回給!返回給調用函數(shù)調用函數(shù)花括號給函數(shù)確定了邊界區(qū)域 long factorial( )inti,n;long fact=1;printf(Input n:); scanf(%d,&n);for(i=1;iy?x:y; /*函數(shù)體的執(zhí)行部分函數(shù)體的執(zhí)行部分 */ return temp; /*返回函數(shù)值返回函數(shù)值 */ 函數(shù)返回類型函數(shù)返回類型函數(shù)名函數(shù)名 形式參數(shù)形式參數(shù)函數(shù)聲明告訴編譯系統(tǒng)函數(shù)聲明告訴編譯系統(tǒng)factorial是一個返回值是是一個返回值是long,只有一個,只有一個int參數(shù)的函參數(shù)的函數(shù)

3、,注意最后分號不可少!數(shù),注意最后分號不可少!程序演示形式參數(shù)形式參數(shù)(簡稱形參簡稱形參)實際參數(shù)實際參數(shù)(簡簡稱實參稱實參)程序演示 什么是函數(shù)的調用?先看下列程序什么是函數(shù)的調用?先看下列程序/*計算計算 S=2!-3!+4!*/ #include void main( ) float qsn(int x); /函數(shù)的聲明函數(shù)的聲明 float s; s=qsn(2)-qsn(3)+qsn(4); /*直接調用直接調用qsn函數(shù)進行計算函數(shù)進行計算*/ printf(“S=%fn”,s); float qsn ( int n) /*定義函數(shù)qsn為階乘*/ int k; float qsn

4、; qsn=1; for (k=1;k=n;k+) qsn*=k; return (qsn); 程序演示A19233.141596.02e+23101105地址地址內存空間內存空間10010110510911720502046char型,占型,占1字節(jié)字節(jié)b int 型,占型,占4字節(jié)字節(jié)c float 型,占型,占4字節(jié)字節(jié)d double 型,占型,占8字節(jié)字節(jié)pq2046存放的是整數(shù)存放的是整數(shù)1923的地址的地址p,2050存放的是浮點數(shù)存放的是浮點數(shù)3.14159的的地址地址q,這就需要我們用一種新的數(shù)據(jù)表示存儲的數(shù)據(jù)是地址而,這就需要我們用一種新的數(shù)據(jù)表示存儲的數(shù)據(jù)是地址而不是其他

5、的數(shù)值。不是其他的數(shù)值。int x;int *p; /*變量前加*,表示該變量是指針變量*/p=&x; 101指針指針p地址地址101變量變量x(a) 將將x的地址裝入的地址裝入p(b) 指針指針p指向變量指向變量x指針指針p地址地址101變量變量xp=&x稱稱*p為指針為指針p的目標變量,也就是變量的目標變量,也就是變量x,指針除了可以指向,指針除了可以指向變量外,還可以指向內存中其它任何一種數(shù)據(jù)結構,如數(shù)組、變量外,還可以指向內存中其它任何一種數(shù)據(jù)結構,如數(shù)組、結構體類型和函數(shù)等。結構體類型和函數(shù)等。類型標識符類型標識符 *指針名指針名 2500025000 100 xy

6、10025000 xya)b)圖圖4.3 指針變量指針變量y與變量與變量x的存儲關系圖的存儲關系圖 x=8;或或*y=8; &x或或 &(*y)怎樣用指針運算符來處理數(shù)據(jù)呢?怎樣用指針運算符來處理數(shù)據(jù)呢? 設變量設變量x、y同類型,把同類型,把x復制到復制到y(tǒng)中,可采取下列方法:中,可采取下列方法:直接賦值:直接賦值: y=x;使用指針:設指針變量使用指針:設指針變量p用于保存用于保存x的地址:的地址: p=&x; 再執(zhí)行語句再執(zhí)行語句 y=*p;例如下列程序段例如下列程序段 int x=20,y,*ptr;ptr=&x;y=*ptr;該程序段的意思為:定義整型

7、變量該程序段的意思為:定義整型變量x(初值為初值為20),y和指針和指針*ptr,將將變量變量x的地址賦給指針變量的地址賦給指針變量ptr,然后以指針變量然后以指針變量ptr的值為內存的值為內存單元地址,將該單元的數(shù)據(jù)取出賦給變量單元地址,將該單元的數(shù)據(jù)取出賦給變量y,相當于語句相當于語句y=x;程序演示以以16進制形式進制形式輸出無符號整數(shù)輸出無符號整數(shù)3510002000 xyabta) 參數(shù)傳遞過程參數(shù)傳遞過程中中3510002000 xyabtb) 參數(shù)傳遞完成后參數(shù)傳遞完成后35100020003xyabtc) t=t=* *x執(zhí)行執(zhí)行后后55100020003xyabtd) *x=

8、*y執(zhí)行后執(zhí)行后53100020003xyabte) *y=ty=t執(zhí)行后執(zhí)行后圖圖4.4 地址值傳遞函數(shù)調用時參數(shù)的變化情況地址值傳遞函數(shù)調用時參數(shù)的變化情況程序演示3510002000 xyabta) 參數(shù)傳遞過程中參數(shù)傳遞過程中3510002000 xyabtb) 參數(shù)傳遞完成后參數(shù)傳遞完成后35100020001000 xyabtc) t=t=x執(zhí)行執(zhí)行后后35200020001000 xyabtd) x=y執(zhí)行后執(zhí)行后35200010001000 xyabte) y=ty=t執(zhí)行后執(zhí)行后圖圖4.5地址值傳遞函數(shù)調用時參數(shù)的變化情況地址值傳遞函數(shù)調用時參數(shù)的變化情況程序演示程序演示pt

9、rarrayarray0*ptrarrayiarray1array2array3*(ptr+1)*(ptr+2)*(ptr+3)*(ptr+i)如圖:數(shù)組與指針的關系,當數(shù)組名傳如圖:數(shù)組與指針的關系,當數(shù)組名傳給函數(shù)時,傳送的是數(shù)組的起始位置給函數(shù)時,傳送的是數(shù)組的起始位置實參數(shù)組實參數(shù)組a形參數(shù)組形參數(shù)組b注:形參數(shù)組注:形參數(shù)組b本質上是指針變量本質上是指針變量圖圖4.6 數(shù)組存儲區(qū)域數(shù)組存儲區(qū)域全部共享時全部共享時形參數(shù)組與實參數(shù)組的關形參數(shù)組與實參數(shù)組的關系系實參數(shù)組實參數(shù)組&a2形參數(shù)組形參數(shù)組b 注:形參數(shù)組注:形參數(shù)組b本質上是指針變量本質上是指針變量圖圖4.7 數(shù)組存

10、儲區(qū)域數(shù)組存儲區(qū)域部分共享部分共享時形參數(shù)組與實參數(shù)組的關系時形參數(shù)組與實參數(shù)組的關系程序演示/* Name:ex04-09.cpp */#include #define N 10void main()int sum(int v,int n); int aN=1,2,3,4,5,6,7,8,9,10,total,pos; printf(請輸入求和起始元素序號請輸入求和起始元素序號: ); scanf(%d,&pos); total=sum(&apos,N-pos);printf(total=%ldn,total);int sum(int v,int n)int i,s=0;fo

11、r(i=0;in;i+)s+=vi;return s;程序演示 數(shù)組數(shù)組a的起始的起始地址地址數(shù)組的起始地數(shù)組的起始地址表示方法址表示方法a 表示平面的起始地址表示平面的起始地址(二級地址)(二級地址)&a00 表示線性的起始地址(一級地址)表示線性的起始地址(一級地址)a0 表示線性的起始地址(一級地址)表示線性的起始地址(一級地址)*a 表示線性的起始地址(一級地址)表示線性的起始地址(一級地址)圖圖4.8 二維數(shù)組起始地址的表示方法示意二維數(shù)組起始地址的表示方法示意 二維數(shù)組在存儲時也是有序地占用一片連續(xù)的內存區(qū)二維數(shù)組在存儲時也是有序地占用一片連續(xù)的內存區(qū)域,數(shù)組的名字表示這段

12、存儲區(qū)域的首地址。需要特別注域,數(shù)組的名字表示這段存儲區(qū)域的首地址。需要特別注意的是,二維數(shù)組起始地址有多種表示方法,而且這些表意的是,二維數(shù)組起始地址有多種表示方法,而且這些表示方法在物理含義上還有表示平面起始地址和表示線性起示方法在物理含義上還有表示平面起始地址和表示線性起始地址之分,所以在使用二維數(shù)組的起始地址使必須注意始地址之分,所以在使用二維數(shù)組的起始地址使必須注意區(qū)分需要用哪一種起始地址。區(qū)分需要用哪一種起始地址。 實參用實參用a形參用形參用b5圖圖4.9 實際參數(shù)為二維數(shù)組名字實際參數(shù)為二維數(shù)組名字程序演示int max(int vN)int max(int vN)/注意數(shù)注意數(shù)

13、組參數(shù)只能省略最高維的長度指定組參數(shù)只能省略最高維的長度指定 int i,j,maxv;int i,j,maxv;maxv=v00;maxv=v00;for(i=0;iM;i+)for(i=0;iM;i+)for(j=0;jN;j+)for(j=0;jmaxv)if(vijmaxv)maxv=vij;maxv=vij;return maxv;return maxv; 程序演示實參數(shù)組實參數(shù)組a形參數(shù)組形參數(shù)組b注:形參數(shù)組注:形參數(shù)組b本質上是指針變量本質上是指針變量圖圖4.6 數(shù)組存儲區(qū)域全部共享時形參數(shù)組與實參數(shù)組的關系數(shù)組存儲區(qū)域全部共享時形參數(shù)組與實參數(shù)組的關系int max(int

14、v,int m,int n)int max(int v,int m,int n) int i,j,maxv;int i,j,maxv;maxv=v0;maxv=v0;for(i=0;im;i+)for(i=0;im;i+)for(j=0;jn;j+)for(j=0;jmaxv)n+jmaxv)maxv=vimaxv=vi* *n+j;n+j;return maxv;return maxv; 程序演示主函數(shù)主函數(shù)函數(shù)函數(shù)fun1函數(shù)函數(shù)fun2程序運行結束程序運行結束調用函數(shù)調用函數(shù)fun1調用函數(shù)調用函數(shù)fun2fun1執(zhí)行結束執(zhí)行結束fun2執(zhí)行結束執(zhí)行結束圖圖4.10 4.10 兩層函數(shù)嵌

15、套調用示意圖兩層函數(shù)嵌套調用示意圖kkkns.21void main()void main() int n,k; int n,k; scanf(“%d,%d”,&n,&k);scanf(“%d,%d”,&n,&k); printf(Sum of printf(Sum of %d%d powers of powers of integers from 1 to integers from 1 to %d%d = , = ,k k, ,n n);); printf(%dn, printf(%dn,f2(n,k)f2(n,k);); 輸入:輸入:4 4,5 5結果:結

16、果:Sum of 5 powers of integers Sum of 5 powers of integers from 1 to 4= 1300from 1 to 4= 1300該程序中,該程序中,main()main()中調用了中調用了f2()f2()函數(shù),而函數(shù),而f2()f2()函數(shù)中又調用了函數(shù)中又調用了f1()f1()函數(shù),這就是函函數(shù),這就是函數(shù)的嵌套調用。數(shù)的嵌套調用。程序演示執(zhí)行如下圖topa) 空??諚opputchar(a)topc) putchar(a)putchar(b)topd) putchar(a)putchar(b)putchar(c)tope) putc

17、har(a)putchar(b)topputchar(a)b) f) topg) 空棧空棧圖圖4.11 遞歸調用時系統(tǒng)堆棧數(shù)據(jù)的變化示意圖遞歸調用時系統(tǒng)堆棧數(shù)據(jù)的變化示意圖程序演示執(zhí)行如下:執(zhí)行如下:程序演示fac(4) *5fac(3)*4*5fac(2)*3*4*5fac(1)*2*3*4*5調用調用返回fac(5)fac(5) fac(4)*5fac(4) fac(3)*4fac(3) fac(2)*3fac(2) fac(1)*2fac(1) 1遞歸壓棧方向遞歸壓棧方向fac(2) fac(1) *21*2 2fac(3) fac(2) *32*3 6fac(4) fac(3) *46

18、*4 24fac(5) fac(4) *524*5 120遞歸回溯方向遞歸回溯方向圖圖4.12 函數(shù)遞歸調用過程示意圖函數(shù)遞歸調用過程示意圖執(zhí)行如下:執(zhí)行如下:程序演示1) 2() 1(101)(nnfnfnnfn=0或者或者n=1fib(n)retuan 1return fib(n-1)+fib(n-2)TF圖圖4.13 菲波拉契數(shù)列的遞歸算法菲波拉契數(shù)列的遞歸算法程序演示0)%(),(0)%(),(nmrrnGcdnmrnnmGcdr=m%n=0gcd(n)retuan nreturn gcd(n,r)TF圖圖4.14 最大公約數(shù)的遞歸算法最大公約數(shù)的遞歸算法int Gcd(int m,i

19、nt n)int r;if(r=m%n)=0)return n;elsereturn Gcd(n,r);程序演示void hanoi(int n,char a,char b,char c)if(n=1)printf(nMove disc %d from pile %c to %c,n,a,b);elsehanoi(n-1,a,c,b);printf(nMove disc %d from pile %c to %c,n,a,b);hanoi(n-1,c,b,a);程序演示 程序在第程序在第5 5行定義行定義了整型變量,由于變了整型變量,由于變量量x x定義在所有函數(shù)的定義在所有函數(shù)的外面,所以變

20、量外面,所以變量x x是全是全局變量,其作用范圍局變量,其作用范圍(作用域)從第(作用域)從第5 5行開行開始至第始至第1919行結束。同行結束。同時由于在定義全局變時由于在定義全局變量量x x時沒有對其顯式初時沒有對其顯式初始化。該程序運行的始化。該程序運行的結果為:結果為:x=4x=4。 程序演示 全局變量全局變量X的作用范圍的作用范圍 c1c1、c2c2、a a、b b、雖然雖然 都是全局變量,都是全局變量,但作用的范圍不一但作用的范圍不一樣。樣。c1c1、c2c2在開始在開始定義,所以在定義,所以在f1()f1(),f2()f2(),主函數(shù)內都,主函數(shù)內都有效,而有效,而a a、僅僅在

21、、僅僅在f2()f2(),主函數(shù)內都,主函數(shù)內都有效。有效。 在主函數(shù)中又定在主函數(shù)中又定義了義了2 2個局部變量個局部變量a a、b b。這時全局變量不。這時全局變量不起作用。起作用。即當全局即當全局變量和局部變量同變量和局部變量同名時,在局部變量名時,在局部變量作用范圍內,全局作用范圍內,全局變量不起作用變量不起作用。全局全局變量變量ab的的作用作用范圍范圍全全局局變變量量c1c2的的作作用用范范圍圍輸出結果:輸出結果:max(8,5)=8max(8,5)=8 思考:思考:主函數(shù)中如果沒有主函數(shù)中如果沒有int int x=8,x=8,結果是多少?結果是多少?如果全局變量如果全局變量x=-

22、3,x=-3,結結果又是多少?果又是多少?如果要將全局變量作如果要將全局變量作用域擴展到其他源文用域擴展到其他源文件,在變量定義前加件,在變量定義前加extermexterm。例如。例如exterm int x=3,y=5; exterm int x=3,y=5; 函數(shù)函數(shù)increincre在第一次被調用在第一次被調用時,會創(chuàng)建局部變量時,會創(chuàng)建局部變量x x并賦初值并賦初值為為2020,然后對其進行加,然后對其進行加5 5的操作的操作并將結果并將結果2525返回到主函數(shù)中輸返回到主函數(shù)中輸出(注意:隨著出(注意:隨著函數(shù)執(zhí)行完成函數(shù)執(zhí)行完成后后控制流程的返回,函數(shù)中定控制流程的返回,函數(shù)中

23、定義的局部變量(自動變量)義的局部變量(自動變量)x x被被系統(tǒng)自動撤銷)。當函數(shù)系統(tǒng)自動撤銷)。當函數(shù)increincre第二次被調用時,會重新創(chuàng)建第二次被調用時,會重新創(chuàng)建局部變量局部變量x x并賦初值為并賦初值為2020,然后然后對其進行加對其進行加5 5的操作并將結果的操作并將結果2525返回到主函數(shù)中輸出,所以程返回到主函數(shù)中輸出,所以程序執(zhí)行的結果為:序執(zhí)行的結果為:x=25x=25x=25x=25 函數(shù)的每次調用都是使用不同局部變量組。函數(shù)的每次調用都是使用不同局部變量組。程序演示*圖圖4.15 字符圖形字符圖形/* Name: ex04-20.cpp */#include vo

24、id main()void myprint();int i;for(i=0;i5;i+)myprint();void myprint()int i;for(i=0;i15;i+) putchar(*);printf(n);程序演示局部局部變量變量i的作的作用范用范圍圍局部局部變量變量i的作的作用范用范圍圍.main() float a,b; float c; c=a*b; 局部變局部變量量C的的作用范作用范圍圍局部局部變量變量a、b的作的作用范用范圍圍int x;void main()x+;void f1() int x=1; int x=2; x+; x+;void f2() x+;全局變量全局變量x的作的作用域用域圖圖4.16 全局變量與局部變量作用域重疊示意圖全局變量與局部變量作用域重疊示意圖復合語句內部定義的復合語句內部定義的局部變量局部變量x的作用域的作用域函數(shù)內部定義的局函數(shù)內部定義的局部變量部變量x的作用域的作用域程序演示x原作用域原作用域X的的作作用用域域被被擴擴充充例4-22程序執(zhí)行的結果為:主函數(shù)中的輸出:110 函數(shù)f中的輸出:130程序演示程序演示double circum()return 2.0*3.1415926*2.0;double area()return

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論