c語言循環(huán)控制語句_第1頁
c語言循環(huán)控制語句_第2頁
c語言循環(huán)控制語句_第3頁
免費(fèi)預(yù)覽已結(jié)束,剩余7頁可下載查看

下載本文檔

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

文檔簡介

1、循環(huán)控制結(jié)構(gòu)(又稱重復(fù)結(jié)構(gòu))是程序中的另一個基本結(jié)構(gòu)在實際問題中,常常需要進(jìn)行大量的重復(fù)處理,循環(huán)結(jié)構(gòu)可以使我們只寫很少的語句,而讓計算機(jī)反復(fù)執(zhí)行,從而完成大量類同的計算C語言提供了 while語句、do.while 語句和for語句實現(xiàn)循環(huán)結(jié)構(gòu).3.4.1while 語句while語句是當(dāng)型循環(huán)控制語句,一般形式為:while表達(dá)式 語句;語句部分稱為循環(huán)體,當(dāng)需要執(zhí)行多條語句時,應(yīng)使用復(fù)合語句.while語句的流程圖見圖 3-8,其特點(diǎn)是先判斷,后執(zhí)行,若條件不成立,有可能一次也不 執(zhí)行.匡3 $ uhile語旬的流強(qiáng)圖例 3-11求 n!分析:n! =n* (n-1)* (n-2)*.2

