# 目錄
* 甚麼是C++
* C++
* 如何編輯程式碼
* 編譯器
* 文字編輯器
* IDE
* Hello World
* 資料型態 、 變數 與 陣列
* 運算子 = + - \* / % ++ -- += -= *= /= %
* 輸入 cin
* 條件判斷 if else if else
* 迴圈for while
* 小競賽
## 甚麼是C++
* **一種程式語言** ~~廢話~~
* **編譯型語言** 等等會介紹編譯器
## 編譯器
編譯的目的: 讓電腦能夠直接執行,有
//排版人幫我畫張圖||相信您看的懂||

編譯器是將程式碼轉成機器能夠執行的機器語言
## 文字編輯器
### 功能: 讓你編輯程式碼
### 優點: 使用較少電腦效能(相較IDE)
### 缺點: 無法一鍵編譯
### 常見的文字編輯器
#### Visual Studio code
[](https://code.visualstudio.com/)
* 屬於microsoft
* 簡稱**Vscode**
* 開放原始碼
* 是目前全世界最多人用的
* 優點: 擴充功能多
* 缺點: 安裝麻煩
* 總之**就是好用**
#### vim
[](https://www.vim.org/download.php)
* 優點
* 滑鼠再見
* 直接按件排超級快的啦
* 缺點
* 叫背很多按鍵
* 還要背指令
* 你可能會卡在vim裡出不來
* 你還要會終端機的指令
* 總之~~不適合初學者~~
* 對使用習慣的人來講**就是好用**
* **強烈建議先學到要寫200行以上的code在嘗試**
## IDE整合是開發環境
### 優點: 好安裝
### 缺點: 吃效能
### 常見的IDE
#### Visual Studio
[](https://visualstudio.microsoft.com/zh-hant/)
* 和剛剛Visual Studio Code名子很像
* 也是microsoft的
* 比Vscode早出現
* 優點: IDE不需要自己安裝編譯器
* 缺點: 電腦不夠好就會卡
#### Replit
[](https://replit.com)
* 線上版IDE
* 優點: 完全不需安裝、手機平板皆可使用
* 缺點: 沒網路很慘、速度較慢、~~其實我覺得不好用~~
* 今天要用的[先去註冊](https://replit.com)
---
## 第一個程式 Hello 暑訓
```cpp=
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"Hello 暑訓!\n";
}
```
### 第一行`#include<bits/stdc++.h>`
引入函式庫
`bits/stdc++.h`又被稱為萬用標頭檔,包含了幾乎所有你會用到的標頭檔
#### 其他標頭檔
| 功能 | 名稱 |
| -------- | ---------- |
| 輸入輸出 | `iostream` |
| 數學 | `cmath` |
| 時間 | `ctime` |
| 隨機 | `random` |
| 還有 | 更多.. |
### 第二行`using namespace std;`
使用命名空間(namespace)
為了標示類型、函數、變數的範圍,避免同名的類型、函數、變數相互衝突,導致程式出錯。
`std` 是大家會經常使用的namespace,裡面除了常見的輸入輸出以外,還有些資料類型可以使用,例如`string`、`vector`等等。
假設今天有另一個函式`cin`和`std`中的`cin`相互衝突,那就應該使用`std::cin`即可避免衝突的情況,`std::cin`代表使用的是`std`當中的`cin`。
### 第三行`int main(){}`
在大括號`{}`裡,就是這個程式開始時會運行的地方
### 第四行`cout<<"Hello 暑訓!\n";`
```cpp=
cout<<"你要輸出的東西";
```
#### 介紹一下`\n`
`\n`是換行的特殊符號
除此之外還有`\t`、`\'`、`\"`、`\\`
### ~~好欸 你會C++了~~
自己寫一遍吧
---
## 變數 資料型態
### 這是什麼?
一段記憶體位置使我們能夠儲存特定資料並在之後進行存取
### 變數
暫存資料
可以把**變數**想像成一個紙箱,裡面裝資訊
//幫我畫個示意圖
### 資料型態
變數的種類,依照剛才的比喻,可以想成是箱子的大小和裝法
//幫我畫張示意圖
分類的目的是方便電腦進行記憶體的分配和進行不同的運算方式
### 資料型態有哪些
| 名稱 | 用途 | 記憶體大小 |
| -------- | -------- | -------- |
| int | 整數$-2^{31}$~$2^{31}-1$ | 4bytes |
| unsigned | 非負整數$0$~$2^{32}-1$ | 4bytes |
| long long | 更大的整數$-2^{63}$~$2^{63}-1$ | 8bytes |
| unsigned long long | 更大的非負整數$0$~$2^{64}-1$ | 8bytes |
| float | 浮點數 (可以有小數點的數字)| 4bytes |
| double | 更精確浮點數 (可以有小數點的數字)| 8bytes |
| long double | 更更精確浮點數 (可以有小數點的數字)| 16bytes |
| bool | 布林值(只有`true`或`false`兩種情況) | 1byte |
| char | 字元 | 1byte |
| string | 字串 | 可變 |
其實還有更多種,但這些是常用的
### 變數的宣告
`資料型態 變數名稱1;`
還可以這樣
`資料型態 變數名稱, 另一個變數名稱, 另另一個變數名稱;`
```cpp!
int a,b,c=10;
```
* 註: 這樣只有c被宣告為10,其餘a, b皆為空的未被賦值的變數喔
### 變數的命名
一般來說會用有意義的變數名稱,例如我想存一個人的名字,那我的變數名稱會叫做`name`。
變數名稱有限制
* **只能**用大小寫字母、數字、`_`、`$`
* 數字**不可**作為變數名稱的開頭
* 大小寫意義不同
* 不可使用保留字
#### 保留字
因為**保留字**有特殊意涵,所以不可作為變數名稱,以免出錯,
常見的保留字可能是`資料型態`或是其他具有特殊意涵的字,
以下是常見的保留字清單,這東西**不要**背,重點在類別的部分
| 類別 | 保留字 |
| ---------------------- | -------------------------------------------------------------------------- |
| 資料型態 | `boot` `int` `long` `short` `signed` `unsigned` `signed` `char` `char8_t` `char16_t` `char32_t` |
| 數值 | `true` `false` `nullptr` |
| 宣告用 | `auto` `new` `static` `const` `new` `extern` `typedef` |
| 運算子 | `and` `or` `xor` `not` `not_eq` `or_eq` `sizeof` `delete` `bitand` `bitor` `compl` `operator` |
| 條件 | `if` `else` `switch` `case` `default` |
| 迴圈 | `for` `while` `do` `continue` `break` `goto` |
| 函式 | `return` `void` `inline` `friend` |
| 物件導向 | `class` `struct` `this` `enum` `namespace` `private` `public` `protected` `typeid` |
| 錯誤 | `catch` `noexcept` `throw` `try` |
| 其他~~我沒用過的東西~~ | `alignas` `alignof` `asm` `const_cast` `constexpr` `decltype` `dynamic_cast` `explicit` `reinterpret_cast` `static_assert` `static_cast` `template` `thread_local` |
## 陣列
就是一排可以隨機取用跟變更的變數
### 陣列的宣告
`資料型態 陣列名稱[陣列長度];`
```cpp!
int arr[5];
```
這個陣列有`arr[0]`、`arr[1]`、`arr[2]`、`arr[3]`、`arr[4]`共5項
請注意陣列一切**從0開始(0-base)**,可能一開始會不習慣,久了就沒事了
### 陣列的存取與修改
```cpp=
int arr[5]={0};//全部歸0(只有在宣告時才能這樣用)
cout<<arr[0]<<"\n"; //0
arr[0]=7;
cout<<arr[0]<<"\n"; //7
```
---
## 輸入cin與輸出cout
### cout
cout指的是輸出,在我們的第一個程式中有這麼一行程式碼
```cpp!
cout<<"Hello 暑訓!\n";
```
用法就是`cout`加上`<<`再加上你要輸出的東西
要輸出的東西如果是變數,那在`<<`後就不用加`""`
否則就要加
而如果要連著輸出多個東西,一樣可以用`<<`再接下去
```cpp!
int a=10;
cout<<"Hello\n";
cout<<a<<"\n";
cout<<"I am "<<a<<" years old.";
```
執行結果:
```txt!
Hello
10
I am 10 years old.
```
### cin
cin指的是輸入,在前面的變數部分有提到,變數是存放資訊的箱子。除了在創建變數的時候就賦值給他,還可以用`cin>>`來賦值給變數。
```cpp!
int a;//此時只有一個叫a的箱子,裡面沒有東西
cin>>a;
cout<<a;
```
假如我們要給a賦值為10,執行結果會像
```txt!
10(你cin給電腦的)
10(電腦cout出來的)
```
## 運算子
### `=` 賦值運算子
* 程式語言中的`=`與數學中的`=`的意思不同
* `a=3`:將3這個值賦予給a這個變數
* 如果要使用數學中的比較是否相同,請使用`==`,詳情請見if else篇
```cpp=
int a=1,b=2,c;
c=4;
cout<<a<<"\n"; //1
a=b;
cout<<a<<"\n"; //2
b=c;
cout<<b<<"\n"; //4
```
### `+` `-` `*` `/` `%` 運算子
* 其實就和一般加減乘除一樣
* 記得有**先乘除後加減**
* `%`是算餘數的意思
```cpp=
int a=1,b=2,c=4;
a=a+b;
cout<<a<<"\n"; //3
cout<<a*b<<"\n"; //6
cout<<c%a<<"\n"; //1
```
### `++` `--` 運算子
* `++`: +1
* `--`: -1
工程師就比較懶
```cpp=
int a=1;
a++;
cout<<a<<"\n"; //2
cout<<a++<<"\n"; //2
cout<<a<<"\n"; //3
cout<<++a<<"\n"; //4
```
### `+=` `-=` `*=` `/=` `%=` 運算子
其實就只是縮寫,不是新的東西
a+=10; 等價於 a=a+10;
a*=10; 等價於 a=a*10;
```cpp=
int a=10;
a+=10;//a==20
a-=10;//a==10
a*=10;//a==100
a/=10;//a==10
a%=10;//a==0
```
### 關係運算子 `==` `!=` `>=` `<=` `>` `<`
* 符合(1) <-> 不符合(0)
* `!=` 代表 `≠`(不等於)
### 邏輯運算子 `||` `&&` `!`
* `||`:兩側至少其中之一為true時回傳true
* `&&`:兩側皆須為true才為true時回傳true
* `!`:變號 true變false false變true
```cpp
int a=2, b=2, c=4;
cout<<(a==b||b==c); //1(true)
cout<<(a==b&&b==c); //0(false)
cout<<(!(a==b&&b==c)); //1(true)
```
其實還有xor`^`為兩側恰有其一為true時回傳true
## if else條件判斷
功能: 用於在不同的條件下,執行不同的程式片段
### `if()` 用法
```cpp=
if(條件){//條件成立(true)時執行
執行的東西1;
執行的東西2;
}
```
偷懶的用法:
```cpp=
if(條件) 執行的東西;
```
或
```cpp=
if(條件)
執行的東西;
```
**偷懶是有代價的**,如果用的偷懶的用法,執行的東西只能有一個
### `else if()` 用法
可以用於前面的條件不符合
```cpp=
if(條件1){
cout<<1<<"\n";//條件1成立時執行
}//結束這一回合
else if(條件2){//條件1不成立才會判斷
cout<<2<<"\n";
}
else if(條件3){//條件2仍然不成立才會判斷
cout<<3<<"\n";
}
```
### `else` 用法
在所有條件皆不符合時,作為例外狀況使用
```cpp=
if(條件1){
cout<<1<<"\n";
//條件1成立時執行
//結束這一回合
}
else if(條件2){//條件1不成立才會判斷
cout<<2<<"\n";
}
//...很多個else if過後
else {//上述所有條件皆不成立後
cout<<3<<"\n";
}
```
## for while 迴圈
用法:重複執行相同的事情
### for 迴圈
模板:
```cpp=
for(起始設定;每次做之前判斷;每做完一次後的更新){
要做的事;
}
```
範例:
```cpp=
for(int var=0;var<5;var++){
cout<<var<<"\n";
}
```
執行結果:
```txt!
0
1
2
3
4
```
### while 迴圈
模板:
```cpp=
while(每次做之前判斷){
要做的事;
}
```
範例:
```cpp=
int var = 0;
while(var < 5){
cout << var << "/n";
var++;
}
```
執行結果:
```txt!
0
1
2
3
4
```
## 小小賽
註冊[iscoj](https://iscoj.fg.tp.edu.tw)
如果沒有email請向現場助教要臨時帳號