ch04 循環(huán)控制.ppt_第1頁
ch04 循環(huán)控制.ppt_第2頁
ch04 循環(huán)控制.ppt_第3頁
ch04 循環(huán)控制.ppt_第4頁
ch04 循環(huán)控制.ppt_第5頁
免費預(yù)覽已結(jié)束,剩余46頁可下載查看

下載本文檔

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

文檔簡介

1、第4章 循環(huán)控制,重復(fù)N次循環(huán) while循環(huán) do while循環(huán) 循環(huán)的中途退出 枚舉法 貪婪法,重復(fù)N次操作,某一組語句要重復(fù)執(zhí)行N次 “重復(fù)n次”循環(huán)通常用 for 語句實現(xiàn),如將1到100共一百個數(shù)相加可寫為: s=0; for (i=1; i=100; +i) s+=i;,i 稱為循環(huán)變量,循環(huán)條件,每次循環(huán)后循環(huán)變量的變化,for循環(huán)語句,格式: for(表達式1;表達式2;表達式3) 語句 執(zhí)行過程: 1.執(zhí)行表達式1 2.執(zhí)行表達式2 3.如果表達式2的結(jié)果為“true”,則執(zhí)行循環(huán)體和表達式3,然后回到2,否則for語句執(zhí)行結(jié)束,循環(huán)體,循環(huán)控制行,for循環(huán)語句 續(xù),作為

2、計數(shù)循環(huán),可以理解為 for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值) 符合循環(huán)條件時的執(zhí)行語句 循環(huán)體所有語句的一次完全執(zhí)行稱為一個循環(huán)周期 循環(huán)體可以是復(fù)合語句或空語句,空語句和復(fù)合語句,單個分號組成的語句成為空語句 用 括起來的一組語句稱為復(fù)合語句。在邏輯上看成一個語句。 復(fù)合語句可以放在任何單語句出現(xiàn)的地方 在復(fù)合語句中可以定義變量(慎用),for循環(huán)實例,某班級有100個學生,設(shè)計一程序統(tǒng)計該班級某門考試成績中的最高分、最低分和平均分。 方案一:先輸入100個整型數(shù),保存在各自的變量中。然后依次檢查這100個數(shù),找出最大的和最小的。在找的過程中順便可以把所有的數(shù)都加起來。最后將總和除

3、100就得到了平均值。,方案一的缺陷,需要定義100個變量 需要輸入100個變量的值 從100個變量中找出最大者,需要100個if 語句 從100個變量中找出最小者,需要100個if 語句 將這100個變量加起來需要一個長長的算術(shù)表達式,方案二,每個學生的分數(shù)在處理過后就沒用了,為此,可以用一個變量保存當前正在處理的分數(shù) 每次輸入分數(shù)的同時將它們加起來:70加40等于110,110加80等于190。并記住最低分的和最高分的值。上述過程重復(fù)100次。,方案二的實現(xiàn),定義: int value, total,max, min; 當輸入每個數(shù)值時必須執(zhí)行下面的步驟,這可以用for循環(huán)實現(xiàn) 請求用戶輸

4、入一個整數(shù)值,將它存儲在變量value中。 將value加入到保存當前和的變量total中。 如果value大于max,將value存于max。 如果value小于min,將value存于min。,#include using namespace std; int main() int value, total, max, min, i; /value:當前輸入數(shù)據(jù),i為循環(huán)變量 total = 0; max = 0; min = 100; /變量的初始化 for (i=1; i value; total += value; if (value max) max = value; if (va

5、lue min) min = value; cout n最高分: max endl; cout 最低分: min endl; cout 平均分: total / 100 endl; return 0; ,注意縮進,for循環(huán)的進一步討論,for循環(huán)的三個表達式可以是任意表達式 三個表達式都是可選的。 如果循環(huán)不需要任何初始化工作,則表達式1可以缺省。如循環(huán)前需要做多個初始化工作,可以將多個初始化工作組合成一個逗號表達式,作為表達式1。,逗號表達式,格式:表達式1,表達式2,,表達式n 執(zhí)行過程:先執(zhí)行表達式1,再執(zhí)行表達式2, ,再執(zhí)行表達式n,整個表達式的計算結(jié)果為最后一個表達式的值 逗號運

6、算符的優(yōu)先級是所有運算符中最低的 如a的初值為0,則表達式 a += 1, a += 2, a += 3, a += 4, a += 5 的結(jié)果為 15,有了逗號表達式,從1加到100的問題就可以只用一個語句: for (i=1, s=0; i=100; +i) s+=i; 或?qū)⑺械某跏蓟挤旁谘h(huán)外,即 i=1; s=0; for ( ; i=100; +i) s+=i; 建議還是用 s=0; for (i=1; i=100; +i) s+=i;,for循環(huán)的進一步討論 續(xù),表達式2也不一定是關(guān)系表達式。它可以是邏輯表達式,甚至可以是算術(shù)表達式。當表達式2是算術(shù)表達式時,只要表達式的值為非

