<style>
/* 顏色Color */
.colorRed{color:#C7254E;}
.colorDarkRed{color:#842029;}
.colorGreen{color:#A9FF33;}
.colorUfoGreen{color:#2DCC76;}
.colorGold{color:#FFBB01;}
.colorBlue{color:#6699CC;}
.colorSkyBlue{color:#9FFFFF;}
.colorPurple{color:#CC99CC;}
.colorDarkPurple{color:#A141E8;}
.colorCyan{color:#0A9396;}
.colorOrange{color:#FF6347;}
.colorAlertDangerText{color:#A94442;}
.colorAlertWarningText{color:#8A6D3B;}
.colorAlertInfoText{color:#31708F;}
.colorAlertSuccessText{color:#3C763D;}
.colorAlertDangerBg{color:#F2DEDE;}
.colorAlertWarningBg{color:#FCF8E3;}
.colorAlertInfoBg{color:#D9EDF7;}
.colorAlertSuccessBg{color:#DFF0D8;}
/* 警報Alerts */
.alertBox {text-align: left;}
.alertBoxTitle{font-size: 26px; font-weight: bold;}
.alertBoxBody{font-size: 18px;}
.alertBoxBodyBlock{color: #FFF; background-color: #191919; padding: 5px; border-radius: 5px;}
</style>
<!-- 簡報開始 -->
# 電研社C++教學
#### by盧冠佑
##### 善有善報 星有星爆 不是不爆 十秒未到
<!-- .slide: data-background="https://images7.alphacoders.com/599/599379.jpg"-->
<iframe width="1" height="1" src="https://www.youtube.com/embed/T9MLjIsfUOU?si=vabLryMqpEVH2IlM" title="YouTube video player" frameborder="0" allow="accelerometer;?autoplay=1&mute=100&loop=1; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
---
## <span class="colorGold">好聽的歌?</span>
<!-- .slide: data-background="https://images7.alphacoders.com/599/599379.jpg"-->
<iframe width="1200" height="600" src="https://www.youtube.com/embed/T9MLjIsfUOU?si=vabLryMqpEVH2IlM" title="YouTube video player" frameborder="0" allow="accelerometer;?autoplay=1&mute=100&loop=1; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
---
## 目錄
1. 用來寫程式的軟體
2. 我的第一個C++程式
3. 變數
4. 基本輸入/輸出
5. 算術運算子
6. 條件分歧
7. 關係/邏輯運算子
8. while 迴圈
9. for迴圈
10. 迴圈中的流程改變
11. 陣列
---
### [用來寫程式的軟體](https://replit.com/)

note:方便免費的線上工具,不用存檔還有版本紀錄
---
## 第一個 C++ 程式
----
## 輸出 Hello, World!
----
請先完成以下程式碼骨架
```cpp
#include <bits/stdc++.h>
using namespace std;
int main(){
return 0;
}
```
note:
先完成這段程式碼
稍後的課程會再做說明
這是 C++ 最根本的「骨幹」,之後每一份程式碼都是從它開始。
replit 應該都自動打好了
然後你可能會發現 replit 沒有 return 0 ;
這個稍後也會做說明
不過有些軟體需要自己手刻骨架
或著出去比賽、考試可能也會需要自己刻
----
接下來的主程式請都寫在 <span class="colorRed">main()</span> 函式中
Note: main() 在英文中就是主要的意思,表示主程式,所有的程式都寫在其中。
----
輸出用 <span class="colorGreen">cout</span> 以 << 連接內容
```cpp
cout << "Hello World!";
```
```cpp
cout << 3 + 5; //輸出結果:8
```
<!-- .element: class="fragment" data-fragment-index="2" -->
```cpp
cout << "3 + 5";
```
<!-- .element: class="fragment" data-fragment-index="3" -->
----
:::warning
<div class="colorAlertWarningText">
<div style="text-align: left; padding: 15px;">
<span class="alertBoxTitle">注意!</span><br>
<span class="alertBoxBody">
在 C++ 中大寫與小寫字母視為不同的文字,並不共通。<br>
請小心誤用大寫字母的情況。
</span>
</div>
</div>
:::
<br>
:::danger
<div class="colorAlertDangerText">
<div style="text-align: left; padding: 15px;">
<span class="alertBoxTitle">常見錯誤:忘記加分號</span><br>
<span class="alertBoxBody">
因為 C++ 的單一命令可以分成很多行來寫,只認分號作為結尾。<br>
缺漏分號必須在下一行發現跟上一行未完結的命令銜接不起來,才能判斷出錯誤。
</span>
</div>
</div>
:::
note:提醒一下新手常見的錯誤是忘記加分號,如果你在編譯過程中出現了錯誤,可以檢查看看是不是漏了分號
----
## 體驗 AC 的快樂
----
### 要怎麼知道自己寫的程式是不是對的呢
----
## 線上評測系統 Online Judge
----
[ZeroJudge](https://zerojudge.tw/)

----
[ZeroJudge d483. hello, world](https://zerojudge.tw/ShowProblem?problemid=d483)
----
:::warning
<div class="colorAlertWarningText">
<div style="text-align: left; padding: 15px;">
<span class="alertBoxTitle">只有「範例」算對是遠遠不夠的</span><br>
<span class="alertBoxBody">
<span class="alertBoxBodyBlock">範例測試資料對了,不等於你的程式是正確的。</span><br>
題目敘述提供的測試資料只是「範例」,是協助理解格式、供你做最初步的確認用的。<br>
上傳後才能獲得完整且可靠的評測。
</span>
</div>
</div>
:::
----
## <span class="colorGold">解答</span>
```cpp=
#include <bits/stdc++.h>
using namespace std;
int main() {
cout << "hello, world";
return 0;
}
```
---
## 變數
----
### 常用變數類型
| 型態 | 名稱 | 範例 |
| --- | --- | --- |
| <span class="colorGreen">int</span> (<span class="colorGreen">long long</span>) | 整數 | 9453、2048... |
| <span class="colorGreen">float</span> (<span class="colorGreen">double</span>) | 浮點數 | 3.1415、1.414... |
| <span class="colorGreen">bool</span> | 布林值 | <span class="colorRed">True</span>、<span class="colorBlue">False</span> |
| <span class="colorGreen">char</span> | 字元 | a、0... |
| <span class="colorGreen">string</span> | 字串 | TcsshCSC |
Note: 型態有其他大小,布林值非0者(0.5, -1...)皆為True。
----
### 變數的宣告
```c++
int a;//資料型態(空格)變數名稱
```
note:要先宣告變數才可使用
----
### 變數的賦值
宣告後的變數要先賦值
```c++
int main(){
int a = 4;
}
```
```c++
int main(){
int a;
a = 4;
}
```
note:不保證宣告來的變數都是乾淨的
----
### 變數命名規則
* 只能使用英文 (A-Z a-z)、數字 (0-9)、底線 (_)
* 開頭不能為數字
* 不能重複使用同一名稱 (即使資料型態不同)
* 不能使用保留字
Note: C++保留字如case, break, do, switch...
----
### <span class="colorGreen">int</span>
$-2147483648 \sim 2147483647$
$-2^{31} \sim 2^{31}-1$
```cpp
int n = INT_MAX;//要大寫
int m = INT_MIN;//要大寫
```
----
### <span class="colorGreen">long long int</span>
$-9223372036854775807 \sim 9223372036854775807$
$-2^{63} \sim 2^{63}-1$
```cpp
long long n = 314159265358979323
```
通常看到數字大於$10^6$就可以考慮使用
----
### <span class="colorGreen">浮點數</span>
| 型態 | bits | 精準度 |
| --- | --- | --- |
| <span class="colorGreen">float</span> | 32 | $6 \sim 7 位$ |
| <span class="colorGreen">double</span> | 64 | $15 \sim 16 位$ |
| <span class="colorGreen">long double</span> | 128 | $18\sim 19 位$ |
浮點數存在誤差,盡量不使用
----
### <span class="colorGold">範例</span>
```cpp=
float f1 = 3.1415927;
double f2 = 3.141592653589793;
long double f3 = 3.1415926535897932384;
```
----
### <span class="colorGreen">bool</span>
布林值 (<span class="colorBlue">true</span> / <span class="colorRed">false</span>) 同時也能作為 1 跟 0 使用
```cpp
bool b1 = true, b2 = false;
```
----
### <span class="colorGold">範例</span>
```cpp=
int main(){
bool b1 = true;
cout << (b1+b1)*2; // output = 4
}
```
```cpp=
int main(){
bool b1 = -3;
cout << b1 + 1; // output = 2
}
```
<!-- .element: class="fragment" data-fragment-index="2" -->
----
## <span class="colorGreen">char</span> 字元
常配合陣列 (<span class="colorPurple">Array</span>) 使用
或是利用ASCII編碼特性使用
```cpp
char w = 'a';
```
----
## <span class="colorGreen">string</span> 字串
一個比樓上的 <span class="colorGreen">char</span> 還好用的東西
用來儲存字元序列
```cpp
string text = "hello world";
```
Note: Array會在之後進行說明,而ASCII則不在此說明
---
## 基本輸入 輸出
----
使用 <span class="colorGreen">cin</span> 與 <span class="colorGreen">cout</span> 進行 ++輸入++ 與 ++輸出++
----
具體來說應該怎麼用呢?
----
### <span class="colorGold">範例</span>
```cpp=
#include<iostream>
using namespace std;
int main(){
string text;
cin>>text;
cout<<text;
}
```
<span class="colorGreen">cin</span> 搭配 **>>** 使用
<span class="colorGreen">cout</span> 搭配 **<<** 使用
note:
cin / cout 要用 >> 或 << 傻傻分不清?
----
幾個 <span class="colorGreen">cin</span> 與 <span class="colorGreen">cout</span> 需注意的點
----
### <span class="colorGreen">cin</span> 遇到空格就會結束一個輸入
```cpp=
string a, b;
cin >> a >> b;
```
若輸入 `"tcssh better than tcfsh"` 則
a 的值為 ++tcssh++
b 的值為 ++better++
你會發現 than 跟 tcfsh 沒有被記錄下來
----
### <span class="colorGreen">cout</span> 不會換行
如果需要換行可以使用 <span class="colorGreen">std</span>::<span class="colorGreen">endl</span> 或是跳脫字元 <span class="colorGreen">'\n'</span>
```
```
<span class="colorGold">範例</span>
```cpp
cout << "Hello" << endl << "World";
```
```cpp
cout << "Hello\nWorld";
```
----
### <span class="colorGold">++ 補 充 說 明 ++</span>
#### 跳脫字元 (`\`)
#### 跳脫字元是會改變下一個文字的原意義

<!-- .element: class="fragment" data-fragment-index="1" -->
Note: 原本 n 的意義被跳脫、轉變成「換行」,而不是原先 n 這個文字。
----
### <span class="colorGold">++ 補 充 說 明 ++</span>
#### 常用的跳脫字元
| 符號 | 名稱 |
| --- | --- |
| \\' | 單引號 (single quote) |
| \\" | 雙引號 (double quote) |
| \\\\ | 反斜線 (backslash ) |
| \n | 換行 (line feed) |
##### 詳細內容請見 [維基百科:跳脫字元](https://zh.wikipedia.org/zh-tw/转义字符)
----
:::warning
<div class="colorAlertWarningText">
<div style="text-align: left; padding: 15px;">
<span class="alertBoxTitle" style="font-weight: bold;">額外補充</span><br>
<span class="alertBoxBody">
實際上,任何傳達給外界的訊息都屬於輸出,包括喇叭發出聲音、或亮燈熄燈等。<br>
由於競程只用上文字的輸出,在此不會提及其它種類的輸出。
若對其它種類輸出感興趣,可自行搜尋相關資料。
</span>
</div>
</div>
:::
----
### <span class="colorGold">小試身手</span>
[ZeroJudge a001. 哈囉](https://zerojudge.tw/ShowProblem?problemid=a001)
----
#### 題目要求輸入一組文字並依格式輸出
----
### 觀察範例
| 輸入 | 輸出 |
| --- | --- |
| world | hello, world |
| C++ | hello, C++ |
| Taiwan | hello, Taiwan |
----
不難發現, 輸出的格式都是
hello, {輸入}
##### 注意:逗點後有一個空格
Note: 下一頁為參考答案
----
### 參考答案
```cpp=
#include <bits/stdc++.h>
using namespace std;
int main() {
string text;
cin >> text;
cout << "hello, " << text;
return 0;
}
```
<!-- .element: class="fragment" data-fragment-index="1" -->
---
## 算術運算子
----
### 二元算術運算子
| 名稱 | 符號 |
| --- | --- |
| 加 | <span class="colorBlue">+</span> |
| 減 | <span class="colorBlue">-</span> |
| 乘 | <span class="colorBlue">*</span> |
| 除(取商) | <span class="colorBlue">/</span> |
| 模除(取餘) | <span class="colorBlue">%</span> |
note:特別說明c++ 不存在^ 次方運算子
----
### <span class="colorGold">範例</span>
```cpp=
int n1 = 2 + 3; // n1 = 5
int n2 = 5 - 2; // n2 = 3
int n3 = 6 * 2; // n3 = 12
int n4 = 9 / 4; // n4 = 2
int n5 = 9 % 4; // n5 = 1
```
Note: //是註解
----
### 縮寫
***
一個整數 <span class="colorPurple">n1</span> 的值為 3
```cpp
int n1 = 3;
```
若要將 <span class="colorPurple">n1</span> 再加上 5
可以這樣寫
```cpp
n1 = n1 + 5;
```
或是下面的縮寫
```cpp
n1 += 5;
```
----
### <span class="colorGold">範例</span>
```cpp
int n = 8;
n -= 5; // n=3
n *= 6; // n=18
n /= 3; // n=6
n %= 3; // n=0
```
----
### 一元算術運算子
| 名稱 | 符號 |
| ---- | ---------------------------------- |
| 自增 | <span class="colorBlue">++</span> |
| 自減 | <span class="colorBlue">-\-</span> |
| 變號 | <span class="colorBlue">-</span> |
----
### 前後差很多!
前:先 <span class="colorPurple">++改變++</span> 再**使用**
```cpp=
int a = 10;
int b = ++a; // a 和 b 都是 11
```
後:先 <span class="colorPurple">++使用++</span> 再**改變**
```cpp=
int a = 10;
int c = a++; // c 是 10,a 是 11
```
----
### 內建函式
| 名稱 | 寫法 |
| --- | --- |
| 高斯符號 [x] | <span class="colorBlue">floor(x)</span> |
| 取頂符號⌈ x ⌉ | <span class="colorBlue">ceil(x)</span> |
| 四捨五入x | <span class="colorBlue">round(x)</span> |
| 絕對值\|x\| | <span class="colorBlue">abs(x)</span> |
| 根號x | <span class="colorBlue">sqrt(x)</span> |
| x的n次方 | <span class="colorBlue">pow(x,n)</span> |
|以10為底的對數x | <span class="colorBlue">log10(x)</span> |
note:特別說明c++ 不存在^ 次方運算子
----
### <span class="colorGold">範例</span>
```cpp=
int n1 = floor(3.14); // n1 = 3
int n2 = ceil(1.732); // n2 = 1
int n3 = round(1.414); // n3 = 1
int n4 = abs(-43); // n4 = 43
int n5 = sqrt(4); // n5 = 2
int n6 = pow(2,10); // n6 = 1024
int n7 = log10(10000); // n7 = 4
```
Note: //是註解
----
### <span class="colorGold">小試身手</span>
***
[ZeroJudge a002. 簡易加法](https://zerojudge.tw/ShowProblem?problemid=a002)
[ZeroJudge d049. 中華民國萬歲!](https://zerojudge.tw/ShowProblem?problemid=d049)
[ZeroJudge d827. 買鉛筆](https://zerojudge.tw/ShowProblem?problemid=d827)
<!-- [ZeroJudge a003. 兩光法師占卜術](https://zerojudge.tw/ShowProblem?problemid=a003) -->
---
## 條件分歧
----
## <span class="colorPurple">if</span>
----
當條件 (<span class="colorGreen">condition</span>) 成立 (<span class="colorBlue">True</span>) 時
執行裡面的程式碼
```cpp=
if (condition) {
// do something
}
```
可以簡單理解成
<span class="colorPurple">如果</span><span class="colorGreen">條件成立</span>,<span class="colorPurple">就</span>`____`
----
## <span class="colorPurple">else</span>
需要和 <span class="colorPurple">if</span> 一起使用
```cpp=
if (condition) {
// do something
} else {
// do another something
}
```
可以簡單理解成
<span class="colorPurple">如果</span><span class="colorGreen">條件成立</span>,<span class="colorPurple">就</span>`___`,<span class="colorPurple">否則</span>`___`
----
## <span class="colorPurple">else if</span>
需要和 <span class="colorPurple">if</span> 一起使用
```cpp=
if (condition1) {
// do something
} else if (condition2) {
// do another something
}
```
可以簡單理解成
<span class="colorPurple">如果</span> <span class="colorGreen">條件1成立</span>,<span class="colorPurple">就</span>`___`
<span class="colorPurple">或是
如果</span> <span class="colorGreen">條件2成立</span>,<span class="colorPurple">就</span>`___`
----
### <span class="colorGold">三個放一起</span>
```cpp=
int n = 4;
if (n == 1) {
cout << "n = 1";
} else if (n == 2) {
cout << "n = 2";
} else if (n == 3){
cout << "n = 3";
} else {
cout << "n != {1, 2, 3}";
}
```
<span class="colorPurple">else if</span> 可以有無數個
<span class="colorPurple">else</span> 可有可無 但只能有一個 且只能放在最後
----
### 小結論
<span class="colorPurple">if</span> 語法結構:
<span class="colorPurple">if</span> + $0 \sim n$ 個 <span class="colorPurple">else if</span> + $0 \sim 1$ 個 <span class="colorPurple">else</span>
----
如果`{}`中的程式碼**只有一句**
則大括號可以省略
----
<span class="colorGold">範例</span>
```cpp=
if (true) {
cout << "hello world";
}
```
```cpp
if (true) cout << "hello world";
```
```cpp
if (true)
cout << "hello world";
```
```cpp
if (false)
cout << "hello world";
cout << "123";
```
<!-- .element: class="fragment" data-fragment-index="2" -->
----
### 所以 <span class="colorGreen">條件</span> 要放什麼?
***
能生出布林值的東西
---
## 關係 / 邏輯運算子
----
### 關係運算子
| 名稱 | 符號 |
| --- | --- |
| 大於 | <span class="colorGold">></span> |
| 小於 | <span class="colorGold"><</span> |
| 等於 | <span class="colorGold">==</span> |
| 不等於 | <span class="colorGold">!=</span> |
| 大於等於 | <span class="colorGold">>=</span> |
| 小於等於 | <span class="colorGold"><=</span> |
note:說明==
----
### <span class="colorGold">小試身手</span>
***
[ZeroJudge a003. 兩光法師占卜術](https://zerojudge.tw/ShowProblem?problemid=a003)
[ZeroJudge d064. ㄑㄧˊ 數?](https://zerojudge.tw/ShowProblem?problemid=d064)
[ZeroJudge a005. Eva 的回家作業](https://zerojudge.tw/ShowProblem?problemid=a005)
[ZeroJudge a053. Sagit's 計分程式](https://zerojudge.tw/ShowProblem?problemid=a053)
----
### 邏輯運算子
| 名稱 | 符號 |
| --- | --- |
| 非(not) | <span class="colorCyan">!</span> |
| 且(and) | <span class="colorCyan">&&</span> |
| 或(or) | <span class="colorCyan">\|\|</span> |
note:可以直接打英文not、and、or
----
### not 真值表
| A | not A |
| --- | --- |
| <span class="colorBlue">True</span> | <span class="colorRed">False</span> |
| <span class="colorRed">False</span> | <span class="colorBlue">True</span> |
----
### and 真值表
| A | B | A and B |
| --- | --- | --- |
| <span class="colorBlue">True</span> | <span class="colorBlue">True</span> | <span class="colorBlue">True</span> |
| <span class="colorBlue">True</span> | <span class="colorRed">False</span> | <span class="colorRed">False</span> |
| <span class="colorRed">False</span> | <span class="colorBlue">True</span> | <span class="colorRed">False</span> |
| <span class="colorRed">False</span> | <span class="colorRed">False</span> | <span class="colorRed">False</span> |
----
### or 真值表
| A | B | A or B |
| --- | --- | --- |
| <span class="colorBlue">True</span> | <span class="colorBlue">True</span> | <span class="colorBlue">True</span> |
| <span class="colorBlue">True</span> | <span class="colorRed">False</span> | <span class="colorBlue">True</span> |
| <span class="colorRed">False</span> | <span class="colorBlue">True</span> | <span class="colorBlue">True</span> |
| <span class="colorRed">False</span> | <span class="colorRed">False</span> | <span class="colorRed">False</span> |
----

----
### <span class="colorGold">關係與邏輯運算子混用範例</span>
```cpp=
bool a = !true; // a = false
bool b = false && true; // b = false
```
<span class="colorCyan">關係運算子</span> 與 <span class="colorCyan">邏輯運算子</span>
運算順序為:<span class="colorCyan">括號</span>$\rightarrow$<span class="colorCyan">關係</span>$\rightarrow$<span class="colorCyan">邏輯</span>
運算後的結果應該視為 <span class="colorOrange">布林值</span>
----
### <span class="colorGold">小試身手</span>
***
請問 b 是 <span class="colorBlue">True</span> 還是 <span class="colorRed">False</span>
```cpp=
bool b = !(1 == (5>4) || 3 < 2);
```
## <br>答案是 <span class="colorRed">False</span>
<!-- .element: class="fragment" data-fragment-index="1" -->
----
### <span class="">說明</span>
```cpp=
bool b = !(1 == (5>4) || (3<2));
= !(True == True || False)
= !(True || False)
= !(True)
= False
```
----
### <span class="colorGold">小試身手</span>
***
[ZeroJudge d067. 格瑞哥里的煩惱 (1 行版)](https://zerojudge.tw/ShowProblem?problemid=d067)
[ZeroJudge d066. 上學去吧!](https://zerojudge.tw/ShowProblem?problemid=d066)
----
### <span class="colorGold">小試身手</span>
<span class="colorGreen">試試看不使用 <span class="colorPurple">if</span> 來完成這些題目吧!</span>
***
[ZeroJudge d050. 妳那裡現在幾點了?](https://zerojudge.tw/ShowProblem?problemid=d050)
[ZeroJudge d073. 分組報告](https://zerojudge.tw/ShowProblem?problemid=d073)
[ZeroJudge d068. 該減肥了!](https://zerojudge.tw/ShowProblem?problemid=d068)
[ZeroJudge d060. 還要等多久啊?](https://zerojudge.tw/ShowProblem?problemid=d060)
[ZeroJudge d058. BASIC 的 SGN 函數](https://zerojudge.tw/ShowProblem?problemid=d058)
---
## <span class="colorPurple">while 迴圈</span>
----
重複執行直到<span class="colorGreen">條件</span>不成立
```cpp=reen
while (條件式) {
// do something
}
```
可以簡單理解成
只要<span class="colorGreen">條件</span>成立就重複執行`___`
----
### <span class="colorGold">範例</span>
```c++
while( A.條件式 )
{
B.當條件成立時,就...
}
```
檢查條件A,成立就做B
$\rightarrow$檢查條件A,成立就做B
...
$\rightarrow$檢查條件A,成立就做B
$\rightarrow$檢查條件A,不成立離開。
----
## <span class="colorGold">小試身手</span>
```cpp=
int n=0;
while (n>3) cout<<"*";
```
請問以上的程式會輸出幾個 *
#### <br>答案是 0 個</span>
<!-- .element: class="fragment" data-fragment-index="1" -->
----
## <span class="colorGold">小試身手</span>
```cpp=
int n=0;
while (n<3){
cout<<"*";
n++;
}
```
請問以上的程式會輸出幾個 *
#### <br>答案是 3 個</span>
<!-- .element: class="fragment" data-fragment-index="1" -->
----
## 重複輸入
----
### 將輸入句 cin 放入 while 中
```cpp=
while(cin >> 變數) {
當輸入變數就...
}
```
```cpp=
while( cin >> 變數1 >> 變數2 ) {
每次輸入變數1、變數2時,要做什麼事...
}
```
<!-- .element: class="fragment" data-fragment-index="1" -->
使用 while 可以反覆輸入</br>直到碰到 End Of File (EOF)
<!-- .element: class="fragment" data-fragment-index="2" -->
----
### <span class="colorGold">小試身手</span>
[ZeroJudge a004. 文文的求婚](https://zerojudge.tw/ShowProblem?problemid=a004)
----

---
## <span class="colorPurple">for 迴圈</span>
----
<span class="colorPurple">for</span> 迴圈的語法相比於 while 稍微複雜些
<!--
for (init; condition; increment){
// do something
} -->
```cpp
for(A.一開始先做... ; B.條件式 ; D.等C每做完一次,就做... )
{
C.當B條件成立,就重複做...
}
```
先做 A $\rightarrow$ 檢查 B 條件,成立就做 C,接著做D
...
$\rightarrow$ 檢查 B 條件,成立就做 C,接著做 D
$\rightarrow$ 檢查B條件,不成立離開
<!-- 1. for迴圈的開始會先進行<font color=#edbd3a>初始化(init)</font>
2. 接著判斷<span class=condition>條件(condition)</span>是否成立
2-1. 如果成立就執行區塊中的程式碼
2-2. 執行<font color=#a141e8>遞增(increment)</font>
2-3. 回到 2.
3. 若<span class=condition>條件(condition)</span>不成立 結束迴圈 -->
Note:
比起 while 迴圈,for 迴圈更適合處理有次序的事。
其實 for 迴圈能做的事,while 迴圈都能做。
while 迴圈能做的事,for 迴圈也都能做。
for 是另一種迴圈的語法,基本和 while 沒有太大區別。為了視覺上的方便,因此要學習 for 迴圈。
----
### <span class="colorPurple">for</span> vs <span class="colorPurple">while</span>

Note: n = 5
在for迴圈裡定義的為區域變數
離開迴圈後即失效
----
## <span class="colorGold">範例</span>
```cpp=
for (int i = 1; i < 6; i++) cout << i;
```
請依剛剛講的流程
想看看輸出的會是多少
----
### 輸出為
<span class="colorRed">12345</span>
<!-- .element: class="fragment" data-fragment-index="1" -->
Note: 需隱藏
----
```cpp
for(A.一開始先做... ; B.條件式 ; D.等C每做完一次,就做... ) {
C.當B條件成立時,就重複做...
}
```
Note: 直接跳下頁 可往回
----
### <span class="colorGold">初始化</span> 與 <span class="colorDarkPurple">下一輪的前置</span>
***
<span class="colorGold">初始化</span> 可用來定義區域變數
<span class="colorDarkPurple">下一輪的前置</span> 通常用來改變該變數的值<br>但不一定是增加
這兩個可以不用存在
Note: 上頁有for
----
### <span class="colorGold">範例</span>
```cpp=
int i = 3;
for (; i > 0;) cout << i--;
```
有沒有很像前面講的某個語法
----
當 <span class=colorPurple>for</span> 迴圈沒 <span class="colorGold">初始化</span> 與 <span class="colorDarkPurple">下一輪的前置</span> 部份時
可以當 <span class="colorPurple">while</span> 迴圈使用
###### ~~怎麼不直接寫while就好~~
----
### 巢狀迴圈
簡單來說就是在一個迴圈當中還有好幾層的迴圈
```cpp=
for (int i=0; i<10; i++) {
for (int j=0; j<10; j++) {
// do something
}
}
```
Note: 兩層迴圈區域變數要不同
----
## <span class="colorGold">範例</span>
```cpp=
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 3; j++) {
cout << "*";
}
cout << endl;
}
```
***
請推測輸出的結果為何
----
`***`
`***`
`***`
`***`
----
### <span class="colorGold">小試身手</span>
[ZeroJudge a058. MOD3](https://zerojudge.tw/ShowProblem?problemid=a058)
[ZeroJudge a148. You Cannot Pass?!](https://zerojudge.tw/ShowProblem?problemid=a148)
---
## 迴圈中的流程改變
----
## <span class="colorPurple">break</span>
<span class="colorPurple">break</span> 在英文中有 ++打破++ ++打斷++ 的意思
而在 C++ 中則用於跳出一個迴圈
----
### <span class="colorGold">範例</span>
***
```cpp=
int n = 0;
while (n<10) {
cout << n;
if (n==2) break;
n++;
}
```
請問輸出的值為何?
## <br>答案是 `012`
<!-- .element: class="fragment" data-fragment-index="1" -->
----
## <span class="colorPurple">continue</span>
用於 ++直接進入下一次迴圈++
----
### <span class="colorGold">範例</span>
***
```cpp=
for (int i=0; i<5; i++) {
if (i == 3) continue;
cout << i;
}
```
結果為:`0124`
----
### <span class="colorGold">範例</span>
***
```cpp=
for (int i=10; i>0; i--) {
if (i%4 == 0) continue;
if (i == 3) break;
cout << i;
}
```
想想看輸出的結果為何?
## <br>答案是 `109765`
<!-- .element: class="fragment" data-fragment-index="1" -->
----
### <span class="colorGold">小試身手</span>
[ZeroJudge a147. Print it all](https://zerojudge.tw/ShowProblem?problemid=a147)
---
## 陣列
----
可以把陣列想成是有多個同名的變數相連在一起
但彼此之間以編號做區別
----
若今天有一組整數陣列,陣列名稱為 arr
| 編號 | 0 | 1 | 2 |
| --- | --- | ---| ---|
| 值| 10 | 20 | 30 |
----
### 注意
在大部分的程式語言中編號都從零開始計算
在習慣上會說第一項,但對程式來說是第 0 項
----
### 注意
編號實際上應稱為「索引值」(index value)
----
### 陣列宣告
```cpp=
int arr[5];
```
以上程式碼會宣告一個長度為 5 的整數陣列
***
格式
```text=
型別 陣列名稱[長度];
```
----
### <span class="colorGold">範例</span>
#### 錯誤寫法
```cpp=
int main() {
int n;
cin >> n;
int arr[n];
}
```
其中陣列長度需為 常數 不得為 變數
#### 這在大部分的編譯器會提示錯誤
----
<!-- ### 補充:宣告常數
使用 <span class="colorPurple">const</span> 關鍵字來宣告一個常數
***
### <span class="colorGold">範例</span>
```cpp
const int i = 1e6;
``` -->
如果我想要陣列中有預設值?
```cpp
int arr[5] = {2, 4, 6, 8, 10};
```
```cpp
int arr[] = {2, 4, 6, 8, 10};
```
<!-- .element: class="fragment" data-fragment-index="1" -->
```cpp
int arr[5] = {2, 4, 6};
```
<!-- .element: class="fragment" data-fragment-index="2" -->
----
如何存取陣列中的值?
```cpp=
int arr[5] = {2, 4, 6, 8, 10};
arr[0] = 9; // 第零項 2 -> 9
cout<<arr[4]; // output: 10
```
同一般變數使用
但使用 <span class="colorBlue">[]</span> 存取陣列中的值
----
### <span class="colorGold">小試身手</span>
[ZeroJudge f345. 新手練習題—陣列](https://zerojudge.tw/ShowProblem?problemid=f345)
[ZeroJudge e968. 2. 班級名單 (Student list)](https://zerojudge.tw/ShowProblem?problemid=e968)
[ZeroJudge d074. 電腦教室](https://zerojudge.tw/ShowProblem?problemid=d074)
----
## 二維陣列
----
宣告方式
型態 名 [大小][大小]
int f[2][3]
----
### 二維陣列類似exccel一樣為一推變數組成的平面陣列
---
{"description":"用來寫程式的軟體","title":"高二社團","contributors":"[{\"id\":\"c76bed1b-fb21-4b17-b55a-3c804f01e602\",\"add\":33044,\"del\":9103}]"}