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

下載本文檔

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

文檔簡(jiǎn)介

1、三種基本的循環(huán)語(yǔ)句 : for 語(yǔ)句、 while 語(yǔ)句和 do-while 語(yǔ) 句。一、循環(huán)語(yǔ)句、for 循環(huán) 它的一般形式為 :for(;)語(yǔ)句;初始化總是一個(gè)賦值語(yǔ)句,它用來(lái)給循環(huán)控制變量賦初值; 條件表達(dá)式是一個(gè)關(guān)系表達(dá)式,它決定什么時(shí)候退出循環(huán); 增量定義循環(huán)控制變量每循環(huán)一次后按什么方式變化。 這三 個(gè)部分之間用 ; 分開(kāi)。例如 :for(i=1;i10 時(shí),結(jié)束循環(huán)。.for 循環(huán)中語(yǔ)句可以為語(yǔ)句體 ,但要用 和將參加循環(huán) 的語(yǔ)句括起來(lái)。.for 循環(huán)中的初始化、條件表達(dá)式和增量都是選擇項(xiàng), 即可以缺省,但 ; 不能缺省。省略了初始化,表示不對(duì)循環(huán)控制變量賦初值。省略了條件表達(dá)式

2、,則不做其它處理時(shí)便 成為死循環(huán)。省略了增量,則不對(duì)循環(huán)控制變量進(jìn)行操作, 這時(shí)可在語(yǔ)句體中加入修改循環(huán)控制變量的語(yǔ)句。.for 循環(huán)可以有多層嵌套。例如:for(;)語(yǔ)句 ;for(i=1;i+=2) 語(yǔ)句 ;for(j=5;) 語(yǔ)句 ;這些 for 循環(huán)語(yǔ)句都是正確的。main()int i,j;printf(i jn);for(i=0;i2;i+)for(j=0;j3;j+)printf(%d %dn,i,j);輸出結(jié)果為 :i j0 00 11 01 11 2用for循環(huán)求1+2+ +100的和:main()int sn=0,i; for(i=1;i=100;i+)sn+=i; /*1

3、+2+ +100*/printf(%dn,sn); 從程序可以看出,使用循環(huán)語(yǔ)句可以大大簡(jiǎn)化代碼。、while 循環(huán) 它的一般形式為 : while( 條件 ) 語(yǔ)句;while 循環(huán)表示當(dāng)條件為真時(shí),便執(zhí)行語(yǔ)句。直到條件為假 才結(jié)束循環(huán)。并繼續(xù)執(zhí)行循環(huán)程序外的后續(xù)語(yǔ)句。例如:#include stdio.h main() char c;c=0; /* 初始化 c*/while(c!=n) /* 回車結(jié)束循環(huán) */ c=getche(); /* 帶回顯的從鍵盤(pán)接收字符 */ 上例中, while 循環(huán)是以檢查 c 是否為回車符開(kāi)始,因其事 先被初始化為空,所以條件為真,進(jìn)入循環(huán)等待鍵盤(pán)輸入字

4、符;一旦輸入回車,則 c=n ,條件為假,循環(huán)便告結(jié)束。 與 for 循環(huán)一樣, while 循環(huán)總是在循環(huán)的頭部檢驗(yàn)條件, 這就意味著循環(huán)可能什么也不執(zhí)行就退出。. 在 while 循環(huán)體內(nèi)也允許空語(yǔ)句。 例如 :while(c=getche()!=n); 這個(gè)循環(huán)直到鍵入回車為止。. 可以有多層循環(huán)嵌套。. 語(yǔ)句可以是語(yǔ)句體 , 此時(shí)必須用 和 括起來(lái)。用while 循環(huán)求1+2+100的和: main()int sn=0,i=0; while(+i=100)sn+=i; /* 求 1+2+ +100*/printf(%dn,sn);、 do-wh ile 循環(huán) 它的一般格式為 :do語(yǔ)句

5、塊 ;while( 條件 );這個(gè)循環(huán)與 while 循環(huán)的不同在于 : 它先執(zhí)行循環(huán)中的語(yǔ)句 然后再判斷條件是否為真, 如果為真則繼續(xù)循環(huán); 如果為假, 則終止循環(huán)。因此,do-while循環(huán)至少要執(zhí)行一次循環(huán)語(yǔ)句。 同樣當(dāng)有許多語(yǔ)句參加循環(huán)時(shí),要用和 把它們括起來(lái)。用 do-while 循環(huán)求 1+2+100 的和:main()int sn=0,i=1;dosn+=i; /* 求 1+2+ +100*/while(+i=100);printf(%dn,sn);從上面三個(gè)程序看出,使用 for , while 和 do-while 求解 同樣的問(wèn)題,基本思路都差不多,只是在第一次計(jì)算時(shí),注

6、意初值。二、循環(huán)控制、 break 語(yǔ)句break 語(yǔ)句通常用在循環(huán)語(yǔ)句和開(kāi)關(guān)語(yǔ)句中。當(dāng) break 用于 開(kāi)關(guān)語(yǔ)句 switch 中時(shí),可使程序跳出 switch 而執(zhí)行 switch 以后的語(yǔ)句;如果沒(méi)有 break 語(yǔ)句,則將成為一個(gè)死循環(huán)而 無(wú)法退出。 break 在 switch 中的用法已在前面介紹開(kāi)關(guān)語(yǔ)句 時(shí)的例子中碰到,這里不再舉例。當(dāng) break 語(yǔ)句用于 do-while 、 for 、 while 循環(huán)語(yǔ)句中時(shí), 可使程序終止循環(huán)而執(zhí)行循環(huán)后面的語(yǔ)句, 通常 break 語(yǔ)句 總是與 if 語(yǔ)句聯(lián)在一起。即滿足條件時(shí)便跳出循環(huán)。例如:main()int sn=0,i;fo

7、r(i=1;i :1. break 語(yǔ)句對(duì) if-else的條件語(yǔ)句不起作用2. 在多層循環(huán)中,一個(gè)例如:break 語(yǔ)句只向外跳一層注意 : main()int i,j;printf(i jn);for(i=0;i2;i+)for(j=0;j3;j+)if(j=2) break; printf(%d %dn,i,j);輸出結(jié)果為 :i j0 00 11 01 1當(dāng) i=0,j=2 時(shí),執(zhí)行 break 語(yǔ)句,跳出到外層的循環(huán), i 變?yōu)?1。、 continue 語(yǔ)句continue 語(yǔ)句的作用是跳過(guò)循環(huán)本中剩余的語(yǔ)句而強(qiáng)行執(zhí) 行下一次循環(huán)。continue 語(yǔ)句只用在 for 、while

8、 、do-while 等循環(huán)體中 , 常 與 if 條件語(yǔ)句一起使用,用來(lái)加速循環(huán)。例如:main()int sn=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 語(yǔ)句只是當(dāng)前的值沒(méi)有執(zhí)行, 也就是說(shuō)當(dāng)前的值跳過(guò)去了,接著執(zhí)行下次循環(huán)。main() int i,j;printf(i jn); for(i=0;i2;i+) for(j=0;j3;j+)if(j=1) continue; printf(

9、%d %dn,i,j); 輸出結(jié)果為 :i j0 00 2、goto 語(yǔ)句goto 語(yǔ)句是一種無(wú)條件轉(zhuǎn)移語(yǔ)句,與BASIC 中的 goto 語(yǔ)句相似。 goto 語(yǔ)句的使用格式為 :goto 標(biāo)號(hào) ;其中標(biāo)號(hào)是 Turbo C 2.0 中一個(gè)有效的標(biāo)識(shí)符,這個(gè)標(biāo)識(shí)符 加上一個(gè) : 一起出現(xiàn)在函數(shù)內(nèi)某處,執(zhí)行 goto 語(yǔ)句后,程序 將跳轉(zhuǎn)到該標(biāo)號(hào)處并執(zhí)行其后的語(yǔ)句。 標(biāo)號(hào)既然是一個(gè)標(biāo)識(shí) 符,也就要滿足標(biāo)識(shí)符的命名規(guī)則。另外標(biāo)號(hào)必須與 goto 語(yǔ)句同處于一個(gè)函數(shù)中,但可以不在一個(gè)循環(huán)層中。通常 goto 語(yǔ)句與 if 條件語(yǔ)句連用,當(dāng)滿足某一條件時(shí),程序跳 到標(biāo)號(hào)處運(yùn)行。 goto 語(yǔ)句通常不

10、用, 主要因?yàn)樗鼘⑹钩绦驅(qū)?次不清,且不易讀,但在多層嵌套退出時(shí),用 goto 語(yǔ)句則 比較合理。main()int sn=0,i;for(i=1;i=100;i+)if(i=51) goto loop; /* 如果 i 等于 51,則跳出循環(huán) */sn+=i; /T+2+50*/loop: ; printf(%dn,sn); 可以看出,這兒的 goto 語(yǔ)句和 break 作用很類似。 這兒的 loop: ;printf(%dn,sn); 也可以寫(xiě)成 loop: printf(%dn,sn);main()int sn=0,i;for(i=1;i=100;i+)if(i=51) goto lo