7、0,就執(zhí)行循環(huán)體,表達式的值為0時退出循環(huán)。 如果表達式2省略,即不判斷循環(huán)條件,循環(huán)將無終止地進行下去。 無終止的循環(huán)稱為“死循環(huán)” 最簡單的死循環(huán)是 for (;); 要結(jié)束一個無限循環(huán),必須從鍵盤上輸入特殊的命令以中斷程序執(zhí)行并強制退出,for循環(huán)的進一步討論 續(xù),表達式3也可以是任何表達式,一般為賦值表達式或逗號表達式。表達式3是在每個循環(huán)周期結(jié)束后對循環(huán)變量的修正。表達式3也可以省略,此時做完循環(huán)體后直接執(zhí)行表達式2。 如從1加到100,可以寫為 s=0; for (i=1; i=100; ) s+=i, i+; 或 s=0; for (i=1; i=100; s+=i, i+) ;

8、,循環(huán)的嵌套,將一個for循環(huán)嵌入到另一個for循環(huán)中 內(nèi)層的for循環(huán)在外層循環(huán)的每一個周期中都將執(zhí)行它的所有的周期 每個for循環(huán)都要有一個自己的循環(huán)變量以避免循環(huán)變量間的互相干擾,打印九九乘法表,#include using namespace std; void main() int i, j; for (i=1; i=9; +i) for (j=1; j=9; +j) cout i*j t; cout endl; ,第4章 循環(huán)控制,重復(fù)N次循環(huán) while循環(huán) do while循環(huán) 循環(huán)的中途退出 枚舉法 貪婪法,while循環(huán),如何對不同人數(shù)的班級完成分數(shù)統(tǒng)計任務(wù)? 方法一:在程

9、序的開始部分請求用戶輸入數(shù)據(jù)個數(shù),并將之存放在某個變量中,以此來替換for語句控制行中使用的常量100 方法二:定義一個特殊的輸入數(shù)據(jù),用戶可以通過輸入該數(shù)據(jù)來標識輸入序列的結(jié)束 方法二需要另外一種的循環(huán)控制結(jié)構(gòu),while 循環(huán)語句,格式:while (表達式) 語句 執(zhí)行過程:先計算出條件表達式的值。如果是false,循環(huán)終止,并接著執(zhí)行在整個while循環(huán)之后的語句。如果是true,整個循環(huán)體將被執(zhí)行,而后又回到while語句的第一行,再次對條件進行檢查。 用途:用于循環(huán)次數(shù)不定的循環(huán)。循環(huán)是否結(jié)束取決于某一個條件是否成立,while語句實例,設(shè)計一個程序,統(tǒng)計某個班級某門考試成績中的最

