學習目標:
1. 如何使用雙迴圈,以處理更複雜的問題。
2. 如何追踪2個或以上變量的值。
參考視頻: https://youtu.be/Hc8_b51y6ck
先來複習一下單迴圈的使用:
如果要輸出一個正方形的話,那又如何處理? 較簡單的方法是使用雙迴圈的操作。一個迴圈控制橫向的輸出,另一個迴圈控制直行的輸出。如下:
|
行 |
說明 |
|
4 |
由於要控制橫行的及直行的輸出,而這個輸出值又可能不同,因此使用2個變量(variables) |
|
5,6 |
分別首先把這2個變量的值設定1。(其實設成其他數值也可以的) |
|
7 |
留意,這是外迴圈,是控制直行輸出的數目的。for (i;i<=2;i=i+1) 的意思是開始值是1(因第5行把i設定1),如i少於或等於2(i<=2)的話便執行迴圈內的指令,指第8-11行,如不是的話,便直接跳出這迴圈到第12行。 |
|
8 |
這是內迴圈,是控制橫行的輸出。for (j;j<=2;j=j+1) 的意思是開始值是1(因第6行把j設定1),如j少於或等於2(j<=2)的話便執行迴圈內的指令,即第9行,如不是的話,便直接跳出這迴圈到第11行。 |
|
9 |
如j的值少於或等於2的話,便輸出一粒*。由於j開始時是1的話,因此以上程式最終會輸出2粒*。 |
以上的程式其實有些問題,因為並不會輸出第二行的*,為甚麼? 查看一下i及j的數值變化便可知。
|
行 |
變量i |
變量j |
輸出 |
說明 |
|
4 |
-- |
-- |
|
|
|
5 |
1 |
-- |
|
|
|
6 |
1 |
1 |
|
|
|
7 |
1 |
1 |
|
尚未輸出 |
|
8 |
1 |
1 |
|
進入內迴圈 |
|
9 |
1 |
1 |
* |
j的值少於或等於2,因此會執行這指令,輸出* |
|
10 |
1 |
2 |
* |
內迴圈執行一次後,j的值會加1 |
|
8 |
1 |
2 |
* |
先跳回內迴圈,判斷是否繼續 |
|
9 |
1 |
2 |
** |
j的值仍是少於或等於2,因此會執行這指令,輸出* |
|
10 |
1 |
3 |
** |
內迴圈執行第二次後,j的值再加1,變成3。 |
|
8 |
1 |
3 |
** |
留意,仍是先回至內迴圈首行,判斷是否繼續執行。現在j的值大於2,不會執行這迴圈內的指令了。 |
|
11 |
2 |
3 |
** |
跳出內迴圈至這一行,i的值會加1。 |
|
7 |
1 |
3 |
** |
跳回外迴圈第一行,判斷是否執行以下的指令。現時i是1,因此會執行以下的指令(即第8行開始) |
|
8 |
1 |
3 |
** |
留意,會先到這一行! 原來的設計是要輸出第二行的*的。不過這時j的值是3,不符合內迴圈的執行條件。 |
|
11 |
3 |
3 |
** |
到這一行後,i的值會再加1,變成3。 |
|
7 |
3 |
3 |
** |
先再回到外迴圈的第一行。 |
|
12 |
3 |
3 |
** |
由於不符合外迴圈的執行條件,因此跳至這行,程式便完結了。 |
看到哪裡出問題嗎? 因為內迴圈完整執行一次後,j的值沒有變回1,因此便不再執行下去。解決方法自然便是於內迴圈執行一次後,把j的值變回1了,如下:
不過,以上的輸出仍有問題,第二行**並不是於下一行輸出,而是於同一行! 解決方法很簡單吧,欠了一個printf("\n"); 如下:
沒有留言:
張貼留言