11、op; /* 如果 i 等于 51,則跳出本次循環(huán) */sn+=i; /T+2+50+52+100*/loop: ; printf(%dn,sn); 可以看出這兒的 loop 語(yǔ)句和 continue 的作用類似。 但是某些情況下又必須使用 goto 語(yǔ)句,否則會(huì)讓程序大大 臃腫。如:main()int i,j,k;printf(i j kn);for(i=0;i2;i+)for(j=0;j3;j+) for(k=0;k3;k+) if(k=2) goto loop; printf(%d %d %dn,i,j,k);loop: ;輸出結(jié)果為 :i j k0 0 00 0 1語(yǔ)句,應(yīng)該如果不使用

12、 goto 語(yǔ)句,而使用 break,continue、亠4A這樣main() int i,j,k; printf(i jn);for(i=0;i2;i+)for(j=0;j3;j+)for(k=0;k0;i-)if(num1%i=0&num2%i=0) break;printf( 最大公約數(shù)為 %dn,i);求 1!+2!+ +n!(n10)main()int n,i;long temp=1,sn=0; /* 從9!以后,所得的值就超過(guò)了int范圍*/scanf(%d,&n); for(i=1;i=n;i+) temp*=i;sn+=temp; /* 如果沒(méi)有這一步,求的就是 n!*/pri

