{%hackmd @hipp0\Hippotumuxthem %}
<style>
.text-center{
text-align: center; //文字置中
}
.text-left{
text-align: left; //文字靠左
}
.text-right{
text-align: right; //文字靠右
}
</style>
<style>
.reveal .slides {
text-align: left;
font-size:30px;
}
</style>
# C++ 基礎II
---
<h2 style='color:#C4C400'> 複習 </h2>
----
<h3 style='color:#C4C400'> 變數宣告: </h3>
```cpp=
int a = 1;
long long b = 2;
char c = 'a';
double d = 2.564; // 不要用 float !
string e = "ABC";
bool ck = 0; //false
```
----
<h3 style='color:#C4C400'> 注意事項 </h3>
- 請注意: int 範圍 (1e9) 如果超過請用 long long
- char 字元使用 'c' 表示, string 字元 "hi oj"
- 使用 string 而不使用 char[]
----
<h3 style='color:#C4C400'> acill </h3>
- 注意字元是 '' 字串是 ""
- 不用打 97 來代表 a ,可以直接用 'a' 就好
```cpp=
char c;
cin >> c;
if ('a' <= c && c <= 'z') cout << "lower" << endl;
```
----
<h2 style='color:#C4C400'> 額外題目 X 2 </h2>
----
<h2 style='color:#C4C400'> 你快樂嗎? </h2>
- 型態判斷
----
<h2 style='color:#C4C400'> 進階天數判斷 (不要用 if else) </h2>
- true(1) false(0)
---
<h2 style='color:#C4C400'> 迴圈 </h2>
----
<h2 style='color:#C4C400'> for </h2>
最常用的迴圈,語法如下:
```cpp=
for (int i = 0 ; i < 100 ; i++){
cout << i << '\n' ; // do things
}
```
----
<h3 style='color:#C4C400'> 語法 </h3>
```cpp=
for (1 ;2 ;4) {
// 3 do
}
```
- 1: 程式執行到迴圈時,第一件會做的事情
- 2: 程式進行的條件,如果不滿足,便會離開這個迴圈。
- 3: 迴圈裡面做什麼事情
- 4: 做完一件事情後,迴圈會做的事
----
<h3 style='color:#C4C400'> 反過來? </h3>
```cpp=
string a = "1234567890";
for (int i = a.length() - 1 ; i >= 0 ; i--) {
cout << a[i];
}
```
----
<h3 style='color:#C4C400'> 注意事項 </h3>
- 如果是用在陣列裡,記得範圍 (尤其反向的時候)
- 如果記得如果反向,要-1,如果寫成 +1 會無窮
----
<h3 style='color:#C4C400'> 巢狀迴圈</h3>
(多層迴圈)
```cpp=
for (int i = 0 ; i < 10 ; i++) {
for (int j = 0 ; j < 20 ; j++) {
// do ...
}
}
```
----
<h3 style='color:#C4C400'> 注意事項 </h3>
- 記得變數要設不一樣,最後要++的部分也要寫對
----
<h3 style='color:#C4C400'> 只想要條件的迴圈? </h3>
```cpp=
int n = 0;
for( ; n < 10 ; ){
int x;
cin >> x;
n += x;
}
```
----
<h2 style='color:#C4C400'> while </h2>
用法如下:
```cpp=
while(條件){
//do
}
```
----
<h3 style='color:#C4C400'> 剛剛的例子 </h3>
```cpp=
while(n < 10){
int x;
cin >> x;
n += x;
}
```
----
<h3 style='color:#C4C400'> 無窮迴圈 </h3>
while 是條件成立會繼續執行,那如果條件本身就是 true 呢?
```cpp=
while (true) {
// do
}
```
----
但是你會發現,這樣的迴圈無法停止,於是我們需要引入讓迴圈結束的工具
----
<h2 style='color:#C4C400'> continue/break </h2>
當我們遇到某些條件成立時,想跳出迴圈 or 進下一輪
----
<h3 style='color:#C4C400'> continue </h3>
用來結束這一輪,但是迴圈會繼續執行
```cpp=
int x;
cin >> x;
for (int i = 0 ; i < x ; i++) {
if (i % 2 == 0) continue;
else cout << i << endl;
}
```
----
<h3 style='color:#C4C400'> break </h3>
用來直接結束當前迴圈
```cpp=
int x, now = 0;
cin >> x;
while (true) {
if (now * now * now == x) break;
now ++;
}
cout << now << '\n';
```
----
<h3 style='color:#C4C400'> 注意事項 </h3>
- 這兩個操作都只能夠離開當前的迴圈!
- 用無窮迴圈記得要有 break 的離開條件
----
<h3 style='color:#C4C400'> 離開當前的迴圈? </h3>
以下錯誤寫法
```cpp=
int ans1, ans2;
for (int i = 0 ; i < 10 ; i++) {
for (int j = i + 1 ; j < 10 ; j++) {
if (i * j > 78) {
ans1 = i, ans2 = j;
break;
}
}
}
cout << ans1 << " " << ans2 << endl;
```
----
<h3 style='color:#C4C400'> 正確寫法 </h3>
```cpp=
int ans1, ans2;
bool check = false;
for (int i = 0 ; i < 10 ; i++) {
for (int j = 0 ; j < 10 ; j++) {
if (i * j > 78) {
ans1 = i, ans2 = j;
check = true;
break;
}
}
if (check) break;
}
cout << ans1 << " " << ans2 << endl;
```
----
<h3 style='color:#C4C400'> 練習題 </h3>
- B001
- B002
----

