C語言課件:5_第六章 循環(huán)控制_第1頁
C語言課件:5_第六章 循環(huán)控制_第2頁
C語言課件:5_第六章 循環(huán)控制_第3頁
C語言課件:5_第六章 循環(huán)控制_第4頁
C語言課件:5_第六章 循環(huán)控制_第5頁
已閱讀5頁,還剩52頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第六章 循環(huán)控制(Cycle Control),了解goto語句和if 語句構(gòu)成的循環(huán)。 熟練掌握for循環(huán)語句、while循環(huán)語句和do-while循環(huán)語句,以及break語句、continue語句的使用。 熟練掌握循環(huán)結(jié)構(gòu)程序設(shè)計(jì)的概念及其程序編制技術(shù)。,void main() int i=1; long int sigma=1; while (i=10) sigma=sigma*i; i+; printf(“10!=%ldn”, sigma); ,sigma=1*2*3*4*5*6*7*8*9*10;,10!=3628800,sigma,思考:如果不使用long int,還可 以使用什么

2、變量類型定義sigma,循環(huán)結(jié)構(gòu)的程序流程是: 在滿足給定條件時(shí),反復(fù)執(zhí)行某個(gè)程序段。,語言中可以用以下語句來實(shí)現(xiàn)循環(huán): 用goto語句和 if 語句構(gòu)成循環(huán); 用while語句; 用do_while語句; 用for語句。,6.2 goto語句和goto語句構(gòu)成的循環(huán),一、 goto 語句(Goto Sentence),goto 語句為無條件轉(zhuǎn)向語句,其作用為:使程序的執(zhí)行無條件地轉(zhuǎn)移到指定處。,執(zhí)行過程:執(zhí)行語句時(shí),程序轉(zhuǎn)移到以標(biāo)號(hào)(定名規(guī)則與變量相同)為前綴的語句處繼續(xù)執(zhí)行。,如:向前跳 goto label; label:語句; 向后跳 label:語句; goto label;,如:

3、goto label_1; goto 123;,說明:, goto語句是一種非結(jié)構(gòu)化語句,結(jié)構(gòu)化程序設(shè)計(jì)方法不提倡使用goto語句,因?yàn)闉E用goto語句將使程序流程無規(guī)律,可讀性差。但也不是絕對(duì)禁止使用,只有在能夠大大提高程序效率時(shí)才使用。,切記:不要從循環(huán)體外跳到循環(huán)體內(nèi)!,二、用goto語句和 if 語句構(gòu)成循環(huán),例:計(jì)算10!并輸出結(jié)果。,void main() int i=1, sum=1; loop: if (i=10) sum=sum*i; i+; goto loop; printf(“10!=%dn”,sum); ,運(yùn)行結(jié)果:10!=24320,本應(yīng)是:10!=3628800,v

4、oid main() int i=1; long sum=1; loop: if (i=10) sum=sum*i; i+; goto loop; printf(“10!=%ldn”,sum); ,6.3 while循環(huán)語句,例:將上面計(jì)算10!并輸出結(jié)果的程序用 while語句寫出:,/用while循環(huán)語句 void main() int i=1; long int sum=1; while (i=10) sum=sum*i; i+; printf(“10!=%ldn”,sum); ,/用goto語句 void main() int i=1; long int sum=1; loop: if

5、 (i=10) sum=sum*i; i+; goto loop; printf(“10!=%ldn”,sum); ,例:計(jì)算y=xn,Enter the value of x and n : 2.5 4 x = 2.500000; n = 4; x to power n = 39.062500,void main() int count=1,n; float x,y=1.0; printf(“Enter the value of x and n : ”); scanf(“%f %d”, ,循環(huán)結(jié)構(gòu)的術(shù)語,1. 循環(huán)條件: 是循環(huán)結(jié)構(gòu)中的測試表達(dá)式。,如:while(i=10),2. 循環(huán)體:

6、是在每個(gè)循環(huán)周期均要執(zhí)行一次的語 句。循環(huán)體可以是任何語句,簡單語 句、復(fù)合語句、空語句均可以。,如:上例while語句中用花括號(hào)括起來的復(fù)合語句。,3. 循環(huán)控制變量:在循環(huán)條件中控制測試條件為 真或?yàn)榧俚淖兞俊?如:上例while語句中使用的變量 i 。,注意: 循環(huán)條件中的表達(dá)式一般是邏輯表達(dá)式或關(guān)系表達(dá)式,也可以是算術(shù)表達(dá)式(非0為真,0為假)。一般表達(dá)式中應(yīng)含有循環(huán)控制變量。 while (3) while (0) 雖然從程序設(shè)計(jì)的角度上說是不合理的,但卻是合法的。,while (3) 語句 表示無限循環(huán) while (0) 語句 表示不進(jìn)入循環(huán)體,要寫出一個(gè)正確的循環(huán)結(jié)構(gòu),對(duì)控制變

