




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
理解并掌握函數(shù)的概念、定義和調(diào)用的方法和實(shí)質(zhì)掌握有參函數(shù)的數(shù)據(jù)傳遞方法,區(qū)分“值傳遞”與“地址傳遞”理解標(biāo)識(shí)符作用域和生成期的概念理解并掌握存儲(chǔ)類(lèi)型的概念理解并學(xué)會(huì)設(shè)計(jì)簡(jiǎn)單的遞歸函數(shù)引言函數(shù)可以實(shí)現(xiàn)程序的模塊化,使得程序設(shè)計(jì)簡(jiǎn)單、直觀,提高程序的可讀性和可維護(hù)性,程序員還可以將一些常用的算法編寫(xiě)成通用函數(shù),以供隨時(shí)調(diào)用。無(wú)論程序的設(shè)計(jì)規(guī)模有多大、多復(fù)雜,都是劃分為若干個(gè)相對(duì)獨(dú)立、功能較單一的函數(shù),通過(guò)對(duì)這些函數(shù)的調(diào)用,從而實(shí)現(xiàn)程序的功能。C語(yǔ)言的函數(shù)分為庫(kù)函數(shù)和用戶(hù)自定義函數(shù)7.1函數(shù)的定義和調(diào)用7.1.1函數(shù)定義函數(shù)的定義如下:類(lèi)型函數(shù)名(參數(shù)列表){//函數(shù)體
…}
7.1.1函數(shù)定義類(lèi)型指函數(shù)返回值的數(shù)據(jù)類(lèi)型,函數(shù)名采用標(biāo)識(shí)符,一對(duì)括號(hào)“()”內(nèi)是參數(shù)列表,一對(duì)大括號(hào)“{}”內(nèi)是函數(shù)體,由一組語(yǔ)句組成,完成函數(shù)具體功能的實(shí)現(xiàn)。函數(shù)值的返回通常是運(yùn)行結(jié)果或狀態(tài)值。返回采用return
語(yǔ)句,例如:return0;returnx>y?x:y;return
后面跟表達(dá)式。返回值的類(lèi)型也可以是void類(lèi)型,這種情況下可以寫(xiě)成:return;也可以省略返回語(yǔ)句。參數(shù):void
表示函數(shù)沒(méi)有參數(shù),通常把這種函數(shù)稱(chēng)為無(wú)參函數(shù)。例如:intsum(void){inti,s=0;for(i=1,s=0;i<=100;i++)s=s+i;returns}函數(shù)計(jì)算并返回1到100之間的整數(shù)之和。參數(shù):參數(shù)類(lèi)型1參數(shù)名1,參數(shù)類(lèi)型2參數(shù)名2,…函數(shù)包含一個(gè)或多個(gè)參數(shù),每個(gè)參數(shù)都必須標(biāo)注具體的數(shù)據(jù)類(lèi)型。這樣的函數(shù)又稱(chēng)為有參函數(shù)。例如:intsum(int
n){inti,s=0;for(i=1,s=0;i<=n;i++)s=s+i;returns;}函數(shù)計(jì)算并返回1到n之間的整數(shù)之和。7.1.2函數(shù)調(diào)用
函數(shù)調(diào)用的形式如下:函數(shù)名(實(shí)參列表)例如:s=sum(100)+sum(200); s=sum(100+200);s=sum(n);
參數(shù)從調(diào)用的角度分為實(shí)際參數(shù)和形式參數(shù),或簡(jiǎn)稱(chēng)為實(shí)參和形參。實(shí)參和形參是一一對(duì)應(yīng)的關(guān)系,參數(shù)的個(gè)數(shù)和類(lèi)型都必須一致。如果類(lèi)型不一致將自動(dòng)轉(zhuǎn)換,不能自動(dòng)轉(zhuǎn)換的將在編譯或運(yùn)行時(shí)出錯(cuò)。【例7-1】演示函數(shù)的定義和調(diào)用。#include<stdio.h>intsum(intn){inti,s=0;for(i=1;i<=n;i++)s=s+i;returns;}main(){ints;s=sum(3)+sum(4)+sum(5);printf("(1+2+3)+(1+2+3+4)+(1+2+3+4+5) =%d\n",s);}7.1.3參考傳遞實(shí)參向形參的參數(shù)傳遞有兩種形式:值傳遞和地址傳遞。值傳遞是單向的數(shù)據(jù)傳遞,傳遞完成后,對(duì)形參的任何操作都不會(huì)影響實(shí)參。地址傳遞也可以說(shuō)是單向的數(shù)據(jù)傳遞,但這種數(shù)據(jù)往往是變量、結(jié)構(gòu)體、對(duì)象等的地址,對(duì)形參的操作會(huì)直接影響實(shí)參,從而使得這種形式上的“單向”數(shù)據(jù)傳遞變成“雙向”的7.1.3參考傳遞7.1.3參考傳遞【例7-2】演示函數(shù)的參數(shù)傳遞main(){ intx=10,y=20;inta[10]={1,2,3,4,5,6,7,8,9,10};inti,s=0;swap(x,y);/*值傳遞*/printf("x,y=%d(main)\n",x,y);for(i=0;i<10;i++) s=s+a[i];printf("s=%d\n",s);s=0;change(a);/*地址傳遞*/for(i=0;i<10;i++)s=s+a[i];printf("s=%d\n",s);}#include<stdio.h>voidswap(inta,intb){ intt;t=a;a=b;b=t;printf("a,b=%d(swap)\n",a,b);}voidchange(intx[10]){ inti;for(i=0;i<10;i++) x[i]=x[i]+1;}7.1.4函數(shù)聲明函數(shù)的聲明是對(duì)函數(shù)類(lèi)型、名稱(chēng)等的說(shuō)明。對(duì)函數(shù)及其函數(shù)體的建立稱(chēng)為函數(shù)的定義。對(duì)函數(shù)的說(shuō)明可以和定義一起完成,也可以只對(duì)函數(shù)的原型進(jìn)行聲明,這種聲明通常稱(chēng)為引用性聲明,其格式如下:<類(lèi)型><函數(shù)名>(<形參表>);如:intsum(inta,intb);和完整的函數(shù)聲明不同的是,形參表可以只給出形參的類(lèi)型,如:intsum(int,int);形參名可以省略。另外,這種聲明是一條語(yǔ)句,后面的分號(hào)(;)必不可少。7.4標(biāo)識(shí)符作用域作用域就是作用范圍,不同作用域允許相同的標(biāo)識(shí)符出現(xiàn),同一作用域標(biāo)識(shí)符不能重復(fù),嵌套的作用域標(biāo)識(shí)符由內(nèi)向外屏蔽。7.4標(biāo)識(shí)符作用域已上由兩個(gè)文件組成的程序中不同形式的作用域,其中塊作用域和函數(shù)作用域包含在文件作用域中。塊作用域通常指一對(duì)花括號(hào)“{}”,例如復(fù)合語(yǔ)句和函數(shù)體等。函數(shù)的形參表也可稱(chēng)為塊。函數(shù)中可以包含塊,塊中也可以有更小范圍的塊【例7-3】作用域演示inta=10;staticintadd(inta,intb){returna+b;}main(){inta,b,c;inti,s=0;intsub(int,int);externintd;a=20;c=10; {inta; intc=20; b=10; a=add(b,c);n} printf("a=%d,b=%d,c=%d\n",a,b,c); for(i=1;i<=100;i++){s=s+i;} for(i=1;i<=100;i++){s=sub(s,i);} printf("s=%d\n",s);printf("d=%d\n",d);}externintsub(inta,intb){returna-b;}intd=888;inte=999;7.5存儲(chǔ)類(lèi)型從分配內(nèi)存到被回收,變量的使用具有時(shí)效性,這就是變量的生存期。在整個(gè)程序運(yùn)行過(guò)程中,不同存儲(chǔ)類(lèi)型的變量生存期也各有差異。一個(gè)程序在內(nèi)存中占用的存儲(chǔ)空間分為兩個(gè)部分:程序區(qū)和數(shù)據(jù)區(qū),數(shù)據(jù)區(qū)也可以分成靜態(tài)數(shù)據(jù)區(qū)和動(dòng)態(tài)數(shù)據(jù)區(qū)。生存期和作用域是不同的概念,分別從時(shí)間上和空間上對(duì)變量的使用進(jìn)行界定,相互關(guān)聯(lián)又不完全一致,例如,靜態(tài)變量的生存期貫穿整個(gè)程序,但作用域是從聲明位置開(kāi)始到文件結(jié)束。7.5存儲(chǔ)類(lèi)型變量的存儲(chǔ)類(lèi)型包括:自動(dòng)(auto)寄存器(register)靜態(tài)(static)外部(extern)7.5.1自動(dòng)(auto)類(lèi)型auto用于局部變量的存儲(chǔ)類(lèi)型聲明,可以省略,系統(tǒng)默認(rèn)局部變量為auto類(lèi)型。auto類(lèi)型變量是動(dòng)態(tài)變量,聲明時(shí)系統(tǒng)不會(huì)自動(dòng)初始化,其值是隨機(jī)的,所以必須在使用前初始化或賦值。下面的用法是錯(cuò)誤的:intadd(inta,intb){intc;c=c+a+b;/*錯(cuò)誤:c沒(méi)有初始化*/returnc;}autointa;/*錯(cuò)誤:外部變量不能聲明為auto*/7.5.2寄存器(register)類(lèi)型register用于局部變量的存儲(chǔ)類(lèi)型聲明,表示請(qǐng)求編譯器盡可能直接分配使用CPU的寄存器,在寄存器滿(mǎn)的情況下才分配內(nèi)存。這種類(lèi)型的變量主要用于循環(huán)變量,可以大大提高對(duì)這種變量的存取速度,從而提高程序效率。能實(shí)際實(shí)現(xiàn)為register類(lèi)型的變量很少,主要是寄存器數(shù)量有限。7.5.3靜態(tài)(static)類(lèi)型static類(lèi)型變量稱(chēng)為靜態(tài)變量,存放在靜態(tài)存儲(chǔ)區(qū)。全局變量和局部變量都可以聲明為static類(lèi)型,但意義不同。全局變量總是靜態(tài)存儲(chǔ),默認(rèn)值為0。全局變量前加上static表示該變量只能在本程序文件內(nèi)使用,其他文件無(wú)使用權(quán)限。對(duì)于全局變量,static關(guān)鍵字主要用于在程序包含多個(gè)文件時(shí)限制變量的使用范圍,對(duì)于只有一個(gè)文件的程序有無(wú)static都是一樣。局部變量聲明為static類(lèi)型,則要求系統(tǒng)對(duì)該變量采用靜態(tài)存儲(chǔ)的內(nèi)存分配方式。值得注意的是,對(duì)這種static類(lèi)型的局部變量,系統(tǒng)初始化只進(jìn)行一次,多次遇到該聲明語(yǔ)句,將不再被執(zhí)行。【例7-5】演示靜態(tài)變量ints;staticintt;/*其他文件不能使用*/main(){ intsum(int); inti; for(i=3;i<=5;i++) {s=sum(i);t=t+s;}/*t自動(dòng)初始化為0*/ printf("1+2+3+4+5=%d\n",s); printf("(1+2+3)+(1+2+3+4)+(1+2+3+4+5)=%d\n",t);}intsum(intn){ staticints=0;/*該行語(yǔ)句只執(zhí)行一次*/ inti; for(i=1;i<=n;i++) s=s+i; returns;}【程序分析】sum函數(shù)計(jì)算1+2+3+…+n。主函數(shù)中利用for循環(huán)3次調(diào)用sum函數(shù),分別計(jì)算sum(3)、sum(4)、sum(5)sum(3)==1+2+3==6s等于6sum(4)==6+(1+2+3+4)==6+10==16s等于16sum(5)==16+(1+2+3+4+5)==16+15==31s等于31t==6+16+31==537.5.4外部(extern)類(lèi)型extern
關(guān)鍵字用于聲明外部的聯(lián)接。對(duì)于全局變量,以下定義形式?jīng)]什么區(qū)別:externinta;inta;默認(rèn)情況下,在文件域中聲明的變量和函數(shù)都是外部的。但對(duì)于作用域范圍之外的變量和函數(shù),需要extern來(lái)進(jìn)行引用性聲明。7.6遞歸函數(shù)函數(shù)不能嵌套定義,但可以嵌套調(diào)用。函數(shù)A可以調(diào)用B,函數(shù)B也可以調(diào)用C,這種調(diào)用稱(chēng)為嵌套調(diào)用。函數(shù)直接或間接調(diào)用自身,則稱(chēng)為遞歸調(diào)用,該函數(shù)則稱(chēng)為遞歸函數(shù)?!纠?-6】演示遞歸函數(shù)的應(yīng)用。intf(intn){ if(n==1) return1; else returnn*f(n-1);}ints(intn){if(n==1) return1; else returnn+s(n-1);}main(){ printf("5!=%d\n",f(5)); printf("1+2+3+...+100=%d\n",s(100));}7.7程序示例【例7-7】演示函數(shù)調(diào)用時(shí)求值的順序。voidf(inta,intb){ printf("a=%d,b=%d\n",a,b);}voidmain(){ inti,j; i=j=1; f(i,++i); i=j=1; f(i,i++); i=j=1; f(i+j,++i); i=j=1; f(i+j,i++);}【例7-8】驗(yàn)證9999是否符合“歌德巴赫猜想”。哥德巴赫(GoldbachC.,1690.3.18-1764.11.20)是德國(guó)數(shù)學(xué)家,出生于格奧尼格斯別爾格(現(xiàn)名加里寧城),曾在英國(guó)牛津大學(xué)學(xué)習(xí);原學(xué)法學(xué),由于在歐洲各國(guó)訪問(wèn)期間結(jié)識(shí)了貝努利家族,所以對(duì)數(shù)學(xué)研究產(chǎn)生了興趣;曾擔(dān)任中學(xué)教師?!案璧掳秃詹孪搿笔歉璧掳秃赵?742年6月7日給著名數(shù)學(xué)家歐拉的信中提出的一個(gè)命題:隨便取某一個(gè)奇數(shù),比如77,可以把它寫(xiě)成3個(gè)素?cái)?shù)之和:77=53+17+7再比如461:461=449+7+5【例7-8】驗(yàn)證9999是否符合“歌德巴赫猜想”。#include<stdio.h>#include<stdlib.h>intisprimer(int);main(){ intn=9999; inta,b,c; for(a=2;a<n;a++) { if(isprimer(a)) for(b=2;b<n;b++) {c=n-a-b; if(isprimer(b)&&isprimer(c)) {printf("%dInGoldbachGuess\n",n); printf("%d=%d+%d+%d\n",n,a,b,c); exit(0); } } } printf("%dOutGoldbachGuess\n",n);}intisprimer(intn){ inti; for(i=2;i<=n/2;i++) if(n%i==0)break; if(i>n/2)return1; else return0;}【例7-9】演示數(shù)組和函數(shù)的關(guān)系#include<stdio.h>intsum(inta,intb){returna+b;}intsumarray(inta[10]){ ints=0; inti;for(i=0;i<10;i++) s=s+a[i];returns;}voidcleararray(inta[],intpos){inti; a[pos]=0;}voidclear(inta){a=0;}main(){inta[10]={1,2,3,4,5,6,7,8,9,10};printf("a[0]+a[2]=%d\n",sum(a[0],a[2]));printf("a[0]+a[1]+...+a[9]=%d\n",sumarray(a));clear(a[2]); printf("a[0]+a[2]=%d\n",sum(a[0],a[2]));printf("a[0]+a[1]+...+a[9]=%d\n",sumarray(a)); cleararray(a,2);printf("a[0]+a[2]=%d\n",sum(a[0],a[2]));printf("a[0]+a[1]+...+a[9]=%d\n",sumarray(a));}【例7-10】利用遞歸函數(shù)調(diào)用輸出圖形。#include<stdio.h>#defineN5voidlineprint(
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030中國(guó)泡茶機(jī)行業(yè)發(fā)展趨勢(shì)及投資風(fēng)險(xiǎn)研究報(bào)告
- 2025至2030中國(guó)植物基水膠體業(yè)深度解析及未來(lái)需求量研究報(bào)告
- 2025至2030中國(guó)本冊(cè)印制市場(chǎng)經(jīng)營(yíng)戰(zhàn)略與投資可行性研究報(bào)告
- 2025至2030中國(guó)智慧交通市場(chǎng)競(jìng)爭(zhēng)狀況及融資并購(gòu)研究報(bào)告
- 2025至2030中國(guó)微流控傳感器行業(yè)應(yīng)用趨勢(shì)與未來(lái)前景研究報(bào)告
- 2025銀發(fā)消費(fèi)市場(chǎng):養(yǎng)老服務(wù)需求與市場(chǎng)拓展研究報(bào)告
- 2025至2030中國(guó)合金電阻市場(chǎng)運(yùn)行態(tài)勢(shì)級(jí)發(fā)展戰(zhàn)略建議報(bào)告
- 基于云計(jì)算的智能教育平臺(tái)設(shè)計(jì)及優(yōu)化研究
- 2025年新興市場(chǎng)戰(zhàn)略開(kāi)拓試題及答案
- 工商儲(chǔ)能項(xiàng)目技術(shù)支持可行性研究
- 全國(guó)衛(wèi)生健康系統(tǒng)職業(yè)技能競(jìng)賽(傳染病防治監(jiān)督)參考試題(附答案)
- 中職《畜禽解剖生理》核心知識(shí)點(diǎn)備考試題(附答案)
- 學(xué)校食堂日清單、周匯-總、月結(jié)算制度
- 中職教案評(píng)比評(píng)價(jià)表
- 四年級(jí)語(yǔ)文下冊(cè) 第六單元 語(yǔ)文園地第1課時(shí)說(shuō)課稿 新人教版
- 高中數(shù)學(xué)核心概念和思想方法有效教學(xué)模式探討課件
- 2025年中國(guó)鐵塔浙江省分公司招聘筆試參考題庫(kù)含答案解析
- 醫(yī)院保密知識(shí)培訓(xùn)課件
- 第8章 宏觀經(jīng)濟(jì)政策
- 建筑項(xiàng)目招投標(biāo)外文翻譯外文文獻(xiàn)英文文獻(xiàn)
- 采油安全知識(shí)培訓(xùn)
評(píng)論
0/150
提交評(píng)論