# Lesson 01 - 程式語言與C++簡介 - 基礎輸入輸出與變數 --- # 程式語言與C++簡介 ---- ## Outline - 什麼是程式語言 - 安裝Dev C++ - 簡單的C++介紹 --- # 什麼是程式語言? ---- ## 什麼是程式語言? - 要跟外國人溝通需要使用外國的語言,要跟電腦溝通就需要使用程式語言 - 這邊會牽扯到一點點計算機概論的東西 ---- ## 什麼是程式語言 - 電腦是由許多的bit(0/1)組成,但人類理解上有困難,因此出現了組合語言 - 組合語言一樣不好寫,因此出現更多適合多數人的語言 ---- ## 什麼是程式語言 只要記得是用來跟電腦溝通的就好了 ---- ## 常見的程式語言 - C/C++ - Python - JavaScript --- # 安裝Dev C++ ---- ## 安裝Dev C++ - 學校電腦都裝好了,這邊提供你們自己回家練習用 - 無法安裝也可以使用線上的編譯器(但速度不好說) ---- ## 安裝Dev C++ - 前往[官網](https://sourceforge.net/projects/orwelldevcpp/)後跟著提示走就可以了 - ~~絕對不是我太久沒有裝~~ --- # 簡單的C++介紹 ---- ## C++是什麼? - 一種編譯式程式語言 - 20世紀80年代被發明於貝爾實驗室 ---- ## 「編譯」? - 有寫過Python的人應該知道,只要把程式碼打完基本上就可以執行了 - C++要先編譯 - 程式語言$\rightarrow$「編譯」$\rightarrow$組合語言 - 組合語言$\rightarrow$「組譯」$\rightarrow$機械語言 ---- ## 「編譯」? - 把程式碼編譯成執行檔 - 執行執行檔 ---- ## C++的一些特性 - 涉及底層操作 - 語法嚴謹 - 使用前要引入標頭檔以及命名空間 --- # 基礎輸入輸出與變數 ---- ## Outline - Hello World! - 從終端機顯示資料 - 變數 - 從終端機輸入資料 --- # Hello World! ---- ## 執行這段程式,跟世界打個招呼吧! ```cpp= #include<iostream> using namespace std; int main(){ cout<<"Hello World!"; return 0; } ``` ---- ## 拆解一下剛剛的那段程式 ```cpp= //標頭檔 #include<iostream> //命名空間 using namespace std; //主函式 int main(){ //顯示出「Hello World!」 cout<<"Hello World!"; return 0; } ``` ---- ## 標頭檔 - `#include<標頭檔>` - 告訴電腦你要用哪些函式庫 - 基礎的標頭檔為`<iostream>` - 競賽時可以使用`<bits/stdc++.h>` ---- ## 命名空間 - `using namespace [命名空間];` - 在一個大專案中,避免掉變數名稱重複引起的衝突 - 現階段會用`using namespace std;`就好了 - 標頭檔不用加分號,但命名空間要 ---- ## 主函式 - `int main(){}` - 存放主要程式碼的地方 - 整段程式的核心 ---- ## 註解 - 有人注意到剛才語法中有出現「`//`」嗎 - 編譯器不會讀取「`//`」後的內容,但僅限單行 - 也可以使用「`/*不會被讀取的內容*/`」註解多行 ```cpp //這一行只寫給人看不寫給機器看 /* 這些內容 機器都看不到 */ ``` ---- ## 小結 - 一個完整的C++程式,要包含「標頭檔」、「命名空間」、「主函式」 - 每一行行末都要有分號「;」 - 主要的程式內容寫在`int main(){}`的大括號中 - 可以使用「`//`」或是「`/**/`」來註解 --- # 從終端機顯示文字 ---- ## 一步步來 - 一個完整的C++程式,要包含「標頭檔」、「命名空間」、「主函式」 - 先把基本架構寫出來 ---- ## 基本的架構 ```cpp= #include<iostream> using namespace std; int main(){ return 0; } ``` ---- ## 輸出文字的語法 - `cout<<"[文字]";` - 注意`<<`的方向 - 注意行末的分號 - 輸出純文字使用雙引號框起來 ---- ## 組合起來 ```cpp= #include<iostream> using namespace std; int main(){ cout<<"Hello World!"; return 0; } ``` ---- ## cout的其他用法 ```cpp= #include<iostream> using namespace std; int main(){ //只輸出一個字元 cout<<'x'; //可以組合在一起 cout<<"Hello"<<" "<<"World"<<'!'; return 0; } ``` ---- ## 這樣的語法會有問題嗎? ```cpp= #include<iostream> using namespace std; int main(){ cout<<'嗨'; return 0; } ``` ---- ## 答案是:會 - 所謂的「一個字元」是指一個ascii的字元 - 中文字的編碼不太一樣,會佔用較多的位元組 - 因此輸出中文字請一律使用雙引號「"中文字"」 ---- ## 跳脫字元 - 如果我今天要輸出的是雙引號「`"`」怎麼辦? - 如果使用雙引號框起來,會產生編譯錯誤 - 可以使用單引號也可以使用跳脫字元 ---- ## 跳脫字元 - 所謂跳脫字元,是指輸出一些**特殊的字元**或是**特殊效果** - 可以看成是「單一字元」 - 特殊字元舉例:單、雙引號、反斜線 - 特殊效果舉例:換行、縮排、讓電腦發出嗶一聲 ---- ## 跳脫字元 - 一般來講以反斜線「`\`」(通常在backspace下面)開頭 - 反斜線+特殊的字元可以直接輸出字元 - `cout<<""";`會編譯錯誤 - `cout<<"\"";`可以正常執行 ---- ## 特殊的效果 以下只是一點點舉例而已~ |效果|字元| | - | - | |換行|`\n`| |縮排|`\t`| |垂直縮排|`\v`| |蜂鳴器警報|`\b`| ---- ## 猜猜看會有什麼效果? ```cpp= #include<iostream> using namespace std; int main(){ cout<<"Hello"<<" "<<"World"<<'!'<<'\n'; return 0; } ``` ---- ## 範例題:請在終端機中輸出<br>「`\(^o^)/`」 ---- ## 解答 直接輸出的話 ```cpp= #include<iostream> using namespace std; int main(){ cout<<"\(^o^)/"; return 0; } ``` 只會輸出`(^o^)/` ---- ## 解答 對於第一個反斜線,要使用跳脫字元 ```cpp= #include<iostream> using namespace std; int main(){ //想要輸出「\」要寫成「\\」 cout<<"\\(^o^)/"; return 0; } ``` ---- ## 練習題 [YOJ2002](http://infor.ylsh.ilc.edu.tw/problem/2002) ---- ## 提示 - 請善用「取代」功能 - 可以參考以下模板(複製起來用) ```cpp= #include <iostream> using namespace std; int main() { int T; cin >>T; if(T==1){ //T=1的情形 } if(T==2){ //T=2的情形 } if(t==3){ //T=3的情形 } return 0; } ``` --- # 變數 ---- ## 什麼是變數? - 可以裝東西的容器 - 例題:[乾坤迷你挪移](http://infor.ylsh.ilc.edu.tw/problem/1155) ---- ## 乾坤迷你挪移 - 輸入兩個整數$a,b$後輸出「a b reversed will be b a」 - Sample Input: - `5 10` - Sample Output: - `5 10 reversed will be 10 5` - 如何解決? ---- ## 如何解決? - 找個東西來貯存$a,b$的值 - 接下來輸出 - 容器:變數 ---- ## 變數的型態別 - 如同牛奶要用瓶子裝,水餃要放冷凍,不同的資料要用不同型態別的變數貯存 - 本課程會用到的三種變數型態別 ![image](https://hackmd.io/_uploads/r1XCvSaOC.png) ---- ## 變數的語法 - 使用前要先宣告 - 型態別 - 名稱 - 不能使用保留字 - 不能重名 ---- ## 宣告一個變數 ```cpp= int a;//int 就是這個變數的型態別,a則是變數的名稱 char b; float c; ``` ---- ## 賦予變數內容 - 核心概念為「等於」符號 - 等號左邊是要改變的變數,等號右邊是要進行的更動 - 會以最後一次操作為主 - 會強制將型態別轉換成該變數的型態別 ---- ## 範例程式碼 ```cpp= //在宣告的時候賦值 int a=5,b;//同樣的型態別可以宣告在同一行 char b='x'; float pi=3.14; //宣告完成之後賦值(會覆蓋掉前面的) a=7;//此時將a從原本的5改成7 b='y';//將b從原本的x改成y pi=3.14159;//將pi從原本的3.14改成4.14159 n=-1//這一行會造成編譯錯誤,因為n沒有被宣告過 ``` ---- ## 將變數內容顯示於終端機 - 使用`cout` - 不需要加入引號 - 可以使用多個`<<`進行串接 ---- ## 範例程式碼 ```cpp= int a=5; cout<<a;//這一行會輸出5 //串接 cout<<"The value of a is "<<a<<'\n'; //The value of a is 5 ``` ---- ## 這會輸出什麼? ```cpp= int a=5,b=10; cout<<a<<b<<a<<b; ``` ---- ## 變數的四則運算 ```cpp= int a=5,b=10; cout<<a+b;//15 cout<<a-b;//-5 cout<<a*b;//50 cout<<b/a;//2 ``` ---- ## 變數四則運算的核心概念 - 使用「`=`」賦予一個變數新的值 - 等號左邊是要更動的變數,右邊是要改成的數值 ---- ## 這會輸出什麼? ```cpp= int a=5,b=10; a=a+5; b=a+b; cout<<a<<'\n'<<b; ``` ---- ## 另一種寫法 - `a=a+5`也可以寫成`a+=5` - 同理... - `a=a-5`等價於`a-=5` - `a=a*5`等價於`a*=5` ---- ## 取餘數 - 如果要進行取餘數的運算,可以使用「`%`」 - `a%b`代表$a\div b$的餘數 - 舉例:`5%3=2`,`10%2=0` ---- ## 某些特殊狀況 - 接下來會討論某些特定的狀況 - 無法整除 - 分母為0 - 不同型態別的四則運算 ---- ## 無法整除 - 考慮以下程式碼,會輸出什麼? ```cpp= int a=5,b=7; cout>>b/a>>' '; cout>>a/b; ``` ---- ## 無法整除 - 答案是:編譯錯誤 - `cout`的箭頭應該朝左 ```cpp= int a=5,b=7; cout<<b/a<<' '; cout<<a/b; ``` - 如果程式碼正確,會輸出什麼? ---- ## 無法整除 - 在C++中,如果無法整除,一律會**無條件捨去** - 因此上述程式碼的輸出為: - `1 0` ```cpp= int a=5,b=7; cout<<b/a<<' '; cout<<a/b; ``` ---- ## 分母為0 - 編譯錯誤 ---- ## 不同型態別的四則運算 - 變數運算的核心概念:等號左邊為「被改變」的變數 - 以「被改變」的型態別為主,強制更改右邊的型態別 - 以下程式碼會輸出什麼? ```cpp= int a=10; float b=5.9; a=a+b; cout<<a; ``` ---- ## 不同型態別的四則運算 - 答案是:`15` - 在計算的過程中,`a+b`的計算結果為`15.9` - `15.9`被貯存到`a`當中 - `a`的型態別是整數 - 自動無條件捨去成`15` ---- ## 以下程式碼會輸出什麼? ```cpp= cout<<5.5+9.9<<" "; cout<<'a'+5; ``` ---- ## 以下程式碼會輸出什麼? - 答案:`15.4 102` - 如果沒有指定型態別,整數跟小數運算會以小數為主 - `a`的ASCII代碼為`97` --- # 從終端機輸入資料 ---- ## 觀察一下剛才提示給的模板 ```cpp= #include <iostream> using namespace std; int main() { int T; cin >>T; if(T==1){ //T=1的情形 } ... return 0; } ``` ---- ## 觀察一下剛才提示給的模板 - 宣告了變數`T`之後,如何設定`T`的值? - `cin >>T` ---- ## cin的使用說明 - 輸出的語法叫做`cout`=`c`+`out` - 因此輸入為`c`+`in`很合理吧! - `cin`的箭頭方向跟`cout`相反 - `cin >>T` - `cout<<T` - 可以一次輸入多個變數 - 用空格或是換行來間隔 ---- ## 範例程式碼 ```cpp= int a; float b; char c; cin >>a>>b>>c; ``` ---- ## 現在可以做了吧! - [乾坤迷你挪移](http://infor.ylsh.ilc.edu.tw/problem/1155) ---- ## AC code ```cpp= #include<bits/stdc++.h> using namespace std; int main(){ int a,b; cin >>a>>b; cout<<a<<" "<<b<<" reversed will be "<<b<<" "<<a<<'\n'; } ``` ---- ## 小插曲:介紹一下OJ的反饋 - <font color="green">AC</font>:<font color="green">Accept</font>,表示通過 - <font color="red">WA</font>:<font color="red">Wrong Answer</font>,表示答案錯誤 - <font color="orange">CE</font>:<font color="orange">Compile Error</font>,表示編譯錯誤 - [更詳細的內容](http://infor.ylsh.ilc.edu.tw/introduction) ---- ## 這段程式碼會輸出什麼? 使用`input 1`,`input 2`來當作輸入 ```cpp= int a,b;char x; cin >>a>>x>>b; cout<<a<<x<<b; //input 1:12345 //input 2:12.45 ``` ---- ## 結果 - `input 1`卡在原地不動,`input 2`輸出`12.45` - 在`input 1`當中,`12345`其實是被寫入變數`a`,系統還在等待`x`以及`b`的輸入 - 在`input 2`當中,`12`被紀錄在`a`,`.`則是`x`,最後`45`被紀錄在b。
{"contributors":"[{\"id\":\"e071b978-bfdd-4b6f-b30a-0767dac744d2\",\"add\":7907,\"del\":408}]","title":"Lesson_01","description":"- APCS與C++簡介\n- 基礎輸入輸出與變數"}
    691 views