# CPP Lecture1

- __學習++基本概念++、++I/O++ 、++變數型態與運算++__
- __如何引入標準輸出輸入函式庫? (`std`)__
- __什麼是命名空間? (`using namespce`)__
---
### 前言 ✓
C++ 相對比 Python、Java 執行速度快,有優勢。
目標放在 APCS 需要的技能而不是整個 C++ 本身。
像是標準庫 (STL),`vector`、`map`、`queue` 結構,
都是要熟悉的內建工具,學會一定別人比較快。
再來就直接花時間解題,熟悉解題思路及技巧。
---
#### **📌 一個最簡單的 C++ 程式**
```cpp[]
#include <iostream> // 引入標準輸出入所需的函式庫
using namespace std; // 使用標準命名空間(非必要)
// C/C++ 程式執行起點: main function
int main() {
cout << "Hello, World!" << endl; // 輸出文字
return 0; // 結束程式
}
// '{' 左花括號 與 '}'右花括號包圍的部分為 main 的程式區塊(block)
```
- 導入標準輸出輸入 ( `cout`/`cin` )。
- 使用命名空間省略 `std::cout` 程式碼更簡潔。
- `main()`:程式的進入點,從 main 開始執行。
- `return 0;`:程式成功執行時返回 0(慣例)。
---
#### **輸出方法: `cout`**
```cpp[]
// 此為單行註解的符號
cout << "這是 C++ 語言" << endl; // endl 和 '\n' 都代表換行,差別?
cout << "這是 " << "C++ " << "語言" << '\n'; // 輸出與上一行一樣
cout << "數字 " << 114 << "為整數\n"; // 可以輸出數值
/* (多行註解的起頭)
cout "<<" 可以記開口方向朝向輸出的內容。
(多行註解的結尾) */
```
1. `<<` 用於 `cout`,將內容輸出到終端。
2. `<<` 右方為輸出流(stream),會自動剖析內容。可以為一個 _++值/變數/表達式++_ 等型態。
3. `endl` 等於換行字符(C++ 自定義)。
---
#### **輸出方法: `cout`**
```cpp[]
cout << "Hello "
<< "C++ "
<< "!"; // 程式碼中的手打換行是會被忽略的,直到遇到分號 ';'
// 輸出: "Hello C++ !"
```
```cpp[]
int x = 45;
cout << "一個數值: " << 123 << endl;
cout << "一個變數的數值: " << x << endl; // 45
cout << "一個表答式: " << (6 + 7) * 8 << endl; // 104
cout << "數值與變數: " << 9 / 45 << endl; // 0 (為何不是 0.2 ???)
cout << "數值與變數: " << 9 / 45.0 << endl; // 0.2 (這時候就正確 ?)
cout << "混合表達: " << 10 * x + 11 * (12 - x) * x / 15 << endl;
// 輸出: -639
```
:::spoiler **▼ Tip**
++值、變數、表達式、混和運用皆可作為輸出流++
:::
---
#### **讀入方法一: `cin`**
```cpp[]
int a, b, c;
cin >> a; // 讀取使用者輸入的數值
cout << "你輸入的是:" << a << "\n";
cin >> b >> c; // 讀取連續輸入的數值
cout << "你輸入的是:" << b << " 和 " << c << "\n";
string message;
cout << "輸入你想說的話:";
cin >> message;
cout << "你想說的是:" << message << "\n";
// cin ">>" 可以記尖端方向只向要存入的容器。
```
1. `>>` 用於 `cin`,將內容讀入到記憶體。
2. `>>` 右方為目的儲存空間,會從輸入流(stream)終端讀入並自動剖析型態。
3. 輸入必須符合儲存位置所設定的型別。
(否則可能會有不合預期的值產生)
---
#### **讀入方法二: `getline()`**
```cpp[]
#include <iostream>
#include <string> // 字串型態所需的函式庫
using namespace std;
int main() {
string text;
cout << "請輸入一整行文字含空格:" << endl;
getline(cin, text); // 讀取整行輸入,delim 預設為 '\n'
cout << "你輸入的是:" << text << endl;
return 0;
}
```
- getline(++istream&++ is, ++string&++ str, ++char++ delim)
- 傳入參數: ++輸入流++, ++字串儲存空間++, ++分割符++
- 會讀取輸入流直到第一個++換行++(預設) 為止
- 通常 APCS 輸入用不上,但以備不時之需
---
#### **讀入方法二: `getline()`**
我們可以指定一個特殊字元作為結束條件,例如 ','
```cpp[]
#include <iostream>
#include <string> // 字串型態所需的函式庫
using namespace std;
int main() {
string text;
cout << "請輸入一段文字 (遇到逗號 `,` 會停止讀取):" << endl;
// 輸入: ABC,DE
getline(cin, text, ','); // 設定 `,` 為分隔符號
cout << "你輸入的是:" << text << endl; // 輸出: ABC
return 0;
}
```
:::info
當遇到逗號(',')時,getline(cin, text, ',') 會停止讀取,但逗號(',')本身並不會儲存到 text 裡。
:::
---
#### **📊 讀入方法比較**
<br/>
| 方法 | 範圍 | 遇到空格/換行 | 適用情境 |
|-|-|-|-|
| `cin >>` | 只讀一個單字 | 空格後的內容會被忽略 | 讀入簡單的數值或單個字串 |
| `getline()` | 讀取整行輸入 | 會一直讀到分割符 ('\n' 換行符號) | 讀取整行、帶有空格的字串 |
---
#### **小練習1:奇怪的輸入**
```cpp[]
#include <iostream>
#include <string>
using namespace std;
int main() {
string name;
int age;
cout << "請輸入姓名:";
cin >> name;
cout << "請輸入年齡:";
cin >> age;
cout << "Hi " << name << ",你年齡 " << age << " 歲!\n";
return 0;
}
```
- 輸入範例 1:Alice`<enter>`25
- 輸入範例 2:Alice Cooper`<enter>`25
(會出現什麼情況?)
- 如何修改程式讓 `name` 變數能讀取完整的姓名?
---
### **小練習1:解答**
:::spoiler
```cpp[]
#include <iostream>
#include <string>
using namespace std;
int main() {
string name;
int age;
cout << "請輸入姓名:";
cin.ignore(); // 確保之前的輸入不影響 getline
getline(cin, name);
cout << "請輸入年齡:";
cin >> age;
cout << "Hi " << name << ",你年齡 " << age << " 歲!\n";
return 0;
}
```
:::
---
#### **小練習2:換行陷阱**
```cpp[]
#include <iostream>
#include <string>
using namespace std;
int main() {
int number;
string message;
cout << "請輸入一個數字:";
cin >> number;
cout << "請輸入一行文字:";
getline(cin, message); // ⚠
cout << "你的數字:" << number << endl;
cout << "你的文字:" << message << endl;
return 0;
}
```
- 試著輸入: 10`<enter>`I love C++
- 有沒有發現沒有成功讀取 "I love C++"?
- 為什麼會發生這個問題,該怎麼修正?
---
### **小練習2:解答**
:::spoiler
```cpp[]
#include <iostream>
#include <string>
using namespace std;
int main() {
int number;
string message;
cout << "請輸入一個數字:";
cin >> number;
cin.ignore(); // 忽略換行符
cout << "請輸入一行文字:";
getline(cin, message);
cout << "你的數字:" << number << endl;
cout << "你的文字:" << message << endl;
return 0;
}
```
✅ 加上 `cin.ignore()` 之後
`getline()` 就能讀取完整輸入
:::
---
#### **小練習3:自訂分隔符**
- ++Requirement++:
請撰寫一個程式,可以讀取一行文字內容,
但當遇到 `','` (逗號) 時就停止輸入:
<br/>
```
// 輸入範例:
Hello world, I am learning C++
// 範例輸出:
Hello world
```
---
### **小練習3:解答**
:::spoiler
```cpp[]
#include <iostream>
#include <string>
using namespace std;
int main() {
string input;
cout << "請輸入一串文字(遇到逗號 `,` 停止讀取):";
getline(cin, input, ',');
cout << "輸入的內容:" << input << endl;
return 0;
}
```
:::
---
#### 📌 變數宣告
```cpp[]
#include <iostream>
#include <cstdlib> // 布林型態所需的函式庫
using namespace std;
int main() {
int a; // 宣告一個整數變數值
int b = 10; // 宣告一個整數變數並賦予值
float c = 0.45f; // 宣告一個浮點數變數並賦予值
double pi = 3.14; // 宣告一個雙精度浮點數變數並賦予值
char chr = 'A'; // 宣告一個字元變數並賦予值
string s = "Hello"; // 宣告一個字串變數並賦予值
bool flag = true; // 宣告一個布林變數並賦予值
return 0;
}
```
- 變數(`Variable`)提供一個有名稱的記憶體空間,方便將數值儲存在記憶體,並在稍後取回使用。
- 在 C++ 中要使用變數,必須先++宣告變數++名稱與指定++資料型態++,但不一定要給予初始值。
---
#### 無型態宣告(`auto`)
```cpp[]
int ageForStudent = 5;
double scoreForStudent = 80.0;
char levelForStudent = 'B';
// 可改為:
auto ageForStudent = 5;
auto scoreForStudent = 80.0;
auto levelForStudent = 'B';
auto ageForStudent; // 只用 auto 卻沒有初始,會發生編譯錯誤
// error: declaration of 'auto ageForStudent' has no initializer
```
<br/>
從 C++ 11 開始,若變數宣告後有明確地初始化,
可以使用 ++`auto`++ 讓編譯器推斷變數型態。
---
#### 🛈 常見資料型態
| 資料型態 | 範圍 | 大小 (bytes) |
|-|-|-|
| `int` | -2^31 到 2^31 – 1 | 4 |
| `float` | ±3.4E-38 ~ ±3.4E+38 | 4 |
| `double` | ±1.7E-308 ~ ±1.7E+308 | 8 |
| `char` | 1 個 ASCII 字元 | 1 |
| `bool` | true or false (1 或 0) | 1 |
| `string` | 變++長字串++ | 依內容長度 |
| `long long` | -2^63 到 2^63 – 1 | 8 |
<!-- | unsigned int | 0 ~ 4,294,967,295 | 4 |
| unsigned long long | 0 ~ 18,446,744,073,709,551,615 | 8 |
| wchar_t | 1 個 Unicode 字元 | 2 或 4 | -->
---
#### 1️⃣ ++`int`++(整數型態)
```cpp[]
int a = 10;
int b = -5;
cout << "a = " << a << ", b = " << b << endl;
```
- 用途: 儲存整數值,用於計算、迴圈等。
- 範圍: -2,147,483,648 ~ 2,147,483,647 (32-bit env)
---
#### 2️⃣ ++`float`++ / ++`double`++ (浮點數型態)
```cpp[]
float pi_f = 3.141592653f; // 單精度 (須加 f)
double pi_d = 3.141592653589793; // 雙精度
cout << "float: " << pi_f << endl;
cout << "double: " << pi_d << endl;
```
- 用途: 儲存小數值,double 精度比 float 高,建議優先使用 double。
- 精度:
- float: 大約 7~8 位有效數字
- double: 大約 15~16 位有效數字
---
#### 3️⃣ ++`char`++ (字元型態)
```cpp[]
char letter = 'A';
cout << "字元: " << letter << endl;
```
- 用途: 儲存 單一字元 (ASCII 或 Unicode)。
- 大小: 1 byte (char 只有 256 個可能值)。
- 表示方式: 用單引號 'A' 而非 "A" (後者為 string)。
<br/>
🔹 注意: 'A' 其實對應 ASCII 值 65,透過 int 轉換:
```cpp[]
char letter = 'A';
cout << (int)letter; // 輸出: 65
```
---
### ==ASCII Code 表格==