2、*1,0!=1.即 S0=1,Sn=S n-1* n.可以從 SO 開始,依次求出 S1、S2、.Sn.統(tǒng)一令S等于階乘值,S的初值為0! =1;變量i為計數(shù)器,i從1變到n,每一步令S=S*i, 則最終S中的值就是n!.流程圖見圖3-9,程序如下:Train:int n, i ;long int 呂;print f(Minput n (n>=0) :11);scanf Majin);if (n>=0)5=1;if (n>o)11;whlle (i<=n)s*=l;)prlatf ("tdL = t Id n1lf ny s);elseprint f (

3、9;* inval 1 i input I n ");運(yùn)行結(jié)果如下;input n (n>=0 i01= 1FEW -input n(n>=0):匹6 I=720input n (n>=0 j : -2-iinvalid Input考察圖3-9中循環(huán)部分的流程圖可以看出,在循環(huán)前各變量應(yīng)有合適的值(s=1),另外,控制循環(huán)結(jié)束的變量(此處為i)必須在循環(huán)體中被改變,否則,循環(huán)將無限進(jìn)行下去,成為死 循環(huán)制口利用格卑高利公式求丈 r/4 = 1 - 1/3 + 1/S - 1/? + .直別誥后一項的絕對伯小T第于為止黒序如下=* include* Includecs

4、tdiorh> cmath h>包pl;doublelong int n s;ni;Efcl;pdx)+0;while (fsits (t jpi=pi+t:n=n+l;s=-s;t= (fLost) () f ;flciat; in';E>1 書!*4; printf (,r運(yùn)行結(jié)果為:HLKpl =3.141591s、n的值,本題中,將多項式的每一項用 t表示,S代表符號,在每一次循環(huán)中,只要改變就可求出每一項t.一般情況下,while型循環(huán)最適合于這種情況:知道控制循環(huán)的條件為某個邏輯表達(dá)式的值,而且該表達(dá)式的值會在循環(huán)中被改變,如同例 3-12的情況一樣.3.

5、4.2do.while 語句在C語句中,直到型循環(huán)的語句是do.while,它的一般形式為:do語句 while表達(dá)式其中語句通常為復(fù)合語句,稱為循環(huán)體do.while語句的流程圖見圖 3-10,其基本特點(diǎn)是:先執(zhí)行后判斷,因此,循環(huán)體至少被執(zhí) 行一次.但需要注意的是,do.while與標(biāo)準(zhǔn)的直到型循環(huán)有一個極為重要的區(qū)別,直到型循環(huán)是當(dāng) 條件為真時結(jié)束循環(huán),而do.while語句恰恰相反,當(dāng)條件為真時循環(huán),一旦條件為假,立即結(jié)束循環(huán),請注意 do.while語句的這一特點(diǎn).例3-13計算 sin(x)=x-x3/3!+x5/5!-x7/7!+.直到最后一項的絕對值小于1e-7時為止.分析:這

6、道題使用遞推方法來做.讓多項式的每一項與一個變量n對應(yīng),n的值依次為1,3,5,乙.,從多項式的前一項算后一項,只需將前一項乘一個因子:(-x2)/( n-1)* n)用s表示多項式的值,用t表示每一項的值,程序如下:栽一1干句啟詭程圖#in clude <math.h># in clude <stdio.h>m a i n ()double s, t,x ;int n ;prin tf("please in put x :");scanf("%lf" ,&x);t=x;n=1;s=x;don=n+2;t=t*(-x*x)

7、/(float)( n)-1)/(float)( n); s=s+t;while(fabs(t)>=1e-7);printf("sin(%f)=%lf , "x, s);運(yùn)行結(jié)果如下:RUN?please in putx:1.5753?sin (1.575300)=0.999990RUN?please in putx:-0.65?sin(-0.650000)=-0.6051863.4.3for 語句for語句是循環(huán)控制結(jié)構(gòu)中使用最廣泛的一種循環(huán)控制語句,特別適合已知循環(huán)次數(shù)的情況.它的一般形式為:for(<表達(dá)式1> ; <表達(dá)式2> ; &l

8、t;表達(dá)式3>)語句for語句很好地體現(xiàn)了正確表達(dá)循環(huán)結(jié)構(gòu)應(yīng)注意的三個問題:1) 控制變量的初始化.2) 循環(huán)的條件.3) 循環(huán)控制變量的更新.表達(dá)式1 :一般為賦值表達(dá)式,給控制變量賦初值;表達(dá)式2 :關(guān)系表達(dá)式或邏輯表達(dá)式,循環(huán)控制條件;表達(dá)式3: 一般為賦值表達(dá)式,給控制變量增量或減量語句:循環(huán)體,當(dāng)有多條語句時,必須使用復(fù)合語句for循環(huán)的流程圖如圖3-11,其執(zhí)行過程如下:for3,首先計算表達(dá)式1,然后計算表達(dá)式2,若表達(dá)式2為真,則執(zhí)行循環(huán)體;否則,退出循環(huán),執(zhí)行for循環(huán)后的語句.如果執(zhí)行了循環(huán)體,則循環(huán)體每執(zhí)行一次,都計算表達(dá)式 然后重新計算表達(dá)式 2,依此循環(huán),直至表

9、達(dá)式2的值為假,退出循環(huán).例3-14計算自然數(shù)1到n的平方和.震達(dá)式1|# in clude <stdio.h># in clude <math.h>mai n ()int i;float s;prin tf("please in put n :"); scanf("%d", &n);s=0.0;for(i=1;i<=n;i+) s=s+(float)(i)*(float)(i);,nn" ,n, s); 運(yùn)行結(jié)果如下:RUNplease input n:51*1+2*2+.+5*5=55.000000fo

10、r 語句的幾種格式for 語句的三個表達(dá)式都是可以省略的,但分號 “; ”絕對不能省略 .a. for(;) 語句;這是一個死循環(huán),一般用條件表達(dá)式加break 語句在循環(huán)體內(nèi)適當(dāng)位置,一旦條件滿足時,用 break 語句跳出 for 循環(huán) .例如,在編制菜單控制程序時,可以如下:for(;)printf("please input choice(Q=Exit):"); 顯/* 示菜單語句塊: */ scanf("%c" , &ch);if(ch='Q')or(ch='q')break; 語/* 句段 */b. f