13、ntf(%ldn,sn);那么想想,如果求 1!+3!+5!+ +n!應(yīng)該怎么辦?1 整除判斷一個(gè)整數(shù)是不是素?cái)?shù) ( 素?cái)?shù)就是只能被本身和 的數(shù))。#include math.hmain()int num,i,flag=0; scanf(%d,&num);for(i=2;iflag=0; /* 標(biāo)志變量復(fù)位 */if(num%i=0)flag=1;break;if(flag=O) printf( 是素?cái)?shù) n);else printf( 不是素?cái)?shù) n);可以說(shuō),在所有的 C語(yǔ)言書(shū)上,都有判斷素?cái)?shù)的例題。它的 編程思想是:把一個(gè)變量作為標(biāo)志變量,用來(lái)標(biāo)志是不是素 數(shù);循環(huán)體是從2到sqrt(num

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

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

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

17、在在使用遞歸函數(shù)的時(shí)候,問(wèn) 題多多。這里面一般有兩個(gè)原因:一是如何往下遞歸,也就 是不知道怎么取一個(gè)變量遞歸下去; 二是不知道怎么終止遞 歸,經(jīng)常弄個(gè)死循環(huán)出來(lái)。下面看幾個(gè)例子:求1+2+100的和先分析一下。第一遞歸變量的問(wèn)題,從題目上看應(yīng)該取1,2, ,100 這些變量的值作為遞歸的條件;第二就是如何 終止的問(wèn)題, 從題目上看應(yīng)該是當(dāng)數(shù)為 100的時(shí)候就不能往 下加了。那么我們?cè)囍鴮?xiě)一下程序。int add(int);main()int num=1,sn;sn=add(num);printf(%dn,sn);getch();int add(int num)static int sn;sn+

