版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第6章函數(shù)與宏定義6.1函數(shù)的概念
6.2變量的作用域和存儲(chǔ)類型6.3
內(nèi)部函數(shù)與外部函數(shù)
6.4
遞歸函數(shù)的設(shè)計(jì)和調(diào)用6.5
預(yù)處理
6.6綜合范例6.7本章小結(jié)6.1函數(shù)的概念函數(shù)的分類:庫(kù)函數(shù)(標(biāo)準(zhǔn)函數(shù))子函數(shù)的三要素:
函數(shù)的調(diào)用函數(shù)的聲明函數(shù)的定義自定義函數(shù):①主函數(shù):main②子函數(shù)[返回值類型符]
函數(shù)名([形參說(shuō)明表]){說(shuō)明語(yǔ)句;可執(zhí)行語(yǔ)句;
return(表達(dá)式);}函數(shù)頭函數(shù)體函數(shù)返回值return(表達(dá)式);[返回值類型符]函數(shù)類型形參說(shuō)明表要素1:函數(shù)的定義
每一個(gè)形參都要單獨(dú)定義數(shù)據(jù)類型。例:intabs_sum(intm,intn)
intabs_sum(intm,n)錯(cuò)誤正確函數(shù)也可以沒有形參,此時(shí)最好標(biāo)記為void類型。例:floatfun(void){……}若函數(shù)無(wú)返回值,則用空類型void來(lái)定義函數(shù)的返回值。void
abs_sum(intm,intn){if(m<0)m=-m;if(n<0)n=-n;
printf(“Thesumis%d\n”,m+n);
return;
}若在函數(shù)的首部省略了函數(shù)返回值的類型名,則默認(rèn)函數(shù)返回值的類型為int類型。[int]abs_sum(intm,intn){if(m<0)m=-m;if(n<0)n=-n;
return(m+n);
}return語(yǔ)句
格式1:return(表達(dá)式);
return只能返回0或1個(gè)值,而不能返回多個(gè)值。intfun(inta,intb){intc;c=a+b;
return(a,b,c);}錯(cuò)誤格式3:return;格式2:return表達(dá)式;等價(jià)函數(shù)類型為void時(shí)用,可以缺省函數(shù)體中可以有多個(gè)return語(yǔ)句,但只有一個(gè)
return語(yǔ)句被執(zhí)行到。intfun(inta){if(a<0)a=-a;returna;}intfun(inta){if(a>0)returna;elsereturn–a;}函數(shù)中沒有return語(yǔ)句,并不代表函數(shù)沒有return值,只是表示函數(shù)的返回值是一個(gè)不確定的數(shù)。函數(shù)無(wú)返回值時(shí):函數(shù)名([實(shí)參表]);要素2:函數(shù)的調(diào)用函數(shù)有返回值時(shí):變量名=函數(shù)名([實(shí)參表]);例6-1分析:P117main7-12abs_sumxyzmn719-1212例6-1:求任意兩個(gè)整數(shù)的絕對(duì)值的和。#include<stdio.h>intabs_sum(intm,intn);voidmain(){intx,y,z;scanf(“%d%d”,&x,&y);
z=abs_sum(x,y);printf(“|%d|+|%d|=%d\n”,x,y,z);}intabs_sum(intm,intn){if(m<0)m=-m;if(n<0)n=-n;return(m+n);}函數(shù)調(diào)用:實(shí)參函數(shù)定義:形參方法1:形參變量在接收到實(shí)參表傳過(guò)來(lái)的值時(shí),會(huì)在內(nèi)存臨時(shí)開辟新的空間,以保存形參變量的值。當(dāng)函數(shù)執(zhí)行完畢時(shí),這些臨時(shí)開辟的內(nèi)存空間空間會(huì)被釋放。形參的值在函數(shù)中不論是否發(fā)生變化,都不會(huì)影響到實(shí)參變量的值。實(shí)參與形參要求在個(gè)數(shù)、類型、次序上匹配。
實(shí)參/形參的名稱可以相同,也可以不同。方法2:#include<stdio.h>voidabs_sum(intx,inty);voidmain(){intx,y;scanf(“%d%d”,&x,&y);
abs_sum(x,y);}voidabs_sum(intx,inty){if(x<0)x=-x;if(y<0)y=-y;printf(“Thesumis%d\n”,x+y);}例6-2:求任意三個(gè)整數(shù)的絕對(duì)值的和。方法1:#include<stdio.h>intabs_sum(intm,intn);voidmain(){intx,y,z,sum;scanf(“%d%d%d”,&x,&y,&z);
sum=abs_sum(abs_sum(x,y),z);printf(“|%d|+|%d|+|%d|=%d\n”,x,y,z,sum);}intabs_sum(intm,intn){if(m<0)m=-m;if(n<0)n=-n;return(m+n);}函數(shù)調(diào)用:實(shí)參函數(shù)定義:形參方法2:#include<stdio.h>intabs_sum(intl,intm,intn);voidmain(){intx,y,z,sum;scanf(“%d%d%d”,&x,&y,&z);
sum=abs_sum(x,y,z);printf(“|%d|+|%d|+|%d|=%d\n”,x,y,z,sum);}intabs_sum(intl,intm,intn){if(l<0)l=-l;if(m<0)m=-m;if(n<0)n=-n;return(l+m+n);}例6-3:求任意兩數(shù)的乘積。#include<stdio.h>floatmul(floata,floatb);voidmain(){floatx,y,z;scanf(“%f%f”,&x,&y);
z=mul(x,y);
mul(x,y);printf(“(%f)*(%f)=%f\n”,x,y,mul(x,y));}floatmul(floata,floatb){returna*b;}函數(shù)調(diào)用1:有變量接收返回值函數(shù)調(diào)用2:無(wú)變量接收返回值函數(shù)調(diào)用3:直接輸出返回值在調(diào)用無(wú)參函數(shù)時(shí),實(shí)參表列可以省略,但括號(hào)不能省略。#include<stdio.h>voidfun(void);voidmain(){fun();}voidfun(void){inta=1,b=2;printf(“(%d,%d)\n”,a+=3,b-=2);
}return;函數(shù)調(diào)用:實(shí)參可以省略函數(shù)定義:形參用void聲明#include<stdio.h>voida(void);voidb(void);voidc(void);voidmain(){……
a();b();c();……}voida(void){……}voidb(void){……}voidc(void){……}函數(shù)調(diào)用:實(shí)參可以省略函數(shù)定義:形參用void聲明例6-4:[返回值類型符]函數(shù)名([形參說(shuō)明表]);例:intabs_sum(intm,intn);intabs_sum(int,int);第1個(gè)問(wèn)題:寫法等價(jià)要素3:函數(shù)的聲明函數(shù)聲明在形式上與函數(shù)頭完全一致,只是在最后多了一個(gè)分號(hào)。第2個(gè)問(wèn)題:缺省情況函數(shù)返回值類型為int型。被調(diào)函數(shù)的定義寫在前面,主調(diào)函數(shù)寫在后面。編寫程序時(shí)最好寫上函數(shù)聲明。#include<stdio.h>floatmul(floata,floatb){returna*b;}voidmain(){……}例6-3:第3個(gè)問(wèn)題:作用目的是讓C語(yǔ)言的編譯程序檢查對(duì)函數(shù)的調(diào)用是否正確。例:#include<stdio.h>intabs_sum(intm,intn);voidmain(){intx,y,z,sum;scanf(“%d%d%d”,&x,&y,&z);
sum=abs_sum(x,y,z);printf(“Thesumis%d\n”,sum);}
intabs_sum(intm,intn){……}第4個(gè)問(wèn)題:位置例:#include<stdio.h>
voidfun1(inta,intb);voidmain(){……}
voidfun1(inta,intb){……}
intfun2(floatx,floaty){…..}位置1:在所有函數(shù)的外部函數(shù)聲明函數(shù)fun1()可以被main()、fun2()調(diào)用。例:#include<stdio.h>voidmain(){voidfun1(inta,intb);……}
voidfun1(inta,intb){……}
intfun2(floatx,floaty){…..}位置2:在某一個(gè)函數(shù)的內(nèi)部函數(shù)聲明函數(shù)fun1()只能被main()調(diào)用。例:#include<stdio.h>voidmain(){……}
voidfun1(inta,intb){……}
voidfun1(inta,intb);
intfun2(floatx,floaty){…..}位置3:在某兩個(gè)函數(shù)之間函數(shù)聲明函數(shù)fun1()只能被fun2()調(diào)用。實(shí)參->形參,單向傳遞,值傳遞,虛實(shí)結(jié)合。實(shí)參/形參的名稱可以相同,也可以不同。
形參與實(shí)參各占一個(gè)獨(dú)立的存儲(chǔ)空間。在調(diào)用函數(shù)時(shí),實(shí)參的值將傳送給對(duì)應(yīng)的形參,但形參的變化不會(huì)影響對(duì)應(yīng)的實(shí)參。在同一程序中,形參名只要在同一函數(shù)中唯一即可,可以與其他函數(shù)中的變量同名。
函數(shù)的傳值方式:例:#include<stdio.h>voidswap(inta,intb);voidmain(){intx=10,y=20;printf(“(1)x=%dy=%d\n”,x,y);
swap(x,y);printf(“(2)x=%dy=%d\n”,x,y);}
voidswap(inta,intb){intt;t=a;a=b;b=t;}main1020swapxyab10201020tintfun2(…){inta1,b1,c1;
return(c1);}intfun1(…){inta,b,c;intfun2(…);
c=fun2(a,b);
return(c);}voidmain(){ints,x,y;intfun1(…);
s=fun1(x,y);
}函數(shù)調(diào)用過(guò)程舉例:#include<stdio.h>intprime(intn){……}voidfactor(intn){……if((n%i==0)&&prime(i))……}voidmain(){……
factor(num);
}因子子函數(shù)素?cái)?shù)子函數(shù)實(shí)驗(yàn)指導(dǎo)書P181:求整數(shù)n的所有素?cái)?shù)因子局部變量:在函數(shù)內(nèi)部或復(fù)合語(yǔ)句內(nèi)部定義的變量。6.2變量的作用域和存儲(chǔ)類型變量的作用域:①局部變量的有效范圍只限于本函數(shù)內(nèi)部,退出函數(shù),該變量自動(dòng)失效。全局變量:在函數(shù)外部定義的變量。①全局變量的作用域是從該變量定義的位置開始,直到源文件結(jié)束。②在同一文件中的所有函數(shù)都可以引用全局變量。例1:#include<stdio.h>
voidmain()
{
intx=5;
printf(“xinmainis%d\n”,x);
{
intx=7;
printf(“xininneris%d\n”,x);
}printf(“xinmainis%d\n”,x);
}優(yōu)先級(jí)低優(yōu)先級(jí)高例2:#include<stdio.h>
voida(void);
voidb(void);voidc(void);
intx=1;
voidmain()
{
……}
voida(void)
{……}
voidb(void)
{
……}voidc(void){……}全局變量#include<stdio.h>inta=5,b=7;voidmain(){inta=4,b=5,c;c=plus(a,b);printf(“a+b=%d\n”,c);}plus(intx,inty){intz;z=x+y;return(z);}全局變量,優(yōu)先級(jí)低局部變量,優(yōu)先級(jí)高實(shí)驗(yàn)六第三題:變量的存儲(chǔ)類型:auto型register型static型extern型內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)CPU的寄存器內(nèi)存的靜態(tài)存儲(chǔ)區(qū)程序區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)用戶區(qū)總結(jié)局部變量全局變量auto√×register(略)√×static√√extern(略)×√定義變量:[存儲(chǔ)類型]數(shù)據(jù)類型變量名;例:autofloata=2;
staticintx=50;情況1:auto型變量(動(dòng)態(tài)的局部變量)局部變量的存儲(chǔ)類型默認(rèn)值為auto型。
auto型只用于定義局部變量。
auto型變量在進(jìn)入所在函數(shù)時(shí)才建立,退出該函數(shù)時(shí)撤銷。
未賦初值的auto變量其值不確定。例:inta,b=3;
autointa,b=3;等價(jià)情況2:static型變量(靜態(tài)的局部變量)在整個(gè)程序運(yùn)行期間,static型變量占據(jù)著永久性的存儲(chǔ)單元。下次調(diào)用該函數(shù)時(shí),該變量擁有最近一次退出該函數(shù)時(shí)的值,該值將被保留。
static型變量的初始化只執(zhí)行一次。
若定義時(shí)沒有賦初值,則系統(tǒng)會(huì)自動(dòng)為其賦0值。雖然靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后仍然存在,但其他函數(shù)不能引用它。例1:#include<stdio.h>intfun(inta);voidmain(){inti,j=2;for(i=0;i<3;i++)printf(“%4d”,fun(j));}
intfun(inta){intb=0;
b++;c++;return(a+b+c);}staticintc=3;輸出結(jié)果:789staticintc;輸出結(jié)果:456#include<stdio.h>intd=1;f(intp){staticintd=5;d+=p;printf(“%d”,d);return(d);}voidmain(){inta=3;printf(“%d
”,f(a+f(d)));}輸出結(jié)果:61515實(shí)驗(yàn)六第五題:注意空格源程序(.c)目標(biāo)程序(.obj)可執(zhí)行程序(.exe)結(jié)果編譯建立/鏈接運(yùn)行編譯預(yù)處理所有編譯預(yù)處理都是以“#”號(hào)開頭,單占源程序中的一行,一般是放在源程序的首部。6.5預(yù)處理C語(yǔ)言提供3種編譯預(yù)處理命令:宏定義文件包含條件編譯6.5.1宏定義情況1:不帶參數(shù)的宏例:#definePI3.14格式:#define宏名字符串宏定義的作用是用宏名來(lái)代表一串字符串。宏名一般采用大寫字母。宏替換不進(jìn)行任何計(jì)算,也不進(jìn)行語(yǔ)法檢查。不能替換雙引號(hào)中與宏名相同的字符串。宏名的有效范圍是從定義命令之后,直到源程序文件結(jié)束,或遇到宏定義終止命令#undef為止。例:#include<stdio.h>
#defineG9.8
#definePI3.14159voidmain()
{……}#undefPIvoidf1(){……}voidf2(){……}#include<stdio.h>#defineS(a,b)a+bvoidmain(){intm=3,n=2,x=4,y=5,area1,area2;
area1=S(m,n);area2=5*S(x,y);printf(“area1=%d\narea2=%d\n”,area1,area2);}area1=m+n;area2=5*x+y;改成:#defineS(a,b)(a+b)情況2:帶參數(shù)的宏格式:#define宏名(參數(shù)表)字符串#include<stdio.h>#defineS(a,b)(a*b)voidmain(){intm=3,n=2,x=4,y=5,area1,area2;
area1=S(m,n);area2=S(x+1,y+2);printf(“area1=%d\narea2=%d\n”,area1,area2)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年版婚前財(cái)產(chǎn)分配合同詳細(xì)范本版
- 2024年簡(jiǎn)易供應(yīng)商訂購(gòu)協(xié)議
- 在線課程設(shè)計(jì)構(gòu)架圖
- 2024年版全面知識(shí)產(chǎn)權(quán)許可與保密協(xié)議
- 電分的課程設(shè)計(jì)
- 2024年地下停車場(chǎng)車位出租合同范本:高效便捷租賃服務(wù)3篇
- 2024年版公路貨物運(yùn)輸協(xié)議范例文件版B版
- 早期干預(yù)教育課程設(shè)計(jì)
- 2024年果蔬買賣協(xié)議
- 2024年度智能家居產(chǎn)品全生命周期售后服務(wù)與維保綜合協(xié)議3篇
- 川藏鐵路勘察報(bào)告范文
- 噴漆安全管理制度模版(3篇)
- Java Web程序設(shè)計(jì)教程(第二版)(微課版)01 Web應(yīng)用開發(fā)概述
- 上海黃浦區(qū)2025屆物理高一第一學(xué)期期末質(zhì)量跟蹤監(jiān)視模擬試題含解析
- 肺結(jié)核課件教學(xué)課件
- 八年級(jí)上冊(cè)物理全冊(cè)知識(shí)點(diǎn)總結(jié)(人教)
- 高考英語(yǔ)詞匯3500詞-亂序版
- 2024年廣告代理合同的廣告投放范圍與分成比例
- 2024年光伏發(fā)電項(xiàng)目融資貸款合同
- E英語(yǔ)教程(第二版)1教學(xué)課件Unit-3
- 高鐵乘務(wù)禮儀培訓(xùn)
評(píng)論
0/150
提交評(píng)論