C語言三種循環(huán)語句_第1頁
C語言三種循環(huán)語句_第2頁
C語言三種循環(huán)語句_第3頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、三種基本的循環(huán)語句:for語句、while語句和do-while語句。(一) 一、循環(huán)語句、for循環(huán)它的一般形式為:for(<初始化><條件表過式><增雖>)語句;初始化總是一個賦值語句,它用來給循環(huán)控制變雖賦初值;條件表達式是一個關(guān)系表達式,它決定什么時候退出循環(huán);增雖定義循環(huán)控制變雖每循環(huán)一次后按什么方式變化。這三個部分之間用;分開。例如:for(i=1;i<=10;i+)語句;上例中先給i賦初值1,判斷i是否小于等于10,若是則執(zhí)行語句,之后值增加1。再重新判斷,直到條件為假,即i>10時,結(jié)束循環(huán)。汪息:.for循環(huán)中語句可以為語句體,

2、但要用和將參加循環(huán)的語句括起來。.for循環(huán)中的初始化、條件表達式和增H都是選擇項,即可以缺省,但;不能缺省。省略了初始化,表示不對循環(huán)控制變雖賦初值。省略了條件表達式,則不做其它處理時便成為死循環(huán)。省略了增雖,則不對循環(huán)控制變雖進行操作,這時可在語句體中加入修改循環(huán)控制變雖的語句。.for循環(huán)可以有多層嵌套。例如:for(;)語句;for(i=1;i+=2)語句;for(j=5;)語句;這些for循環(huán)語句都是正確的。main()(inti,j;printf(ijn);for(i=0;i<2;i+)for(j=0;j<3;j+)printf(%d%dn,i,j);輸出結(jié)果為:000

3、1101112用for循環(huán)求1+2+100的和:main()(intsn=0,i;for(i=1;i<=100;i+)sn+=i;/*1+2+100*/printf(%dn,sn);從程序可以看出,使用循環(huán)語句可以大大簡化代碼。(二) 、while循環(huán)它的一般形式為:while(條件)語句;while循環(huán)表示當條件為真時,便執(zhí)行語句。直到條件為假才結(jié)束循環(huán)。并繼續(xù)執(zhí)行循環(huán)程序外的后續(xù)語句。例如:#includestdio.hmain()(charc;c='0'/*初始化c*/while(c!='n')/*回車結(jié)束循環(huán)*/c=getche();/*帶回顯的從

4、鍵盤接收字符*/上例中,while循環(huán)是以檢查c是否為回車符開始,因其事先被初始化為空,所以條件為真,進入循環(huán)等待鍵盤輸入字符;一旦輸入回車,則c='n',條件為假,循環(huán)便告結(jié)束。與for循環(huán)一樣,while循環(huán)總是在循環(huán)的頭部檢驗條件,這就意味著循環(huán)可能什么也不執(zhí)行就退出。汪息:(1) .在while循環(huán)體內(nèi)也允許空語句。例如:while(c=getche()!='n');這個循環(huán)直到鍵入回車為止。(2) .可以有多層循環(huán)嵌套。(3) .語句可以是語句體,此時必須用和括起來。(三) 用while循環(huán)求1+2+100的和:main()intsn=0,i=0;wh

5、ile(+i<=100)sn+=i;/*求1+2+100*/printf(%dn,sn);、do-while循環(huán)它的一般格式為:do語句塊;while(條件);這個循環(huán)與while循環(huán)的不同在于:它先執(zhí)行循環(huán)中的語句然后再判斷條件是否為真,如果為真則繼續(xù)循環(huán);如果為假,則終止循環(huán)。因此,do-while循環(huán)至少要執(zhí)行一次循環(huán)語句。同樣當有許多語句參加循環(huán)時,要用和把它們括起來。用do-while循環(huán)求1+2+100的和:main()intsn=0,i=1;dosn+=i;/*求1+2+100*/while(+i<=100);printf(%dn,sn);從上面三個程序看出,使用fo

6、r,while和do-while求解同樣的問題,基本思路都差不多,只是在第一次計算時,注意初值。二、循環(huán)控制、break語句break語句通常用在循環(huán)語句和開關(guān)語句中。當break用于開關(guān)語句switch中時,可使程序跳出switch而執(zhí)行switch以后的語句;如果沒有break語句,則將成為一個死循環(huán)而無法退出。break在switch中的用法已在前面介紹開關(guān)語句時的例子中碰到,這里不再舉例。當break語句用于do-while、for、while循環(huán)語句中時,可使程序終止循環(huán)而執(zhí)行循環(huán)后面的語句,通常break語句總是與if語句聯(lián)在一起。即滿足條件時便跳出循環(huán)。例如:main()ints

7、n=0,i;for(i=1;i<=100;i+)if(i=51)break;/*如果i等于51,則跳出循環(huán)*/sn+=i;/*1+2+50*/printf(%dn,sn);可以看出,最終的結(jié)果是1+2+50。因為在i等于51的時候,就跳出循環(huán)了。自己寫寫怎樣在while和do-while循環(huán)中增加break語句。汪息:1. break語句對if-else的條件語句不起作用。2. 在多層循環(huán)中,一個break語句只向外跳一層。例如:main()inti,j;printf(ijn);for(i=0;i<2;i+)for(j=0;j<3;j+)if(j=2)break;printf

8、(%d%dn,i,j);輸出結(jié)果為:00011011當i=0,j=2時,執(zhí)行break語句,跳出到外層的循環(huán),i變?yōu)?。、continue語句continue語句的作用是跳過循環(huán)本中剩余的語句而強行執(zhí)行下一次循環(huán)。continue語句只用在for、while、do-while等循環(huán)體中,常與if條件語句一起使用,用來加速循環(huán)。例如:main()intsn=0,i;for(i=1;i<=100;i+)if(i=51)continue;/*如果i等于51,則結(jié)束本次循環(huán)*/sn+=i;/*1+2+50+52+100*/printf(%dn,sn);從程序中可以看出,continue語句只是當

9、前的值沒有執(zhí)行,也就是說當前的值跳過去了,接著執(zhí)行下次循環(huán)。main()inti,j;printf(ijn);for(i=0;i<2;i+)for(j=0;j<3;j+)if(j=1)continue;printf(%d%dn,i,j);輸出結(jié)果為:0002、goto語句goto語句是一種無條件轉(zhuǎn)移語句,與BASIC中的goto語句相似。goto語句的使用格式為:goto標號;其中標號是TurboC2.0中一個有效的標識符,這個標識符加上一個:一起出現(xiàn)在函數(shù)內(nèi)某處,執(zhí)行g(shù)oto語句后,程序?qū)⑻D(zhuǎn)到該標號處并執(zhí)行其后的語句。標號既然是一個標識符,也就要滿足標識符的命名規(guī)則。另外標號必