18、=num;if(num=100) return sn;add(+num);分析一下程序:前調(diào)用 add(1),然后在子函數(shù)中把這個(gè)1加到sn上面。接著調(diào)用add(2),再把sn加2上來(lái)。這樣一 直到100,到了 100的時(shí)候,先加上來(lái),然后發(fā)現(xiàn)滿足了if條件,這時(shí)返回sn的值,也就是1+2+100的值了。 這里有一個(gè)問(wèn)題一定要注意,就是static int sn;有些人就不明白,為什么要使用 static 類型修飾符,為什 么不使用int sn=0;?如果使用int sn=0;這樣的語(yǔ)句,在每次調(diào)用函數(shù)add()的時(shí)候,sn的值都是賦值為0,也就是第 一步雖然加了 1上來(lái),可是第二次調(diào)用的時(shí)候

19、,sn又回到了 0。我們前面說(shuō)了, static 能保證本次初始化的值是上次執(zhí) 行后的值,這樣也就保證了前面想加的結(jié)果不會(huì)丟失。如果 你修改為int sn=0,最后結(jié)果一定是最后的 100這個(gè)值而不 是 5050。求數(shù)列 s(n)=s(n-1)+s(n-2) 的第 n 項(xiàng)。其中 s(1)=s(2)=1可以看出,終止條件一定是s(1)=s (2)=1。遞歸下降的參數(shù)定是n。int a(int);main()int n,s;scanf(%d,&n);s=a(n);printf(%dn,s);getch();int a(int n)if(n3) return 1;return a(n-1)+a(n-

20、2);這個(gè)題目主要說(shuō)明的是, 在函數(shù)中, 不一定只有一個(gè) return 語(yǔ)句,可以有很多,但是每次對(duì)歸的時(shí)候只有一個(gè)起作用。 題目不難理解,這兒不分析了。 說(shuō)了這些遞歸,其實(shí)它和函數(shù)的調(diào)用沒(méi)有大的區(qū)別,主要就 是一個(gè)終止條件要選好。 遞歸函數(shù)很多時(shí)候都能用循環(huán)來(lái)處main()int n=20,array20;int i;for(i=0;iN;I+)if(i2) arrayi=1;else arrayi=arrayi-1+arrayi-2;printf(%dn,array19); getch();但是它有一個(gè)缺陷,如果想通過(guò)鍵盤(pán)來(lái)得上面的程序就是實(shí)現(xiàn)一模一樣的功能的 就是 n 的值不是通過(guò)鍵盤(pán)輸

21、入來(lái)得到。 到n可以這樣:main()int n,i;int s1=1,s2=1,tempscanf(%d,&n); for(i=3;i .自左向右! + - + - * & sizeof自右向左* / % 自左向右+ - 自左向右 自左向右 = 自左向右= != 自左向右& 自左向右A自左向右| 自左向右& 自左向右| 自左向右?: 自右向左自右向左= += -= *= /= %= &= A= |= =( 最低 ) , 自左向右精品文檔 一個(gè)表達(dá)式的返回值都可以用來(lái)判斷真假, 除非沒(méi)有任何返 回值的 void 型和返回?zé)o法判斷真假的結(jié)構(gòu)。當(dāng)表達(dá)式的值 不等于 0 時(shí),它就是 “真 ”,否則就

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

23、條件 為假時(shí)執(zhí)行另外一段代碼。在 C 語(yǔ)句中利用 else 語(yǔ)句來(lái)達(dá) 到這個(gè)目的。if( 表達(dá)式 ) 語(yǔ)句 1;else 語(yǔ)句 2;同樣,當(dāng)語(yǔ)句 1或語(yǔ)句 2是多于一個(gè)語(yǔ)句時(shí),需要用 把語(yǔ) 句括起來(lái)。例如: if(x=0) y=x;else y=-x;三、if-else if-else結(jié)構(gòu)。if( 表達(dá)式 1)語(yǔ)句 1;else if( 表達(dá)式 2)語(yǔ)句 2;else if( 表達(dá)式 3)語(yǔ)句 3;else語(yǔ)句n;這種結(jié)構(gòu)是從上到下逐個(gè)對(duì)條件進(jìn)行判斷,一旦發(fā)現(xiàn)條件滿點(diǎn)足就執(zhí)行與它有關(guān)的語(yǔ)句,并跳過(guò)其它剩余階梯;|若沒(méi)有一個(gè)條件滿足,則執(zhí)行最后一個(gè)else語(yǔ)句n。最后這個(gè)else 常起著缺省條件

