版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、第六章 6.1 概述什么是循環(huán)?為什么要使用循環(huán)?問題1:問題2:求學(xué)生平均成績 分?jǐn)?shù)相加后除以課數(shù) 在許多問題中需要用到循環(huán)控制。循環(huán)結(jié)構(gòu)是結(jié)構(gòu)化程序設(shè)計的基本結(jié)構(gòu)之一,它和順序結(jié)構(gòu)、選擇結(jié)構(gòu)共同作為各種復(fù)雜程序的基本構(gòu)造單元。 6.2 goto語句以及用goto語句構(gòu)成循環(huán) 結(jié)構(gòu)化程序設(shè)計方法主張限制使用goto語句,因為濫用goto語句將使程序流程無規(guī)律、可讀性差。一般來說,可以有兩種用途:(1) 與if語句一起構(gòu)成循環(huán)結(jié)構(gòu);(2) 從循環(huán)體中跳轉(zhuǎn)到循環(huán)體外。 但是這種用法不符合結(jié)構(gòu)化原則,一般不宜采用,只有在不得已時(例如能大大提高效率)才使用。 6.3 用while語句實現(xiàn)循環(huán)whi
2、le語句用來實現(xiàn)“當(dāng)型”循環(huán)結(jié)構(gòu)。一般形式: while (表達式) 語句 當(dāng)表達式為非0值時,執(zhí)行while語句中的內(nèi)嵌語句(循環(huán)體)。 其特點是:先判斷表達式,后執(zhí)行語句。語句關(guān)鍵字表達循環(huán)條件的表達式循環(huán)體 例6.2 求1到100的和#include void main() int i,sum=0; i=1; while (i=100) sum=sum+i; i+; printf(%dn,sum); 說明:(1)循環(huán)體如果包含一個以上的語句,應(yīng)該用花括弧括起來,以復(fù)合語句形式出現(xiàn).(2)在循環(huán)體中應(yīng)有使循環(huán)趨向于結(jié)束的語句。運行結(jié)果:5050 6.4 用do-while語句實現(xiàn)循環(huán) 執(zhí)行
3、過程:先執(zhí)行一次指定的循環(huán)體語句,然后判別表達式,當(dāng)表達式的值為非零(“真”) 時,返回重新執(zhí)行循環(huán)體語句,如此反復(fù),直到表達式的值等于0為止,此時循環(huán)結(jié)束。do-while語句的特點: 先執(zhí)行循環(huán)體, 然后判斷循環(huán)條件是否成立。 一般形式: do 循環(huán)體語句 while (表達式);例6.3 求1到100的和#include void main() int i,sum=0; i=1; do sum=sum+i; i+; while(i=100); printf(%dn,sum); 運行結(jié)果:5050例6.4 while和do-while循環(huán)的比較 (1) #include (2) #incl
4、ude void main ( ) void main( )int sum=0,i; int sum=0,i; scanf(“%d,&i); scanf(”%d,&i); while (i=10) do sum=sum+i; sum=sum+i; i+; i+; while (i=10); 運行結(jié)果:1 sum=55 再運行一次: 11sum=0運行結(jié)果:1 sum=55 再運行一次: 11sum=11說明:(1)當(dāng)while后面的表達式的第一次的值為“真”時,兩種循環(huán)得到的結(jié)果相同。否則,二者結(jié)果不相同。 6.5 用for語句實現(xiàn)循環(huán)C語言中的for語句使用最為靈活,不僅可以用于循環(huán)次數(shù)已經(jīng)
5、確定的情況,而且可以用于循環(huán)次數(shù)不確定而只給出循環(huán)結(jié)束條件的情況,它完全可以代替while語句。一般形式: for(表達式1;表達式2;表達式3) 語句循環(huán)變量更新循環(huán)條件循環(huán)變量賦初值 6.5 用for 語句實現(xiàn)循環(huán)for語句的執(zhí)行過程: (1) 先求解表達式1。 (2) 求解表達式2,若其值為真(值為非0),則執(zhí) 行for語句中指定的內(nèi)嵌語句,然后執(zhí)行下 面第(3)步。若為假(值為0),則結(jié)束循環(huán), 轉(zhuǎn)到第(5)步。 (3) 求解表達式3。 (4) 轉(zhuǎn)回上面第(2)步驟繼續(xù)執(zhí)行。 (5) 循環(huán)結(jié)束,執(zhí)行for語句下面的一個語句 6.5 用for 語句實現(xiàn)循環(huán)表達式2?執(zhí)行語句成立不成立執(zhí)行
6、for循環(huán)之后的語句執(zhí)行表達式3執(zhí)行表達式1循環(huán)初始條件循環(huán)控制條件循環(huán)體for語句等價于下列語句:表達式1;while (表達式2) 語句; 表達式3; 6.5 用for 語句實現(xiàn)循環(huán)說明:(1) for語句的一般形式中的“表達式1”可以省略,此時應(yīng)在for語句之前給循環(huán)變量賦初值。注意省略表達式1時,其后的分號不能省略。如 for(;i=100;i+) sum=sum+i; 執(zhí)行時,跳過“求解表達式1”這一步,其他不變。 6.5 用for 語句實現(xiàn)循環(huán)說明:(2) 如果表達式2省略,即不判斷循環(huán)條件,循環(huán)無終止地進行下去。也就是認(rèn)為表達式2始終為真。例如:for(i=1; ;i+) sum
7、=sum+i; 表達式1是一個賦值表達式,表達式2空缺。它相當(dāng)于: i=1; while(1) sum=sum+1;i+; 6.5 用for 語句實現(xiàn)循環(huán)說明:(3) 表達式3也可以省略,但此時程序設(shè)計者應(yīng)另外設(shè)法保證循環(huán)能正常結(jié)束。如: for(i=1;i=100;) sum=sum+i;i+; 在上面的for語句中只有表達式1和表達式2,而沒有表達式3。i+的操作不放在for語句的表達式3的位置處,而作為循環(huán)體的一部分,效果是一樣的,都能使循環(huán)正常結(jié)束。 6.5 用for 語句實現(xiàn)循環(huán)說明:(4) 可以省略表達式1和表達式3,只有表達式2,即只給循環(huán)條件。如: for(;i=100;) w
8、hile(i=100) sum=sum+i; 相當(dāng)于 sum=sum+i; i+; i+; 在這種情況下,完全等同于while語句。可見for語句比while語句功能強,除了可以給出循環(huán)條件外,還可以賦初值,使循環(huán)變量自動增值等。 6.5 用for 語句實現(xiàn)循環(huán)說明:(5) 3個表達式都可省略,如: for(; ;) 語句 相當(dāng)于 while(1) 語句 即不設(shè)初值,不判斷條件(認(rèn)為表達式2為真值),循環(huán)變量不增值。無終止地執(zhí)行循環(huán)體。 6.5 用for 語句實現(xiàn)循環(huán)說明:(6) 表達式1可以是設(shè)置循環(huán)變量初值的賦值表達式,也可以是與循環(huán)變量無關(guān)的其他表達式。如: for (sum=0;i=1
9、00;i+) sum=sum+i; 表達式3也可以是與循環(huán)控制無關(guān)的任意表達式。 6.5 用for 語句實現(xiàn)循環(huán)說明: 表達式1和表達式3可以是一個簡單的表達式,也可以是逗號表達式,即包含一個以上的簡單表達式,中間用逗號間隔。如: for(sum=0,i=1;i=100;i+) sum=sum+i;或 for(i=0,j=100;i=j;i+,j-) k=i+j; 表達式1和表達式3都是逗號表達式,各包含兩個賦值表達式,即同時設(shè)兩個初值,使兩個變量增值. 6.5 用for 語句實現(xiàn)循環(huán)說明: 在逗號表達式內(nèi)按自左至右順序求解,整個逗號表達式的值為其中最右邊的表達式的值。如: for(i=1;i
10、=100;i+,i+) sum=sum+i;相當(dāng)于 for(i=1;i=100;i=i+2) sum=sum+i; 6.5 用for 語句實現(xiàn)循環(huán)說明:(7) 表達式一般是關(guān)系表達式(如i=100)或邏輯表達式 (如ab & xy),但也可以是數(shù)值表達式或字符表達 式,只要其值為非零,就執(zhí)行循環(huán)體。 6.5 用for 語句實現(xiàn)循環(huán) for(i=0;(c=getchar()!=n;i+=c); 在表達式2中先從終端接收一個字符賦給c,然后判斷此賦值表達式的值是否不等于n(換行符),如果不等于n,就執(zhí)行循環(huán)體。注意:此for語句的循環(huán)體為空語句,把本來要在循環(huán)體內(nèi)處理的內(nèi)容放在表達式3中,作用是一
11、樣的??梢奻or語句功能強,可以在表達式中完成本來應(yīng)在循環(huán)體內(nèi)完成的操作。 6.5 用for 語句實現(xiàn)循環(huán) for( ;(c=getchar()!=n;) printf(%c,c); for語句中只有表達式2,而無表達式1和表達式3。其作用是每讀入一個字符后立即輸出該字符,直到輸入一個“換行”為止。請注意,從終端鍵盤向計算機輸入時,是在按Enter鍵以后才將一批數(shù)據(jù)一起送到內(nèi)存緩沖區(qū)中去的。運行情況:Computer (輸入)Computer (輸出)而不是Ccoommppuutteerr 6.5 用for語句實現(xiàn)循環(huán)注意: C語言中的for語句比其他語言(如BASIC,PASCAL)中的FO
12、R語句功能強得多??梢园蜒h(huán)體和一些與循環(huán)控制無關(guān)的操作也作為表達式1或表達式3出現(xiàn),這樣程序可以短小簡潔。但過分地利用這一特點會使for語句顯得雜亂,可讀性降低,最好不要把與循環(huán)控制無關(guān)的內(nèi)容放到for語句中。 6.6 循環(huán)的嵌套一個循環(huán)體內(nèi)又包含另一個完整的循環(huán)結(jié)構(gòu) 稱為循環(huán)的嵌套。內(nèi)嵌的循環(huán)中還可以嵌套 循環(huán),這就是多層循環(huán)。三種循環(huán)(while循環(huán)、do-while循環(huán)和for循 環(huán))可以互相嵌套。 6.6 循環(huán)的嵌套下面幾種都是合法的形式:(1) while( ) (2) do (3) for(;) while( ) do for(;) while( ); while( ); 6.6
13、 循環(huán)的嵌套(4) while( ) (5) for(;) (6) do do while( ) for(;) while( ) while( ) 6.7 幾種循環(huán)的比較(1)四種循環(huán)都可以用來處理同一問題,一般情況下它們可以互相代替。但一般不提倡用goto型循環(huán)。(2)在while循環(huán)和do-while循環(huán)中,只在while后面的括號內(nèi)指定循環(huán)條件,因此為了使循環(huán)能正常結(jié)束,應(yīng)在循環(huán)體中包含使循環(huán)趨于結(jié)束的語句(如i+,或i=i+1等)。 6.7 幾種循環(huán)的比較 for循環(huán)可以在表達式3中包含使循環(huán)趨于結(jié)束的操作,甚至可以將循環(huán)體中的操作全部放到表達式3中。因此for語句的功能更強,凡用wh
14、ile循環(huán)能完成的,用for循環(huán)都能實現(xiàn)。 (3)用while和do-while循環(huán)時,循環(huán)變量初始化的操作應(yīng)在while和do-while語句之前完成。而for語句可以在表達式1中實現(xiàn)循環(huán)變量的初始化。 6.7 幾種循環(huán)的比較(4)while循環(huán)、do-while循環(huán)和for循環(huán),可以用break語句跳出循環(huán),用continue語句結(jié)束本次循環(huán)(break語句和continue語句見下節(jié))。而對用goto語句和if語句構(gòu)成的循環(huán),不能用break語句和continue語句進行控制。 6.8 break語句和continue語句 6.8.1 break語句 break語句可以用來從循環(huán)體內(nèi)跳出
15、循環(huán)體,即提前結(jié)束循環(huán),接著執(zhí)行循環(huán)下面的語句 一般形式: break;注意:break語句不能用于循環(huán)語句和switch語句之外的任何其他語句中。 6.8 break語句和continue語句 例: float pi=3.14159;for(r=1;r100) break; printf(r=%f,area=%fn,r,area); 程序的作用是計算r=1到r=10時的圓面積,直到面積area大于100為止。從上面的for循環(huán)可以看到:當(dāng)area100時,執(zhí)行break語句,提前結(jié)束循環(huán),即不再繼續(xù)執(zhí)行其余的幾次循環(huán)。 6.8 break語句和continue語句 6.8.2 continu
16、e語句 作用為結(jié)束本次循環(huán),即跳過循環(huán)體中下面尚未執(zhí)行的語句,接著進行下一次是否執(zhí)行循環(huán)的判定.一般形式: continue; 6.8 break語句和continue語句 continue語句和break語句的區(qū)別 continue語句只結(jié)束本次循環(huán),而不是終止整個循環(huán)的執(zhí)行。 while(表達式1) /for if(表達式2) continue; 6.8 break語句和continue語句 continue和break的區(qū)別 break語句則是結(jié)束整個循環(huán)過程,不再判斷執(zhí)行循環(huán)的條件是否成立。 while(表達式1) /for if(表達式2) break; 6.9 程序舉例 例6.7
17、求Fibonacci數(shù)列前40個數(shù)。這個數(shù)列有如下特點:第1,2兩個數(shù)為1,1。從第3個數(shù)開始,該數(shù)是其前面兩個數(shù)之和。即:F(1)=1 (n=1)F(2)=1 (n=2)F(n)=F(n-1)+F(n-2) (n3) 算法如圖所示:例6.7求Fibonacci數(shù)列前40個數(shù)。 #include void main() long int f1,f2; int i; f1=1;f2=1; for(i=1; i=20; i+) printf(%12ld %12ld ,f1,f2); if(i%2=0) printf(n); f1=f1+f2; f2=f2+f1; 運行結(jié)果: 1 1 2 3 5 8
18、 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 57022887 9227465 14930352 24157817 39088169 63245986 102334155 6.9 程序舉例 例6.8 判斷m是否素數(shù)。算法思想:讓m被2到除,如果m能被2之中任何一個整數(shù)整除,則提前結(jié)束循環(huán),此時i必然小于或等于k(即);如果m不能被2k(即)之間的任一整數(shù)
19、整除,則在完成最后一次循環(huán)后,i還要加1,因此i=k+1,然后才終止循環(huán)。在循環(huán)之后判別i的值是否大于或等于k+1,若是,則表明未曾被2k之間任一整數(shù)整除過,因此輸出“是素數(shù)”。 例6.8 判斷m是否素數(shù)。 #include #include void main()int m,i,k; scanf(%d,&m); k=sqrt(m); for (i=2;ik) printf(%d is a prime numbern,m); else printf(%d is not a prime numbern,m); 運行結(jié)果: 1717 is a prime number 例6.9 求100200間的
20、全部素數(shù)。#include #include void main() int m,k,i,n=0; for(m=101;m=200;m=m+2) k=sqrt(m); for (i=2;i=k+1) printf(%d ,m);n=n+1; if(n%10=0) printf(n); printf (n);運行結(jié)果: 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 6.9 程序舉例 例6.10 譯密碼。為使電文保密,往往按一定規(guī)律將其轉(zhuǎn)換成密碼,收報人再按約定的規(guī)律將其譯回原
21、文。 思路: 將字母A變成字母E,a變成e,即變成其后的第4個字母,W變成A,X變成B,Y變成C,Z變成D。 更進一步,將任何一個字母變成其后的第n個字母,如何進行加密。(整理思路,改進算法,使之更通用)此題作為本次實驗報告的附加題1。#include void main() char c; int n; scanf(%d,&n); getchar(); n=n%26; while(c=getchar()!=n) /c=getchar(); while(c!=n) if(c=a & cz) c=c-26; else if(c=A & cZ) c=c-26; else if (cA) c=c+2
22、6; printf(%c,c); /c=getchar(); 附加題2猜數(shù)游戲 編程先由計算機“想”出一個1-100之間的數(shù)請人猜。如果猜對了,在屏幕上輸出猜了多少次才猜對此數(shù),以此來反映猜數(shù)者“猜”的水平,則游戲結(jié)束;否則計算機給出提示,告訴所猜的數(shù)是太大還是太小,最多可猜10次,若猜了10次仍為猜中的話,則停止本次猜數(shù)。每次運行程序可反復(fù)猜多個數(shù),直到操作者想停止時才結(jié)束。#include#include#include /getche();getch();#includevoid main()int magic;int guess;int count;char reply;srand(u
23、nsigned)time(NULL); do magic=rand()%100+1; count=0; do printf(please guess a magic number:); scanf( “%d”, &guess ); count+; if(guessmagic) printf(wrong! Too high!n); else if(guessmagic) printf(wrong! Too low!n); else printf(Right!n); while( guess!=magic & count10 ); printf(count=%dn,count); printf(D
24、o you want to continue(Y/N or y/n)?); reply=getche(); /reply=getch(); /reply=getchar(); reply=getchar(); printf(n);while( reply=y| reply=Y );printf(The game is overn);例:求自然數(shù)1-100中能被3整除的數(shù)之和。 main() int i,s=0; printf(“n %d”,s); 求能被3整除但不被7整除的數(shù)之和?for(i=1;i=100;i+) if(i%3=0)s+=i;for(i=3;i=100;i+=3) s+=i;
25、 for(i=3;i=100;i+=3) if (i%7)s+=i; 例:求任意100個數(shù)中的最大值。 main() int i,a,max; max=? for(i=1;imax) max=a; printf(“n max=%d”,max); 循環(huán)體中沒有引用循環(huán)變量。i的作用? 求任意個數(shù)中的最大值?for(i=1; ;i+) if(a=-9999)break;max=-32768;例:找出行號乘以列號等于100的座位。 main() int i,j; for(i=1;i=30;i+) for(j=1;j=20;j+) if(i*j=100) printf(“n%d,%d”,i,j); 注意循環(huán)的關(guān)系例:百錢買百雞問題。 給定100塊錢,要求正好買100只雞,已知公雞5元/只,母雞3元/只,小雞1元/3只,問公雞、母雞和小雞應(yīng)各買多少只?若考慮用方程組: x+y+z=100 5x+3y+z/3=100 是一多解問題。用測試法求解的程序: main() int x,y,z; for(x=1;x=100;x+) for(y=1;y=100;y+) for(z=1;z=100;z+) if(x+y+z=100&5*x+3*y+z/3.0=100) printf(“n%d,%d,%d”,x,y,z)
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年寶雞三和職業(yè)學(xué)院招聘備考題庫(3人)及答案詳解(奪冠系列)
- 2026年老年人康復(fù)訓(xùn)練日常生活能力提升題庫
- 2025北京京東方機器人有限公司招聘備考題庫含答案詳解
- 2026江蘇省對外科學(xué)技術(shù)促進會招聘備考題庫及答案詳解1套
- 2026廣西百色市事業(yè)單位招聘1563人備考題庫及答案詳解(易錯題)
- 2026廣西河池市金城江區(qū)大數(shù)據(jù)發(fā)展局招聘編外工作人員1人備考題庫完整參考答案詳解
- 2026年度青島市李滄區(qū)所屬事業(yè)單位公開招聘工作人員備考題庫(32名)及參考答案詳解1套
- 2026寧夏公務(wù)員考試備考題庫(984人)及一套答案詳解
- 2025湖南永州市雙牌縣殯儀館勞務(wù)派遣人員招聘4人備考題庫參考答案詳解
- 2026廣東浩傳管理服務(wù)有限公司招聘10人備考題庫有答案詳解
- 2025上海開放大學(xué)(上海市電視中等專業(yè)學(xué)校)工作人員招聘3人(二)考試筆試參考題庫附答案解析
- 急性闌尾炎與右側(cè)輸尿管結(jié)石鑒別診斷方案
- 公司網(wǎng)絡(luò)團隊介紹
- 路虎攬勝購買合同
- 2025年文化旅游活動效果評估計劃可行性研究報告
- 塑木地板銷售合同范本
- 《青島市中小學(xué)心理危機干預(yù) 指導(dǎo)手冊》
- 三北工程林草濕荒一體化保護修復(fù)(2025年度退化草原修復(fù))監(jiān)理方案投標(biāo)文件(技術(shù)方案)
- 2024江蘇省常熟市中考物理試卷【歷年真題】附答案詳解
- 2025年企業(yè)法律合規(guī)性風(fēng)險評估與治理方案
- DBJT15-162-2019 建筑基坑施工監(jiān)測技術(shù)標(biāo)準(zhǔn)
評論
0/150
提交評論