迴圈(重複結構)
2012/10/30 謝碧景(c)編製更新
學習目標
學會計次式迴圈的設計與應用。
學會條件式迴圈的設計與應用。
學會無窮迴圈的設計與應用。
一、迴圈的種類與應用
(一)迴圈的種類
處理『重複』事件的敘述即為『迴圈』,本單元應用【while】、【for】、【do...while】三種。
(二)迴圈的應用
【while】常用於不固定次數之迴圈,而【for】則為固定次數之迴圈 (for適合計次式迴圈)。
while、for 會先判斷條件,即先測試再執行重複敘述屬於前測式迴圈;而 do...while 為先執行敘述,再判斷條件,屬於後測式迴圈。
格式、流程圖
(一) while 迴圈
條件式迴圈
若條件成立,則執行迴圈,若條件不成立,則跳到迴圈外下一敘述。
while(條件式)
{ 成立敘述; }
例:輸出 a=1 a=2 a=3~a=10。
※ 比較 if 條件指令
僅執行1次(即輸出1次)。
執行
(二) for 迴圈
for (初始值;條件式;更新值)
{ 成立的迴圈敘述; }
用變數控制迴圈執行次數
指定變數初始值,若變數值滿足條件式,則執行迴圈後,再更新變數值接著檢查條件,若仍滿足條件則重複迴圈,若不滿足條件則離開迴圈。
重點提示:
break 指令可以跳離 while 或 for 迴圈,也可跳離 switch 結構。
continue指令會跳過迴圈內在continue後的敘述,而跳回迴圈的開頭,再繼續執行下一次迴圈。
§實作練習
while 迴圈
for 迴圈
【進階一】 輸入一正整數 n,求2+4+6+...+n=? (n值為偶數) (檔名:while-1-1.cpp、for-1-1.cpp)
【進階二】輸入一正整數 n,求1-2+3-4+...+(-) n=? (n>2)【流程圖】【提示:可利用 if-else 判斷奇數與偶數,求加法或減法 】(檔名:while-1-2.cpp、for-1-2.cpp)
【進階一】求1-1/2+1/3-1/4+...+(-)1/n=?【流程圖】【提示:可利用 if-else 判斷奇數與偶數,求加法或減法 】(檔名:while-2-1.cpp、for-2-1.cpp)
【進階二】輸入一正整數 n,求1 + 1/2 + 2/3 + 3/4 +...+ (n-1)/n=? (n>2)【流程圖】(檔名:while-2-2.cpp、for-2-2.cpp)
題3:巧克力分裝,七個一數餘二且十一個一數餘二且三個一數餘二,求<10000之內所有可能分裝的結果。【流程圖】【延伸想法】求可能分裝結果之個數。(檔名:while-3.cpp、for-3.cpp)
【進階一】求數值1~100中,是 3 或 7 的倍數之總和。(檔名:while-3-1.cpp、for-3-1.cpp)
【進階二】輸出數值1~100中,是4或9的倍數,並累計其倍數之個數與總和。(檔名:while-3-2.cpp)
【進階三】輸入一個整數,請倒著輸出此數值,例:輸入2017,即輸出7102。【流程圖,參閱:運算子→比較/及%的差異】(檔名:while-3-3.cpp)
【進階四】輸入一個正整數 n,請輸出 n 是幾位數?例:輸入101則輸出3,輸入20190702則輸出8。【提示:/應用】(檔名:while-3-4.cpp)
題4:讀入10個數字(可為正值>0,或負值<0),列印正值的個數與負值的個數。並依其結果列印訊息“正值多”、“負值多”、“正負值一樣多”。【流程圖】(檔名:while-4.cpp、for-4.cpp)
【提示: for(;;) { } 相同於 while(1) { } //為無窮迴圈,注意:條件】
【進階一】輸入8筆整數分數之成績,60分(含)以上為“及格”,以下即為“不及格”,請依此條件統計“及格”與“不及格”個數,並依其結果顯示“及格數多”、“不及格數多”、“及格數與不及格數一樣多”。(檔名:while-4-1.cpp)
【練習】輸入 a,b,c,X ,求aX2+bX+c。(檔名:while-4-2.cpp)【提示: while( cin>>變數 ){每次輸入變數時,要做什麼事...} 】
題5:寫一程式計算一組數字的乘積。程式必須能夠連續輸入數個整數(至少1筆非0),以Enter隔開,當輸入數字為0時, 就輸出結果,並結束程式。【流程圖】(檔名:while-5.cpp、for-5.cpp) 【提示:while(1){...if(條件) break; ...} //整數1代表真true,可讓迴圈反覆執行,直到if條件成立即break跳出迴圈。】
題6:輸入一正整數,列出此數的所有正因數,並判斷此數字是否為質數?【流程圖】(檔名:while-6.cpp、for-6.cpp)
【進階一】輸入一個正整數,列印出由1開始至此正整數範圍內的所有質數。【流程圖】(檔名:while-6-1.cpp、for-6-1.cpp)
*延伸思考:質數判斷方式→變數i 一定要由 2, 3, 4...n-2, n-1 嗎? 能不能最後到 n/2 就好?迴圈次數可不可以更少?
【進階二】輸入一正整數,列出此數字之所有質因數?並求質因數之和。
題7:計算任意正整數 n 的階乘值(n!)。(n<15) ( n!=1*2*3……*n)【流程圖】(檔名:while-7.cpp、for-7.cpp)
題9:計算並列印出2的前20次方之 數值。【流程圖】【方法2:以 pow(x,n) 次方函數,求x的n次方,參閱:數學函式】(檔名:while-9.cpp、for-9.cpp)
題10:輸出九九乘法表。(*多層迴圈應用,檔名:while-10.cpp、for-10.cpp)
【方法1:引入#include <iomanip> 函式庫,可運用 cout<<setw(n)<<x; 讓變數x值以n格的寬度輸出。】
【方法2:參閱→欄位寬度設定。】
題11:費氏數列(Fibonacci)﹦0,1,1,2,3,5,8,13,…… 即 第I位數﹦第(I-1)位數+第(I-2)位數 ,I>2 請列出 Fibonacci 數列的前25項。【流程圖】(檔名:while-11.cpp、for-11.cpp)
題12:一個數等於它所有的因數和,這種數我們叫它完全數﹝不包括它本身﹞,例如: 6=1+2+3、28=1+2+4+7+14 請列印出10000之內,所有的完全數。【流程圖】(檔名:while-12.cpp、for-12.cpp)
題13:請輸出四位數(d1d2d3d4)中,所有位數總和為9的數值,即d1 +d2 +d3+d4=9 (流程圖,檔名:while-13.cpp、for-13.cpp)【提示:利用%(求餘數)及/(求整數商)的方式,以迴圈重複求出各個位數值 】【方法2:以 一維陣列設計 】
【進階題】輸出四位數中,其四個位數總和為7的倍數,即d1+d2+d3+d4=7X (檔名:while-13-1.cpp、for-13-1.cpp)
題14:擲骰子遊戲,以亂數產生1-6的點數,若按鍵盤 Enter 鍵('\r')表示遊戲結束。 (檔名:while-14.cpp、for-14.cpp)
【提示:亂數 rand() 函數產生不同之亂數 srand(time(NULL)),使用系統時間當亂數種子必須引用 time.h 標頭檔】
【進階題 】班上有33位同學,請以亂數產生5位同學參加校外活動。【提示:產生 m <= r <= n 的亂數,公式為 r=m+rand()%(n-m+1) 】 (檔名:while-14-1.cpp、for-14-1.cpp)
題15:請列出小於等於五位數中,符合 N=2i ×3j ×5k 之數 (檔名:while-15.cpp、for-15.cpp)
題16:求小於五位數中,求位數和(每一位數相加,如28之位數和為2+8=10)為23的正整數為何? (檔名:while-16.cpp、for-16.cpp)