24、的作用。同樣,如果每一個(gè)條件中有多于一 條語(yǔ)句要執(zhí)行時(shí),必須使用和把這些語(yǔ)句包括在其中。條件語(yǔ)句可以嵌套,這種情況經(jīng)常碰到,但條件嵌套語(yǔ)句容 易出錯(cuò),其原因主要是不知道哪個(gè)if對(duì)應(yīng)哪個(gè)else。例如:if(x20|xv-10) if(yv=100&yx) printf(Good);elseprintf(Bad);對(duì)于上述情況,Turbo C2.0 規(guī)定:else 語(yǔ)句與最近的一個(gè) if 語(yǔ)句匹配,上例中的 else 與if(yx) 相匹配。為了使else與if(x20|x20|x-10)if(yx) printf(Good);else printf(Bad);下面舉幾個(gè)例子:輸入一個(gè)數(shù) , 如

25、果大于 0,輸出 plus; 如果是負(fù)數(shù),輸出 negative; 如果正好是 0,則輸出 zero 。main()float num; scanf(%f,&f); if(num0) printf(plusn);else if(num=0) y=x;else y=-x;printf(%fn,y); 程序比較簡(jiǎn)單,這兒就不分析了。其實(shí) Trubo C 2.0 把一些常用的功能都寫(xiě)好了,我們只需要使用就可。例如求絕對(duì)值的功能在C的庫(kù)里面就有??聪旅娴模?include math.hmain()float x,y;scanf(%f,&x);y=fabs(x); /* 求 x 的絕對(duì)值,然后賦值給 y

26、*/ printf(%fn,y);都是求絕這個(gè)程序和上面的程序完成的功能是一模一樣的, 對(duì)值。可以看出,用下面這個(gè)方法比上面就要好一些。由于 fabs() 是一個(gè)函數(shù),系統(tǒng)自帶的,所以在使用它的時(shí)候,我 們必須把它所在的庫(kù)文件 math.h 包含都程序中,即程序最 前面一行。類似的還有求開(kāi)方 sqrt() ,求指數(shù)冪 exp() 等等, 這些與數(shù)學(xué)方面有關(guān)的函數(shù)都在 math.h 里面。具體哪些有 哪些沒(méi)有,在什么庫(kù)里面,可以查看一些手冊(cè)。輸入x,輸出y, x和y滿足關(guān)系:x-5 y=x; -5=x1 y=2*x+5;1=x=4 y=3*x-2; 程序如下: main() float x,y;

27、 scanf(%f,&x);if(x-5)y=x;else if(-5=x&x1) y=2*x+5;else if(1=x&x4)y=x+6;elsey=3*x-2; printf(%fn,y);這里要說(shuō)明兩點(diǎn):.-5=x&x1不能寫(xiě)成-5=x1;1=x&x4 也不能寫(xiě)成1=x=y& x=z) printf(%ft,x);if(y=z) printf(%ft%fn,y,z);else printf(%ft%fn,z,y);else if(y=x&y =z)printf(%ft,y);if(x=z) printf(%ft%fn,x,z);else printf(%ft%fn,z,x);print

28、f(%ft,z);if(x=y) printf(%ft%fn,x,y);else printf(%ft%fn,y,x);說(shuō)明:這是一個(gè)典型的if語(yǔ)句嵌套結(jié)構(gòu),如果不使用括號(hào), 那么if和else的對(duì)應(yīng)關(guān)系就亂了。四、switch-case 語(yǔ)句在編寫(xiě)程序時(shí),經(jīng)常會(huì)碰到按不同情況分轉(zhuǎn)的多路問(wèn)題,這時(shí)可用嵌套if -else-if語(yǔ)句來(lái)實(shí)現(xiàn),但if-else-if 語(yǔ)句使用不方便,并且容易出錯(cuò)。對(duì)這種情況 ,Turbo C2.0提供了一個(gè)開(kāi)關(guān)語(yǔ)句。開(kāi)關(guān)語(yǔ)句格式為:switch(變量) case 常量1:語(yǔ)句1或空;case 常量2:語(yǔ)句2或空;case常量n:語(yǔ)句n或空;default:語(yǔ)句n+1

