迴圈(重複結構)

2019/07/16 謝碧景(c)編製更新

學習目標

一、迴圈的種類

    • 處理『重複』事件的指令即為『迴圈』,有 for、while 兩種迴圈。

    • for 迴圈適用固定次數之迴圈,而 while迴圈用於不固定次數之迴圈。

二、range 函式語法

(一)單一參數

    • range函式的功能是建立整數循序串列,如:1、2、3…每個數列中的內容稱為元素,而迴圈最常用的就是整數循序串列

數列變數 = range(整數值n) #產生的數列由「0 到 整數值n-1」的串列

list1 = range(5) # list1 指定為 range(0,5)

print(list1) #輸出 range(0,5)

print(list(list1)) #輸出 [0, 1, 2, 3, 4]

*註:list 可將 range 產出的「數列」轉換為「串列[ ]」,參閱:串列

(二)二個參數

數列變數 = range(起始值,終止值n) #產生的數列由「起始值 到 終止值n-1」的串列

list2=range(-1,5)

print(list(list2)) #輸出 [-1, 0, 1, 2, 3, 4]

print(list(range(-6,-2))) #輸出 [-6, -5, -4, -3]

(三)三個參數

數列變數=range(起始值,終止值,遞增間隔值) #產生由「起始值開始,依間隔值遞增終止值-1」的串列

數列變數=range(起始值,終止值,遞減間隔值) #產生由「起始值開始,依間隔值遞減終止值+1」的串列

list3=range(-3,7,2)

print(list(list3)) #輸出 [-3, -1, 1, 3, 5]

list4=range(7,-3,-2)

print(list(list4)) #輸出 [7, 5, 3, 1, -1]

範例1:(檔名:range-1.py)

三、for 迴圈

  • for 迴圈適用固定次數之迴圈,執行時系統會將數列元素依序做為變數值,即數列元素有多少個,就執行程式區塊多少次【參閱:以 for迴圈讀取串列】。

  • 『迴圈內部程式區塊』可以是一行或多行程式碼,在Python中,區塊是以縮排來界定其範圍,故『迴圈內部程式區塊』必須向右縮排(建議4個空格),代表屬於同一個程式區塊。

(一)語法

for 變數 in 數列 : # for 變數 in range:

程式區塊

  • 流程圖

◆ 例1:顯示正整數數列,請以逗號隔開。(檔名:loop-1.py)

*注意:程式區塊需縮排

◆例2:某活動有n位參賽者,請輸出其號碼牌(號碼間請以空白隔開)。(檔名:loop-2.py)

◆例3:求偶數和,輸入一偶數正整數 n,求2+4+...+n=? n>=6 (檔名:loop-3.py)

(二)巢狀 for 迴圈

    • 在迴圈中又包含迴圈,即為巢狀迴圈。 (檔名:loop-4.py)

    • 巢狀for迴圈執行次數,為各層迴圈 (即外迴圈x內迴圈) 的乘積。

◆ 例4:數字直角三角形。(檔名:loop-4.py)

(三) break 指令

    • 該指令通常安插於迴圈中,在迴圈執行中遇到break指令,會立即跳出迴圈,繼續執行迴圈後的下一列敘述。

for i in range(1,6):

if (i==3):

break #數字1-5遇3就跳出迴圈

print(i,end=",")

(四) contiinue 指令

    • 該指令通常也安插於迴圈中,在迴圈執行中遇到continue指令,會暫停往下,立即返回迴圈起始處繼續執行。

◆ 例5:小山討厭3的倍數,輸入一正整數,請輸出非3倍數的數字,並統計其個數。(檔名:loop-5.py)

*註:8 行敘述相同於 print("共 %d 個" % count)

四、while 迴圈

    • while迴圈用於不固定次數之迴圈。語法如下條件式的 ( ) 可省略,即 while 條件式:

(一)語法

while (條件式) :