7、量要做三方面工作: 控制變量賦初值; 把控制變量寫入正確的循環(huán)條件(測試表達(dá)式); 控制變量的更新、調(diào)整。 int count=1; while(count=n)/測試表達(dá)式 y=y*x; count+; ,6.4 do-while循環(huán)語句,分號(hào)不能少,例:將上面計(jì)算10!并輸出結(jié)果的程序用do-while語句寫出:,/用while循環(huán)語句 void main() int i=1; long int sum=1; while (i=10) sum=sum*i; i+; printf(“10!=%ldn”,sum); ,/用do-while循環(huán)語句 void main() int i=1; lo

8、ng int sum=1; do sum=sum*i; i+; while (i=10); printf(“10!=%ldn”,sum); ,將while和do-while循環(huán)做一下比較:,#include void main() int i; long sum=1; scanf(“%d”, ,#include void main() int i; long sum=1; scanf(“%d”, ,輸入:9 輸出:90,輸入:11 輸出:1,輸入:9 輸出:90,輸入:11 輸出:11,比較上面兩個(gè)程序,雖然結(jié)構(gòu)是相同的,在輸入值為有效值時(shí)結(jié)果相同,但當(dāng)輸入無效值時(shí)輸出結(jié)果是不同的。為什么?,

9、while與do-while的主要區(qū)別:,6.5 for循環(huán)語句,一般形式:,for(表達(dá)式1 ;表達(dá)式2 ;表達(dá)式3) 語句(循環(huán)體),表達(dá)式1:變量初始化 表達(dá)式2:循環(huán)控制條件測試 表達(dá)式3:控制變量更新,前面已經(jīng)說明,要正確表達(dá)循環(huán)結(jié)構(gòu)應(yīng)注意三方面的問題:控制變量的初始化,循環(huán)條件的設(shè)置和控制變量的更新。 for語句在書寫形式上正好體現(xiàn)了這種緊密的邏輯關(guān)系。,執(zhí)行過程:, 求出表達(dá)式1的值,若表達(dá)式1是逗號(hào)表達(dá)式,則依次計(jì)算; 對(duì)“表達(dá)式2”進(jìn)行判斷,為真轉(zhuǎn),為假則退出循環(huán); 執(zhí)行循環(huán)體中語句; 執(zhí)行“表達(dá)式3”,若表達(dá)式3是逗號(hào)表達(dá)式,則依次計(jì)算; 轉(zhuǎn)向。,例:將上面計(jì)算10!的程序

10、用 for語句寫出:,main() int i; long sum=1; for(i=1; i=10; i+) sum=sum*i; printf(“10!=%ldn”,sum); ,main() int i; long sum; for(i=1,sum=1; i=10; sum=sum*i, i+) ; printf(“10!=%ldn”,sum); ,空語句,說明:,表達(dá)式1:用于進(jìn)入循環(huán)體之前給某些變量賦初值。 若省略,可在for語句前給變量賦初值。,main() int i; long sum=1; i=1; for( ; i=10; i+) sum=sum*i; printf(“10

11、!=%ldn”,sum); , for 循環(huán)的三個(gè)表達(dá)式起著不同的作用, 根據(jù)需要可以省略。,表達(dá)式2:決定循環(huán)的條件,若省略,則為無限 循環(huán)。,如: for(i0; ;i+) 語句 for( ; ; ) 語句 for(i0;i=10;i-) 語句,無限循環(huán) (死循環(huán)),表達(dá)式3:用于循環(huán)一次后對(duì)某些變量進(jìn)行修改。 若省略,可在循環(huán)體內(nèi)對(duì)變量進(jìn)行修改。,main() int i; long sum=1; for(i=1 ; i=10 ; ) sum=sum*i; i+; printf(“10!=%ldn”,sum); , for語句功能很強(qiáng),其中表達(dá)式1和表達(dá)式3可以是逗號(hào)表達(dá)式,但為增強(qiáng)程序

