# 第一階段回顧
###### 04.21 鄭余玄
----
## 小提醒
- 下週是階段考,不能來的要先請假
- 已經公佈去年練習題
----
## 第一階段回顧
- 資料存取 - 變數宣告與使用、陣列
- 邏輯運算 - if-else
- 流程控制 - while, for-loop, break, continue
- 字串 - cstring
- 函數 - 呼叫函數、撰寫函數、參數傳遞
- 遞迴
---
## 程式進入點 - main
```clang
int main() {
// Do something ...
return 0;
}
```
---
# 資料相關
----
## 談談變數
- 變數,可以想像是一個有大小限制的箱子
- 可以放整數、字元等進去箱子
- 型態,則是箱子的標籤
- 可以箱子有整數、字元大小的性質
- 命名,就是如何稱呼這個箱子
----
## 宣告變數
```clang
int a = 2;
long long int b = 2147453648;
double c = 3.14;
char d = 'Z';
char e[] = "Hello";
char f[7] = "Sprout";
```
---
## 談談 cout
- cout,重點是 out,是 output 的意思
- 因為是 out,所以開口要向外,記得是 `cout <<`
- 它會把放在 << 後的東西塞到 stdout 中
- 就是那個小黑框
----
## `std::cout`
```cpp
#include <iostream>
using namespace std;
int main() {
cout << "Hello, sprout" << endl;
cout << 1 + 3 << endl;
cout << "1 + 3" << endl;
return 0;
}
```
----
## `std::cout`
```cpp
#include <iostream>
using namespace std;
int main() {
int zero = 0;
double pi = 3.14;
char hello[] = "Hello, sprout";
cout << zero << endl;
cout << pi << endl;
cout << hello << endl;
return 0;
}
```
----
## using namespace std
```cpp
#include <iostream>
// using namespace std;
int main() {
int zero = 0;
double pi = 3.14;
char hello[] = "Hello, sprout";
std::cout << zero << std::endl;
std::cout << pi << std::endl;
std::cout << hello << std::endl;
return 0;
}
```
----
## using namespace std
```cpp
#include <iostream>
using std::cout;
using std::endl;
int main() {
int zero = 0;
double pi = 3.14;
char hello[] = "Hello, sprout";
cout << zero << endl;
cout << pi << endl;
cout << hello << endl;
return 0;
}
```
---
## 談談 cin
- cin,重點是 in,是 input 的意思
- 因為是 in,所以開口要向內,記得是 `cin >>`
- 它會從 stdin(鍵盤輸入)抓東西塞到 >> 後的東西
----
## `std::cin`
```clang
int length;
char name[100];
std::cin >> length >> name;
```
---
# 邏輯運算相關
----
## 談談判斷式
- 一個 `=` 叫做 assign,絕對不是拿來判斷的
- `==` 這個才叫等於,請認明**兩個**等號
- `!=` 這個是不等於,前面是半形驚嘆號
- ~~`10 >= b >= 0`~~ 會 GG,多可條件要用 `&&` `||` 串起來
----
## 比較條件
```clang
if (a >= 0 && a < 100) {
// do something
} else if (b != 0) {
// do something
} else {
// do something
}
```
---
# 流程控制相關
----
## 談談 while
- while(條件式發生時) { 做事 }
- do { 做事 } while(條件式發生時)**;**
- 條件如果寫爛,BOOM!!無窮迴圈
- 使用 `while (1) {}` 要小心
----
## 使用方法
```clang
while (a > 0) {
// do something
}
while (1) {
if (a > 0) break;
// do something
}
do {
// do something
} while (a > 0);
```
----
## 談談 for
- for (初始化; 條件判斷; 迭代步驟) { 做事 }
- 忘記初始化。BOOM!
- 條件判斷錯誤。BOOM!!
- 迭代錯誤。BOOM!!!
- 要寫 for (;;) {} 一定要知道在做什麼
----
## 使用方法
```clang
int a[200][200], b[200][200];
int n = 100, m = 10;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
b[i][j] = a[j][i];
}
}
```
----
## 小心變數
```clang
int a[200][200], b[200][200];
int n = 100, m = 10;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++i) { // GG
b[i][j] = a[j][i];
}
}
```
----
## 談談 break
- 跳出現在的 loop
- 不只不做 break 後的東西,更是離開 loop scope
- 但是一次只能跳出一層
----
## 談談 continue
- 不做 continue 後的是,回到 loop 開頭
- 沒有離開 loop scope
---
## 談談 cstring
- char str[1000];
- 寫題目的時候,大小請開好開滿...
- 不要忘記字串最後由 \0 結尾
----
## cstring 相關函數
- 比較請用 `strcmp`
- 串接請用 `strcat`
- 複製請用 `strcpy`
---
## 談談函數
- 型態 函數名稱(參數) { 做事 }
```clang
int sprout_v1() { return 1 + 1; }
void run() { // do something }
```
```clang
int f(double);
int main() {
double x = 1.6;
int y = f(x);
}
int f(double z) {
int x = z / 2;
if (x / 2 == 0) return x;
return 3 * z + 1;
}
```
---
## 談談 OJ

----
## 談談 OJ
- 注意行內空格
- 注意行尾是否換行(例如最後一筆)
- 輸入結束條件
- 只通過範例輸入輸出,但你的程式可能不一定是正確
----
## 常見錯誤訊息
免則聲明(?:以下列出是**可能**解決方向,仍有很高可能是其他錯誤方式
- Wrong Answer:答案錯了,也可能是格式有錯
- Compile Error:編譯錯誤,可能是語法錯誤
- 回頭檢查分號、大中小括號、變數宣告等等
----
## 常見錯誤訊息
- Time Limit Exceeded:程式跑太久
- 進入無窮迴圈?有結束等待輸入?
- 要更有效率的寫法?
- Runtime Error:程式跑一跑壞了
- 陣列存取到外面?存取到不存在的物件?
---
## GLHF
{"metaMigratedAt":"2023-06-14T16:16:49.827Z","metaMigratedFrom":"YAML","title":"第一階段回顧","breaks":true,"slideOptions":"{\"theme\":\"serif\"}","contributors":"[]"}