11、or( ;表達(dá)式 2;表達(dá)式 3) 使用條件是:循環(huán)控制變量的初值不是已知常量,而是在前面通過計算得到,例如: i=m-n;?for( ; i<k ;i+) 語句;c. for (表達(dá)式 1;表達(dá)式 2; ) 語句 一般當(dāng)循環(huán)控制變量非規(guī)則變化,而且循環(huán)體中有更新控制變量的語句時使用 . 例如:for(i=1 ; i<=100 ;)?i=i*2+1;?d. for(i=1 , j=n ; i<j ; i+ , j-) 語句;在 for 語句中,表達(dá)式 1、表達(dá)式 3 都可以有一項或多項,如本例中,表達(dá)式1 同時為 i 和 j賦初值,表達(dá)式 3 同時改變 i 和 j 的值 .當(dāng)

12、有不止一項時,各項之間用逗號 “,”分隔 . 另外, C 語言還允許在循環(huán)體內(nèi)改變循環(huán)變量的值,這在某些程序的設(shè)計中是很有用的 . 到此,我們已經(jīng)學(xué)習(xí)了 C 語言中三種循環(huán)控制語句 while 、 do.while 和 for 語句,下面再討 論兩個問題: 三種語句的選用同一個問題,往往既可以用 while 語句解決,也可以用 do.while 或者 for 語句來解決,但在實際應(yīng)用中,應(yīng)根據(jù)具體情況來選用不同的循環(huán)語句,選用的一般原則是:1) 如果循環(huán)次數(shù)在執(zhí)行循環(huán)體之前就已確定,一般用for語句;如果循環(huán)次數(shù)是由循環(huán)體的執(zhí)行情況確定的,一般用 while語句或者do.while語句.2)

13、當(dāng)循環(huán)體至少執(zhí)行一次時,用do.while語句,反之,如果循環(huán)體可能一次也不執(zhí)行,選用while語句.循環(huán)的嵌套一個循環(huán)的循環(huán)體中有另一個循環(huán)叫循環(huán)嵌套.這種嵌套過程可以有很多重.一個循環(huán)外面僅包圍一層循環(huán)叫二重循環(huán);一個循環(huán)外面包圍兩層循環(huán)叫三重循環(huán);一個循環(huán)外面包圍多層循環(huán)叫多重循環(huán).三種循環(huán)語句for、while、do.while可以互相嵌套自由組合.但要注意的是,各循環(huán)必須 完整,相互之間絕不允許交叉.如下面這種形式是不允許的:dofor(;) while();例3-15打印8行7列的星形矩陣 流程圖見圖3-12,程序如下:BEGIN )=1亠厲圖3 2剖3-戸的鼻法適程圖#in cl

14、ude<stdio.h>main ()inti,j;for(i=0;i<8,i+)/* 控制行 */ for(j=0;j<7>j+)/* 控制列 */ printf("*");printf("n") ; /* 換行 */ 打印結(jié)果如下: RUN*將程序中 for(j=0;j<7;j+) 改為 for(j=0;j<i;j+) ,用行數(shù)來控制每行星號的多少,就可以 打印三角形 .3.4.4break 與 continue 語句 有時,我們需要在循環(huán)體中提前跳出循環(huán),或者在滿足某種條件下,不執(zhí)行循環(huán)中剩下 的語句而立即

15、從頭開始新的一輪循環(huán),這時就要用到break 和 continue 語句 .1. break 語句在前面學(xué)習(xí) switch 語句時,我們已經(jīng)接觸到 break 語句,在 case 子句執(zhí)行完后,通過 break 語句使控制立即跳出 switch 結(jié)構(gòu) . 在循環(huán)語句中, break 語句的作用是在循環(huán)體中測試到應(yīng)立 即結(jié)束循環(huán)時,使控制立即跳出循環(huán)結(jié)構(gòu),轉(zhuǎn)而執(zhí)行循環(huán)語句后的語句 .例 3-16打印半徑為 1到 10 的圓的面積,若面積超過 100,則不予打印 . #include<stdio.h>main()intr;float area; for(r=1;r<=10;r+)