12、的可讀性,一般不要把與循環(huán)無關(guān)的東西放到for語句中。,如:sum=1; for(i=1 ; i=10 ; i+) sum=sum*i;, for 語句最為靈活,它完全可以代替while語句。,如:i=1; while(i=10) sum=sum*i; i+; ,等效于,for(i=1;i=10;i+) sum=sum*i;,6.6 三種循環(huán)語句的總結(jié),三種循環(huán)語句共同的特點(diǎn)是:當(dāng)循環(huán)控制條件非零時(shí),執(zhí)行循環(huán)體語句,否則終止循環(huán)。,循環(huán)體語句可以是任何語句,簡單語句、復(fù)合語句、空語句均可以。,for(expression 1) Setence 1; Setence 2; Setence 3;

13、,if(e1) S1; S2; else if(e2) S3;,while和for語句先判斷循環(huán)控制條件,所以它們的循環(huán)體可能一次也不執(zhí)行;而do-while語句后判斷循環(huán)控制條件,它至少執(zhí)行一次循環(huán)體。 在循環(huán)條件中或循環(huán)體內(nèi)必須有使循環(huán)趨于結(jié)束的語句,否則會(huì)出現(xiàn)死循環(huán)等異常情況。 三種循環(huán)可以處理同一問題,一般情況可以互相代替。但在實(shí)際應(yīng)用中,我們要根據(jù)具體情況來選用不同的循環(huán)語句。選用的一般原則如下:,如果循環(huán)次數(shù)在執(zhí)行循環(huán)體之前就已確定,一般用for語句;如果循環(huán)次數(shù)是根據(jù)循環(huán)體的執(zhí)行情況確定的,一般用while語句或者do-while語句。,(循環(huán)次數(shù)確定例) int i,n; lo