- ASCII 泛用的字碼標準。 使用`7`個位元(bit)來儲存每個字元,所以可代表`128`個不同的英文、數字、符號或一些運作(就是鍵盤上的鍵位)
---
#### 4️⃣ ++`bool`++(布林型態)
```cpp[]
bool isStudent = true;
bool ihasSalary = false;
cout << "學生身份: " << isStudent << endl;
cout << "有無薪水: " << ihasSalary << endl;
```
- 用途: 表真假 (true/false),內部以 0 和 1 存儲。
- 常見用途: ++條件判斷++、++迴圈控制++ (if, while, for)
<br/>
:::success
🔹 注意
true 會輸出 1,false 會輸出 0。注意:
:::
---
#### 5️⃣ ++`string`++ (字串型態)
```cpp[]
string name = "Alice";
cout << "Hello, " << name << "!" << endl;
// 字串操作
string a = "Hello";
string b = "World";
string c = a + " " + b;
cout << c << endl; // Hello World
```
- 用途: 儲存 字串 (`"Hello"`、`"C++"` 等)
- 需要 `#include <string>`
- 可變長度,不像 char 陣列 (`char[]`)
---
#### 6️⃣ ++`long long`++ (大數整數)
```cpp[]
long long bigNum = 10000000000LL; // 注意結尾 "LL"
cout << bigNum << endl;
```
<br/>
- 用途: 儲存 超大整數,避免 int 溢位
- 範圍(64-bit):
- 下限: -9,223,372,036,854,775,808
- 上限: 9,223,372,036,854,775,807
---
### 📎++資料型態總結++ >>
---
| 型態 | 主要用途 | 需注意事項 |
| -|-|- |
| `int` | 一般整數 | 避免溢位,較大數請用 ++`long long`++ |
| `float` | 低精度小數 | 有精度誤差,推薦用 double |
| `double` | 高精度小數 | 一般浮點數計算優先選擇 |
| `char` | 單一字元 | 需用 單引號 'A' |
| `bool` | 表示真假 | true 會輸出 1,false 會輸出 0 |
| `string` | 儲存長字串 | `#include <string>` 才能使用 |
<!-- | long long | 超大整數 | int 溢位時可用 |
| unsigned int | 無負數整數 | 負數會溢位 |
| wchar_t | 儲存 Unicode 字元 | 需 L'' 前綴,搭配 wcout | -->
---
#### 💻 運算子(Operators)
<br/>
用來對++變數++或++數值++執行計算或邏輯判斷的符號,
依功能分類可以分為以下幾類:
- (1) **`算術運算子`**(Arithmetic Operators)
- (2) **`賦值運算子`**(Assignment Operator)
- (3) **`比較運算子`**(Comparison Operators)
- (4) **`邏輯運算子`**(Logical Operators)
- (5) **`位運算子`** (Bitwise Operators)
---
#### 1. 算數運算子
> - **以下以 a = `10`, b = `3` 為範例**
| 運算子 | 說明 | 範例 | 結果 |
|-|-|-|-|
| `+` | 加法 | a + b | 13 |
| `-` | 減法 | a - b | 7 |
| `*` | 乘法 | a * b | 30 |
| `/` | 除法 | a / b | 3 (取整) |
| `%` | 取餘數(模數) | a % b | 1 |
其實就是數值運算,如加法、減法、乘法等
🔹`%` 只適用於整數運算,不能用於++浮點數++
---
#### 1. 算數運算子 - 範例
```cpp[]
int a = 10, b = 3;
cout << a / b << endl; // 3
cout << (double)a / b << endl; // 3.33333,`a` 運用到型態轉換
cout << 10.0 / b << endl; // 3.33333
cout << a / 3.0 << endl; // 3.33333
cout << a % b << endl; // 1
```
* 補充: 在 C++ 中,我們可以透過++型別轉換++(Type Casting)來強制變數轉換為不同的資料型態。這在除法運算、數據處理、記憶體管理等情境需多注意,包括以下三種轉換方式:
* 括號型態轉換(C-style Casting)
* 標準型別轉換(`static_cast<type>()`)
* 隱式型別轉換(Implicit Type Conversion)
_- 後續再詳細提及 -_
<!-- | 型別轉換方式 | 語法 | 適用情境 | 優點 |
|-|-|-|-|
| C-style 強制轉換 | (double)a / b | 快速轉換但不安全 | 簡單直覺,但可能導致難以追蹤的錯誤 |
| C++ 標準轉換 | static_cast<double>(a) / b | 一般數值轉換 | 更安全,推薦使用 |
| 隱式型別轉換 | double y = x; | 自動轉換時使用 | 可讀性高,但需注意精度問題 | -->
---
#### 2. 賦值運算子
> - **以下以 `int a;` 為範例**
| 運算子 | 說明 | 範例 | 累計結果
|-|-|-|-|
| `=` | 賦值 | a = 1 | 1 |
| `+=` | 加上某值 | a += 2 | 3 |
| `-=` | 減上某值 | a -= 4 | -1 |
| `*=` | 乘上某值 | a *= 25 | -25 |
| `/=` | 除上某值 | a /= 2 | -12 |
| `%=` | 模上某值 | a %= 7 | -5 |
與算數運算子有點相似,預算作用於對象本身
```cpp[]
// 小問題:
int b = -5; b %= 6; // b = ??
```
---
#### 3. 比較運算子
> - **以下以 a = `10`, b = `3` 為範例**
| 運算子 | 說明 | 範例 | 結果 |
|-|-|-|-|
| `==` | 等於 | a == b | ++false++ (0) |
| `!=` | 不等於 | a != b | ++true++ (1) |
| `>` | 大於 | a > b | ++true++ (1) |
| `<` | 小於 | a < b | ++false++ (0) |
| `>=` | 大於等於 | a >= b | ++true++ (1) |
| `<=` | 小於等於 | a <= b | ++false++ (0) |
比較運算子不會改變變數本身的值,
只會返回 true 或 false
---
#### 3. 比較運算子 - 範例
```cpp[]
int x = 5, y = 10;
cout << (x > y) << endl; // 0 (false)
cout << (x != y) << endl; // 1 (true)
cout << (5.0 == 5) << endl; // ?
cout << ('A' == 65) << endl; // ??
cout << ('B' == 65) << endl; // ??
cout << ((int)'A' == 65) << endl; // ??
cout << ((double)'A' == 65) << endl; // ??
cout << ((x == y) == 0) << endl; // !?
cout << ((x == y) == 1) << endl; // !!??
cout << ((x == y) != (x != y)) << endl; // !!!!!!?????
```
基於前面學到的
請判斷以上輸出的結果會是什麼呢 `??`
---
#### 4. 邏輯運算子
> - **以下以 a = `10`, b = `3` 為範例**
| 運算子 | 說明 | 範例 | 結果
|-|-|-|-|
| `&&` | AND(且) | (a > 5 && b < 5) | true (1) |
| `\|\|` | OR(或) | (a < 9 \|\| b > 2) | true (1) |
| `!` | NOT(反向) | !(a > 5) | false (0) |
<br/>
- `&&(AND)`:兩個條件都成立結果才為 true。
- `||(OR)`:其中一個條件成立結果就為 true。
- `!(NOT)`:將 true 變成 false,false 變成 true。
---
#### 4. 邏輯運算子 - 範例
```cpp[]
int a = 0, b = 1;
int c = 2, d = 3;
int e = -1, f = -2;
cout << (a && b) << endl; // 0 (false)
cout << (a || b) << endl; // 1 (true)
cout << (c && d) << endl; // ?
cout << (c || d) << endl; // ?
cout << (e && f) << endl; // ?
cout << (e || f) << endl; // ?
cout << !(1) << endl; // ?
cout << !!0 << endl; // ?
cout << !((1 == 0) || (1 != 0)) << endl; // ??
cout << ((1 == 0) || (1 != 0)) << endl; // ???
```
一樣思考一下,output 會是什麼 `?`
---
#### 5. 位運算子
> - **以下以 a = `5`, b = `3` 為範例**
> 5_10 = 0101_2, 3_10 = 0011_2
| 運算子 | 說明 | 範例 | 結果 |
|-|-|-|-|
| `&` | 位元 AND | a & b | 1 (0001) |
| `\|` | 位元 OR | a \| b | 7 (0111) |
| `^` | 位元 XOR | a ^ b | 6 (0110) |
| `~` | 位元 NOT | ~a | 1...1010(取反) |
| `<<` | 左移位 | a << 1 | 10 (0101 -> 1010) |
| `>>` | 右移位 | a >> 1 | 2 (0101 -> 0010) |
位元運算子用於對++二進位++進行運算,除了`考題`之外常見於效能優化、低階硬體開發等。
---
#### 5. 位運算子 - 範例
```cpp[]
int a = 4, b = 7;
cout << (a & b) << endl; // 4
cout << (a | b) << endl; // 7
cout << (a ^ b) << endl; // ??
cout << (a << 1) << endl; // ??
cout << (a >> 1) << endl; // ??
cout << (b >> 1) << endl; // ???
```
- `&` 可以用來 檢查二進位的某一位是否為 1。
- `|` 可用於 設定某些位元為 1。
- `^` 可用來 做數據加密 或 交換兩個數值。
- `<<` 和 `>>` 可用於快速乘除 2。
---
### 📎 運算子總結
| 類別 | 說明 |
|-|-|
| `算術運算子` | 基本數值運算 |
| `賦值運算子` | 快速進行計算並賦值 |
| `比較運算子` | 判斷條件是否成立 |
| `邏輯運算子` | 判斷布林邏輯 |
| `位運算子` | 二進位運算 |
---
### ★ 元分類運算子 (補充)
| 類型 | 運算子 | 作用 |
|-|-|-|
| 一元運算子(Unary) | `++ -- ! ~` | 作用於單一變數或值 |
| 二元運算子(Binary) | `+ % != &&` | 作用於兩兩變數或值 |
| 三元運算子(Ternary) | `? :` | 三個操作數,通常用於條件判斷 |
<br/>
==三元運算子屬於語法糖,非必要用到==
🔗 ++[C/C++ 三元運算子](https://shengyu7697.github.io/cpp-ternary-operator/)++
---
#### 🕮 函式庫與命名空間
#### (Libraries & Namespaces)
<br/>
在 C/C++ 中,為了能夠使用特定功能,我們會在程式開頭包含`函式庫` (的名稱),並透過`命名空間`來使用++函式++或++物件++。這些概念對於 C++ 的應用至關重要。
---
#### 1. `#include` 與 ++Header File++
<br/>
當 `#include` 被編譯器讀取時,它會將對應++標頭檔++的內容直接插入到程式碼中,這意味著:
- 標頭檔只是程式碼的擴展,不會影響執行效能
- 需要的函式庫才引入,避免不必要的編譯時間
- 系統函式庫通常使用 `< >`,自訂函式庫用 `" "`
---
#### 📜 常見 ++[Header File](https://hackmd.io/@William8334551/CPP-Lib)++
<br/>
| 標頭檔 | 功能 |
|-|-|
| `<iostream>` | 標準輸出入 (`cin`, `cout`) |
| `<cstdlib>` | 標準函式庫 (`bool`, `rand`, `srand`, `abs`, `atoi`, `exit`) |
| `<string>` | 字串操作 (`string`) |
| `<vector>` | 動態陣列 (`vector`) |
| `<map>` | 關聯式容器 (`(unordered_)map`) |
| `<cmath>` | 數學函式 (`sqrt()`, `pow()`) |
| `<algorithm>` | 演算法 (`sort()`, `max()`) |
---
### 引入函式庫 - 範例
```cpp[]
#include <iostream> // 載入標準輸入輸出函式庫
#include <cmath> // 載入數學運算函式庫
int main() {
std::cout << "平方根:" << sqrt(25) << std::endl;
return 0;
}
```
---
### ☑ ++`using namespace std;`++ 是什麼❓
<br/>
C++ 中的標準函式庫(如 `cout`、`cin`、`endl`)都被定義在 `std` 命名空間裡,因此我們需要使用 `std::cout`, `std::end` 來呼叫它們:
```cpp[]
#include <iostream>
int main() {
std::cout << "Hello, World!" << std::endl;
return 0;
}
```
---
#### ✔️ 簡化 `std::` 的語法
<br/>
```cpp[]
using namespace std;
```
這樣就能直接使用 `cout`、`endl` 而不需要 `std::`
```cpp[]
#include <iostream>
using namespace std; // 省略 std::
int main() {
cout << "Hello, World!" << endl;
return 0;
}
```
---
#### 📌 ++`using namespace std;`++ 是否必要?
<br/>
使用命名空間雖然方便,但可能會帶來++命名衝突++(Naming Conflict),尤其在大型專案中,
建議使用++範圍限定++的 `using` 或 `std::` 前綴:
```cpp[]
#include <iostream>
using std::cout;
using std::endl;
int main() {
cout << "Hello, World!" << endl;
return 0;
}
```
---
#### 標頭檔(Header File) `V.S` 函式庫(Library)

---
### `∑` Summary
<br/>
- 函式庫是預先編寫好的 C++ 標準函式的實踐
- `#include` 負責++引入函式庫++,提供額外功能
- 包含必要標頭檔,避免過多 `#include` 降低效能
- ++自訂函式庫++使用 `" "`, ++系統函式庫++則用 `< >`
- 大型專案中不建議濫用:
- 避免 `using namespace std;`,改用 `std::`
- 特定 `using std::cout;`,減少++全域污染++
---
### 🔍 小測驗 1️⃣
為何需要 `#include<iostream>` 才能使用 `cout` ??
:::spoiler ▼ Answer
👉 `cout` 是定義在++標頭檔++內的 `std::cout`,C++ 預設不會自動載入這些功能,所以需要 `#include <iostream>` 來引入標準輸入輸出++函式庫++。
:::
---
### 🔍 小測驗 2️⃣
`using namespace std;` 可能造成哪些問題 ??
:::spoiler ▼ Answer
👉 在大型專案中,可能與其他函式庫的名稱發生衝突,例如 `vector` 在 C++ 標準函式庫與 `OpenCV` 中都有定義,這會導致程式無法正確編譯。建議使用 `std::cout` 來避免命名衝突。
:::
---
### 🔍 小測驗 3️⃣
什麼時候應該用 `#include "myheader.h"` 而不是 `#include <myheader.h>` ??
:::spoiler ▼ Answer
👉 `#include "myheader.h"` 用於自訂的標頭檔,編譯器會先從當前目錄尋找該檔案。
👉 `#include <myheader.h>` 用於標準函式庫,編譯器會從系統的標頭檔路徑搜尋該檔案。
:::
---
### ✎ 習題練習
---
<br/>
- [a003. 兩光法師占卜術](https://zerojudge.tw/ShowProblem?problemid=a003)
:::spoiler ▼ 模板
```cpp[]
#include <iostream>
using namespace std;
int main() {
int S;
// 你的程式:
// ...
//
switch (S) {
case 0:
cout << "普通\n";
break;
case 1:
cout << "吉\n";
break;
case 2:
cout << "大吉\n";
break;
}
return 0;
}
```
:::
<!-- - [...]() -->
{"title":"CPP Lecture1","image":"https://hackmd.io/_uploads/SkLh_yisyg.png","description":"CPP Lecture1.","contributors":"[{\"id\":\"08ecf684-cada-47c1-ad99-984ab62fb65e\",\"add\":19378,\"del\":2268}]"}