16、 area=3.141593*r*r;if(area>100.0)break; printf("square=%fn" , area);printf("nowr=%dn" , r); 運(yùn)行程序:RUN square=3.141593 square=12.566373 square=28.274338 square=50.265488 square=78.539825 nowr=6當(dāng) break 處于嵌套結(jié)構(gòu)中時,它將只跳出最內(nèi)層結(jié)構(gòu),而對外層結(jié)構(gòu)無影響 .2. continue 語句continue 語句只能用于循環(huán)結(jié)構(gòu)中,一旦執(zhí)行了 contin

17、ue 語句,程序就跳過循環(huán)體中位于 該語句后的所有語句,提前結(jié)束本次循環(huán)周期并開始新一輪循環(huán) .例3-17計算半徑為 1到 15的圓的面積,僅打印出超過 50的圓面積 .#include<stdio.h>main()int r;float area;for(r=1;r<=5;r+)area=3.141593*r*r;if(area<50.0)continue;printf("square=%f" , area);結(jié)果為:RUNsquare=50.265488square=78.539825同 break 一樣, continue 語句也僅僅影響該語句

18、本身所處的循環(huán)層,而對外層循環(huán)沒有影響.3.4.5 程序應(yīng)用舉例例 3-18 驗證哥德巴赫猜想:任一充分大的偶數(shù),可以用兩個素數(shù)之和表示,例如:4=2+26=3+3 98=19+79 哥德巴赫猜想是世界著名的數(shù)學(xué)難題, 至今未能在理論上得到證明, 自從計算機(jī)出現(xiàn)后, 人 們就開始用計算機(jī)去嘗試解各種各樣的數(shù)學(xué)難題, 包括費(fèi)馬大定理、 四色問題、 哥德巴赫猜 想等,雖然計算機(jī)無法從理論上嚴(yán)密地證明它們,而只能在很有限的范圍內(nèi)對其進(jìn)行檢驗, 但也不失其意義 .費(fèi)馬大定理已于 1994年得到證明, 而哥德巴赫猜想這枚數(shù)學(xué)王冠上的寶石, 至今無人能及 .分析:我們先不考慮怎樣判斷一個數(shù)是否為素數(shù),而從

19、整體上對這個問題進(jìn)行考慮,可以這樣做:讀入一個偶數(shù)n,將它分成p和q,使n=p+q.怎樣分呢?可以令 p從2開始,每次加1,而令q=n-p,如果p、q均為素數(shù),則正為所求,否則令p=p+q再試.其基本算法如下:1) 讀入大于 3 的偶數(shù) n.2) P=13) do4) p=p+1 ; q=n-p;5) p 是素數(shù)嗎?6) q 是素數(shù)嗎?7) whilep 、 q 有一個不是素數(shù) .8) 輸出 n=p+q.為了判明 p、q 是否是素數(shù), 我們設(shè)置兩個標(biāo)志量 flag p 和 flag q ,初始值為 0,若 p 是素數(shù), 令flag p=1,若q是素數(shù),令flag q=1,于是第7步變成:7)w

20、hile(flag p*flag q=0);再來分析第 5、第 6 步,怎樣判斷一個數(shù)是不是素數(shù)呢? 素數(shù)就是除了 1 和它自身外,不能被任何數(shù)整除的整數(shù),由定義可知: 2、3、5、7、11、13、17、19 等是素數(shù);1、4、6、8、9、10、12、14等不是素數(shù);要判斷i是否是素數(shù),最簡單的辦法是用2、3、4、?i-1這些數(shù)依次去除i,看能否除盡,若被其中之一除盡,則 i 不是素數(shù),反之, i 是素數(shù) .但其實,沒必要用那么多的數(shù)去除,實際上,用反證法很容易證明,如果小于等于i 的平方根的數(shù)都除不盡,則 i 必是素數(shù) .于是,上述算法中的第5步、第 6 步可以細(xì)化為:第 5)步 p 是素數(shù)嗎?flag p=1;for(j=2;j<=sqrt(p);j+)if

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論