14、ng sum=1; scanf(“%d”,n); for(i=1;i=n;i+) sum=sum*i;,(循環(huán)次數(shù)不確定例) char c do c=getchar(); printf(“%c”,c); while(c!=q,當(dāng)循環(huán)體至少執(zhí)行一次時(shí),用do-while語句;反之,如果循環(huán)體可能一次也不執(zhí)行時(shí),用while語句。,(循環(huán)體至少執(zhí)行一次) /*只有當(dāng)用戶鍵入q或Q,才結(jié)束循環(huán)*/ char c; do c=getchar(); printf(“%c”,c); while(c!=q,(循環(huán)體可能一次不執(zhí)行) /*只有不是q或Q的字符才被打印*/ char c; c=getchar()

15、; while (c!=q ,注意:!(a for( i=0; i7; i+ ) printf(*); /*打印第1行星號(hào)*/ printf(n); for( i=0; i7; i+ ) printf(*); /*打印第2行星號(hào)*/ printf(n); for( i=0; i7; i+ ) printf(“*”);/*打印第8行星號(hào)*/ ,什么叫循環(huán)嵌套?,一個(gè)循環(huán)的循環(huán)體中套有另一個(gè)循環(huán)叫循環(huán)嵌套。這種嵌套過程可以一直重復(fù)下去。,一個(gè)循環(huán)外面包圍一層循環(huán)稱為二重循環(huán)。 一個(gè)循環(huán)外面包圍二層循環(huán)稱為三重循環(huán)。 一個(gè)循環(huán)外面包圍多層循環(huán)稱為多重循環(huán)。,while、do-while、for可以互

16、相嵌套,自由組合。,例:將上例(打印8行7列的星號(hào)矩形)用二重循環(huán)實(shí)現(xiàn)。,#include void main() int i , k; for( i=0; i8; i+ ) for( k=0; k7; k+ ) printf(*); printf(n); ,例:在顯示器上輸出以下圖案。,#include void main() int i ,j, k; for( i=0; i6; i+ )/i=1;i7或者i=1;i=6 for(j=0;j5-i;j+) printf( ); for( k=0; k2*i+1; k+ ) printf(*); printf(n); ,012345678901

17、 0 * 1 * 2 * 3 * 4 * 5*,6.8 break 和continue語句,一、break 語句,功能:結(jié)束當(dāng)前的循環(huán)語句。,解釋:break 語句一般用在循環(huán)體的條件語 句中,其作用是當(dāng)某個(gè)條件滿足時(shí)用 break語句退出當(dāng)前循環(huán)語句,不再繼續(xù)執(zhí) 行剩余的幾次循環(huán)。,例:打印半徑為110的圓的面積,如果面積超過100,則不再打印。,#include #define PI=3.14159/符號(hào)常量 main() int r; float area; for(r=1; r100.0) break;/r=6 printf(area=%fn,area); printf(now, r=

18、%dn,r); ,注意:在嵌套循環(huán)中使用break語句,它只影響包含它的最內(nèi)層循環(huán),即程序僅跳出包圍該break的那層循環(huán)。,例:編寫程序,輸出九九乘法表。 main( ) int i, j; for( i=1; ii ) break; printf(“%3d”, i*j ); printf(“n”); ,運(yùn)行結(jié)果: 1 2 4 3 6 9 4 8 12 16 5 10 15 20 25 6 12 18 24 30 36 7 14 21 28 35 42 49 8 16 24 32 40 48 56 64 9 18 27 36 45 54 63 72 81,功能:結(jié)束本次循環(huán),進(jìn)入下一個(gè)循環(huán)周

19、期。,解釋:一旦執(zhí)行了continue語句,程序就跳 過循環(huán)體中位于該語句后的所有語句, 提前結(jié)束本次循環(huán)并開始下一次循環(huán)。,二、continue語句,例:計(jì)算用戶輸入的所有正整數(shù)的和,忽略負(fù)數(shù),用戶輸入 0 時(shí)結(jié)束。,#include main() long data, sum = 0; do printf(“Please input : data=”); scanf(%ld, ,注意continue語句用于各種循環(huán)語句的情況,a) while(test-condition) - if(-) continue; - - c) for(初始化; 測試表達(dá)式;增量表達(dá)式) - if(-) con

20、tinue; - - b) do - if(-) continue; - - while(test-condition);,注意break語句用于各種循環(huán)語句的情況,a) while(test-condition) - if(-) break; - - c) for(初始化; 測試表達(dá)式;增量表達(dá)式) - if(-) break; - - b) do - if(-) break; - - while(test-condition); - d) for(-) - for(-) - if(-) break; - - ,6.9 程序舉例,例6.6 用/41-1/ 3+1/5-1/7+1/9 求的近似

21、值。 直到最后一項(xiàng)的絕對(duì)值小于10-6為止。,#include math.h main() int sign=1; float n=1,t=1,sum=0, pi; while(fabs(t)=1.e-6)/fabs()求絕對(duì)值的函數(shù) sum=sum+t; n=n+2; sign*= -1; t=sign/n; pi=sum*4; printf(pi=%fn,pi); ,運(yùn)行結(jié)果: pi=3.141594,第幾個(gè)月 小兔子對(duì)數(shù) 中兔子對(duì)數(shù) 老兔子對(duì)數(shù) 總數(shù) 1 1 0 0 1 2 0 1 0 1 3 1 0 1 2 4 1 1 1 3 5 2 1 2 5 6 3 2 3 8 7 5 3 5 1

22、3 .,斐波納契Fibonacci數(shù)列:1,1,2,3,5,8,例6.7 求斐波納契數(shù)列:1,1,2,3,5,8 的前20個(gè)數(shù)。,(該數(shù)列特點(diǎn):第1、2兩個(gè)數(shù)是1、1,從第3個(gè)數(shù) 開始,每個(gè)數(shù)都是其前面兩個(gè)數(shù)之和。),main() int f1=1, f2=1, i; for(i=1;i=10;i+) printf(%6d%6dn,f1,f2); f1=f1+f2; f2=f1+f2; ,運(yùn)行結(jié)果: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765,例6.7 求斐波納契數(shù)列:1,1,2,3,5,8 的前40個(gè)數(shù)

