# 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$的值
- 接下來輸出
- 容器:變數
----
## 變數的型態別
- 如同牛奶要用瓶子裝,水餃要放冷凍,不同的資料要用不同型態別的變數貯存
- 本課程會用到的三種變數型態別

----
## 變數的語法
- 使用前要先宣告
- 型態別
- 名稱
- 不能使用保留字
- 不能重名
----
## 宣告一個變數
```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- 基礎輸入輸出與變數"}