2021年5月24日 星期一

有關雙迴圈程式內變量的變化

有關雙迴圈程式內變量的變化

假設

輸入2a, 輸入7b


以下是程式執行時的順序,及程式執行變量值的變化。

留意,為免太難閱讀,空格不代表沒有數值,而是數值跟上方的數值。其實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(b7,因此大於7便不再執行以下指令,i=i+1,每次執行後把i的值加1。即是由17,如b變成8的話,便不再執行15-24行的指令,而直接跳至第25行。

11

15

1

1

2

7

這是內迴圈的第一行,範圍由第15行至第20行。功能是輸出每行要輸出數目字。留意,由於a2,因此每行祇輸出兩個數目字。

for (j;j<=a;j++)j1a2, 因此這迴圈一直執行直至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是輸出的數字(運行到這裡時,i2,而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)是否需要繼續執行下去。這時i2a也是2(j<=a)仍是對的。

17

16

2

2

2

7

由於j<=a 仍是符合的(因為i2, 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的值加1j23

21

15

3

3

2

7

執行第三次,繼續判斷是否需要執行下去

22

21

3

3

 

7

由於不符合j<=a(因為j3, a2,因此不會執行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,由32

25

24

3

1

2

7

外迴圈執行一次後(14)i的值會加1(因為迴圈指令內有i=i+1i的值由2又變回3。留意,由於這行的指令必然會自動執行,因此要先於第23行把i的值減1,然後這裡又加回1,第二行數目字時才能正確連續輸出。(是否覺得很沒效率? 其實有另一迴圈指令可處理這問題。)

26

14

3

1

2

7

執行第二次這迴圈,先判斷是否需要繼續執行下去。i<=b; (i這時是3, b7),因此繼續執行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)是否需要繼續執行下去。這時i2a也是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, b7),因此繼續執行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, b7),因此繼續執行15-20的迴圈。

59

15

 

 

2

7

第七次執行。繼續判斷是否需要執行下去。(j<=a)

60

16

 

 

2

7

 

61

17

8

 

2

7

 

62

18

8

 

2

7

判斷是否i>b,這時i8b7

63

19

 

3

2

7

由於符合以上條件,因此第一次執行這指令j=a+1;

64

20

 

4

2

7

 

65

15

8

4

2

7

第八次執行。繼續判斷是否需要執行下去。(j<=a)

由於這時j4a仍是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這時i8, b7),因此不會繼續執行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;

}

 


沒有留言:

張貼留言

如何於C++產生亂數?

 如 何於 C++ 產生亂數 ?   以下是一個例子,輸出一個由 0-4 的亂數。留意,行號 2,3,8,9,10 及 11 是需要的。 備註 : 如要輸出 0-9 的話,把行 11 的 rand()%5 改成 rand()%10 便可以。   -----...