---
# System prepended metadata

title: 上學期課程精華版
tags: [C++]

---

# 上學期課程精華版
政附資訊20屆 zfcsc20th
###### tags: `C++`

----

# <a href="https://hackmd.io/@zfcsc20th/SyHrJaBJbl">第一堂社課 </a> 
## C++ 基礎架構

```cpp=
#include<iostream>
using namespace std;
int main(){
    
}
```

## 輸入輸出

`cin` : 輸入，使用 `>>` 連接
`cout` : 輸出，使用 `<<` 連接
`'\n'` 、 `endl` : 輸出換行

## 變數型別

| 名稱 | 儲存值 |
| :---: | :---: |
| int | 整數 |
| long long int | 長整數 |
| float | 浮點數(小數) |
| double | 雙精度浮點數(小數) |
| bool | 布林值(1或0) |
| char | 字母 |
| string | 字串 |
| void | 無 |

## 算術運算子

| 運算子 | 用途 |
|:------:| :----: |
| + | 將左值加上右值 |
| - | 將左值減去右值 |
| * | 將左值乘上右值 |
| / | 將左值除以右值 |
| % | 取左值除以右值的餘數 |

----

# <a href="https://hackmd.io/@zfcsc20th/BktQJarJ-x">第二堂社課 </a> 

## 關係運算子

| 符號 | 意義 |
| :--------: | :--------: |
| > | 大於 |
| < | 小於 |
| >= | 大於等於 |
| <= | 小於等於 |
| == | 等於 |
| != | 不等於 |

## 邏輯運算子

| 符號 | 意義 |
| :--------: | :--------: |
| && | 且 |
| \|\| | 或 |
| ! | 相反 |

## if...else... 判斷式
```cpp=
if(條件1){
    //陳述 
}
else if(條件2){
    //陳述
}
else{
    //陳述
}
```

## switch...case... 判斷式
```cpp=
switch (變數/運算式) {
    case 值1:
        //陳述
        break;
    case 值2:
        //陳述
        break;
    default:
        //陳述
        break;//可省略 
}
```

----

# <a href="https://hackmd.io/@zfcsc20th/ryO_kTSkWl">第三堂社課 </a> 

## 遞增(```++```)與遞減(```--```)運算子

```cpp=
#include<iostream>
using namespace std;
int main(){
    int a=1;//a=1
    a++;
    cout<<a;//a=2
    ++a;
    cout<<a;//a=3
    a--;
    cout<<a;//a=2
    --a;
    cout<<a;//a=1
}
```

## 前置(```++a```)與後置(```a++```)的區別
在運算上會有些許的不同:
```cpp=
int a,count=5;
a=count+++5;//a=10
```
```cpp=
int a,count=5;
a=++count+5;//a=11
```

## for 迴圈基本語法
```cpp=
for (初始;判斷;運算) {
    陳述句;
}
```
初始:只在進入迴圈時執行
判斷:判斷是否繼續迴圈
運算:每次一個迴圈循環後執行

## while 迴圈基本語法
```cpp=
while(判斷) {
    陳述句;
}
```
判斷:判斷是否繼續迴圈



## do...while 迴圈基本語法
```cpp=
do{
    陳述句;
}while(判斷);
```
判斷:判斷是否繼續迴圈

## 略過迴圈迭代
當有一個迴圈你不想要執行時
你可以使用```continue```來跳過

## 中斷迴圈
當有一個迴圈之後的迴圈你都想要跳過時
你可以使用```break```來跳過

## 巢狀敘述
當你將多個條件判斷式或迴圈一層一層組合在一起
即稱之為**巢狀敘述**

----

# <a href="https://hackmd.io/@zfcsc20th/S1fH3sEgWg">第四堂社課 </a> 

## C 風格陣列

```cpp=
#include<iostream>
using namespace std;
int main(){
    int a[3]={1,2,0};// 陣列的宣告與定義
    a[2]=3;// 陣列的改變
    for(int i=0;i<3;i++)cout<<a[i]<<endl;//陣列的引用
}
```

## C++ `std::vector` 

```cpp=
#include<iostream>
#include<vector>
using namespace std;
int main(){
    // std::vector 的宣告與定義
    vector<int>a(3,0);
    vector<int>b({1,0,-1});
    // std::vector 的改變
    b[1]=1;
    b.at(2)=2;
    // std::vector 的引用
    cout<<a[0];
    cout<<b.at(1);
}
```

## C++ ```std::vector``` 的基礎操作

`push_back()` : 在陣列的最後新增元素
`insert()` : 在指定位置插入元素
`pop_back()` : 刪除陣列最後方的元素
`erase()` : 刪除指定位置或指定記憶體區間的元素
`clear()` : 清空 `std::vector` 陣列
`size()` : 讀取陣列長度
`resize()` : 調整陣列長度
`empty()` : 讀取陣列是否為空