程式區塊

  • 流程圖

  • 當條件式成立為True,則重複執行程式區塊;當條件式不成立為False,則結束迴圈繼續執行迴圈後的下一列程式敘述。

◆ 範例6:累加每日花費。請連續輸入每日花費金額 (以Enter 隔開輸入),當輸入-1 則輸出總花費金額。(檔名:loop-6.py)

*註: while True: 會造成無窮迴圈,故迴圈中會有條件,滿足時跳出迴圈。在 Dev-C++ 亦常使用 while(1) {迴圈程式敘述;}

§實作練習

一、輸入一正整數 n,求1-2+3-4+...+(-) n=? (n>2)【流程圖

【提示:迴圈內可利用 if...else 判斷奇數與偶數,求加法或減法 】(檔名:loop-ex1.py)

執行1結果:

請輸入一正整數n=15

1-2+...+15=8

執行2結果:

請輸入一正整數n=20

1-2+...-20=-10

二、計算任意正整數 n 的階乘值(n!)。(n<15) ( n!=1*2*3……*n)【流程圖】(檔名:loop-ex2.py)

執行1結果:

請輸入此正整數=5

1*2*...*5=120

執行2結果:

請輸入此正整數=10

1*2*...*10=3628800

三、巧克力分裝,七個一數餘二且十一個一數餘二且三個一數餘二,求<10000之內所有可能分裝的結果。【流程圖】【延伸想法】求可能分裝結果之個數。(檔名:loop-ex3.py)

執行結果:

可能的結果有

2 233 464 695 926 1157 1388 1619 1850 2081 2312 2543 2774 3005 3236 3467 3698 3929 4160 4391 4622 4853 5084 5315 5546 5777 6008 6239 6470 6701 6932 7163 7394 7625 7856 8087 8318 8549 8780 9011 9242 9473 9704 9935

四、輸入一個整數,請倒著輸出此數值例:輸入2017,即輸出7102。【參閱:算術運算子→比較//及%的差異】(檔名:loop-ex4.py)

執行1結果:

輸入此數:123

3 2 1

執行2結果:

輸入此數:2017

7 1 0 2

五、輸入10個數字(可為正值>0,或負值<0),輸出正值的個數與負值的個數。並依其結果列印訊息“正值多”、“負值多”、“正負值一樣多”。【流程圖】(檔名:loop-ex5.py)

執行1結果:

請輸入第1次數字:10

請輸入第2次數字:0

請輸入第3次數字:-3

請輸入第4次數字:-15

請輸入第5次數字:0

請輸入第6次數字:-99

請輸入第7次數字:51

請輸入第8次數字:231

請輸入第9次數字:0

請輸入第10次數字:13

你輸入了4個正數,3個負數。

正值多

執行2結果:

請輸入第1次數字:3

請輸入第2次數字:4

請輸入第3次數字:5

請輸入第4次數字:6

請輸入第5次數字:7

請輸入第6次數字:-9

請輸入第7次數字:-5

請輸入第8次數字:-7

請輸入第9次數字:-6

請輸入第10次數字:-5

你輸入了5個正數,5個負數。

正負值一樣多

六、輸入一正整數,輸出此數的所有正因數,並判斷此數字是否為質數?【流程圖】(檔名:loop-ex6.py)

執行1結果:

請輸入一個數字:15

15的因數有:1 3 5 15

15不為質數

執行2結果:

請輸入一個數字:121321

121321的因數有:1 121321

121321為質數

七、輸入兩數字,求最大公因數(GCD)與最小公倍數(LCM)。【流程圖

【提示:a*b兩數乘積等於gcd*lcm 】(方法2:利用『輾轉相除法』)(檔名:loop-ex7.py)

執行1結果:

請輸入第一個數字:95

請輸入第二個數字:51

95,51的最大公因數為1 最小公倍數為4845

執行2結果:

請輸入第一個數字:55

請輸入第二個數字:99

55,99的最大公因數為11 最小公倍數為495

八、輸出九九乘法表。(*多層迴圈應用,檔名:loop-ex8.py)