Loop 迴圈

while/for/...

Loop 迴圈

為什麼需要迴圈?

:請輸出 1 

cout << 1;

:請輸出 1 ~ 5

cout << 1 <<' '<< 2 <<' '<< 3 <<' '<< 4 <<' '<< 5;

輸出到100呢?

輸出到1000呢?

loop 迴圈

while loop

while loop

while(condition){
	//code
}

進入迴圈後判斷條件(condition)是否成立

成立的話會執行{}內的程式碼

執行完回頭再次檢查條件

成立則再跑一次迴圈,否則離開迴圈

while loop

while(condition){
	//code
}

進入迴圈後判斷條件(condition)是否成立

成立的話會執行{}內的程式碼

執行完回頭再次檢查條件

成立則再跑一次迴圈,否則離開迴圈

int a = 0;
while( a < 10 ){
	a++;
    a *= 2;
}
cout << a << '\n';
return 0;

Example:這段程式會怎麼執行

Output:14

while loop

int a = 0;
while( a < 10 ){
	a++;
    a *= 2;
}
cout << a << '\n';
return 0;

Example:這段程式會怎麼執行

Output:14

有些比較老的題目不會給輸入幾行

或著說「輸入有若干行直到 EOF 結束」

是什麼意思?

while(cin >> ...){
	//code
}

片語4.3 EOF:End-of-file,代表文字檔的結尾

while loop

有些比較老的題目不會給輸入幾行

或著說「輸入有若干行直到 EOF 結束」

是什麼意思?

while(cin >> ...){
	//code
}

有些時候想跑迴圈,但首次進入條件不符合,該怎麼辦?

do{
	//code
}while(condition);
//最後要加分號
//code
while(condition){
	//code
}

=

for loop

for loop

for(初始化 ; 條件式 ; 迭代動作){
	//code
}
  • 初始化:再首次進入迴圈時執行(不論條件成立與否)
  • 條件式:判斷條件成立才能執行迴圈內的code
  • 迭待動作:code跑完後(迴圈尾),在判斷條件前執行
  • 可以空白,但分隔區塊的分號要留著

for loop

for(初始化 ; 條件式 ; 迭代動作){
	//code
}
  • 初始化:再首次進入迴圈時執行(不論條件成立與否)
  • 條件式:判斷條件成立才能執行迴圈內的code
  • 迭待動作:code跑完後(迴圈尾),在判斷條件前執行
int sum = 0;
for(int i = 0 ; i < 5 ; i++){
	sum += i;
}
cout << sum << '\n';

Example:這段程式會怎麼執行?

sum = 0 + 0 + 1 + 2 + 3 + 4 = 10

Output:10

可以用 while 寫嗎?

for

 

for loop

int sum = 0;
for(int i = 0 ; i < 5 ; i++){
	sum += i;
}
cout << sum << '\n';

Example:這段程式會怎麼執行?

sum = 0 + 0 + 1 + 2 + 3 + 4 = 10

Output:10

for

 

可以用 while 寫嗎?

while

 

int sum = 0, i = 0;
while(i < 5){
	sum += i;
    i++;
}
cout << sum << '\n';

當然可以!

那為什麼要教兩種呢?

處理迭代具規律性(計數器)

易推估執行次數的問題

e.g. 數列總和

執行次數不固定的問題

e.g. 在數列中找值

flow control

flow control

有時候我們並不想要跑完整個迴圈

有什麼控制迴圈的手段呢?

while(...){
	//code
    if(...)break;
}
while(...){
	//code
    if(...)continue;
}

break:「跳出」迴圈

跑到{}外(5)

continue:「跳過」迴圈

跑到迴圈頭(1)

(不限for/while都可以用)

Others

Others

Example:印出一張九九乘法表

有被乘數、乘數兩個變量要跑耶,但剛剛教的只能跑一個變量

想想看你怎麼背九九乘法表的

2 1 2,2 2 4,2 3 6,...,2 9 18

3 1 3,3 2 6,3 3 9,...,3 9 27

乘數從一到九跑完,被乘數就會加一

兩者都是從一到九,有沒有可能,用兩個迴圈?

Others

Example:印出一張九九乘法表

有被乘數、乘數兩個變量要跑耶,但剛剛教的只能跑一個變量

想想看你怎麼背九九乘法表的

2 1 2,2 2 4,2 3 6,...,2 9 18

3 1 3,3 2 6,3 3 9,...,3 9 27

乘數從一到九跑完,被乘數就會加一

兩者都是從一到九,有沒有可能,用兩個迴圈?

1 2 3 4 5 6 7 8 9
1
2
3
4
5
6
7
8
9

Others

Example:印出一張九九乘法表

有被乘數、乘數兩個變量要跑耶,但剛剛教的只能跑一個變量

想想看你怎麼背九九乘法表的

2 1 2,2 2 4,2 3 6,...,2 9 18

3 1 3,3 2 6,3 3 9,...,3 9 27

乘數從一到九跑完,被乘數就會加一

兩者都是從一到九,有沒有可能,用兩個迴圈?

1 2 3 4 5 6 7 8 9
1
2
3
4
5
6
7
8
9

Others

Example:印出一張九九乘法表

有被乘數、乘數兩個變量要跑耶,但剛剛教的只能跑一個變量

想想看你怎麼背九九乘法表的