----

# <a href="https://hackmd.io/@zfcsc20th/r1nQqlJGWg">第五堂社課 </a> 


## 字元
根據 ASCII 碼，我們可以對字元做簡單的運算
```cpp=
#include<iostream>
using namespace std;
int main(){
    char a='a',b='b',c='1',d='d',e='e',f='f';
    int C=c-'0';
    cout<<a-b<<endl;//-1
    cout<<C<<endl;//1
    cout<<int(d)<<endl;//100
    cout<<(e>f)<<endl;//0
}
```

## `cctype` 函式
`isalpha()` : 是否為字母
`isupper()` : 是否為大寫字母
`islower()` : 是否為小寫字母
`isdigit()` : 是否為數字
`isalnum()` : 是否為數字或字母
`isspace()` : 是否為空格 ' '
`isblank()` : 是否為空格 ' ' 或 '\t'
`toupper()` : 將字元從小寫轉換成大寫的 ASCII
`tolower()` : 將字元從大寫轉換成小寫的 ASCII

## C++ `std::string` 

```cpp=
#include<iostream>
#include<string>
using namespace std;
int main(){
    // std::string 的宣告與定義
    string a="Xiaochengyi";
    string b("Kaikai");
    // std::string 的改變
    b[3]='K';
    a.at(0)='x';
    // std::string 的引用
    cout<<a[0];
    cout<<b.at(1);
    cout<<a;
}
```

## C++ ```std::string``` 的基礎操作

`push_back()` : 在字串的最後新增元素
`insert()` : 在指定位置插入元素
`pop_back()` : 刪除陣列最後方的元素
`erase()` : 刪除指定位置或指定記憶體區間的元素
`clear()` : 清空字串
`size()` : 讀取字串長度
`length()` : 讀取字串長度
`resize()` : 調整陣列長度
`empty()` : 讀取字串是否為空
`append()` : 將兩字串相加
`getline()` : 讀取整行字串
`find()` : 尋找子字串
`substr()` : 擷取子字串

## 變數的域
變數的作用是有範圍的，主要是以大括號 `{}` 為分界
```cpp=
#include<iostream>
using namespace std;
int a=0;// 全域變數
int main(){
    cout<<a;// 0
    int a=1;// 區域變數
    {
        cout<<a;// 1
        int a=2;// 區域變數
        {
            cout<<a;// 2
            int a=3;// 區域變數
            cout<<a;// 3
        }
        cout<<a;// 2
    }
    cout<<a;// 1
}
```

## 函式的宣告、定義、引用以及函式參數的使用

```cpp=
#include<iostream>
using namespace std;
// 函式的宣告
int myPlus(int a,int b);// 函式的定義先於函式的引用
int main(){
    int x=1,y=2;
    // 函式的引用: 因為函式是 int 型態的，所以我們把它當作一個 int 型態的變數使用，故可以輸出
    cout<<myPlus(x,y)<<endl;
}
// 函式的定義
int myPlus(int a,int b){
    return a+b;
}
```

## 遞迴
在函式中呼叫函式，直到達到某特定效果後回傳

```cpp=
#include<iostream>
using namespace std;
int Fib(int n){
    if(n==0)return 0;
    if(n==1)return 1;
    return Fib(n-1)+Fib(n-2);
}
int main(){
    int n;
    cin>>n;
    cout<<Fib(n)<<endl;
}
```

----

# <a href="https://hackmd.io/@zfcsc20th/S1ra6krXZx">第六堂社課 </a> 

## 競賽程式編程技巧
+ 萬用標頭檔 `<bits/stdc++.h>`
+ 輸入輸出優化 (節省執行時間)
    + `scanf()` 和 `printf()` 
    + ```cpp=
        ios::sync_with_stdio(false);
        cin.tie(NULL);
        cout.tie(NULL);
        ```
    + 使用 `'\n'` 替代 `endl` 
+ 命名程式碼
    + 文字替換 `#define`
    +  型別別名 `using`
    +   固定值的變數 `const`
+ 長整數 `long long`
+ 獲取 `ASCII` 碼 `int('字元')`
+ 字元數字轉換為整數數字 `'數字字元'-'0'`
+ 大數輸入
    + 大數直接轉陣列
    + 字串轉陣列

## 競賽程式解題技巧
+ 讀題要點
    1. 題目敘述: 不一定必讀項，但需要注意有條列的部分
    2. 輸入格式與範例: 按照題目給定的變數名稱做命名
    3. 輸出格式與範例: 嚴格按照題目給定的格式輸出
    4. 評分說明: 按照子題目給的條件先解小題拿一定分數
+ 編程要點
    1. 程式架構: 在家練習時先擬定一個固定的架構，包含常用的標頭檔或輸入輸出優化
    2. 註釋: 常忘記自己之前的邏輯可以用註釋輔助
