《《循環(huán)結構》PPT課件》由會員分享,可在線閱讀,更多相關《《循環(huán)結構》PPT課件(33頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、第5章 循環(huán)結構本章要點:5.1 while語句和用while語句構成的循環(huán)結構5.2 do-while語句和用do-while語句構成的循環(huán)結構5.3 for語句和用for語句構成的循環(huán)結構5.4 循環(huán)結構的嵌套5.5 break和continue語句在循環(huán)體中的作用5.6 程序舉例 5.1.1 while循環(huán)的一般形式由while語句構成的循環(huán)也稱“當”循環(huán),While語句的一般形式為:While(表達式)循環(huán)語句;以下是幾點說明:1while是C語言的關鍵字。2while后的表達式,可以是C語言中任意合法的表達式,通常為關系表達式或邏輯表達式,但也可以是其他運算表達式。當表達式的值為零時
2、,表示條件為假;非零時,表示條件為真。 3循環(huán)體可以是一條簡單可執(zhí)行語句,也可以是復合語句。4如果第一次計算時表達式的值就為0,則循環(huán)語句一次也不被執(zhí)行,流程直接跳過While語句,執(zhí)行下一條語句。重點提示:while型循環(huán)語句中循環(huán)體的執(zhí)行次數(shù)可以從0到無窮。若第一次計算表達式的值為0,則循環(huán)體執(zhí)行0次;若表達式恒為真,則陷入死循環(huán)。 5.1.2 while循環(huán)的執(zhí)行過程while循環(huán)的執(zhí)行過程是:計算while后表達式的值,當值為非零時,執(zhí)行循環(huán)體中的語句;當值為零時,退出while循環(huán)。 注意:進入while循環(huán)后,一定要有能使此表達式的值變?yōu)?的操作,否則,循環(huán)將會無限制的進行下去,即
3、進入死循環(huán)。在程序設計中,這個是不允許出現(xiàn)的。例如:計算1+2+3+100。main() int i,sum=0; i=1; while(i100時,循環(huán)條件就不滿足,循環(huán)到此結束。如果無此語句,則i的值一直不變,循環(huán)永不結束,這就稱為“死循環(huán)”。在程序設計中,是不允許死循環(huán)出現(xiàn)的。重點提示:在循環(huán)體中應有使循環(huán)趨于結束的語句。在程序設計中,是不允許死循環(huán)出現(xiàn)的。 5.2 do-while語句和用do-while語句構成的循環(huán)結構5.2.1 do-while語句構成的循環(huán)結構 do-while是另一種循環(huán)結構,它的一般形式為: do 循環(huán)語句;while(表達式); 以下是幾點說明:1do是C
4、語言的關鍵字,必須和while聯(lián)合使用。2在while(表達式)后的分號“;”不可丟,它表示do-while語句的結束。3while后括號中的表達式可以是任意合法的表達式,由它來控制循環(huán)是否執(zhí)行。4do-while之間的循環(huán)體可以是一條可執(zhí)行語句也可以是由“”構成的符合語句。 5.2.2 do-while循環(huán)的執(zhí)行過程do-while語句的執(zhí)行過程是:先執(zhí)行一次指定的循環(huán)語句,然后判斷表達式的值,若表達式的值為非0,再返回重新執(zhí)行循環(huán)語句,如此重復,直到表達式的值為0時才跳出循環(huán)語句,執(zhí)行下一條語句;若表達式的值為0,則不再返回重新執(zhí)行循環(huán)語句,直接退出循環(huán)語句,執(zhí)行下一條語句。如圖5.1(b
5、)所示。do while語句的特點是:先執(zhí)行語句,后判斷表達式的值。故do While語句又稱“直到型”循環(huán)結構。由于是先執(zhí)行后判斷,因此do while語句的循環(huán)語句至少被執(zhí)行一次。注意:while圓括號后面有一個分號“;”,書寫時不能丟。 例如:用do while循環(huán)結構來計算1+2+3+100。main() int i,sum=0; i=1; do sum+=i; i+; while(i=100); printf(dn,sum);程序運行結果為:5050 可以看出,此例的結果與上節(jié)的例程結果是完全相同的,也就是說,對同一問題既可以用while語句來處理,也可用do while語句來處理。
6、在一般情況下,用while語句和do while語句處理同一問題時,若二者的循環(huán)體一樣,運行結果也就一樣。但當while后面表達式的值一開始就為0時,兩種循環(huán)結構的結果是不相同的。重點提示:do-while語句先執(zhí)行語句,后判斷表達式的值。故do-while語句又稱“直到型”循環(huán)結構。由于是先執(zhí)行后判斷,因此do-while語句的循環(huán)語句至少被執(zhí)行一次。 5.3 for語句和用for語句構成的循環(huán)結構5.3.1 for語句構成的循環(huán)結構for語句的一般形式為:for(表達式1;表達式2;表達式3)循環(huán)語句;以下是幾點說明:1表達式1一般為賦值表達式,用于進入循環(huán)之前給循環(huán)變量賦初值。2表達式2
7、一般為關系表達式或邏輯表達式,用于執(zhí)行循環(huán)的條件判定,它與while、do while循環(huán)中的表達式作用完全相同。3表達式3一般為賦值表達式或自增、自減表達式,用于修改循環(huán)變量的值。 for循環(huán)結構是幾乎所有高級語言都提供的循環(huán)控制結構。但C語言中的for語句使用最為靈活,它不僅可以用于循環(huán)次數(shù)已經(jīng)確定的情況,而且可以用于循環(huán)次數(shù)不確定而只給出循環(huán)結束條件的情況,因而它完全可以代替while語句和do while語句。重點提示:表達式1、表達式2、表達式3都必須為for語句規(guī)定的合法的表達式。 for語句的執(zhí)行過程是: 先計算表達式1的值。 再計算表達式2的值,若其值為真,則執(zhí)行循環(huán)體一次;否
8、則跳轉第步。 然后計算表達式3的值。 轉回上面第步。 結束循環(huán),執(zhí)行for語句下面一個語句。5.3.2 for循環(huán)執(zhí)行過程 圖5.2 for語句的執(zhí)行流程圖重點提示:在整個for語句中,表達式1只計算一次,表達式2和表達式3則可能計算多次。循環(huán)體可能多次執(zhí)行,也可能一次都不執(zhí)行。 5.3.3 有關for語句的說明(1)for語句的一般形式中的“表達式1”可以省略,即:for(;表達式2;表達式3) 循環(huán)語句;但注意省略表達式1時,其后的分號不能省略。此時,應在for語句之前給循環(huán)變量賦初值。(2)如果省略表達式2,即:for(表達式1;表達式3) 循環(huán)語句;則表示表達式2的值始終為真,循環(huán)將無
9、終止地進行下去。例如:for(i=1;i+) printf(%d,i);將無限循環(huán)輸出1,2,3,4,5,6, (3)如果省略表達式3,即:for(表達式1;表達式2;) 循環(huán)語句;此時,也將產(chǎn)生一個無窮循環(huán)。因此,程序設計者應另外設法保證循環(huán)能正常結束,可以將循環(huán)變量的修改部分(即表達式3)放在循環(huán)語句中控制。例如:for(i=1;i=100;) sum+=i; i+;上述for語句中沒有表達式3,而是將表達式3(i+)放在循環(huán)語句中,作用相同,都能使用循環(huán)正常結束。注意表達式2后面的分號不能省略。(4)也可以同時省略表達式1和表達式3,即:for(;表達式2;) 循環(huán)語句;也即省略了循環(huán)的
10、初值和循環(huán)變量的修改部分,此時完全等價于while 語句。 (5)同時省略表達式1、表達式2和表達式3,即:for(;) 循環(huán)語句; 相當于賦循環(huán)變量的初值,循環(huán)控制條件始終為真,不修改循環(huán)變量,故循環(huán)將無終止地進行下去。(6)在for語句中,表達式1和表達式3不僅可以使用簡單表達式,也可以使用逗號表達式,即包含一個以上的簡單表達式,中間用逗號間隔。在逗號表達式內按自左至右求解,整個表達式的值為其中最右邊的表達式的值。例如: for(i=1;i=100;i+,sum=sum+i) 相當于 for(i=1;i=100;i+) sum=sum+i;(7)在for語句中,表達式一般為關系表達式或邏輯
11、表達式,但也可以是其他表達式(如字符表達式、數(shù)值表達式)。 (8)for語句的循環(huán)語句可以是空語句??照Z句用來實現(xiàn)延時,即在程序執(zhí)行中等待一定的時間。如下為延時程序的例子:for(i=1;i=1000;i+);注意以上語句最后的分號不能省略,它代表一個空語句。例如:用for循環(huán)結構來計算1+2+3+100。main() int i,sum=0; for(i=1;i=100;i+) sum+=i; printf(%dn,sum);程序運行結果為:5050 可以看出,此例的結果前兩例是完全相同的。顯然,用for語句簡單、方便。重點提示:for語句中的表達式可以部分或全部省略,但兩個分號不能省略,且
12、三個表達式均省略時,循環(huán)將會無限制執(zhí)行,而形成死循環(huán)。因此,編寫程序時,在for后面的一對圓括號內,應只含有能對循環(huán)進行控制的表達式,其它的操作盡量放在循環(huán)體內完成。 5.4 循環(huán)結構的嵌套1循環(huán)嵌套的形式在一個循環(huán)體內又完整地包含了另一個循環(huán),稱為循環(huán)嵌套。循環(huán)的嵌套可以是多層,但每一層循環(huán)在邏輯上必須是完整的。例如以下幾種形式的二重嵌套。 while與while二重嵌套 while() while() do while與do while二重嵌套dodo while(); while(); for與for二重嵌套for(;)for(;) while與while二重嵌套 2關于循環(huán)嵌套的幾點說
13、明(1)三種循環(huán)語句不僅各自可以嵌套,而且還可以互相嵌套。例如: while與do while二重嵌套while() do while; while與for二重嵌套while() for(;) do while與for二重嵌套do for(;) while(); (2)使用嵌套時,應注意一個循環(huán)結構應完整地嵌套在另一個循環(huán)體內,不允許循環(huán)體間交叉。例如以下循環(huán)結構是不正確的:while() do while();(3)除了上述二重嵌套外,還可以有三重嵌套、四重嵌套等多層嵌套。(4)嵌套的外循環(huán)和內循環(huán)的循環(huán)控制變量不得同名,但并列的內、外循環(huán)允許有同名的循環(huán)控制變量。例如以下為合法的循環(huán)結構:
14、for(j=1;j=10;j+) for(i=1;i=10;i+) for(i=1;i=10;i+) 3循環(huán)嵌套程序舉例利用雙層for循環(huán)結構打印出99乘法表。main() int i,j; for(i=1;i10;i+) printf(%5d,i); printf(n); for(i=1;i=46;i+) printf(-); printf(n); for(i=1;i10;i+) for(j=1;j=9;j+) printf(%5d,i*j); printf(n); 程序運行結果為: 1 2 3 4 5 6 7 8 9- 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14
15、16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81 (1)第45行和第78行為兩個并列的for循環(huán)結構,作用是輸出運行結果的第1行和第2行。(2)第6行和第9行的“printf(n);”語句作用是輸出一行后進行換行處理。(3)第1014行為二重嵌套for循環(huán)結構,作用是打印乘法表,
16、其中第14行的作用是每次退出內循環(huán)之時,即每次輸出一行完畢后進行換行處理。重點提示:在循環(huán)嵌套中,內嵌的第一個for循環(huán)的結束條件和外循環(huán)的控制變量是有關的,而最里面的for循環(huán)的循環(huán)結束條件是固定不變的。 5.5 break和continue語句在循環(huán)體中的作用5.5.1 break語句在第四章中我們介紹過,使用break語句可以使流程跳出switch語句體,在循環(huán)結構中,也可以使用break語句使流程跳出本層循環(huán)體,從而提前結束本層循環(huán)。break語句的一般形式為: break; 關于break語句有以下幾點說明:(1)break語句不能用于循環(huán)語句和switch語句之外的任何其他語句中。
17、(2)break語句只能用于循環(huán)體內,不能用在循環(huán)語句上。如for(i=1;i10;break,i+)是不正確的。(3)break語句只能跳出一層循環(huán),即從當前循環(huán)層中跳出。如果要跳出多層循環(huán),可使用goto語句。 例如:設計一個程序,求能同時滿足除以3余1、除以5余3、除以7余5、除以9余7的最小正整數(shù)。main() int i; for(i=1;i+) if(i%3= =1 printf(%dn,i); 程序運行結果為:313由于此題無法確定循環(huán)的條件和循環(huán)次數(shù),因此應采用無限循環(huán)配以break語句的方法。重點提示:當break語句出現(xiàn)在循環(huán)體中的switch語句體內時,其作用只是跳出該s
18、witch語句體,當break語句出現(xiàn)在循環(huán)體中,但并不在 switch語句體內時,則在執(zhí)行break后,跳出本層循環(huán)。 5.5.2 continue語句1continue語句的一般形式continue語句的作用是結束本次循環(huán),即不再執(zhí)行循環(huán)體中continue語句之后的語句,而是跳轉到循環(huán)的開始處,進行下一次是否執(zhí)行循環(huán)的判定。它的一般形式為:continue;2關于continue語句的幾點說明(1)continue語句只是結束循環(huán)結構中的本次循環(huán),并非跳出整個循環(huán)過程。具體說:對while和dowhile語句,遇continue語句后,轉向執(zhí)行while之后圓括號內的條件表達式的判斷;對
19、for語句,遇continue語句后,轉向執(zhí)行表達式3。(2)執(zhí)行continue語句并沒有使整個循環(huán)終止。(3)continue語句與break語句有本質的區(qū)別:continue語句只是結束本次循環(huán),而不終止整個循環(huán)的執(zhí)行;而break語句的作用則是強制終止整個循環(huán)過程。 3continue語句與break語句的區(qū)別例如:打印出數(shù)字010,但跳過(即不輸出)數(shù)字5。main() int i; for(i=0;i=10;i+) if(i=5) continue; printf(%5d,i); 程序運行結果為:0 1 2 3 4 6 7 8 9 10 (1)當i等于5時執(zhí)行continue語句,
20、它的作用是終止本次循環(huán),即不再執(zhí)行continue后面的語句,故不輸出5,而是轉轉向執(zhí)行for語句的表達式3,繼續(xù)進行下一輪循環(huán)。(2)實際上,在程序中完全可以不用continue語句,如本例中可以去掉第6、7兩行,而用下面的語句來代替: if(i!=5)(3)如果在本例中將第7行的“continue;”語句,改為“break;”語句,則輸出結果為:0 1 2 3 4可以清楚地看出break語句是終止整個循環(huán)過程,它與continue語句作用是截然不同的。重點提示:當break語句出現(xiàn)在循環(huán)體中的switch語句體內時,其作用只是跳出該switch語句體,當break語句出現(xiàn)在循環(huán)體中,但并不在switch語句體內時,則在執(zhí)行break后,跳出本層循環(huán)。