2 1 2,2 2 4,2 3 6,...,2 9 18

3 1 3,3 2 6,3 3 9,...,3 9 27

乘數從一到九跑完,被乘數就會加一

兩者都是從一到九,有沒有可能,用兩個迴圈?

1 2 3 4 5 6 7 8 9
1
2
3
4
5
6
7
8
9

Others

Example:印出一張九九乘法表

有被乘數、乘數兩個變量要跑耶,但剛剛教的只能跑一個變量

想想看你怎麼背九九乘法表的

2 1 2,2 2 4,2 3 6,...,2 9 18

3 1 3,3 2 6,3 3 9,...,3 9 27

乘數從一到九跑完,被乘數就會加一

兩者都是從一到九,有沒有可能,用兩個迴圈?

1 2 3 4 5 6 7 8 9
1
2
3
4
5
6
7
8
9

Others

Example:印出一張九九乘法表

有被乘數、乘數兩個變量要跑耶,但剛剛教的只能跑一個變量

想想看你怎麼背九九乘法表的

2 1 2,2 2 4,2 3 6,...,2 9 18

3 1 3,3 2 6,3 3 9,...,3 9 27

乘數從一到九跑完,被乘數就會加一

兩者都是從一到九,有沒有可能,用兩個迴圈?

1 2 3 4 5 6 7 8 9
1
2
3
4
5
6
7
8
9

Others

Example:印出一張九九乘法表

有被乘數、乘數兩個變量要跑耶,但剛剛教的只能跑一個變量

想想看你怎麼背九九乘法表的

2 1 2,2 2 4,2 3 6,...,2 9 18

3 1 3,3 2 6,3 3 9,...,3 9 27

乘數從一到九跑完,被乘數就會加一

兩者都是從一到九,有沒有可能,用兩個迴圈?

1 2 3 4 5 6 7 8 9
1
2
3
4
5
6
7
8
9

Others

Example:印出一張九九乘法表

有被乘數、乘數兩個變量要跑耶,但剛剛教的只能跑一個變量

想想看你怎麼背九九乘法表的

2 1 2,2 2 4,2 3 6,...,2 9 18

3 1 3,3 2 6,3 3 9,...,3 9 27

乘數從一到九跑完,被乘數就會加一

兩者都是從一到九,有沒有可能,用兩個迴圈?

1 2 3 4 5 6 7 8 9
1
2
3
4
5
6
7
8
9

Others

Example:印出一張九九乘法表

有被乘數、乘數兩個變量要跑耶,但剛剛教的只能跑一個變量

想想看你怎麼背九九乘法表的

2 1 2,2 2 4,2 3 6,...,2 9 18

3 1 3,3 2 6,3 3 9,...,3 9 27

乘數從一到九跑完,被乘數就會加一

兩者都是從一到九,有沒有可能,用兩個迴圈?

1 2 3 4 5 6 7 8 9
1
2
3
4
5
6
7
8
9

Others

Example:印出一張九九乘法表

有被乘數、乘數兩個變量要跑耶,但剛剛教的只能跑一個變量

想想看你怎麼背九九乘法表的

2 1 2,2 2 4,2 3 6,...,2 9 18

3 1 3,3 2 6,3 3 9,...,3 9 27

乘數從一到九跑完,被乘數就會加一

兩者都是從一到九,有沒有可能,用兩個迴圈?

1 2 3 4 5 6 7 8 9
1
2
3
4
5
6
7
8
9

Others

乘數從一到九跑完,被乘數就會加一

兩者都是從一到九,有沒有可能,用兩個迴圈?

1 2 3 4 5 6 7 8 9
1
2
3
4
5
6
7
8
9

每次藍色箭頭的移動

都是往綠色的方向

藍色是附屬於綠色的小迴圈

被包在綠色這個大迴圈

for(int i = 1;i <= 9;i++){
	for(int j = 1;j <= 9;j++)
    	cout << i << '*' << j << '='<< i*j <<' ';
    cout << '\n';
}

Others

雖然理論上還沒教過陣列

該怎麼遍歷陣列的每個值?

int arr[n];
for(int i = 0;i < n;i++){
	cin >> arr[i];
}

用一個 i 作為 index,用 for 遍歷 i 的值走過全部陣列

蛤?你說還要寫 arr[i] 很麻煩?

Others

蛤?你說還要寫 arr[i] 很麻煩?

Python 可以做到 for i in list,C++也可以!

int arr[5] = { 1 , 3 , 5 , 7 , 9 };
for(int i : arr){
	cout << i << ' ';
}
//1 3 5 7 9

C++會幫你遍歷「所有」陣列裡面的值

並把值複製到 i 上供你操作

但這個時候就沒辦法利用陣列的性質操作比如前後項的資料了

Others

蛤?你說還要寫 arr[i] 很麻煩?

Python 可以做到 for i in list,C++也可以!

int arr[5] = { 1 , 3 , 5 , 7 , 9 };
for(int &i : arr){
	i *= 2;
    cout << i << ' ';
}
//2 6 10 14 18

C++會幫你遍歷「所有」陣列裡面的值

並把值複製到 i 上供你操作

但這個時候就沒辦法利用陣列的性質操作比如前後項的資料了

加一個 & 傳參考進去,就可以改動陣列裡的值

至於參考是什麼就是另一回事了

Made with Slides.com