10、高分、最低分和平均分。當輸入的分數(shù)為-1時,輸入結(jié)束,int main() int value, total, max, min, noOfInput; / total總分, noOfInput人數(shù) total = 0; max = 0; min = 100; noOfInput = 0;/置初值 cout value; while (value != -1) +noOfInput; total += value; if (value max) max = value; if (value value; cout n最高分: max endl; cout 最低分: min endl; cout

11、 平均分: total / noOfInput endl; return 0; ,eg 2.求,時結(jié)束。,ex=0; p = 1; while (p0.000001) ex += p; 計算新的p; ,問題: 如何計算p?計算第i個p,需要兩個i次的循環(huán)。第一個循環(huán)計算xi,第二個循環(huán)計算i! 解決方案: 從前一項計算后一項。如果p是第i項的值,則第 i+1 項的值為 p * x / ( i + 1),int main() double ex, x, p;/ex存儲ex的值,p保存當前項的值 int i; cout x; ex=0; p=1; i=0; while (p 1e-6) ex +=

12、 p; +i; p = p * x / i; cout e的 x 次方等于: ex endl; return 0; ,例子:將輸入句子中的字符全部輸出為大寫,/ Capitalize lowercase letters int main( ) char c; cout c; while(c != .) if (z= c ,第4章 循環(huán)控制,重復(fù)N次循環(huán) while循環(huán) do while循環(huán) 循環(huán)的中途退出 枚舉法 貪婪法,dowhile 循環(huán)語句,格式: do 語句 while (表達式) 執(zhí)行過程:先執(zhí)行循環(huán)體,然后判斷循環(huán)條件。如條件成立,繼續(xù)循環(huán),直到條件為假 如將若干個輸入數(shù)相加,直到

13、輸入0為止。 total = 0; do cout value ; total += value; while (value != 0);,第4章 循環(huán)控制,重復(fù)N次循環(huán) while循環(huán) do while循環(huán) 循環(huán)的中途退出 枚舉法 貪婪法,循環(huán)的中途退出,考慮一個讀入數(shù)據(jù)直到讀到標志值的問題。如用自然語言描述,基于標志的循環(huán)的結(jié)構(gòu)由以下步驟組成: 讀入一個值 如果讀入值與標志值相等,則退出循環(huán) 執(zhí)行在讀入那個特定值情況下需要執(zhí)行的語句 當一個循環(huán)中有一些操作必須在條件測試之前執(zhí)行時,稱為循環(huán)的中途退出問題。,問題,由于循環(huán)語句是先判斷條件再決定是否執(zhí)行循環(huán)體,循環(huán)的中途退出將使得循環(huán)體中的某

14、些語句必須重復(fù)出現(xiàn)。 基于標志的循環(huán)結(jié)構(gòu)被改為: 讀入一個值 while (讀入值與標志值不相等) 執(zhí)行在讀入那個特定值情況下需要執(zhí)行的語句 讀入一個值 ,解決方案,break語句:跳出循環(huán) 上述問題可以用下列方案解決: while (true) 提示用戶并讀入數(shù)據(jù) if (value=標志) break; 根據(jù)數(shù)據(jù)作出處理 continue語句:跳出當前循環(huán)周期,第4章 循環(huán)控制,重復(fù)N次循環(huán) while循環(huán) do while循環(huán) 循環(huán)的中途退出 枚舉法 貪婪法,枚舉法,對所有可能的情況一種一種去嘗試,直到找到正確的答案。 枚舉法的實現(xiàn)基礎(chǔ)是循環(huán)。,枚舉法實例一,用50元錢買了三種水果。各種

15、水果加起來一共100個。西瓜5元一個,蘋果1元一個,桔子1元3個,設(shè)計一程序輸出每種水果各買了幾個 它有兩個約束條件: 第一是三種水果一共100個; 第二是三種水果一共花了50元 可以按一個約束條件列出所有可行的情況,然后對每個可能解檢查它是否滿足第二個約束條件 。也可以用第二個約束條件列出所有情況,然后對每個可能解檢查它是否滿足第一個約束條件 。,#include using namespace std; int main() int mellon, apple, orange; /分別表示西瓜數(shù)、蘋果數(shù)和桔子數(shù) for (mellon=1; mellon10; +mellon) / 對每種

16、可能的西瓜數(shù) for ( apple=1; apple 50 - 5 * mellon; +apple) /當西瓜數(shù)給定后可能的蘋果數(shù) orange = 3*(50-5*mellon-apple); / 剩下的錢全買了桔子 if (mellon+apple+orange = 100) / 三種水果數(shù)之和是否為100 cout mellon: mellon ; cout apple: apple ; cout orange: orange endl; return 0; ,執(zhí)行結(jié)果,Mellon:1 apple:18 orange:81 Mellon:2 apple:11 orange:87 M

17、ellon:3 apple:4 orange:93,實例二 四大湖問題,上地理課時,四個學生回答我國四大湖的大小時分別說: 甲:洞庭最大,洪澤最小,鄱陽第三 乙:洪澤最大,洞庭最小,鄱陽第二,太湖第三 丙:洪澤最小,洞庭第三 ?。痕蛾栕畲螅钚?,洪澤第二,洞庭第三 對于每個湖的大小,每個人僅答對一個,設(shè)計一程序讓計算機通過這些信息去判別四個湖的大小。,解題思路,如果用a,b,c,d分別表示四個湖的排序。a表示洞庭湖,b表示洪澤湖,c表示鄱陽湖,d表示太湖。我們可以假設(shè):洞庭最大,洪澤第二,鄱陽第三,太湖第四,然后檢查每位同學是否都講對了一個。如果不是,再嘗試下一種情況:洞庭最大,洪澤第二,鄱陽第四,太湖第三,再檢查每位同學是否都講對了一個。嘗試所有可能的情況,直到滿足每位同學都講對一個為止。,枚舉法續(xù),為了嘗試所有情況,我們需要假設(shè)洞庭湖可能是最大,也可能是第二、第三或第四。因此,a的值可能從1變到4。同樣,b, c ,d的值也都可能從1變到4。為此,我們需要一個控制結(jié)構(gòu),使a, b, c, d的值能自動從1變到4。這種結(jié)構(gòu)就是循環(huán)結(jié)構(gòu)。,四大湖排列問題的解,main() int a, b, c, d; for (a=1; a=4; +a) for (b=1; b=4; +b) if ( a = b) continue; else for (c=1; c=4; +c)

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論