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