---
<h2 style='color:#C4C400'> 題目的各種輸入方式 </h2>
----
<h3 style='color:#C4C400'> t筆輸入 </h3>
```cpp=
int t;
cin >> t;
while (t--) {
// do
}
// 如果題目要求輸出 case i
for (int i = 1 ; i <= t ; i++) {
cout << "Case " << i << " ";
// do
}
```
----
<h3 style='color:#C4C400'> 輸入直到讀到某個值 </h3>
例如讀到 -1 為止
```cpp=
int t;
cin >> t;
while (true) {
if (t == -1) break;
// do
cin >> t;
}
```
----
<h3 style='color:#C4C400'> 輸入直到 EOF </h3>
EOF = end of file
```cpp=
int t;
while (cin >> t) {
// do
}
```
----
<h3 style='color:#C4C400'> 輸出 n 個數字用空白隔開 </h3>
要求: 尾巴不能有空白
```cpp=
int ans[10] = {2,3,4,1,5,6,7,1,2,3};
bool first = true;
for (int i = 0 ; i < 10 ; i++){
if (first) {
cout << ans[i];
first = false;
}else{
cout << " " << ans[i];
}
}
cout << '\n';
```
----
這只是幾種常見的輸入輸出而已,還是要看題目的敘述為主。
---
<h2 style='color:#C4C400'> 陣列 </h2>
如果要儲存5個變數,我們可能會這樣做
```cpp=
int a, b, c, d, e;
```
但如果100、1000個變數那怎麼辦呢?
----
<h3 style='color:#C4C400'> 宣告 </h3>
```cpp=
int a[15]; //a[0]~a[14] 共15個
char b[150]; //b[0]~b[149] 共150個
double c[200]; //c[0]~c[199] 共200個
string str[1500]; //str[0]~str[1499] 共1500個
```
----
可以一次定義所有數字 or 部分數字
```cpp=
int a[5] = {1,2,3,4,5};
int b[100] = {1,2,3}; // 其餘會自動補 0
int zero[1000] = {0};
```
----
<h3 style='color:#C4C400'> 使用 </h3>
```cpp=
int a[5] = {1,2,3,4,5};
cout << a[0] + a[2] << '\n';
a[3] = 6;
cout << a[1] + a[3];
for (int i = 0 ; i < 5 ; i++) { // 注意 是 0~4
cout << a[i] << ' ';
}
cout << '\n';
```
----
<h3 style='color:#C4C400'> 注意事項 </h3>
- 陣列的 index (索引值) 是從 0 開始到 size - 1,引用超過會報 RE or WA。
- 陣列宣告過後,不可改變大小或重新宣告。
- 如果在裡面宣告沒有給定初始值,他不會自動幫你補 0 !!!!!!
- 陣列大小大概只能開到 2e6 左右
----
<h3 style='color:#C4C400'> 多維陣列 </h3>
陣列是可以有多個維度的,例如:
```cpp=
int arr[13][14][15] = {0}; // 設0,
cin >> arr[2][5][6];
cout << arr[2][5][6] << '\n';
// 也可以這樣定義,一樣不夠的會自動補 0
int arr[2][3] ={{1,2,3},{4,5,6}};
```
----

----
<h2 style='color:#C4C400'> string </h2>
----
<h3 style='color:#C4C400'> 宣告 </h3>
```cpp=
#include <string>
#include <iostream>
using namespace std;
int main(void) {
string s;
cin >> s;
for (int i = 0 ; i < s.length() ; i++) {
// do...
}
}
```
----
<h3 style='color:#C4C400'> 好用的加法 </h3>
```cpp=
string a = "123", b = "456";
string c = a + b; // 123456
cout << c << '\n';
```
----
<h3 style='color:#C4C400'> 好用的翻轉 string </h3>
```cpp=
#include <algorithm> // 記得記得要加
#include <string>
#include <iostream>
using namespace std;
int main(void) {
string s = "123456";
reverse(s.begin(), s.end());
}
```
----
<h3 style='color:#C4C400'> 酷酷的判斷 </h3>
字串判斷大小是根據字典序排序,也就是根據 acill 碼來比較大小
他會先判斷最前面,依序往後面判斷
假設 a = "1234" b = "567"
則 b 比較大
假設 a = "12345" b = "123"
則 a 比較大
可以直接用 判斷寫法寫
```cpp=
string a = "abcd", b = "fghi";
cout << (a > b) << '\n'; // false
```
----
<h3 style='color:#C4C400'> 酷酷的標頭檔 (懶人) </h3>
```cpp=
#include <bits/stdc++.h>
```
包含

