# 變數與運算
## 2021/09/17 電算社第一堂社課
---
## 變數
----
朋友買了一件衣料,當他拿給我們看的時候,
一位對圍棋很感興趣的人說
:「啊,好像棋盤似的。」
我說:「我倒覺得有點像稿紙。」
一位很愛吃的同學說:「這明明就是綠豆糕。」
對圍棋很感興趣的同學又說
:「我覺得它像稿紙了。」
我又說:「嗯我也覺得它像棋盤了。」
----
是不是覺得很亂呢
如果我們用**變數**表示的話
----
A:「啊,好像棋盤似的。」
B:「我倒覺得有點像稿紙。」
C:「這明明就是綠豆糕。」
A:「我又覺得它像稿紙了。」
B:「嗯我也覺得它像棋盤了。」
----
### 變數的意義
* 防止很長的程式碼一再地出現
```cpp=
int a = 5 , b = 7 , c = 11;
int d = a + b + c;
cout << d;
```
<br>
* 把想要存的東西存下來
```cpp=
int a;
cin >> a; // 輸入值到 a;
```
----
#### 變數的宣告
```cpp=
int a;
//宣告一個變數a,其資料型態為整數int
std::string club;
//宣告一個變數club,其資料型態為字串string
```
----
#### 賦值
```cpp=
int a = 10;
//賦予a一個整數值10
std::string club = "CRC";
//賦予club一個字串的值"CRC"
a = 20;
//也可以重新賦值
```
----
#### 變數命名規定
* 開頭不能用數字,例如 3A
* 不能使用特殊符號,例如-、@、#
* 不能使用保留字,會出事
例如if、class、enum、new等等
tags: 保留字就是在C++裡面已經有自己意義的字
----
#### 變數具有區域性
```cpp=
#include<iostream>
using namespace std;
int a = 10;//全域變數
int main()
{
int b = 10;//區域變數
if(b > 5){
int c = 50;//區域變數
}
//這裡不是c的有效範圍
//這裡是a和b的有效範圍
}
//這裡不是b、c的有效範圍
//但是是a的有效範圍
```
---
## 資料
----
### 資料型態
- 整數(int , long)
- 浮點數(float , double)
- 布林值(bool)
- 字元(char)
- 字串(std::string)
- 因為我們都會用 using namespace std;
所以下面就用 string 帶過
----
### 整數

----
### 浮點數

**double比float精準**
----
### 布林值 bool
只有兩個值,
True or False
對應到數字則是 1 和 0
之後在學條件判斷時會用到
----
### 字元 char
表示方式 : 用單引號 ' ' 把字元包起來
Examples : 'A'、'B'、'c'、'5'
字元用**整數**的形式儲存
ASCII Code : 把數字對應到字元
[維基百科](https://zh.wikipedia.org/wiki/ASCII)
----
### 跳脫字元
特殊的或是有功能的字元

----
### 字串 string
由一個或多個字元組成的句子
表示方式 : 用雙引號包起來
Examples : "HSNU"、"CRC"

字串在 std 裡面,要使用時記得加 "std::"
----
### 雙引號 or 單引號
一個字串是用 " "
"CRC is the best"
一個字元是用 ' '
```cpp=
{'C' , '8' , ' ' , '7' , '6' , '3' , '\0'}
//"C8 763"
```
可以看到
一個空格 ' ' 和跳脫字元 '\0' or '\n'......
都可以當作是一個字元
所以可以用' '包起來
---
## 運算
----
### 名詞解釋
a + b
\+ : 運算子
a、b : 運算元
----
### 優先度
* 優先度高的先算
* e.g. 先乘除後加減
* [C++ Operator Precedence](https://en.cppreference.com/w/cpp/language/operator_precedence)
* [Microsoft Doc](https://docs.microsoft.com/zh-tw/cpp/cpp/cpp-built-in-operators-precedence-and-associativity?view=msvc-160)
----
### 算術運算

----
### 小撇步
```cpp=
a = a + 1 ;
a += 1 ;
a++ ;
//三行都代表 a = a + 1
//(直接把 a 的值 + 1)
```
有 a -= 1, a \*= 1, a /= 1, a %= 1
相同的也有 a-\-,**不過沒有 a 和 a// 或 a%%**
----
整數和整數做運算,輸出的也是整數
浮點數做運算,輸出的就是浮點數
```cpp=
cout << 4/3; //1
cout << 4.0/3; //1.33333
```
----
### 條件運算
算完的結果會是一個布林值
不是True就是False

----
### 邏輯運算
多條件的條件運算
得到的結果也是一個布林值

----
Examples
```cpp=
int a = 5 , b = 3 , c = 1;
cout << (a > b); // 1
cout << (b > a); // 0
cout << (a > b && c > b); // 0
cout << (a > b || c > b); // 1
cout << ((a > b) && !(c > b)); // 1
```
---
### 輸入與輸出
----
上一節課講了輸出但沒講輸入
因為輸入需要變數的概念
用cin取得輸入
用cout輸出
----
### 輸入
```cpp=
int N;
cin >> N; //輸入 100 的話, N 就是 100
```
當然也可以一次輸入很多
```cpp=
int a , b;
cin >> a >> b;
```
----
### 輸出
```cpp=
int a = 100;
cout << a << '\n'; //輸出 100
```
----
### 一起用
```cpp=
int N;
cin >> N;
cout << N + 10 << '\n';
```
注意 : cout 跟 cin 的箭頭方向不一樣
---
### 小練習
輸入兩個數字a b
幫忙算算a跟b的總和吧
----
我是防雷頁
----
### 解答
```cpp=
#include<iostream>
using namespace std;
int main(){
int a , b;
cin >> a >> b;
cout << a + b;
return 0;
}
```
---
### OJ練習
* [GreenJudge a005:矩形面積](http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=a005)
* [GreenJudge a006:時間換算(一)](http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=a006)
* [GreenJudge a008:溫度轉換](http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=a008)
* [GreenJudge a009:團購力量大](http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=a009)
* [GreenJudge a010:年齡推算](http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=a010)
{"metaMigratedAt":"2023-06-16T10:06:44.041Z","metaMigratedFrom":"YAML","title":"變數與運算","breaks":true,"slideOptions":"{\"transition\":\"slide\",\"theme\":null}","contributors":"[{\"id\":\"4f731eff-9d88-41f4-af56-2e3e02f20cfc\",\"add\":2846,\"del\":1296},{\"id\":\"9e7d687a-83f2-4e8a-8ee6-8846394e69a5\",\"add\":653,\"del\":180},{\"id\":\"68c94489-3c2e-4879-b847-e982f360b03c\",\"add\":1372,\"del\":42},{\"id\":\"efc43b79-1b19-4cb1-9b18-ce50fad56214\",\"add\":727,\"del\":46}]"}