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 上供你操作
但這個時候就沒辦法利用陣列的性質操作比如前後項的資料了
加一個 & 傳參考進去,就可以改動陣列裡的值
至於參考是什麼就是另一回事了
Minimal
By rain0130
Minimal
- 22