# MDCPP 校內培訓講義 迴圈
### 講師 楊翔宇
----
## 什麼是迴圈?就是能一直做同樣的事情
----
Q:我們以往遇到的題目可能都只需要執行一遍,但假如遇到很多遍的問題呢 ?
A:複製貼上就好啦
Q:那假如遇到需要做100遍的事情呢
A:哦...那就複製一百次
Q:假如他要求你用輸入的數字當作數字呢...
A:... ...
---
## 由此可見,迴圈這個東西是必須的
----
```
這裡有一個題目的例子:
請輸出10個'A'
```
看到這裡大家一定會想說,阿這不就這樣
```cpp=
std::cout<<"AAAAAAAAAA";
```
----
```
那假如是這樣
請輸入100000個A
```
相信大家絕對不會想要手寫100000個A,於是迴圈就此誕生了
---
## for 迴圈
for迴圈可說是最常看到的迴圈形式,概念如下
```cpp=
for ( 初始狀態 ; 跳出迴圈依據 ; 每次改變的值 ) {
//what you want to do
}
```
#### 迴圈跟if一樣,都會用一個 { } 包起來,這樣不會與其他地方干擾
----

----
## 大家可以發現,利用變數的設立,我們便能依據輸入或自己想要的數字限制迴圈跑的次數拉 ~ ( 歡呼 )
## 如此一來是不是很多問題都迎刃而解了呢 ?
---
像是剛剛的題目就可以用for迴圈解決
```cpp=
for(int i=1 ; i<=100000 ; i=i+1 ) {
std::cout<<"A";
}
```
這樣會發現for迴圈就會執行100000次,每次只要輸出一個A即可完成 !
----
## while 迴圈
while 迴圈可說是 for 迴圈的簡化版,他只會看什麼時候跳出 !
```cpp=
while( 跳出迴圈依據 ) {
//what you want to do
}
```
----

---
剛剛那題也可以用while迴圈解決喔 !
我們可以適當搭配變數使用
----
```cpp=
int x=1;
while( x<=100000 ) {
std::cout<<"A";
x=x+1;
}
```
----
## for 與 while 的差別 ?
大多數時候,我們在有需要變數限制迴圈次數時,我們會較常使用 for 迴圈,因為其較為方便設立變數。
而在以後我們會學到更多需要其他布林值判斷式的東西,而那時候會較常使用while迴圈
但是其實這兩個是互通的 ! 亦即兩個能做到的事情對方也都能做到
---
## do while迴圈
這個迴圈其實不會有多少情況會使用到,大多數都還是用while跟for
但是APCS觀念題還是會考喔~
----
do while迴圈就是在說他至少會執行一次,第一次不會理那個判斷式

----
```cpp=
do {
//do what you want to do
} while( 跳出迴圈依據 ) ; //很多人會沒加到這個分號w
```
---
若要以那題進行的話,其實沒什麼必要,這樣做只是會增加coding複雜度而已
~~所以我不喜歡用~~
```cpp=
int x=2;
do {
std::cout<<"A";
x=x+1;
} while( x<=100000 ) ;
```
----
## 巢狀迴圈
巢狀迴圈是一個很常用到的技巧,我們就用以下例子吧:
```
請輸入9*9乘法表
```
----
這樣我們也不會想要直接手寫吧 !
但大家會發現這樣似乎不是一個迴圈就能完成的事情
---
巢狀迴圈如下
```
第一層迴圈 {
第二層迴圈 {
第三層迴圈 {
...
}
}
}
```
像是如果很多輸出的模式都是有相關性,只是參數不一樣的時候,我們就能使用這種巢狀迴圈
----
像是上面這題的寫法就是像這樣子
```cpp=
for ( int i=1 ; i<=9 ; i++ ) {
for( int j=1 ; j<=9 ; j++) {
cout<<i<<" * "<<j<<" = "<<i*j<<" ";
}
cout<<endl;//每行輸出完畢要換行
}
```
大家可以寫寫看、試試看喔 !
----
## 小技巧教學
---
我們常在遇到要跑N次的迴圈時,會這樣做:
```cpp=
int N=100;
while( N-- ) {
//do what you want to do
}
```
大家會發現這樣寫真的很短,所以這是一個可以善用的方法
----
假如大家有看到一些code,他們的迴圈寫法可能會像這樣:
```cpp=
for ( int i=0 ; i<=100 ; i++ ) cout<<"i";
```
這類的東西,那其實這不用 { } 的原因是因為假如不用 { },他會幫你自動讀入下一行,而第二行就不會去理他了。
----
這東西能在 for, while 迴圈使用到,但do_while似乎不行。
~~再次推坑不要用do_while~~
---
跟大家再次說,其實任何的迴圈要求都能夠被for, while, dowhile完成,其實這三者的方向是一樣的,只是在不同的方面有他比較方便用的地方喔 !
----
## 例題
上面有說過三種都是一樣意思,那這裡就沒有特別分類三者了
----
## 單層迴圈例題
---
例題:
http://mdcpp.mingdao.edu.tw/problem/A016
:::spoiler
```cpp=
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cout<<i<<" ";
}
}
```
:::
----
例題:
http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=a026
:::spoiler
```cpp=
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++)
cout<<"I love you.\n";
}
```
:::
----
例題:
http://mdcpp.mingdao.edu.tw/problem/a020
:::spoiler
```cpp=
for(int i=a;i<=b;i++){
cout<<i<<" ";
}
```
:::
---
例題:
http://mdcpp.mingdao.edu.tw/problem/A017
:::spoiler
```cpp=
#include<iostream>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<m;i++){
cout<<i%n+1<<" ";
}
}
```
:::
----
## 巢狀迴圈例題
----
例題:
https://zerojudge.tw/ShowProblem?problemid=a005
:::spoiler
```cpp=
#include <iostream>
using namespace std;
int main() {
int t, a0, a1, a2, a3, a4;
cin >> t;
for (int i = 0; i < t; i++) {
cin >> a0 >> a1 >> a2 >> a3;
if (a3 - a2 == a2 - a1){
a4 = a3 + a3 - a2;
} else {
a4 = a3 * (a3 / a2);
}
cout << a0 << " " << a1 << " " << a2 << " " << a3 << " " << a4 << "\n";
}
return 0;
}
```
:::
---
## 下禮拜就是我們的第一次模擬賽了喔 !
## 大家要好好寫題目,好好準備 ~
----
# 謝謝大家
{"metaMigratedAt":"2023-06-16T09:33:41.121Z","metaMigratedFrom":"Content","title":"MDCPP 校內培訓講義 迴圈","breaks":true,"contributors":"[{\"id\":\"6a375517-4167-4b7c-a983-1e595a29262c\",\"add\":5509,\"del\":1427}]"}