# How to C++ ## 寫程式要幹嘛? 目前資訊領域大概有: 網頁設計師 網頁工程師 資訊安全 AI工程師 物聯網 大數據分析師 資料庫維護 ~~東太平洋漁場時價分析師~~ ... 目前是一個資訊大爆炸的時代,所以說扯到電子產品的工作都需要會寫程式的人。 我們統稱這些人叫IT人。 ## 那我為什麼要學? 上面提到,現在是一個資訊大爆炸的時代,雖然不是說不會寫程式將來就沒路用,但是多學一項技能他不香嗎? 目前教育部也有給對寫程式很有興趣的人很多管道去升學(特殊選材)。 ## 廢言說完了,來介紹程式 首先在電腦桌面會看到好多圖片 ![](https://i.imgur.com/aiaGKnP.jpg) 楓之谷阿,雀姬,~~Mirror~~,這些都是程式。 不過今天我們要寫的程式不是這種dOuOb 別擔心,今天學的程式學會了,將來就能自己寫那種大遊戲了。 今天要學的程式長這樣 ![](https://i.imgur.com/pksqTaA.png) 沒有圖片,沒有按鈕,~~沒有瑟瑟ㄉ大姊姊~~ 這種程式是我們來練習程式的邏輯還有演算法的 當然也有人圖像化,例如Scratch,Google的小遊戲 ![](https://i.imgur.com/EriBAFE.png) 這些拼圖其實背後都代表著一行的程式碼 拼圖太遜了,我們直接把程式碼打出來 除非是教小小孩寫程式,否則基本上都是用寫程式碼的方法喔 ## 還是在介紹程式 程式語言有好多種,C/C++,C#,Java,Python,VB\.net,PHP,Kotlin,R...太多了。 今天主要是介紹C++ 這麼多語言是為什麼呢? 因為各種原因,像是跨平台開發,程式效能...等等。 那你會想這麼多語言我怎麼學得完 當然學不完,不過程式語言有趣的地方在於,你只要學會一種就好,其他語言不過是語法稍微改變了一下 🌰: C++ ![](https://i.imgur.com/1q8bau6.png) python ![](https://i.imgur.com/gmAYx1R.png) ## 終於要開始瞜 寫程式當然要先下載IDE IDE是三小? ``` 整合開發環境(Integrated Development Environment,簡稱IDE,也稱為Integration Design Environment、Integration Debugging Environment)是一種輔助程式開發人員開發軟體的應用軟體,在開發工具內部就可以輔助編寫原始碼文字、並編譯打包成為可用的程式,有些甚至可以設計圖形介面。 ``` 就是讓你寫程式的程式。 編譯器是三小? 眾所周知電腦是由01組成的聽過這句話吧 正確來說,電腦只讀得懂0和1 ![](https://i.imgur.com/qLSvQnf.png) 這叫做binary code 我們寫的程式長這樣嗎? 不,我們寫一堆的英文電腦根本跨謀 所以我們需要編譯器把她轉換成1010binary code 回歸正題 IDE要用哪個? 有些IDE只能寫一種語言,有些能寫很多種語言,我是都用codeblock拉,當然DevC++,VS,Vim...一堆隨便你選,下載方法就google然後下載,官網找載點,如果連這都不會你可以回家洗洗睡了。 ## 起手式 ![](https://i.imgur.com/g7Eolzn.png) 打開應該是這個畫面,按"住"鍵盤的ctrl+shift,然後輕輕地點一下n,BOOM~!可以開始寫第一個程式了。 在這之前先把檔案建立起來,按F9。 ![](https://i.imgur.com/YmLoda9.png) 會問你要存在哪裡,我的習慣是開一個叫做code的資料夾,放在裡面。 注意!!!! 先別按存檔 ![](https://i.imgur.com/yN3VtCH.png) 預設是C語言檔案,今天要寫的是C++,所以要把.c改成.cpp,不然會編譯失敗喔喔喔 ![](https://i.imgur.com/g8Q8GtN.png) 會發現旁邊的線變綠色ㄌ,那就可以開始寫瞜 ## 真的要寫程式了拉 一開始要先用#include <"libraryname"> library是三小? 概念就像萬能阿曼的工具箱,裡面放著各式各樣的情趣用品,根據你的癖好用哪個工具箱。 🌰: 今天你到了麥當當, 點了大薯,麥克雞塊,你會需要番茄醬和糖醋醬嘛。 點了玉米濃湯,鬆餅,你會需要湯匙和叉子。 程式: ```cpp= #include <醬料> "番茄醬"沾薯條 "糖醋醬"沾麥克雞塊 ``` ```cpp= #include <餐具> 用"湯匙"喝玉米濃湯 用"叉子"吃鬆餅 ``` :::info 意思就是要用什麼要先講。 這個的專有名詞叫做標頭檔 **記得前面要加"#"很多人錯這邊忘記加"#" 然後字要拼對"i n c l u d e"** ::: 今天暫時還不用什麼奇怪的工具,所以就先引入基本款<iostream> === 第一行就長這樣 ```cpp= #include <iostream> ``` === 進入到第二行: using namespace std; 這行是用來省略std:: [std是什麼?](https://www.itread01.com/content/1542080947.html) 懶的說了,自己看 === 第三行我習慣空著 === 第四行我們就要進入程式的主體ㄌ: int main() int是什麼等一下會介紹 至於main()就是一個函式,含是就是數學的那個函式y = f(x),程式也一樣,()裡面放回傳值。 🌰: 今天創造一個叫add的函式 ```cpp= int add(); ``` 內容是回傳 輸入值a + 輸入值b ```cpp= int add(int a,int b){ return a+b; } ``` 那這邊add(a,b)就會等於a+b 這邊後面會有更仔細的解釋 === main()是什麼呢? main()是程式的進入點,電腦會找main()這個函式,去執行裡面的程式碼,一個大門的感覺。 那main()內容要放什麼?回傳什麼? Ans:內容放你寫的程式,不用回傳,空著就好。 記得函式內容要用大括號刮起來 ```cpp= 型別 函式名稱(){} ``` 那到這邊應該有人會問型別是什麼?int又是什麼? 型別就是資料的型別哈哈 直接上🌰: 常用的資料型別有int ,float , double , bool , string(C++限定) , char... 他們代表什麼?又能幹嘛呢? 首先要先介紹變數,變數就是會變的數,就像你善變的女朋友,一下子要從前面,一下子要從後面,也像多變的天氣,一下子放晴一下子暴雨。 現在這個變數是1等等可能就變成2了,更貼近的說法是容器,告訴電腦這個容器裡面裝的是什麼? 那這個容器的名字隨便你取,但要遵守一些規則: 1.不能用數字開頭,中文 2.可以用英文,底線"_" 3.不能用保留字(保留字就是程式已經定義好的函式名稱阿,指令阿等等) 🌰如: (V) ```cpp= int a; int _; int a69; int Int; int iNt; ``` (X) ```cpp= int 69a; int int; ``` tip:如果真的要用到保留字可以把其中一個字母改成大寫,這樣就okㄌ [ref:](http://kaiching.org/pydoing/cpp-guide/unit-5-naming-rule.html) 那回到資料型別,上面例子都是用int(整數)當例子,這邊指的是變數(容器)裡面裝的資料的型別,直接看🌰: ```cpp= int a = 1; float a = 0.1; double a = 0.1234; bool a = true; char a = 'a'; string a = "aaaa"; //也口以一次宣告很多個"同樣類型"的變數 (V) int a,b,c,d,e,f,g; //注意!同一種型別一排 (X) int a,float b,double c; (這是不對的 ``` 一個一個解釋 int => 整數 float => 浮點數(有小數點) double => 更精準的浮點數 bool => 布林(只放true和false) char => 字元(單個字) string => 字串(很多字,當然也可以只放一個字) tip:string其實就是很多個字元串起來,宣告的時候要用雙引號"",字元則用單引號'' === 通過宣告可以讓電腦知道你變數(容器)裡面放什麼,之後用到這個變數的時候才能進行運算處理。 介紹了很多,休息一下進廣告瞜 廣告沒了 ### 第一項挑戰(宣告) 宣告一個整數a,浮點數b,字元c,字串d。 :::spoiler 點我看答案 ```cpp= #include <iostream> using namespace std; int main() { int a; float b; char c; string d; } ``` ::: 這邊介紹一下coding style 好的coding style看起來比較舒服,也方便維護,看懂整個程式的邏輯。 🌰: bad ```cpp= #include <iostream> using namespace std; int main(){int a;int b;cout<<a+b;} ``` or ```cpp= #include <iostream> using namespace std; int main(){ int a; int b; cout<<a+b; } ``` good ```cpp= #include <iostream> using namespace std; int main() { int a; int b; cout<<a+b; } ``` 到後面會在介紹一次 那做完第一項挑戰應該沒什麼難度吧 接著第二項 ### 第二項挑戰(輸入輸出) 這項挑戰就是要輸入整數a然後輸出整數a :::info 輸入的語法(cin>>變數;) 🌰: cin>>b; 輸出的語法(cout<<變數;) 🌰: cout<<b; ::: tips:記得最後加分號";",在給電腦下指令後要用分號";"來讓電腦知道你的指令告一段落了。如果沒加電腦會送你可愛的錯誤訊息(error message!),長這樣: ![](https://i.imgur.com/HlZXTsO.png) 那另一個常犯的錯誤就是忘記宣告,在用變數前必須先宣告,告訴電腦你等等會用到這個變數,然後方向別寫錯邊了不然可愛的錯誤訊息又來了長這樣: ![](https://i.imgur.com/DUg5l2g.png) ::: :::spoiler 點我看答案 ```cpp= #include <iostream> using namespace std; int main() { int a; cin>>a; cout<<a; } ``` 這邊可以配合TCGS OJ的題目練習 [網站](http://www.tcgs.tc.edu.tw:1218/) 辦完會員就能開始練題目瞜 這個網站能讓你上傳你的程式碼,然後伺服器會編譯,接著檢查答案對不對再告訴你。 ![](https://i.imgur.com/r9iFVDW.png) 點這兩個都能選題目,從a001開始 當然今天不需要輸入,直接輸出瑪喜可以拉,例如:TCGSa001 題目說輸出Hello!,這邊提供兩種解法: :::info 第一種: 宣告一個字串,他的值叫做"Hello!",然後輸出這個字串 第二種: 直接cout<<"Hello!"; ::: 好的熟悉輸入輸出就進入下個挑戰搂>< ### 第三項挑戰(連續輸入連續輸出) 這項挑戰就輸入兩個整數a和b,然後倒過來輸出b和a。 :::info 連續輸入語法(cin>>變數>>變數) 🌰: cin>>z>>x; 連續輸出語法(cout<<變數<<變數) 🌰: cout<<z<<x; ::: 總之就是用"<<"和">>"串起來,輸入輸出三個四個以此類推... :::spoiler 點我看答案 ```cpp= #include <iostream> using namespace std; int main( { int a,b; cin>>a>>b; cout<<b<<a; } ``` ::: ### 第四項挑戰 輸出"雷姆好可愛XDDD雷姆是郭勁廷老婆。"這段話(不包含"")。 "雷姆好可愛XDDD雷姆是郭勁廷老婆。"這是一段文字,由很多單個字元合在一起的字串。 所以要輸出一個字串 :::info 上面有提到字串是用""包起來的。 所以只要cout<<"雷姆好可愛XDDD雷姆是郭勁廷老婆。"; 就可以了 這邊提到一個重點 ""這個裡面包的東西會全部印出來,我用程式碼來講解 ```cpp= #include <iostream> using namespace std; int main() { int a = 1; cout<<a<<'\n'; cout<<"a"; } ``` ::: 這邊可以看到一個新東西長這樣'\n',這代表換行的意思。 沒加的話輸出長這樣: 1"a" 有加的話輸出長這樣: 1 "a" '\n'也能用endl(endline)替換,這邊一律推薦'\n',因為程式效率會執行得比較快,想了解更多的可以參考下面的文章 [**ref**](https://www.itread01.com/content/1546683862.html) **充分了解後可以去TCGSa002練習。** ## 跳脫字元 這個東西很簡單,剛剛學過怎麼輸入輸出,現在問題來了,如果我要輸出"<","/",";"...等等這些在程式中具有特殊意義的符號呢? ANS : 跳脫字元! 沒錯,就是用跳脫字元來讓電腦知道你今天這個符號不是用來當特殊功能的符號。 :::info 用法: 在有特殊意義的符號前面加上"\",防止電腦將這個符號當成特殊用法處裡。 ::: 🌰: 今天我要輸出'這個符號 ```cpp= #include <iostream> using namespace std; int main() { cout<<'''; } ``` 會發現無法編譯,噴錯誤 ![](https://i.imgur.com/e4lK1Bx.png) 那該怎麼解決呢? 上面有說過,用\去告訴電腦他不是特殊符號,而是一般的字元。 改成: ```cpp= #include <iostream> using namespace std; int main() { cout<<'\''; } ``` 就可以了 學會後搭配 TCGSa003 服用。 ## 運算子(Operator) ### 1.**算術運算子** 就是做加減乘除等等操作 在電腦中有些數學運算符號不像我們平常看到那樣 ![](https://i.imgur.com/ALPpPhh.png) 那更複雜的sin,cos,lim...等數學符號我們會自行將公式輸入做成一個函式。 當要使用時就直接sin([對邊],[斜邊])輸入兩個數字就幫你算出來。 **然後一樣()優先運算,否則先乘除後加減。** ### 2.**指定運算子** 指定值給變數,通常用"="表示 注意! 平常人類的數學是把運算結果指定給右邊 **人類** :::info EX. a+b = c 運算 = 結果 ::: **電腦** :::info EX. c = a+b; 結果(變數) = 運算過程 ::: 並且電腦還能這樣寫 c = c+a; 那就是先算完(c+a),再把結果存在c,去更新c的值。 帶入數字說明: ```cpp= c = 1; c = c+2; cout << c ; ``` 這時候cout << c ; 會發現c變成3,因為電腦先算(c+2),得到3後去更新c,c(1) -->> c(3) 這邊介紹一個簡潔的表示法: 剛剛舉了c = c+a 的例子,其實還可以這樣寫: ```cpp c += a; ``` 其他減,乘,除,取餘數一樣 ```cpp= c -= a; c *= a; c /= a; c %= a; ``` ### 3.**比較運算子** ![](https://i.imgur.com/kRobNta.png) 舉例來說: 要比較6和9的大小 這邊我把它們比較運算出來的結果指定給變數"result",這時候就能用到之前說的布林變數bool這個型別了。 還記得bool只存"true"和"false"這兩個狀態嗎? ```cpp= result = (6 > 9); cout << result; ``` 會發現輸出1,由於bool在記憶體中只占1byte的大小,所以用1來表示"true",0則表示"false"。 那為什麼是true應該看的出來吧,因為6小於9這個敘述是對的,所以true。 也可以改成錯誤的敘述,例如:6>9...等等,然後把result印出來看看。 不單單是比較數字,裡面也能放變數。 EX. ```cpp= int a = 6,b = 9; bool result //先宣告 result =( a > b ); cout << result ; ``` 回到那張表,應該>,>=,<,<=都沒問題吧! 接下來是"!="和"==" :::info !=就是不等於 ==就是等於 (The 幹話 ::: 直接舉例: :::info 6 != 9; 6 == 6; ::: 這兩行輸入電腦,電腦會告訴你1(true),還是0(false)? 好啦1(true)拉 // 因為6不等於9 所以你說的對,那就是true 然後6等於6 也沒說錯,所以也是true。 // **這邊超容易錯的地方就是只打一個'=',還有這樣'=!'** **記住:** :::danger **一個等於叫做指定運算子 兩個才是比較運算子** :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: :rage: ::: ```cpp= 以下為錯誤示範 result = (6 = 6); result = (6 =! 9); ``` BAD! :face_with_symbols_on_mouth: :face_with_symbols_on_mouth: :face_with_symbols_on_mouth: 最後三個是 最後附上參考資料: [**ref**](https://zh.wikipedia.org/wiki/C%E5%92%8CC%2B%2B%E9%81%8B%E7%AE%97%E5%AD%90) ## 條件判斷 要先來介紹這個語法"if" :::info if(true/false){ 執行動作 } 那小刮號裡面放的就是一個敘述,如果是true則執行大括號裡面全部的指令。 反之,false則跳過,完全不執行就跑下一行。 ::: 再來是"else if" :::info else if一定要搭配if ::: ![](https://i.imgur.com/ZjocQeV.png)