# 上學期課程精華版
政附資訊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. 註釋: 常忘記自己之前的邏輯可以用註釋輔助