# QwQ:從C++開始的APCS之旅
{%hackmd theme-dark %}
## 開發環境(IDE)與參考教材
+ [Code::Blocks](https://www.codeblocks.org/)
+ [下載CodeBlocks Windows安裝包](https://www.codeblocks.org/downloads/binaries/#imagesoswindows48pnglogo-microsoft-windows)
:::warning
**記得要選檔名中有mingw-setup.exe**的下載,才能正常編譯與執行C++
:::
+ [W3schools C++ Tutorial](https://www.w3schools.com/cpp/default.asp)
## 開啟新c++(cpp)程式碼檔案與基本輸出語法

### 先按`Ctrl` + `S`存檔後再開始寫code

#### 記得存檔檔名要.cpp結尾
```cpp=
#include <iostream>
using namespace std;
int main() {
cout << "Hello World!";
return 0;
}
```
### 按`F9`建置(編譯)並執行

### 程式碼中的註解
```cpp=
#include <iostream>
using namespace std;
// 我是單行註解
int main() {
return 0;
}
/*
*1
2
3
我們是多行註解
*/
```
### C++字串中的特殊符號
```cpp=
#include <iostream>
using namespace std;
int main() {
cout << "Line 1\n"; // 反斜線n 為換行符號
cout << "Line 2" << endl;// 或是你也可以用<<endl換行
cout << "我們之間\t相隔1個TAB符號" << endl;
cout << "\"你好\"我有雙引號" << endl;
return 0;
}
```
## 變數(Variables)
### 宣告不同型態的變數
```cpp=
#include <iostream>
using namespace std;
int main() {
int pig = 1;
// [變數型態] [變數名稱] = [指派的值];
// 每一行的分號;很重要代表這行程式碼的結尾
double a = 6.68;
char b = 'b';
string h = "Hello World";
bool t = true;
// true = 1, false = 0
cout << pig << "\t" << a << "\t" << b << endl;
cout << h << "\t" << t << endl;
return 0;
}
```
### 在同一行內宣告多個變數
```cpp=
#include <iostream>
using namespace std;
int main() {
int x = 5, y = 6, z = 50;
cout << x + y + z << endl;
double x1 = 5.3, y1 = 6.9, z1 = 3.14;
cout << x1 * y1 / z1;
return 0;
}
```
### 更改變數值與宣告常數(不可變)
```cpp=
#include <iostream>
using namespace std;
int main() {
int a = 1;
const float PI = 3.141592;
// 加上const代表常數,不可更改值
a = a + 6;
//執行完上行後a的值為7
cout << a << "\nPI:" << PI;
return 0;
}
```
## 基本輸入與輸出(cin與cout)
```cpp=
#include <iostream>
using namespace std;
int main() {
int x;
cout << "請輸入整數(輸入完後按ENTER):";
cin >> x;
// 把使用者輸入的值存到指定的變數裡
cout << "你輸入的數字為:" << x;
int a,b;
cin >> a >> b;
// 也可以輸入多個數值(在題目中通常以空白隔開不同的輸入)
return 0;
}
```
> REF: https://www.w3schools.com/cpp/cpp_user_input.asp
## 基本資料型態(Data Types)

```cpp=
int myNum = 5; // Integer (whole number)
float myFloatNum = 5.99; // Floating point number
double myDoubleNum = 9.98; // Floating point number
char myLetter = 'D'; // Character
bool myBoolean = true; // Boolean
string myText = "Hello"; // String
```
> REF: https://www.w3schools.com/cpp/cpp_data_types.asp
> 可以點進去看每個資料型態的詳細說明
## 運算子(Operator)
### 基礎運算子(四則運算)
> REF: https://www.w3schools.com/cpp/cpp_operators.asp
```cpp=
#include <iostream>
using namespace std;
int main() {
double a=3,b=2,c=6,d=9;
cout << a/2 + b*c - d << endl;
cout << (a + b) * c<< endl;
return 0;
}
```
### 取餘數運算子(%)
```cpp=
#include <iostream>
using namespace std;
int main() {
int a=187,b=69,c=6;
c = a % b;
// %代表取餘數,只能用在整數運算(int)
// %讀音是mod
cout << c << endl;
return 0;
}
```
### ++與+=運算子

```cpp=
#include <iostream>
using namespace std;
int main() {
int pig = 6;
pig++;// 這行等同下面被註解的那行
// pig = pig + 1;
pig+=2;//也可以加任何數
cout << pig << endl;
return 0;
}
```
### - -與-=運算子
:::info
**加加 的妹妹叫 減減** :laughing:
:::
```cpp=
#include <iostream>
using namespace std;
int main() {
int pig = 88;
pig--;// 這行等同下面被註解的那行
// pig = pig - 1;
pig-=2;//也可以減去任何數
cout << pig << endl;
return 0;
}
```
### 指派運算子(Assignment Operators)
> REF: https://www.w3schools.com/cpp/cpp_operators_assignment.asp
> 
### 比較運算子(Comparison Operators)
> REF: https://www.w3schools.com/cpp/cpp_operators_comparison.asp
> 
```cpp=
int x = 5;
int y = 3;
cout << (x > y);
// 回傳結果為 1 (true) 因為 5 大於 3
```
### 邏輯運算子(Logical Operators)
> REF: https://www.w3schools.com/cpp/cpp_operators_logical.asp
> 
#### 邏輯運算子常用於 if / if else 的判斷式
## 20230128練習題
### 課堂練習
+ [ZERO JUDGE-a001. 哈囉](#a001-哈囉)
+ [ZERO JUDGE-a002. 簡易加法](#a002-簡易加法)
### 下次上課複習題
+ [輸入兩整數輸出完整算術結果與餘數](#EX1-輸入兩整數輸出完整算術結果與餘數)
+ [輸入三小數輸出相減結果](#EX2-輸入三小數輸出相減結果)
---
## if、else if、else條件判斷(Conditions and If Statements)
> REF: https://www.w3schools.com/cpp/cpp_conditions.asp
### 在開始之前先[複習上次的內容](20230128練習題)
## 零壹是否布林值(Boolean)
### 認識布林值(Boolean Value)
> REF: https://www.w3schools.com/cpp/cpp_booleans.asp
### 布林表達式(Boolean Expressions)與應用範例
> REF: https://www.w3schools.com/cpp/cpp_booleans_expressions.asp
## 常用數學函式(C++ Math)
> REF: https://www.w3schools.com/cpp/cpp_math.asp
### 記得要先引入cmath函式庫
```cpp=
#include <cmath>
```
## C++字串(Strings)與他們的函式
### 引入字串函式庫與宣告字串
```cpp=
#include <string>
// 還是要記得加上面那行避免舊版IDE無法識別string資料型態
string greeting = "Hello";
```
### 字串連接函式(Concatenation)
> REF: https://www.w3schools.com/cpp/cpp_strings_concat.asp
### 注意字串與數字的加法
> REF: https://www.w3schools.com/cpp/cpp_strings_numbers.asp
### 字串長度(Length)與存取特定字串中的特定字元
> REF1: https://www.w3schools.com/cpp/cpp_strings_length.asp
> REF2: https://www.w3schools.com/cpp/cpp_strings_access.asp
#### 陣列的概念後面詳細介紹,這裡先簡易帶過
### 特殊字元(Special Characters)
> REF: https://www.w3schools.com/cpp/cpp_strings_esc.asp
### 讀取使用者的整行輸入為字串(getline函式)
> REF: https://www.w3schools.com/cpp/cpp_strings_input.asp
## 函式命名空間(Namespace)
### Namespace References
+ https://www.w3schools.com/cpp/cpp_strings_namespace.asp
+ https://openhome.cc/Gossip/CppGossip/Namespace.html
+ https://www.runoob.com/cplusplus/cpp-namespaces.html
### 假設Steve與Alex都寫了名為greeting function的程式碼
```cpp=
#include <iostream>
#include <string>
namespace alex {
void greeting(){
std::cout << "Hello! I am Alex." << std::endl;
}
}
namespace steve {
using namespace std;
void greeting(){
cout << "Hi~ I am Steve." << endl;
}
}
int main(){
// 讓Steve與Alex互相打招呼
steve::greeting();
alex::greeting();
return 0;
}
```
---
## 再下周的授課內容籌畫中(Switch與Loops)
---
## LuckyPig自己出的練習題
### EX1-輸入兩整數輸出完整算術結果與餘數
#### 範例輸入
#### 範例輸出
#### 範例解答(請自行練習完後再參閱)
```cpp=
#include <iostream>
owo;
```
### EX2-輸入三小數輸出相減結果
#### 範例輸入
#### 範例輸出
#### 範例解答(請自行練習完後再參閱)
```cpp=
#include <iostream>
owo;
```
---
## 高中生程式解題系統
+ https://zerojudge.tw/Problems
:::info
**都答對的話會出現如下圖式(AC)**

:::
### a001. 哈囉
+ https://zerojudge.tw/ShowProblem?problemid=a001
```cpp=
#include <iostream>
using namespace std;
int main() {
string input;
cin >> input;
cout << "hello, " << input << endl;
return 0;
}
```
### a002. 簡易加法
+ https://zerojudge.tw/ShowProblem?problemid=a002
```cpp=
#include <iostream>
using namespace std;
int main() {
int a,b;
cin >> a >> b;
cout << a+b << endl;
return 0;
}
```