10、須與goto語句同處于一個函數(shù)中,但可以不在一個循環(huán)層中。通常goto語句與if條件語句連用,當滿足某一條件時,程序跳到標號處運行。goto語句通常不用,主要因為它將使程序?qū)哟尾磺?,且不易讀,但在多層嵌套退出時,用goto語句則比較合理。main()intsn=0,i;for(i=1;i<=100;i+)if(i=51)gotoloop;/*如果i等于51,則跳出循環(huán)*/sn+=i;/*1+2+50*/loop:;printf(%dn,sn);可以看出,這兒的goto語句和break作用很類似。這兒的loop:;printf(%dn,sn);也可以寫成loop:printf(%dn,sn

11、);main()(intsn=0,i;for(i=1;i<=100;i+)(if(i=51)gotoloop;/*如果i等于51,則跳出本次循環(huán)*/sn+=i;/*1+2+50+52+100*/loop:;printf(%dn,sn);可以看出這兒的loop語句和continue的作用類似。但是某些情況下乂必須使用goto語句,否則會讓程序大大臃腫。如:main()(inti,j,k;printf(ijkn);for(i=0;i<2;i+)for(j=0;j<3;j+)for(k=0;k<3;k+)(if(k=2)gotoloop;printf(%d%d%dn,i,j,

12、k);loop:;輸出結(jié)果為:ijk000001如果不使用goto語句,而使用break,continue語句,應(yīng)該這樣main()(inti,j,k;printf(ijn);for(i=0;i<2;i+)(for(j=0;j<3;j+)(for(k=0;k<3;k+)(if(k=2)break;printf(%d%d%dn,i,j,k);if(k=2)break;if(k=2)break;輸出結(jié)果為:ijk000001所以在同時跳出多層循環(huán)時,應(yīng)該使用goto語句。記住,所有的goto語句其實都是可以用break,continue代替的下面舉幾個例子:求兩個整數(shù)的最大公約數(shù)

13、。例如10和15的最大公約數(shù)是5。分析:最大公約數(shù)一定小于等于最小的那個數(shù)一半,同時能main()(intnum1,num2,i,min;scanf(%d%d,&num1,&num2);min=num1for(i=min/2;i>0;i-)if(num1%i=0&&num2%i=0)break;printf(最大公約數(shù)為%dn,i);求1!+2!+n!(n<10)main()(intn,i;longtemp=1,sn=0;/*從9!以后,所得的值就超過了int范圍*/scanf(%d,&n);for(i=1;i<=n;i+)(temp*

14、=i;sn+=temp;/*如果沒有這一步,求的就是n!*/printf(%ldn,sn);那么想想,如果求1!+3!+5!+n!應(yīng)該怎么辦?判斷一個整數(shù)是不是素數(shù)(素數(shù)就是只能被本身和1整除的數(shù))。#includemath.hmain()(intnum,i,flag=0;scanf(%d,&num);for(i=2;i(flag=0;/*標志變H復(fù)位*/if(num%i=0)(flag=1;break;if(flag=0)printf(是素數(shù)n);elseprintf(不是素數(shù)n);可以說,在所有的C語言書上,都有判斷素數(shù)的例題。它的編程思想是:把一個變作為標志變,用來標志是不是素數(shù)

15、;循環(huán)體是從2到sqrt(num),因為如果一個數(shù)不是素數(shù)的話,一定能分解成num=num1*num2它們中的最小值一定小于sqrt(num),所以循環(huán)的時候只要到sqrt(num)就可以了。同時要,意變復(fù)位的問題。二、遞歸遞歸,是函數(shù)實現(xiàn)的一個很重要的環(huán)節(jié),很多程序中都或多或少的使用了遞歸函數(shù)。遞歸的意思就是函數(shù)自己調(diào)用自己本身,或者在自己函數(shù)調(diào)用的下級函數(shù)中調(diào)用自己。遞歸之所以能實現(xiàn),是因為函數(shù)的每個執(zhí)行過程都在棧中有自己的形參和局部變雖的拷貝,這些拷貝和函數(shù)的其他執(zhí)行過程毫不相干。這種機制是當代大多數(shù)程序設(shè)計語言實現(xiàn)子程序結(jié)構(gòu)的基礎(chǔ),是使得遞歸成為可能。假定某個調(diào)用函數(shù)調(diào)用了一個被調(diào)用函

16、數(shù),再假定被調(diào)用函數(shù)乂反過來調(diào)用了調(diào)用函數(shù)。這第二個調(diào)用就被稱為調(diào)用函數(shù)的遞歸,因為它發(fā)生在調(diào)用函數(shù)的當前執(zhí)行過程運行完畢之前。而且,因為這個原先的調(diào)用函數(shù)、現(xiàn)在的被調(diào)用函數(shù)在棧中較低的位置有它獨立的一組參數(shù)和自變雖,原先的參數(shù)和變雖將不受影響,所以遞歸能正常工作。程序遍歷執(zhí)行這些函數(shù)的過程就被稱為遞歸下降。程序員需保證遞歸函數(shù)不會隨意改變靜態(tài)變雖和全局變雖的值,以避免在遞歸下降過程中的上層函數(shù)出錯。程序員還必須確保有一個終止條件來結(jié)束遞歸下降過程,并且返回到頂層。例如這樣的程序就是遞歸:voida(int);main()(intnum=5;a(num);voida(intnum)(if(nu

17、m=0)return;printf(%d,num);a(-num);在函數(shù)a()里面乂調(diào)用了自己,也就是自己調(diào)用本身,這樣就是遞歸。那么有些人可能要想,這不是死循環(huán)嗎?所以在遞歸函數(shù)中,一定要有return語句,沒有return語句的遞歸函數(shù)是死循環(huán)。我們分析上面的例子,先調(diào)用a(5),然后輸出5,再在函數(shù)中調(diào)用本身a(4),接著回到函數(shù)起點,輸出4,;一直到調(diào)用a(0),這時發(fā)現(xiàn)已經(jīng)滿足if條件,不在調(diào)用而是返回了,所以這個遞歸一共進行了5次。如果沒有這個return,肯定是死循環(huán)的。雖然遞歸不難理解,但是很多在在使用遞歸函數(shù)的時候,問題多多。這里面一般有兩個原因:一是如何往下遞歸,也就是不

18、知道怎么取一個變雖遞歸下去;二是不知道怎么終止遞歸,經(jīng)常弄個死循環(huán)出來。下面看幾個例子:1.求1+2+100的和先分析一下。第一遞歸變雖的問題,從題目上看應(yīng)該取1,2,100這些變雖的值作為遞歸的條件;第二就是如何終止的問題,從題目上看應(yīng)該是當數(shù)為100的時候就不能往下加了。那么我們試著寫一下程序。intadd(int);main()(intnum=1,sn;sn=add(num);printf(%dn,sn);getch();intadd(intnum)(staticintsn;sn+=num;if(num=100)returnsn;add(+num);分析一下程序:前調(diào)用add(1),然后

19、在子函數(shù)中把這個1加到sn上面。接著調(diào)用add(2),再把sn加2上來。這樣一直到100,到了100的時候,先加上來,然后發(fā)現(xiàn)滿足了if條件,這時返回sn的值,也就是1+2+100的值了。這里有一個問題一定要注意,就是staticintsn;有些人就不明白,為什么要使用static類型修飾符,為什么不使用intsn=0;?如果使用intsn=0;這樣的語句,在每次調(diào)用函數(shù)add()的時候,sn的值都是賦值為0,也就是第一步雖然加了1上來,可是第二次調(diào)用的時候,sn乂回到了0。我們前面說了,static能保證本次初始化的值是上次執(zhí)行后的值,這樣也就保證了前面想加的結(jié)果不會丟失。如果你修改為int

20、sn=0,最后結(jié)果一定是最后的100這個值而不是5050。2.求數(shù)列s(n)=s(n-1)+s(n-2)的第n項。其中s(1)=s(2)=1??梢钥闯觯K止條件一定是s(1)=s(2)=1。遞歸下降的參數(shù)*定是n。inta(int);main()(intn,s;scanf(%d,&n);s=a(n);printf(%dn,s);getch();inta(intn)(if(n<3)return1;returna(n-1)+a(n-2);這個題目主要說明的是,在函數(shù)中,不一定只有一個return語句,可以有很多,但是每次對歸的時候只有一個起作用。題目不難理解,這兒不分析了。說了這些遞

21、歸,其實它和函數(shù)的調(diào)用沒有大的區(qū)別,主要就是一個終止條件要選好。遞歸函數(shù)很多時候都能用循環(huán)來處main()(intn=20,array20;inti;for(i=0;i<N;I+)(if(i<2)arrayi=1;elsearrayi=arrayi-1+arrayi-2;printf(%dn,array19);getch();上面的程序就是實現(xiàn)一模一樣的功能的。但是它有一個缺陷,就是n的值不是通過鍵盤輸入來得到。如果想通過鍵盤來得到n,可以這樣:main()(intn,i;ints1=1,s2=1,tempscanf(%d,&n);for(i=3;i<=n;i+)(t

22、emp=s2;s2+=s1;s1=temp;printf(%dn,s2);getch();(最高)()->.自左向右!+_*&sizeof自右向左*/%自左向右+-自左向右«»自左向右<<=>>=自左向右=!=自左向右&自左向右A自左向右|自左向右&&自左向右|自左向右?:自右向左=+=-=*=/=%=&=A=|=«=»=自右向左(最低),自左向右一個表達式的返回值都可以用來判斷真假,除非沒有任何返回值的void型和返回無法判斷真假的結(jié)構(gòu)。當表達式的值不等于0時,它就是真”,否則就是假

23、。一樣個表達式可以包含其他表達式和運算符,并且基于整個表達式的運算結(jié)果可以得到一個真/假的條件值。因此,當一個表達式在程序中被用于檢驗其真/假的值時,就稱為一個條件。一、if語句if(表達式)語句1;如果表達式的值為非0,則執(zhí)行語句1,否則跳過語句繼續(xù)執(zhí)行下面的語句。如果語句1有多于一條語句要執(zhí)行時,必須使用和把這些語句包括在其中,此時條件語句形式為:if(表達式)語句體1;例如:if(x>=0)y=x;if(a|b&&c)z=a+b;c+=z;二、if-else語句除了可以指定在條件為真時執(zhí)行某些語句外,還可以在條件為假時執(zhí)行另外一段代碼。在C語句中利用else語句來達

24、到這個目的。if(表達式)語句1;else語句2;同樣,當語句1或語句2是多于一個語句時,需要用把語句括起來。例如:if(x>=0)y=x;elsey=-x;三、if-elseif-else結(jié)構(gòu)。if(表達式1)語句1;elseif(表達式2)語句2;elseif(表達式3)語句3;else語句n;這種結(jié)構(gòu)是從上到下逐個對條件進行判斷,一旦發(fā)現(xiàn)條件滿點足就執(zhí)行與它有關(guān)的語句,并跳過其它剩余階梯;|若沒有一個條件滿足,則執(zhí)行最后一個else語句n。最后這個else常起著缺省條件的作用。同樣,如果每一個條件中有多于一條語句要執(zhí)行時,必須使用和把這些語句包括在其中。條件語句可以嵌套,這種情況經(jīng)

25、常碰到,但條件嵌套語句容易出錯,其原因主要是不知道哪個if對應(yīng)哪個elseo例如:if(x>20|x<-10)if(y<=100&&y>x)printf(Good);elseprintf(Bad);對于上述情況,TurboC2.0規(guī)定:else語句與最近的一個if語句匹配,上例中的else與if(y<=100&&y>x)相匹配。為了使else與if(x>20|x<-10)相匹配,必須用花括號。如下所示:if(x>20|x<-10)(if(y<=100&&y>x)printf(

26、Good);elseprintf(Bad);下面舉幾個例子:1. 輸入一個數(shù),如果大于0,輸出plus;如果是負數(shù),輸出negative;如果正好是0,則輸出zero。main()(floatnum;scanf(%f,&f);if(num>0)printf(plusn);elseif(num<0)printf(negativen);elseprintf(zeron);先定義兩個變雖,然后輸入一個數(shù),然后判斷這個數(shù)的范圍,輸出對應(yīng)的字符串。2. 輸入一個數(shù)x,輸出y。其中y是x的絕對值。main()(floatx,y;scanf(%f,&x);if(x>=0)y

27、=x;elsey=-x;printf(%fn,y);程序比較簡單,這兒就不分析了。其實TruboC2.0把一些常用的功能都寫好了,我們只需要使用就可。例如求絕對值的功能在C的庫里面就有??聪旅娴模?includemath.hmain()(floatx,y;scanf(%f,&x);y=fabs(x);/*求x的絕對值,然后賦值給y*/printf(%fn,y);這個程序和上面的程序完成的功能是一模一樣的,都是求絕對值??梢钥闯觯孟旅孢@個方法比上面就要好一些。由于fabs()是一個函數(shù),系統(tǒng)自帶的,所以在使用它的時候,我們必須把它所在的庫文件math.h包含都程序中,即程序最前面一行。

28、類似的還有求開方sqrt(),求指數(shù)幕exp()等等,這些與數(shù)學(xué)方面有關(guān)的函數(shù)都在math.h里面。具體哪些有哪些沒有,在什么庫里面,可以查看一些手冊。3. 輸入x,輸出y,x和y滿足關(guān)系:x<-5y=x;-5<=x<1y=2*x+5;1<=x<4y=x+6;x>=4y=3*x-2;程序如下:main()floatx,y;scanf(%f,&x);if(x<-5)y=x;elseif(-5<=x&&x<1)y=2*x+5;elseif(1<=x&&x<4)y=x+6;elsey=3*x-2

29、;printf(%fn,y);這里要說明兩點:.-5<=x&&x<1不能寫成-5<=x<1;1<=x&&x<4也不能寫成1<=x<4;在C語言中,不能認識連續(xù)不等式。(2).y=2*x+5不能寫成y=2x+5;y=3*x-2也不能寫成y=3x-2;這與我們平時所寫的方法不一樣。輸入三個數(shù)x,y,z,然后按從大到小輸出main()floatx,y,z;scanf(%f%f%f,&x,&y,&z);if(x>=y&&x>=z)printf(%ft,x);if(y>

30、;=z)printf(%ft%fn,y,z);elseprintf(%ft%fn,z,y);elseif(y>=x&&y>=z)(printf(%ft,y);if(x>=z)printf(%ft%fn,x,z);elseprintf(%ft%fn,z,x);printf(%ft,z);if(x>=y)printf(%ft%fn,x,y);elseprintf(%ft%fn,y,x);說明:這是一個典型的if語句嵌套結(jié)構(gòu),如果不使用括號,那么if和else的對應(yīng)關(guān)系就亂了。四、switch-case語句在編寫程序時,經(jīng)常會碰到按不同情況分轉(zhuǎn)的多路問題,這時

31、可用嵌套if-else-if語句來實現(xiàn),但if-else-if語句使用不方便,并且容易出錯。對這種情況,TurboC2.0提供了一個開關(guān)語句。開關(guān)語句格式為:switch(變H)(case常H1:語句1或空;case常H2:語句2或空;case常量n:語句n或空;default:語句n+1或空;執(zhí)行switch開關(guān)語句時,將變雖逐個與case后的常H進行比較,若與其中一個相等,則執(zhí)行該常雖下的語句,若不與任何一個常H相等,則執(zhí)行default后面的語句。汪息:1. switch中變雖可以是數(shù)值,也可以是字符,但必須是整數(shù)。2. 可以省略一些case和default。每個case或default

32、后的語句可以是語句體,但不需要使用和括起來。例如:main()intx,y;scanf(%d,&x);witch(x)case1:y=x+1;break;/*退出開關(guān)語句,遇到break才退出*/case4:y=2*x+1;break;default:y=x-;break;printf(%dn,y);從上面的例子可以看出,用開關(guān)語句編的程序一定可以用if語句做。那么在什么情況下需要用switch語句呢?:般在出現(xiàn)比較整的情況下或者能轉(zhuǎn)化成比較整數(shù)的情況下使用??聪旅娴睦樱豪樱阂粋€學(xué)生的成績分成五等,超過90分的為'A',80-89的為'B',70-7

33、9為'C',60-69為'D',60分以下為'E'?,F(xiàn)在輸入一個學(xué)生的成績,輸出他的等級。(1).用if語句main()floatnum;chargrade;scanf(%d,&num);if(num>=90)grade='A'elseif(num>=80&&num<89)grade='B'elseif(num>=70&&num<79)grade='C'elseif(num>=60&&num<69)gr

34、ade='D'elsegrade='E'printf(%c,grade);(2).用switch語句main()(intnum;chargrade;scanf(%d,&num);num/=10;switch(num)(case10:case9:grade='A'break;case8:grade='B'break;case7:grade='C'break;case6:grade='D'break;default:grade='E'break;printf(%c,grade);

35、說明一點,并不是每個case里面有都語句,有時侯里面是空的,就好象這一題。switch語句執(zhí)行的順序是從第一case判斷,如果正確就往下執(zhí)行,直到break;如果不正確,就執(zhí)行下一個case。所以在這里,當成績是100分時,執(zhí)行case10:然后往下執(zhí)行,grade='A'break;退出。想想看,這里為什么要用num/=10;?假設(shè)當程序中有浮點數(shù)時怎么辦呢?前面我們說的都是無參數(shù)無返回值的函數(shù),實際程序中,我們經(jīng)常使用到帶參數(shù)有返回值的函數(shù)。一、函數(shù)參數(shù)傳遞形式參數(shù)和實際參數(shù)函數(shù)的調(diào)用值把一些表達式作為參數(shù)傳遞給函數(shù)。函數(shù)定義中的參數(shù)是形式參數(shù),函數(shù)的調(diào)用者提供給函數(shù)的參數(shù)

36、叫實際參數(shù)。在函數(shù)調(diào)用之前,實際參數(shù)的值將被拷貝到這些形式參數(shù)中。參數(shù)傳遞先看一個例子:voida(int);/*注意函數(shù)聲明的形式*/main()(intnum;scanf(%d,&num);a(num);/*注意調(diào)用形式*/voida(intnum_back)/*注意定義形式*/(printf(%dn,num_back);在主函數(shù)中,先定義一個變雖,然后輸入一個值,在a()這個函數(shù)中輸出。當程序運行a(num);這一步時,把num的值賦值給num_back,在運行程序過程中,把實際參數(shù)的值傳給形式參數(shù),這就是函數(shù)參數(shù)的傳遞。形參和實參可能不只一個,如果多于一個時,函數(shù)聲明、調(diào)用、定

37、義的形式都要一一對應(yīng),不僅個數(shù)要對應(yīng),參數(shù)的數(shù)據(jù)類型也要對應(yīng)。voida(int,float);main()intnum1;floatnum2;scanf(%d,&num1);scanf(%f,&num2);a(num1,num2);voida(intnum1_back,floatnum2_back)(printf(%d,%fn,num1_back,num2_back);上面的例子中,函數(shù)有兩個參數(shù),一個是整型,一個是浮點型,那么在聲明、調(diào)用、定義的時候,不僅個數(shù)要一樣,類型也要對應(yīng)。如果不對應(yīng),有可能使的編譯錯誤,即使沒錯誤,也有可能讓數(shù)據(jù)傳遞過程中出現(xiàn)錯誤。再看一個例子:v

38、oida(int);main()(intnum;scanf(%d,&num);a(num);voida(intnum)(printf(%dn,num);看上面的例子,形式參數(shù)和實際參數(shù)的標識符都是num,程序把實際參數(shù)num的值傳遞給形式參數(shù)num有些人可能就不明白了,既然兩個都是num,為什么還要傳遞呢?干脆這樣不就行了嗎:voida();main()(intnum;scanf(%d,&num);a();voida()(printf(%dn,num);其實不然,這就要涉及到標識符作用域的問題。作用域的意思就是說,哪些變H在哪些范圍內(nèi)有效。一個標識符在一個語句塊中聲明,那么這個

39、標識符僅在當前和更低的語句塊中可見,在函數(shù)外部的其實地方不可見,其他地方同名的標識符不受影響,后面我們會系統(tǒng)講解作用域的問題。在這兒你就要知道兩個同名的變雖在不同的函數(shù)中是互不干擾的。前面將的都是變雖與變n之間的值傳遞,其實函數(shù)也可以傳遞數(shù)組之間的值??聪旅娴睦樱簐oida(int);main()(intarray5,i;for(i=0;i<5;i+)scanf(%d,&arrayi);a(array);voida(intarray)(inti;for(i=0;i<5;i+)printf(%dt,arrayi);printf(n);這就是數(shù)組之間的值傳遞。注意他們的聲明和

40、定義形式,和變雖參數(shù)傳遞有什么區(qū)別?有了后面的就表明傳遞的是一個數(shù)組。其中在定義的時候,也可以寫成voida(intarray5);想想,如果我們寫成了intarray4會有什么情況發(fā)生?目前我們只學(xué)了數(shù)組和變雖,以后還會知道指針、結(jié)構(gòu),到那是,函數(shù)也可以傳遞它們之間的值。二、函數(shù)值的返回其實我們也可以把函數(shù)當作一個變雖來看,既然是變雖,那一定也可以有類型。還舉最前面的例子,現(xiàn)在要求在main()函數(shù)里輸入一個整數(shù)作為正方形的邊長,在子函數(shù)里求正方形的面積,然后再在主函數(shù)里輸出這個面積。我們前面的程序都是在子函數(shù)里輸出的,現(xiàn)在要求在主函數(shù)里輸出,這就需要把算好的值返回回來。先看例子:inta(

41、int);/*聲明函數(shù)*/main()(intnum,area;scanf(%d,&num);area=a(num);/*調(diào)用時的形式*/printf(%d,area);inta(intnum)(intarea_back;area_back=num*num;returnarea_back;/*返回一個值*/和前面的程序有幾點不同:(1) .聲明函數(shù)類型時,不是void,而是int。這是由于最后要求的面積是整型的,所以聲明函數(shù)的返回值類型是整型。.return語句它的意思就是返回一個值。在C語言中,return一定是在函數(shù)的最后一行。(2) .調(diào)用函數(shù)的時候,由于函數(shù)有一個返回值,所以必須要用變雖接受這個返回值(不是絕對的),如果我們不用一個變雖接受這個值,函數(shù)還照樣返回,但是返回的這個值沒有使用。上面的例子運行過程是這樣的,先把實參的值傳遞給形參,然后在子函數(shù)里計算面積得到area_back,然后返回這個面積到主函數(shù),也就是把area_back賦值給area,最后輸出°前面說了,返回值有時不一定非要用一個變雖來接受,我們可以把上面的程序簡化為:inta(int);mai

溫馨提示

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

評論

0/150

提交評論