




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第5章 循環(huán)結(jié)構(gòu)程序設(shè)計,C 語言程序設(shè)計,本章主要內(nèi)容,為什么需要循環(huán)控制 用while語句實現(xiàn)循環(huán) 用do-while實現(xiàn)循環(huán) 用for語句實現(xiàn)循環(huán) 循環(huán)的嵌套 幾種循環(huán)的比較 改變循環(huán)執(zhí)行的狀態(tài) 循環(huán)結(jié)構(gòu)程序設(shè)計舉例,在日常生活中或是在程序所處理的問題中常常遇到需要重復(fù)處理的問題,5.1 為什么需要循環(huán)控制,例如:全班有50個學生,統(tǒng)計各學生三門課的平均成績。,scanf(“%f,%f,%f”,輸入學生1的三門課成績,并計算平均值后輸出,scanf(“%f,%f,%f”,輸入學生2的三門課成績,并計算平均值后輸出,要對50個學生進行相同操作,重復(fù)50次,使用循環(huán)結(jié)構(gòu):,i=1; whil
2、e(i=50) scanf(“%f,%f,%f”, ,大多數(shù)的應(yīng)用程序都會包含循環(huán)結(jié)構(gòu) 循環(huán)結(jié)構(gòu)和順序結(jié)構(gòu)、選擇結(jié)構(gòu)是結(jié)構(gòu)化程序設(shè)計的三種基本結(jié)構(gòu),它們是各種復(fù)雜程序的基本構(gòu)造單元,5.2 用while語句實現(xiàn)循環(huán),語句一般格式 while (表達式) 語句,一般為關(guān)系表達式或邏輯表達式,也可以是C語言其他類型的合法表達式 用來控制循環(huán)體是否執(zhí)行,稱為內(nèi)嵌語句,可以是基本語句、控制語句,也可以是復(fù)合語句 是循環(huán)重復(fù)執(zhí)行的部分,功能:,計算表達式的值,為非0(邏輯真)時,重復(fù)執(zhí)行內(nèi)嵌語句,每執(zhí)行一次,就判斷一次表達式的值,直到表達式的值為0 時結(jié)束循環(huán),轉(zhuǎn)去執(zhí)行while后面的語句。,循環(huán)控制條
3、件,循環(huán)體,例如:,【例5.1】編寫程序,求100個自然數(shù)的和 即: s=1+2+3+ +100,思路:尋找加數(shù)與求和的規(guī)律,加數(shù)i從1變到100,每循環(huán)一次,使i增1,直到i的值超過100。i的初值設(shè)為1。 求和設(shè)變量 sum 存放和,循環(huán)求sum=sum+i,直至i超過100。,算法和程序:,main( ) int i,sum; i=1; sum=0; while (i=100) sum=sum+i; i+; printf(sum=%dn,sum); ,程序輸出結(jié)果: sum=5050,i: 循環(huán)控制變量 sum: 累加器,注意:,循環(huán)體如果包括一個以上的語句,應(yīng)該用花括號括起來,作為復(fù)合
4、語句。如果不加花括號,while語句的范圍只到while后面的第一個分號處。 不要忽略給i和sum賦初值,否則他們的值是不可預(yù)測的,結(jié)果不正確。 在循環(huán)體中必須有使循環(huán)趨向結(jié)束的操作,否則循環(huán)將無限進行(死循環(huán))。如i+,5.3 用do-while語句實現(xiàn)循環(huán),語句一般格式 do 語句 while (表達式); 功能: 先執(zhí)行內(nèi)嵌語句(循環(huán)體),之后計算表達式的值,不為0(邏輯真)時,再執(zhí)行循環(huán)體并判斷條件,直到表達式的值為 0 結(jié)束循環(huán),轉(zhuǎn)去執(zhí)行while下面的語句。,do-while循環(huán)的算法,N-S結(jié)構(gòu)圖,main( ) int i=1,sum=0; do sum=sum+i; i+;
5、while (i=100); printf(%dn,sum); ,用do-while語句 求100個自然數(shù)的和,說明:,while和do-while都能實現(xiàn)循環(huán)控制,while結(jié)構(gòu)程序通常都可以轉(zhuǎn)換成do-while結(jié)構(gòu),區(qū)別: do- while 語句先執(zhí)行循環(huán)體再判斷條件,循環(huán)體至少執(zhí)行一次; while 語句先判斷條件再執(zhí)行循環(huán)體,循環(huán)體有可能一次也不執(zhí)行,while和do-while循環(huán)的比較。,int i,sum=0; printf(“i=?”); scanf(“%d”,int i,sum=0; printf(“i=?”); scanf(“%d”,當while后面的表達式的第一次的值
6、為“真”時,兩種循環(huán)得到的結(jié)果相同;否則不相同,5.4 用for語句實現(xiàn)循環(huán),語句一般格式 for (表達式1;表達式2;表達式3) 語句,功能: 計算表達式1的值,再判斷表達式2,如果其值為非0(邏輯真),則執(zhí)行內(nèi)嵌語句(循環(huán)體),并計算表達式3;之后再去判斷表達式2,一直到其值為0時結(jié)束循環(huán),執(zhí)行后續(xù)語句。,循環(huán)初始條件,循環(huán)控制條件,循環(huán)體,for語句的算法,例如: main( ) int i,sum; sum=0; for ( i=1; i=100; i+) sum=sum+i; printf(sum=%dn,sum); ,可部分或全部省略,但“;”不可省略,省略for語句的表達式,
7、表達式1、2、3全省略,即: for ( ; ; ) 就等同于:while (1),會無限循環(huán)(死循環(huán)),注意:在省略某個表達式時,應(yīng)在適當位置進行循環(huán)控制的必要操作,以保證循環(huán)的正確執(zhí)行, 省略表達式1和表達式3,即: for(;表達式2;) 就等同于:while( 表達式2 ) 省略表達式2,即: for(表達式1; ;表達式3) 就等同于:表達式1; while(1)表達式3;,例如:, i=1; for ( ; i100) for (i=1; i100) i+; ,省略表達式1,省略表達式2,省略表達式3,省略表達式1,2,3,表達式1可是是設(shè)置循環(huán)變量初值的賦值表達式,也可以是逗號表
8、達式。見 P123 表達式1和3可以使一個簡單的表達式,也可以是逗號表達式,即包含一個以上的簡單表達式。 表達式2一般為關(guān)系表達式或邏輯表達式,但也可以是數(shù)值表達式或字符表達式,只要其值為非0,就執(zhí)行循環(huán)體。 for(i=0;(c=getchar()!=n;i+=c);,說明:,所有用 while 語句實現(xiàn)的循環(huán)都可以用for 語句實現(xiàn)。,等價于:,for(表達式1;表達式2 ;表達式3) 語句;,表達式1; while (表達式2) 語句; 表達式3; ,for語句的簡單應(yīng)用,【例5.4】求n! ,即計算p=123n的值。,思路:求階乘與求累加的運算處理過程類似,只要將“+”變?yōu)椤?”。,設(shè)
9、置: 乘數(shù)i ,初值為1,終值為n(n是循環(huán)控制終值,需要從鍵盤輸入) 累乘器 p ,每次循環(huán)令p = p*i,程序:,int main( ) int i, n; long p; p=1; printf(Enter n:); scanf(%d, ,思考: 如何輸出1!, 2!, , n! ? 如何求s =1!+ 2!+ + n! ?,原碼、反碼和補碼,正數(shù):原碼、反碼、補碼相同 符號位為0,數(shù)值為對應(yīng)的二進制數(shù)。 109,01101101原 = 01101101反 = 01101101補 負數(shù): 原碼符號位為1,數(shù)值為絕對值的二進制數(shù)。 10911101101原 反碼符號位為1,數(shù)值為絕對值的
10、二進制數(shù)各位變反。 10910010010反 補碼符號位為1,數(shù)值為絕對值的二進制數(shù)各位變反加1。 10910010011補,上次課重點回顧,條件運算符:? : (必須同時使用,相當于if語句) 條件表達式的一般形式 表達式1 ? 表達式2 : 表達式3 先求解表達式1的值如果為真,則求解求解表達式2。 若為假,則求解表達式3的值 條件運算符優(yōu)先級高于賦值、逗號運算符,低于其他運算符 .條件運算符具有右結(jié)合性。當一個表達式中出現(xiàn)多個條件運算符時,應(yīng)該將位于最右邊的問號與離它最近的冒號配對,Switch實現(xiàn)多分支選擇,switch語句的一般形式 switch (表達式) case 常量表達式1:
11、 語句序列1;break; case 常量表達式2: 語句序列2; break; case 常量表達式n: 語句序列n; break; default : 語句序列n+1 ,循環(huán)結(jié)構(gòu)程序設(shè)計:,while 語句一般格式 while (表達式) 語句 do while語句一般格式 do 語句 while (表達式);,當while后面的表達式的第一次的值為“真”時,兩種循環(huán)得到的結(jié)果相同;否則不相同,for語句一般格式 for (表達式1;表達式2;表達式3) 內(nèi)嵌語句,計算表達式1的值, 判斷表達式2,如果其值為非0(邏輯 真),則執(zhí)行內(nèi)嵌語句。否則跳出執(zhí)行后續(xù)語句。 計算表達式3; 再去判斷
12、表達式 2 for(i=1;i=100;i+) 執(zhí)行后續(xù)語句。 sum=sum+i ;,5.5 循環(huán)的嵌套,如果循環(huán)語句的循環(huán)體內(nèi)又包含了另一條循環(huán)語句,則稱為循環(huán)的嵌套 (P125) 例如: #include int main( ) int i, j; for ( i=1; i10; i+ ) for ( j=1; j=i; j+ ) printf (%4dn,i*j); return 0; ,外循環(huán)語句,內(nèi)循環(huán)語句,注意:,while、do-while、for循環(huán)語句可以并列,也可以相互嵌套,但要層次清楚,不能出現(xiàn)交叉。 多重循環(huán)程序執(zhí)行時,外層循環(huán)每執(zhí)行一次,內(nèi)層循環(huán)都需要循環(huán)執(zhí)行多次。
13、 例如:,for(a=1;a=10;a+) for (b=0;b=5;b+) ,外循環(huán)執(zhí)行了10次,內(nèi)循環(huán)執(zhí)行6次 循環(huán)正常結(jié)束時,內(nèi)循環(huán)執(zhí)行了106=60次,5.6 幾種循環(huán)語句的比較,3種循環(huán)都可以用來處理同一問題。 while和do-while語句的表達式只有一個,for語句有三個。 while 和for先判斷循環(huán)條件后執(zhí)行循環(huán)體,do-while語句先執(zhí)行循環(huán)體后判斷循環(huán)條件。 do-while語句的while后面需要注意有分號(;)。,while語句多用于循環(huán)次數(shù)不定的情況 do-while語句多用于至少要運行一次的情況 for語句多用于要賦初值或循環(huán)次數(shù)固定的情況,5.7 改變循環(huán)
14、執(zhí)行的狀態(tài),有如下三種語句實現(xiàn)跳轉(zhuǎn): continue語句 break語句 在循環(huán)語句的循環(huán)體中使用,可以進行循環(huán)的流程控制,5.7.1 用break語句提前終止循環(huán),功能: 利用break語句能夠強迫終止本層循環(huán),轉(zhuǎn)到后續(xù)語句執(zhí)行。,while語句,do-while語句,for語句,例如:, int x,n=0,s=0; while (n10) scanf(%d, int x,n=0,s=0; do scanf(%d, for (n=0,s=0; n10; n+ ) scanf(%d, ,5.7.2 用continue語句提前結(jié)束本次循環(huán),功能: 中斷循環(huán)體的本次執(zhí)行(即跳過循環(huán)體中尚未執(zhí)行
15、的語句),立即開始執(zhí)行下一次循環(huán)。,while語句,do-while語句,for語句,例如:, int x,n=0,s=0; while (n10) scanf(%d, int x,n=0,s=0; do scanf(%d, for (n=0,s=0; n10; n+) scanf(%d, ,5.7.3 break語句和continue語句的區(qū)別,continue語句只結(jié)束本次循環(huán),而不是終止整個循環(huán)的執(zhí)行 break語句結(jié)束整個循環(huán)過程,不再判斷執(zhí)行循環(huán)的條件是否成立,while(表達式1) if (表達式2) break; ,while(表達式1) if (表達式2) continue;
16、,例5.6 輸出以下4*5的矩陣。 1 2 3 4 5 2 4 6 8 10 3 6 9 12 15 4 8 12 16 20,解題思路: 可以用循環(huán)的嵌套來處理此問題 用外循環(huán)來輸出一行數(shù)據(jù) 用內(nèi)循環(huán)來輸出一列數(shù)據(jù) 按矩陣的格式(每行5個數(shù)據(jù))輸出,#include int main() int i,j,n=0; for (i=1;i=4;i+) for (j=1;j=5;j+,n+) if (n%5=0) printf (“n”); printf (%dt,i*j); printf(n); return 0; ,控制一行內(nèi)輸出5個數(shù)據(jù),#include int main() int i,j
17、,n=0; for (i=1;i=4;i+) for (j=1;j=5;j+,n+) if (n%5=0) printf (“n”); printf (%dt,i*j); printf(n); return 0; ,雙重循環(huán),#include int main() int i,j,n=0; for (i=1;i=4;i+) for (j=1;j=5;j+,n+) if (n%5=0) printf (“n”); printf (%dt,i*j); printf(n); return 0; ,控制輸出4行,#include int main() int i,j,n=0; for (i=1;i=4
18、;i+) for (j=1;j=5;j+,n+) if (n%5=0) printf (“n”); printf (%dt,i*j); printf(n); return 0; ,控制每行中輸出5個數(shù)據(jù),#include int main() int i,j,n=0; for (i=1;i=4;i+) for (j=1;j=5;j+,n+) if (n%5=0) printf (“n”); printf (%dt,i*j); printf(n); return 0; ,i=1時,j由1變到5 i*j的值是1,2,3,4,5,#include int main() int i,j,n=0; fo
19、r (i=1;i=4;i+) for (j=1;j=5;j+,n+) if (n%5=0) printf (n); printf (%dt,i*j); printf(n); return 0; ,i=2時,j也由1變到5 i*j的值是2,4,6,8,10,如何修改程序,不輸出第三行?,#include int main() int i,j,n=0; for (i=1;i=4;i+) for (j=1;j=5;j+,n+) if (n%5=0) printf (“n”); printf (%dt,i*j); printf(n); return 0; ,if (i=3 ,遇到第3行第1列,終止內(nèi)循
20、環(huán),#include int main() int i,j,n=0; for (i=1;i=4;i+) for (j=1;j=5;j+,n+) if (n%5=0) printf (“n”); printf (%dt,i*j); printf(n); return 0; ,if (i=3 ,原來第3行第1個數(shù)據(jù)3沒有輸出,5.8 循環(huán)程序設(shè)計舉例,【例1】按每行輸出5個數(shù)的形式輸出Fibonacci數(shù)列的前40項 。,思路:Fibonacci數(shù)列的前幾項是:1、1、2、3、5、8、13、21、34、。此數(shù)列的變化規(guī)律是:,設(shè)變量f1、f2和f3,并為f1和f2賦初值1,令f3=f1+f2得到第
21、3項; 將f1f2, f2f3,再求f3=f1+f2得到第4項; 依此類推求第5項、第6項,這是一種遞推算法 應(yīng)采用循環(huán)實現(xiàn),算法和程序,#include int main( ) int i,f1,f2,f3; f1=f2=1; printf(%12dn%12dn,f1,f2); for (i=1; i=38; i+) f3=f1+f2; f1=f2; f2=f3; printf(%12ld,f3); if (i%5=0) printf(n); return 0; ,舉例2,【例2】 判斷輸入一個大于3的整數(shù)n,是否為素數(shù)。若是素數(shù),輸出“YES”,若不是,輸出“NO”。,思路:素數(shù)是指只能被
22、1和它本身整除的數(shù),如5、7、11、17、等。,分別用2、3、,n-1嘗試能否整除整數(shù)n。如果n能被某個數(shù)整除,則n就不是素數(shù)。,設(shè)除數(shù)為j,從2循環(huán)到n-1,算法和程序:,#include “stdio.h int main( ) int j,m,k; printf(Enter an integer number: ); scanf(%d, ,【例3】把100200之間能被7整除的數(shù),以十個數(shù)為一行的形式輸出,最后輸出一共有多少個這樣的數(shù)。,舉例3,算法和程序,#include int main( ) int n,j=0; for(n=100;n=200;n+) if (n%7!=0) co
23、ntinue; printf(%6d,n); j+; if (j%10=0) printf(n); printf(j=%dn,j); return 0; ,for語句一般格式 for (表達式1;表達式2;表達式3) 內(nèi)嵌語句,計算表達式1的值, 判斷表達式2,如果其值為非0(邏輯 真),則執(zhí)行內(nèi)嵌語句。否則跳出執(zhí)行后續(xù)語句。 計算表達式3; 再去判斷表達式 2 for(i=1;i=100;i+) 執(zhí)行后續(xù)語句。 sum=sum+i ;,上次課重點回顧,while(表達式1) if (表達式2) break; ,while(表達式1) if (表達式2) continue; ,【例4】編程序求
24、210000以內(nèi)的完全數(shù)。,完全數(shù):一個數(shù)的因子(除了這個數(shù)本身)之和等于該數(shù)本身。,思路: 設(shè)定i從2變到10000,對每個i找到其因子和s; 判定 is?若相等,則i為完全數(shù),否則不是。,例如:6的因子是1、2、3,因子和 1+2+36 因此 6 是完全數(shù),用雙層循環(huán)實現(xiàn),舉例4,算法和程序:,int main( ) int i,j,s; for (i=2; i=10000; i+) s=0; for (j=1; ji; j+) if (i%j=0) s+=j; if (i=s) printf(%6dn,s); return 0; ,舉例5,【例5】編程序,輸出以下圖形。,* * * *,
25、一共有4 行,每行由空格和星號組成:空格數(shù)按行增加,星號按行減少 變量 i 控制輸出行數(shù), 從1變化到4 變量 j 控制輸出每行的空格和星號: j 從1變化到 i,每次輸出一個空格 j 從1變化到 8-2*i1,每次輸出一個星號,使用雙重循環(huán)實現(xiàn),思路:,算法和程序:,#include int main( ) int i,j; for (i=1; i=4; i+) for (j=1; j=i; j+) printf( ); for (j=1;j=8-(2*i-1);j+) printf(*); printf(n); return 0; ,“水仙花數(shù)”-narcissus numbers 輸出所有的水仙花數(shù),三位數(shù)(大于等于100小于1000). 例如:153 各位數(shù)字立方和等于該數(shù)本身。 13+53+33=153 百位數(shù):153/100=1 十位數(shù): 153/10-1*10=5 個位數(shù):153%10=3 (求余數(shù)),舉例6,例5.7用 公式求 的近似值,直到發(fā)現(xiàn)某一項的絕對值小于10-6 為止(該項不累計加)。,舉例7,解題思路: 求 近似值的方法很多,本題是一種 其他方法:,每項的
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年湖北省十堰市單招職業(yè)傾向性測試題庫新版
- 2024年醫(yī)用供應(yīng)裝置項目投資申請報告
- 生物-云南省師范大學附屬中學2025屆高三下學期開學考試試題和答案
- 2025年度國際貿(mào)易付款委托三方協(xié)議
- 2025年度全包家裝裝修與智能家居智能安防報警系統(tǒng)合同
- 2025年度單身公寓房產(chǎn)租賃合同(含智能家居)
- 2025年度信用卡旅游保險借款合同
- 二零二五年度勞動合同解除后離職員工離職后職業(yè)發(fā)展支持合同
- 2025年度XX小區(qū)智慧物業(yè)管理系統(tǒng)服務(wù)協(xié)議書
- 2025年度兼職協(xié)議書-旅游行業(yè)導游兼職人員合作協(xié)議
- 山東省泰安市新泰市2024-2025學年(五四學制)九年級上學期1月期末道德與法治試題(含答案)
- 1《北京的春節(jié)》課后練習(含答案)
- (完整版)陸河客家請神書
- 2025年行業(yè)協(xié)會年度工作計劃
- DB3502T 160-2024 工業(yè)產(chǎn)品質(zhì)量技術(shù)幫扶和質(zhì)量安全監(jiān)管聯(lián)動工作規(guī)范
- 2025年學校教師政治理論學習計劃
- 集團專利管理制度內(nèi)容
- 春節(jié)后復(fù)工安全教育培訓
- 提高發(fā)票額度的合同6篇
- 小散工程施工安全培訓
- 車站信號自動控制(第二版) 課件 -3-6502部分
評論
0/150
提交評論