2022年3月30日 星期三

C 雙迴圈的使用

 學習目標:

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*

 

以上的程式其實有些問題,因為並不會輸出第二行的*,為甚麼? 查看一下ij的數值變化便可知。

變量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

**

跳回外迴圈第一行,判斷是否執行以下的指令。現時i1,因此會執行以下的指令(即第8行開始)

8

1

3

**

留意,會先到這一行! 原來的設計是要輸出第二行的*的。不過這時j的值是3,不符合內迴圈的執行條件。

11

3

3

**

到這一行後,i的值會再加1,變成3

7

3

3

**

先再回到外迴圈的第一行。

12

3

3

**

由於不符合外迴圈的執行條件,因此跳至這行,程式便完結了。

 

看到哪裡出問題嗎? 因為內迴圈完整執行一次後,j的值沒有變回1,因此便不再執行下去。解決方法自然便是於內迴圈執行一次後,把j的值變回1了,如下:


不過,以上的輸出仍有問題,第二行**並不是於下一行輸出,而是於同一行! 解決方法很簡單吧,欠了一個printf("\n"); 如下


如何於C程式內輸入字串?

之前我們學過如何於 C 程式內輸入數目字,但如要輸入字串,例如姓名,又要如何處理呢 ?   跟其他大部分電腦程言不一樣, C 並沒有一個字串的變數數據類型 (variable data type) , C 是使用字元 (character) 及變數陣列 (array)...