----
<h3 style='color:#C4C400'> 輸入輸出優化 </h3>
檢定不會用到,但我提一下
請注意: 不要使用 endl 會導致使用 flush 而無法加快,請使用 '\n'
```cpp=
#include <bits/stdc++.h>
using namesapce std;
int main(void) {
ios::sync_with_stdio(false),cin.tie(0);
}
```
----
<h3 style='color:#C4C400'> 練習題 </h3>
- B003
- B004
----

---
<h2 style='color:#C4C400'> function </h2>
----
<h3 style='color:#C4C400'> 例子 </h3>
```cpp=
#include <bits/stdc++.h>
using namespace std;
void hello() {
cout << "hello world\n";
}
int main(void) {
hello();
}
```
----
<h3 style='color:#C4C400'> 引入變數 </h3>
```cpp=
void two_sum (int a, int b) {
cout << a + b << '\n';
}
int main(void) {
int x1, x2;
cin >> x1 >> x2;
two_sum (a, b);
}
```
----
<h3 style='color:#C4C400'> 回傳不同型態 </h3>
return
- void 不回傳
- int\char\string .... 回傳該型態
```cpp=
void nothing() {
return;
}
int two_sum (int a, int b) {
return a + b;
}
int main(void) {
int x1, x2;
cin >> x1 >> x2;
cout << two_sum(x1,x2);
}
```
----
<h3 style='color:#C4C400'> 前後定義的問題 </h3>
```cpp=
int main(void) {
int x1, x2;
cin >> x1 >> x2;
cout << two_sum(x1,x2);
}
int two_sum (int a, int b) {
return a + b;
}
```

----
<h3 style='color:#C4C400'> 解決方法 </h3>
- 定義在前面
- 跟變數一樣 先宣告
```cpp=
int two_sum (int a, int b);
int main(void) {
int x1, x2;
cin >> x1 >> x2;
cout << two_sum(x1,x2);
}
int two_sum (int a, int b) {
return a + b;
}
```
----
<h3 style='color:#C4C400'> 我喜歡的寫法 </h3>
```cpp=
#include <bits/stdc++.h>
using namespace std;
void solve() {
// do
}
int main(void) {
int t = 1;
// cin >> t;
while (t--) solve();
}
```
----
<h3 style='color:#C4C400'> 我喜歡的寫法 EOF 版本 </h3>
```cpp=
#include <bits/stdc++.h>
using namespace std;
void solve(int t) {
// do
}
int main(void) {
int t; // 看題目輸入什麼型態
while (cin >> t) solve(t);
}
```
----
<h3 style='color:#C4C400'> why </h3>
- 假設今天我們在好幾層迴圈的時候,得到答案想要離開 我們可能需要這樣寫
```cpp=
bool check = false;
for (int i = 0 ; i < n ; i++) {
for (int j = 0 ; j < m ; j++) {
for (int k = 0 ; k < p ; k++) {
if (...) {
cout << ans << '\n';
check = true;
break;
}
}
if (check) break;
}
if (check) break;
}
```
----
<h3 style='color:#C4C400'> 可以直接 return </h3>
```cpp=
for (int i = 0 ; i < n ; i++) {
for (int j = 0 ; j < m ; j++) {
for (int k = 0 ; k < p ; k++) {
if (...) {
cout << ans << '\n';
return;
}
}
}
}
```
---
<h2 style='color:#C4C400'> 區域、全域變數 </h2>
----
<h3 style='color:#C4C400'> 區域變數 </h3>
起始於變數宣告,結束於宣告敘述所在的區塊的大右括號。
```cpp=
#include <bits/stdc++.h>
using namespace std;
int func(int a, int b) {
int c = 5;
return c*(a+b); // abc都屬於func的區域變數 (和main的abc不衝突)
};
int main(void){
int a, b; //屬於main函式的區域變數
cin >> a >> b;
cout << func(a,b) << '\n';
for (int i = 0 ; i < 3 ; i++) {
int x; //出了for迴圈之後,x就結束了
cin >> x;
cout << x << '\n';
}
}
```
----
<h3 style='color:#C4C400'> 全域變數 </h3>
- 宣告在所有區塊和類別之外的變數
- 不可宣告同名的全域變數
- 若沒有給定初始值,會自動給0
----
<h3 style='color:#C4C400'> 全域變數 </h3>
```cpp=
#include <bits/stdc++.h>
using namespace std;
int arr[10000000]; //全域變數,所以沒有給定初始值會自動給0
int main(void){
int str[100000]; //這邊是區域變數,沒有給定初始值就不會有
}
```
----
<h3 style='color:#C4C400'> 注意事項 </h3>
- 定義名稱不要重複
- 陣列大小區域大概 (2e6) 全域大概可以開到 (5e7)
- 全域變數會自動給 0 但區域變數不會!!
----
<h3 style='color:#C4C400'> 練習題 </h3>
- B005
----
{"title":"C++ 基礎語法II","description":"C++基礎","contributors":"[{\"id\":\"b4bc52a4-04a8-4c6d-920a-32b9ab31a7f9\",\"add\":10648,\"del\":328}]"}