# 目錄 * 甚麼是C++ * C++ * 如何編輯程式碼 * 編譯器 * 文字編輯器 * IDE * Hello World * 資料型態 、 變數 與 陣列 * 運算子 = + - \* / % ++ -- += -= *= /= % * 輸入 cin * 條件判斷 if else if else * 迴圈for while * 小競賽 ## 甚麼是C++ * **一種程式語言** ~~廢話~~ * **編譯型語言** 等等會介紹編譯器 ## 編譯器 編譯的目的: 讓電腦能夠直接執行,有 //排版人幫我畫張圖||相信您看的懂|| ![程式碼--編譯器-->機器碼](https://hackmd.io/_uploads/rkSNIiFKh.png) 編譯器是將程式碼轉成機器能夠執行的機器語言 ## 文字編輯器 ### 功能: 讓你編輯程式碼 ### 優點: 使用較少電腦效能(相較IDE) ### 缺點: 無法一鍵編譯 ### 常見的文字編輯器 #### Visual Studio code [![vscode](<https://hackmd.io/_uploads/rJWN7UeYh.png> =100x100)](https://code.visualstudio.com/) * 屬於microsoft * 簡稱**Vscode** * 開放原始碼 * 是目前全世界最多人用的 * 優點: 擴充功能多 * 缺點: 安裝麻煩 * 總之**就是好用** #### vim [![vim](<https://hackmd.io/_uploads/H1a04UeF3.png> =100x100)](https://www.vim.org/download.php) * 優點 * 滑鼠再見 * 直接按件排超級快的啦 * 缺點 * 叫背很多按鍵 * 還要背指令 * 你可能會卡在vim裡出不來 * 你還要會終端機的指令 * 總之~~不適合初學者~~ * 對使用習慣的人來講**就是好用** * **強烈建議先學到要寫200行以上的code在嘗試** ## IDE整合是開發環境 ### 優點: 好安裝 ### 缺點: 吃效能 ### 常見的IDE #### Visual Studio [![Visual Studio](<https://hackmd.io/_uploads/Sk73cb-K2.png> =100x100)](https://visualstudio.microsoft.com/zh-hant/) * 和剛剛Visual Studio Code名子很像 * 也是microsoft的 * 比Vscode早出現 * 優點: IDE不需要自己安裝編譯器 * 缺點: 電腦不夠好就會卡 #### Replit [![replit](<https://hackmd.io/_uploads/ry2OsW-F3.png> =100x100)](https://replit.com) * 線上版IDE * 優點: 完全不需安裝、手機平板皆可使用 * 缺點: 沒網路很慘、速度較慢、~~其實我覺得不好用~~ * 今天要用的[先去註冊](https://replit.com) --- ## 第一個程式 Hello 暑訓 ```cpp= #include<bits/stdc++.h> using namespace std; int main(){ cout<<"Hello 暑訓!\n"; } ``` ### 第一行`#include<bits/stdc++.h>` 引入函式庫 `bits/stdc++.h`又被稱為萬用標頭檔,包含了幾乎所有你會用到的標頭檔 #### 其他標頭檔 | 功能 | 名稱 | | -------- | ---------- | | 輸入輸出 | `iostream` | | 數學 | `cmath` | | 時間 | `ctime` | | 隨機 | `random` | | 還有 | 更多.. | ### 第二行`using namespace std;` 使用命名空間(namespace) 為了標示類型、函數、變數的範圍,避免同名的類型、函數、變數相互衝突,導致程式出錯。 `std` 是大家會經常使用的namespace,裡面除了常見的輸入輸出以外,還有些資料類型可以使用,例如`string`、`vector`等等。 假設今天有另一個函式`cin`和`std`中的`cin`相互衝突,那就應該使用`std::cin`即可避免衝突的情況,`std::cin`代表使用的是`std`當中的`cin`。 ### 第三行`int main(){}` 在大括號`{}`裡,就是這個程式開始時會運行的地方 ### 第四行`cout<<"Hello 暑訓!\n";` ```cpp= cout<<"你要輸出的東西"; ``` #### 介紹一下`\n` `\n`是換行的特殊符號 除此之外還有`\t`、`\'`、`\"`、`\\` ### ~~好欸 你會C++了~~ 自己寫一遍吧 --- ## 變數 資料型態 ### 這是什麼? 一段記憶體位置使我們能夠儲存特定資料並在之後進行存取 ### 變數 暫存資料 可以把**變數**想像成一個紙箱,裡面裝資訊 //幫我畫個示意圖 ### 資料型態 變數的種類,依照剛才的比喻,可以想成是箱子的大小和裝法 //幫我畫張示意圖 分類的目的是方便電腦進行記憶體的分配和進行不同的運算方式 ### 資料型態有哪些 | 名稱 | 用途 | 記憶體大小 | | -------- | -------- | -------- | | int | 整數$-2^{31}$~$2^{31}-1$ | 4bytes | | unsigned | 非負整數$0$~$2^{32}-1$ | 4bytes | | long long | 更大的整數$-2^{63}$~$2^{63}-1$ | 8bytes | | unsigned long long | 更大的非負整數$0$~$2^{64}-1$ | 8bytes | | float | 浮點數 (可以有小數點的數字)| 4bytes | | double | 更精確浮點數 (可以有小數點的數字)| 8bytes | | long double | 更更精確浮點數 (可以有小數點的數字)| 16bytes | | bool | 布林值(只有`true`或`false`兩種情況) | 1byte | | char | 字元 | 1byte | | string | 字串 | 可變 | 其實還有更多種,但這些是常用的 ### 變數的宣告 `資料型態 變數名稱1;` 還可以這樣 `資料型態 變數名稱, 另一個變數名稱, 另另一個變數名稱;` ```cpp! int a,b,c=10; ``` * 註: 這樣只有c被宣告為10,其餘a, b皆為空的未被賦值的變數喔 ### 變數的命名 一般來說會用有意義的變數名稱,例如我想存一個人的名字,那我的變數名稱會叫做`name`。 變數名稱有限制 * **只能**用大小寫字母、數字、`_`、`$` * 數字**不可**作為變數名稱的開頭 * 大小寫意義不同 * 不可使用保留字 #### 保留字 因為**保留字**有特殊意涵,所以不可作為變數名稱,以免出錯, 常見的保留字可能是`資料型態`或是其他具有特殊意涵的字, 以下是常見的保留字清單,這東西**不要**背,重點在類別的部分 | 類別 | 保留字 | | ---------------------- | -------------------------------------------------------------------------- | | 資料型態 | `boot` `int` `long` `short` `signed` `unsigned` `signed` `char` `char8_t` `char16_t` `char32_t` | | 數值 | `true` `false` `nullptr` | | 宣告用 | `auto` `new` `static` `const` `new` `extern` `typedef` | | 運算子 | `and` `or` `xor` `not` `not_eq` `or_eq` `sizeof` `delete` `bitand` `bitor` `compl` `operator` | | 條件 | `if` `else` `switch` `case` `default` | | 迴圈 | `for` `while` `do` `continue` `break` `goto` | | 函式 | `return` `void` `inline` `friend` | | 物件導向 | `class` `struct` `this` `enum` `namespace` `private` `public` `protected` `typeid` | | 錯誤 | `catch` `noexcept` `throw` `try` | | 其他~~我沒用過的東西~~ | `alignas` `alignof` `asm` `const_cast` `constexpr` `decltype` `dynamic_cast` `explicit` `reinterpret_cast` `static_assert` `static_cast` `template` `thread_local` | ## 陣列 就是一排可以隨機取用跟變更的變數 ### 陣列的宣告 `資料型態 陣列名稱[陣列長度];` ```cpp! int arr[5]; ``` 這個陣列有`arr[0]`、`arr[1]`、`arr[2]`、`arr[3]`、`arr[4]`共5項 請注意陣列一切**從0開始(0-base)**,可能一開始會不習慣,久了就沒事了 ### 陣列的存取與修改 ```cpp= int arr[5]={0};//全部歸0(只有在宣告時才能這樣用) cout<<arr[0]<<"\n"; //0 arr[0]=7; cout<<arr[0]<<"\n"; //7 ``` --- ## 輸入cin與輸出cout ### cout cout指的是輸出,在我們的第一個程式中有這麼一行程式碼 ```cpp! cout<<"Hello 暑訓!\n"; ``` 用法就是`cout`加上`<<`再加上你要輸出的東西 要輸出的東西如果是變數,那在`<<`後就不用加`""` 否則就要加 而如果要連著輸出多個東西,一樣可以用`<<`再接下去 ```cpp! int a=10; cout<<"Hello\n"; cout<<a<<"\n"; cout<<"I am "<<a<<" years old."; ``` 執行結果: ```txt! Hello 10 I am 10 years old. ``` ### cin cin指的是輸入,在前面的變數部分有提到,變數是存放資訊的箱子。除了在創建變數的時候就賦值給他,還可以用`cin>>`來賦值給變數。 ```cpp! int a;//此時只有一個叫a的箱子,裡面沒有東西 cin>>a; cout<<a; ``` 假如我們要給a賦值為10,執行結果會像 ```txt! 10(你cin給電腦的) 10(電腦cout出來的) ``` ## 運算子 ### `=` 賦值運算子 * 程式語言中的`=`與數學中的`=`的意思不同 * `a=3`:將3這個值賦予給a這個變數 * 如果要使用數學中的比較是否相同,請使用`==`,詳情請見if else篇 ```cpp= int a=1,b=2,c; c=4; cout<<a<<"\n"; //1 a=b; cout<<a<<"\n"; //2 b=c; cout<<b<<"\n"; //4 ``` ### `+` `-` `*` `/` `%` 運算子 * 其實就和一般加減乘除一樣 * 記得有**先乘除後加減** * `%`是算餘數的意思 ```cpp= int a=1,b=2,c=4; a=a+b; cout<<a<<"\n"; //3 cout<<a*b<<"\n"; //6 cout<<c%a<<"\n"; //1 ``` ### `++` `--` 運算子 * `++`: +1 * `--`: -1 工程師就比較懶 ```cpp= int a=1; a++; cout<<a<<"\n"; //2 cout<<a++<<"\n"; //2 cout<<a<<"\n"; //3 cout<<++a<<"\n"; //4 ``` ### `+=` `-=` `*=` `/=` `%=` 運算子 其實就只是縮寫,不是新的東西 a+=10; 等價於 a=a+10; a*=10; 等價於 a=a*10; ```cpp= int a=10; a+=10;//a==20 a-=10;//a==10 a*=10;//a==100 a/=10;//a==10 a%=10;//a==0 ``` ### 關係運算子 `==` `!=` `>=` `<=` `>` `<` * 符合(1) <-> 不符合(0) * `!=` 代表 `≠`(不等於) ### 邏輯運算子 `||` `&&` `!` * `||`:兩側至少其中之一為true時回傳true * `&&`:兩側皆須為true才為true時回傳true * `!`:變號 true變false false變true ```cpp int a=2, b=2, c=4; cout<<(a==b||b==c); //1(true) cout<<(a==b&&b==c); //0(false) cout<<(!(a==b&&b==c)); //1(true) ``` 其實還有xor`^`為兩側恰有其一為true時回傳true ## if else條件判斷 功能: 用於在不同的條件下,執行不同的程式片段 ### `if()` 用法 ```cpp= if(條件){//條件成立(true)時執行 執行的東西1; 執行的東西2; } ``` 偷懶的用法: ```cpp= if(條件) 執行的東西; ``` 或 ```cpp= if(條件) 執行的東西; ``` **偷懶是有代價的**,如果用的偷懶的用法,執行的東西只能有一個 ### `else if()` 用法 可以用於前面的條件不符合 ```cpp= if(條件1){ cout<<1<<"\n";//條件1成立時執行 }//結束這一回合 else if(條件2){//條件1不成立才會判斷 cout<<2<<"\n"; } else if(條件3){//條件2仍然不成立才會判斷 cout<<3<<"\n"; } ``` ### `else` 用法 在所有條件皆不符合時,作為例外狀況使用 ```cpp= if(條件1){ cout<<1<<"\n"; //條件1成立時執行 //結束這一回合 } else if(條件2){//條件1不成立才會判斷 cout<<2<<"\n"; } //...很多個else if過後 else {//上述所有條件皆不成立後 cout<<3<<"\n"; } ``` ## for while 迴圈 用法:重複執行相同的事情 ### for 迴圈 模板: ```cpp= for(起始設定;每次做之前判斷;每做完一次後的更新){ 要做的事; } ``` 範例: ```cpp= for(int var=0;var<5;var++){ cout<<var<<"\n"; } ``` 執行結果: ```txt! 0 1 2 3 4 ``` ### while 迴圈 模板: ```cpp= while(每次做之前判斷){ 要做的事; } ``` 範例: ```cpp= int var = 0; while(var < 5){ cout << var << "/n"; var++; } ``` 執行結果: ```txt! 0 1 2 3 4 ``` ## 小小賽 註冊[iscoj](https://iscoj.fg.tp.edu.tw) 如果沒有email請向現場助教要臨時帳號