23、。,#include main() long int f1=1, f2=1, i; for(i=1;i=20;i+) printf(%12ld %12ld,f1,f2); if(fmod(i,2)=0) printf(n); f1=f1+f2; f2=f1+f2; ,運(yùn)行結(jié)果: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 2584 4181 6765 ,例6.8 判斷m是否為素?cái)?shù)。,#include main() int m, i ,k; scanf(%d, ,方法:用2 (m)1/2 之間的整數(shù)作為除數(shù)去整除m。,例6.9 錯(cuò)誤處理與多次處理

24、,tmpt=0; do if (tmpt=0) printf(請(qǐng)輸入三角形三邊長a,b,c:n); else printf(請(qǐng)重新輸入三角形三邊長a,b,c:n); scanf(%f,%f,%f,do printf(Please input a float data:n); scanf(%f,例6.10 譯密碼。密碼規(guī)律為每個(gè)字母用其后 第四個(gè)字母代替,26個(gè)字母循環(huán)排列。,#include stdio.h main() char c,c1; while(c=getchar()!=n) if(c=a ,A BCDEFGV W X Y Z 22 23 24 25 26,China! Glmre!

25、,(第三版習(xí)題6.3 ,書P129;第四版習(xí)題5 ,書P140 ),已知:一位數(shù)碼a 和要組成的最大重碼數(shù)tn的位數(shù)n。 求 :各重碼數(shù)的累加和sn。,算法:對(duì)給定的a和n,從i=1 n 依次作: 求第i個(gè)重碼數(shù)tntn*10+a。 (其中tn的初值應(yīng)是0) 求累加和 snsn+tn。,main() int sn,a,n,i,tn; long sn,tn; printf(na, n=); scanf(%d%d,for(tn=0,sn=0,i=1;i=n;i+) tn=tn*10+a; sn+=tn; printf(na+aa+.=%ld,sn); ,(第三版習(xí)題6.7 ,書P129 ;第四版習(xí)

26、題9 ,書P141 ),已知:正整數(shù) 1n1000 求:其中的“完數(shù)”,即一個(gè)數(shù)的所有因子之和等于該數(shù)本身的數(shù)。,算法:對(duì)于n=21000的每一個(gè)數(shù),進(jìn)行: 求出該數(shù)的所有因子并累加于sum(不保 存這些因子)。 (一個(gè)數(shù)n的所有因子的求法:只需用2n/2 的所有數(shù)去除n,能整除的就是其因子。) 當(dāng)能滿足完數(shù)條件時(shí)(sum=n),重新求 出該數(shù)的所有因子并打印。,#include main() int sum,n,i; for(n=2;n=1000;n+) sum=0; for(i=1;i=n/2;i+) if(fmod(n,i)=0) sum+=i;/求出n的因子,計(jì)算其和 if(sum=n

27、) printf(“n%d : ”,n);/打印完數(shù) for(i=1;i=n/2;i+) if(fmod(n,i)=0) printf(“%d ”,i);/重新計(jì)算n的因子,并打印輸出 ,(第三版習(xí)題6.11 ,書P129P130 ;第四版習(xí)題13 ,書P141 ),已知:正數(shù)a和求a的算術(shù)平方根x的公式。 求 :a的算術(shù)平方根x。 算法: 從鍵盤上輸入a,并假設(shè)a的第一個(gè)根 為x=a;誤差標(biāo)志變量dx。 重復(fù)做: 記下上一個(gè)根x0=x; 按公式求下一個(gè)根x;x=(x+a/x)/2; 求兩個(gè)根的誤差絕對(duì)值dx=fabs(x-x0)。 當(dāng)兩次求得的根之差的絕對(duì)值(精度) dx=0.00001時(shí)停止。X即為所求平方根。,#include “math.h” main() float a, x, x0, dx; printf(n a=); scanf(%f, ,要牢記,勿忘在dowhile語句后使用分號(hào); 在for語句

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論