有關雙迴圈程式內變量的變化
假設
輸入2至a, 輸入7至b
以下是程式執行時的順序,及程式執行變量值的變化。
留意,為免太難閱讀,空格不代表沒有數值,而是數值跟上方的數值。其實a及b的值一直沒有變化。
|
No. |
Line |
i |
j |
a |
b |
說明 |
|
1 |
5 |
-- |
-- |
-- |
-- |
剛宣告這幾個變量(variable),但仍未給予指定的值 |
|
2 |
6 |
-- |
-- |
0 |
-- |
a=0; 把0 給予a,其他仍未有數值。 |
|
3 |
7 |
-- |
-- |
0 |
0 |
b=0; 把0 給予b |
|
4 |
8 |
1 |
-- |
0 |
0 |
i=1; 把1給予i |
|
5 |
9 |
1 |
1 |
0 |
0 |
j=1; 把1給予j |
|
6 |
10 |
1 |
1 |
0 |
0 |
這行祇是輸出enter the number per row,沒有改變任何變量的值 |
|
7 |
11 |
1 |
1 |
2 |
0 |
cin>>a; 讓使用者輸入數值,然後把數值給予a |
|
8 |
12 |
1 |
1 |
2 |
0 |
這行祇是輸出enter the last number,沒有改變任何變量的值。 |
|
9 |
13 |
1 |
1 |
2 |
7 |
cin>>b; 讓使用者輸入數值,然後把數值給予b |
|
10 |
14 |
1 |
1 |
2 |
7 |
這行是外迴圈的第一行,但沒有改變數量值。留意這迴圈的範圍是由第14行至24行(看看{}便知道) 這迴圈的作用是控制輸出所有相關數目字。 for (i;i<=b;i=i+1),開始是i(現時是1), 直至i<=b(b是7,因此大於7便不再執行以下指令,i=i+1,每次執行後把i的值加1。即是由1至7,如b變成8的話,便不再執行15-24行的指令,而直接跳至第25行。 |
|
11 |
15 |
1 |
1 |
2 |
7 |
這是內迴圈的第一行,範圍由第15行至第20行。功能是輸出每行要輸出數目字。留意,由於a是2,因此每行祇輸出兩個數目字。 for (j;j<=a;j++),j是1,a是2, 因此這迴圈一直執行直至j>a,即a等於3便不再執行迴圈內指令,而直接跳至第21行。 |
|
12 |
16 |
1 |
1 |
2 |
7 |
輸出i的值,於這裡,即是1 |
|
13 |
17 |
2 |
1 |
2 |
7 |
i=i+1; 執行完這句後,i變成2。 |
|
14 |
18 |
2 |
1 |
2 |
7 |
If (i>b) 先判斷這句是否真,以決定是否需要執行第19行指令。If (i>b),i是輸出的數字(運行到這裡時,i是2,而b是最末的數字,即是7。因此,運行到這裡時,i>b是錯的,因此不會執行第19行,而跳至第20行。 |
|
15 |
20 |
2 |
2 |
2 |
7 |
每次執行15-12這迴圈後(即最末一行),會把j的值加1,因為第15行有 j++ 這指令。 |
|
16 |
15 |
2 |
2 |
2 |
7 |
執行第二次,先判斷(j<=a)是否需要繼續執行下去。這時i是2,a也是2,(j<=a)仍是對的。 |
|
17 |
16 |
2 |
2 |
2 |
7 |
由於j<=a 仍是符合的(因為i是2, a也是2),因此繼續執行這迴圈內的指令。輸出i的值,於這裡,即是2。 |
|
18 |
17 |
3 |
2 |
2 |
7 |
i=i+1; 執行完這句後,i變成3。 |
|
19 |
18 |
3 |
2 |
2 |
7 |
繼續先判斷這條件式是否符合if (i>b),由於仍不符合,第19行不會執行,而跳至第20行。 |
|
20 |
20 |
3 |
3 |
2 |
7 |
每次執行15-12這迴圈後(即最末一行),會把j的值加1,j由2變3。 |
|
21 |
15 |
3 |
3 |
2 |
7 |
執行第三次,繼續判斷是否需要執行下去 |
|
22 |
21 |
3 |
3 |
|
7 |
由於不符合j<=a(因為j是3, a是2,因此不會執行16-20行,直接跳出15-20的迴圈,按順序跳至21行 |
|
23 |
22 |
3 |
1 |
2 |
7 |
j=1; 執行完這句後,j變回1。留意,如j不變回1的話,便不可能輸出第二行的數目字。 |
|
24 |
23 |
2 |
1 |
2 |
7 |
i=i-1; 執行完這句後,i的值減1,由3變2。 |
|
25 |
24 |
3 |
1 |
2 |
7 |
外迴圈執行一次後(第14行),i的值會加1(因為迴圈指令內有i=i+1。i的值由2又變回3。留意,由於這行的指令必然會自動執行,因此要先於第23行把i的值減1,然後這裡又加回1,第二行數目字時才能正確連續輸出。(是否覺得很沒效率? 其實有另一迴圈指令可處理這問題。) |
|
26 |
14 |
3 |
1 |
2 |
7 |
執行第二次這迴圈,先判斷是否需要繼續執行下去。i<=b; (i這時是3, 而b是7),因此繼續執行15-20的迴圈。 |
|
27 |
15 |
3 |
1 |
2 |
7 |
第三次執行。繼續判斷是否需要執行下去。(j<=a) |
|
28 |
16 |
3 |
1 |
2 |
7 |
輸出i的值,於這裡,即是3。 |
|
29 |
17 |
4 |
1 |
2 |
7 |
i=i+1; i的值變4。 |
|
30 |
18 |
4 |
1 |
2 |
7 |
繼續先判斷這條件式是否符合if (i>b),由於仍不符合,第19行不會執行,而跳至第20行。 |
|
31 |
20 |
|
2 |
2 |
7 |
每執行一次這迴圈,j的值加1,變成2。 |
|
32 |
15 |
|
2 |
2 |
7 |
執行第四次,先判斷(j<=a)是否需要繼續執行下去。這時i是2,a也是2,(j<=a)仍是對的。 |
|
33 |
16 |
|
2 |
2 |
7 |
|
|
34 |
17 |
5 |
2 |
2 |
7 |
i=i+1; |
|
35 |
18 |
|
2 |
2 |
7 |
|
|
36 |
20 |
|
3 |
2 |
7 |
|
|
37 |
15 |
|
3 |
2 |
7 |
第三次執行。繼續判斷是否需要執行下去。(j<=a) |
|
38 |
21 |
|
3 |
2 |
7 |
不符合,所以跳至這行 |
|
39 |
22 |
|
1 |
2 |
7 |
j=1; |
|
40 |
23 |
4 |
1 |
2 |
7 |
i=i+1; |
|
41 |
24 |
5 |
1 |
2 |
7 |
執行外迴圈後,i的值加1 |
|
42 |
14 |
|
1 |
2 |
7 |
執行第三次這迴圈,先判斷是否需要繼續執行下去。i<=b; (i這時是5, 而b是7),因此繼續執行15-20的迴圈。 |
|
43 |
15 |
|
1 |
2 |
7 |
第四次執行。繼續判斷是否需要執行下去。(j<=a) |
|
44 |
16 |
|
1 |
2 |
7 |
|
|
45 |
17 |
6 |
1 |
2 |
7 |
|
|
46 |
18 |
|
1 |
2 |
7 |
|
|
47 |
20 |
|
2 |
2 |
7 |
|
|
48 |
15 |
|
|
2 |
7 |
第五次執行。繼續判斷是否需要執行下去。(j<=a) |
|
49 |
16 |
|
|
2 |
7 |
|
|
50 |
17 |
7 |
|
2 |
7 |
|
|
51 |
18 |
|
|
2 |
7 |
|
|
52 |
20 |
|
3 |
2 |
7 |
|
|
53 |
15 |
|
|
2 |
7 |
第六次執行。繼續判斷是否需要執行下去。(j<=a) |
|
54 |
21 |
|
|
2 |
7 |
|
|
55 |
22 |
|
1 |
2 |
7 |
|
|
56 |
23 |
6 |
|
2 |
7 |
|
|
57 |
24 |
7 |
|
2 |
7 |
|
|
58 |
14 |
|
|
2 |
7 |
執行第四次這迴圈,先判斷是否需要繼續執行下去。i<=b; (i這時是7, 而b是7),因此繼續執行15-20的迴圈。 |
|
59 |
15 |
|
|
2 |
7 |
第七次執行。繼續判斷是否需要執行下去。(j<=a) |
|
60 |
16 |
|
|
2 |
7 |
|
|
61 |
17 |
8 |
|
2 |
7 |
|
|
62 |
18 |
8 |
|
2 |
7 |
判斷是否i>b,這時i是8,b是7 |
|
63 |
19 |
|
3 |
2 |
7 |
由於符合以上條件,因此第一次執行這指令j=a+1; |
|
64 |
20 |
|
4 |
2 |
7 |
|
|
65 |
15 |
8 |
4 |
2 |
7 |
第八次執行。繼續判斷是否需要執行下去。(j<=a) 由於這時j是4,a仍是2 |
|
66 |
21 |
|
|
2 |
7 |
由於不符合(j<=a),因此跳至這行 |
|
67 |
22 |
|
1 |
2 |
7 |
j=1; |
|
68 |
23 |
7 |
|
2 |
7 |
i=i-1; |
|
69 |
24 |
8 |
|
2 |
7 |
自動加1 |
|
70 |
14 |
|
|
2 |
7 |
執行第五次這迴圈,先判斷是否需要繼續執行下去。i<=b; (i這時i是8, 而b是7),因此不會繼續執行15-20的迴圈。 |
|
71 |
25 |
8 |
1 |
2 |
7 |
|
Appendix:原程式碼
#include <iostream>
using namespace std;
int main() {
int i,j,a,b;
a=0;
b=0;
i=1;
j=1;
cout<<"enter the number per row: ";
cin>>a;
cout<<"enter the last number: ";
cin>>b;
for (i;i<=b;i=i+1){
for (j;j<=a;j++){
cout<<i<<" ";
i=i+1;
if (i>b)
j=a+1;
}
cout<<endl;
j=1;
i=i-1;
}
return 0;
}
沒有留言:
張貼留言