29、或空;執(zhí)行switch開(kāi)關(guān)語(yǔ)句時(shí),將變量逐個(gè)與 case后的常量進(jìn)行 比較,若與其中一個(gè)相等,則執(zhí)行該常量下的語(yǔ)句,若不與任 何一個(gè)常量相等,則執(zhí)行default后面的語(yǔ)句。switch中變量可以是數(shù)值,也可以是字符,但必須是整數(shù)??梢允÷砸恍?case和default 。每個(gè)case或default后的語(yǔ)句可以是語(yǔ)句體,但不需要使用 和括起來(lái)。例如:main()int x,y;scanf(%d,&x);witch(x)case 1:y=x+1;break; /* 退出開(kāi)關(guān)語(yǔ)句 , 遇到 break 才退出 */ case 4:y=2*x+1;break;default:y=x-;break;

30、printf(%dn,y);從上面的例子可以看出,用開(kāi)關(guān)語(yǔ)句編的程序一定可以用 if語(yǔ)句做。那么在什么情況下需要用switch語(yǔ)句呢? 一般在出現(xiàn)比較整的情況下或者能轉(zhuǎn)化成比較整數(shù)的情況下使用。看下面的例子:例子:一個(gè)學(xué)生的成績(jī)分成五等,超過(guò)90分的為A ,80-89 的為B,70-79為C,60-69為D,60分以下為E。現(xiàn)在輸入一個(gè)學(xué)生的成績(jī),輸出他的等級(jí)。(1).用if語(yǔ)句main()float num;char grade;scanf(%d,&nu m);if(num=90) grade=A;else if(num=80&num=70&num=60&num69) grade=D;els

31、e grade=E;printf(%c,grade);(2). 用 switch 語(yǔ)句 main()int num;char grade; scanf(%d,&num); num/=10; switch(num)case 10:case 9: grade=A;break;case 8: grade=B;break;case 7:grade=C;break;case 6: grade=D;break;default:grade=E; break;printf(%c,grade);說(shuō)明一點(diǎn),并不是每個(gè) case 里面有都語(yǔ)句,有時(shí)侯里面是 空的,就好象這一題。 switch 語(yǔ)句執(zhí)行的順序是從第一

32、 case 判斷,如果正確就往下執(zhí)行,直到 break ;如果不正確,就 執(zhí)行下一個(gè) case 。所以在這里,當(dāng)成績(jī)是 100 分時(shí),執(zhí)行 case 10: 然后往下執(zhí)行, grade=A;break; 退出。 想想看,這里為什么要用 num/=10; ? 假設(shè)當(dāng)程序中有浮點(diǎn)數(shù)時(shí)怎么辦呢?前面我們說(shuō)的都是無(wú)參數(shù)無(wú)返回值的函數(shù),實(shí)際程序中,我 們經(jīng)常使用到帶參數(shù)有返回值的函數(shù)。一、函數(shù)參數(shù)傳遞1. 形式參數(shù)和實(shí)際參數(shù) 函數(shù)的調(diào)用值把一些表達(dá)式作為參數(shù)傳遞給函數(shù)。 函數(shù)定義 中的參數(shù)是形式參數(shù), 函數(shù)的調(diào)用者提供給函數(shù)的參數(shù)叫實(shí) 際參數(shù)。在函數(shù)調(diào)用之前,實(shí)際參數(shù)的值將被拷貝到這些形 式參數(shù)中。2.

33、 參數(shù)傳遞 先看一個(gè)例子: void a(int); /*注意函數(shù)聲明的形式 */main()int num;scanf(%d,&num);a(num); /* 注意調(diào)用形式 */void a(int num_back) /*注意定義形式 */printf(%dn,num_back);在主函數(shù)中,先定義一個(gè)變量,然后輸入一個(gè)值,在a()這個(gè)函數(shù)中輸出。當(dāng)程序運(yùn)行a(num);這一步時(shí),把num的值賦值給num_back,在運(yùn)行程序過(guò)程中,把實(shí)際參數(shù)的值傳給形式參數(shù),這就是函數(shù)參數(shù)的傳遞。形參和實(shí)參可能不只一個(gè),如果多于一個(gè)時(shí),函數(shù)聲明、調(diào) 用、定義的形式都要一一對(duì)應(yīng),不僅個(gè)數(shù)要對(duì)應(yīng),參數(shù)的數(shù)

34、據(jù)類型也要對(duì)應(yīng)。void a(int,float);main()int numl;float num2; scanf(%d,&num1); scanf(%f,&num2); a(num1,num2);void a(int num1_back,float num2_back)printf(%d,%fn,num1_back,num2_back);上面的例子中,函數(shù)有兩個(gè)參數(shù),一個(gè)是整型,一個(gè)是浮點(diǎn) 型,那么在聲明、調(diào)用、定義的時(shí)候,不僅個(gè)數(shù)要一樣,類 型也要對(duì)應(yīng)。如果不對(duì)應(yīng),有可能使的編譯錯(cuò)誤,即使沒(méi)錯(cuò) 誤,也有可能讓數(shù)據(jù)傳遞過(guò)程中出現(xiàn)錯(cuò)誤。再看一個(gè)例子:void a(int);main()int

35、 num;scanf(%d,&num);a(num);void a(int num) printf(%dn,num);看上面的例子,形式參數(shù)和實(shí)際參數(shù)的標(biāo)識(shí)符都是num,程序把實(shí)際參數(shù)num的值傳遞給形式參數(shù)num。有些人可能就不明白了,既然兩個(gè)都是num為什么還要傳遞呢?干脆這樣不就行了嗎:void a();main()int num;scanf(%d,&num);a();void a()printf(%dn,num);其實(shí)不然,這就要涉及到標(biāo)識(shí)符作用域的問(wèn)題。作用域的意 思就是說(shuō),哪些變量在哪些范圍內(nèi)有效。一個(gè)標(biāo)識(shí)符在一個(gè) 語(yǔ)句塊中聲明, 那么這個(gè)標(biāo)識(shí)符僅在當(dāng)前和更低的語(yǔ)句塊中 可見(jiàn),在函

36、數(shù)外部的其實(shí)地方不可見(jiàn),其他地方同名的標(biāo)識(shí) 符不受影響,后面我們會(huì)系統(tǒng)講解作用域的問(wèn)題。在這兒你 就要知道兩個(gè)同名的變量在不同的函數(shù)中是互不干擾的。 前面將的都是變量與變量之間的值傳遞, 其實(shí)函數(shù)也可以傳 遞數(shù)組之間的值??聪旅娴睦樱簐oid a(int );main()int array5,i;for(i=0;i5;i+) scanf(%d,&arrayi);a(array);void a(int array)int i;for(i=0;i5;i+) printf(%dt,arrayi);printf(n);這就是數(shù)組之間的值傳遞。注意他們的聲明和定義形式,和 變量參數(shù)傳遞有什么區(qū)別?有了

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

38、聲明函數(shù) */ main()int num,area;scanf(%d,&num);area=a(num); /* 調(diào)用時(shí)的形式 */printf(%d,area);int a(int num)int area_back;area_back=num*num;return area_back; /* 返回一個(gè)值 */和前面的程序有幾點(diǎn)不同:(1). 聲明函數(shù)類型時(shí),不是 void ,而是 int 。這是由于最后 要求的面積是整型的,所以聲明函數(shù)的返回值類型是整型。(2).return 語(yǔ)句 它的意思就是返回一個(gè)值。在 C 語(yǔ)言中, return 一定是在函數(shù)的最后一行。. 調(diào)用函數(shù)的時(shí)候 , 由

39、于函數(shù)有一個(gè)返回值,所以必須要 用變量接受這個(gè)返回值 ( 不是絕對(duì)的 ) ,如果我們不用一個(gè)變 量接受這個(gè)值,函數(shù)還照樣返回,但是返回的這個(gè)值沒(méi)有使 用。上面的例子運(yùn)行過(guò)程是這樣的,先把實(shí)參的值傳遞給形參, 然后在子函數(shù)里計(jì)算面積得到 area_back ,然后返回這個(gè)面 積到主函數(shù),也就是把 area_back 賦值給 area ,最后輸出。 前面說(shuō)了,返回值有時(shí)不一定非要用一個(gè)變量來(lái)接受,我們 可以把上面的程序簡(jiǎn)化為:int a(int);main()int num;scanf(%d,&num);printf(%d,a(num); /* 函數(shù)調(diào)用放在這兒 */int a(int num)int area_back;area_back=num*num;return area_back;這樣函數(shù)

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論