# C++ 筆記
## 重點
==句子的結尾要有分號 ; 代表一件事結束。==
endl代表 end line,結束一行(換行)。
盡量不要在程式碼裡面寫中文,有時候會出錯。
萬能標頭檔:
```cpp=
#include<bits/stdc++.h>
```
### 基本輸入輸出
```cpp=
cout << "Hello, Everyone!" << endl;
```
輸入變數值
```cpp=
cin >> 變數名稱1 >> 變數名稱2;
```
重複輸入
```cpp=
while( cin >> 變數1 >> 變數2 )
{
每次輸入變數1、變數2時,要做什麼事...
}
```
C++上的取餘數 %
### 變數型態:
| 型態 | 中文意思 | 英文字義 | 可儲存的資料 |
| ---- | -------- | -------- | ----------------- |
| int | 整數 | Integer | 100、-5、1246 ... |
| float | 浮點數(小數) | floating point | 3.14159、4.3、-1.1 ... |
| char | 字元(半形字) | character | 'a'、'R'、'1'、'@'、'*' ... |
| string | 字串(文句) | string | "Hello"、"^_^"、"Rock!" ... |
| bool | 布林(是非) | boolean | true、false |
**變數宣告後就可以自由使用
只有在宣告變數時要打int,使用變數時不用打int。
指派變數值
等號(=)是指派的意思,跟數學上的等號意義不同
左邊的變數內容會變成右邊的新的儲存值
舊的變數內容直接消失**
### if條件式:
```cpp=
if( 條件 )
{
如果條件成立時做什麼...
}
```
### 語法 - if-else條件式
```cpp=
if( 條件 )
{
如果條件成立時做什麼...
}
else
{
否則做什麼...
}
```
### 關係運算
關係運算就是比較兩個數的關係
注意:=在C++中是指派(詳見指派變數值)
==才是判斷是否相等
| 關係運算子 | 意義 | 使用範例 | 範例運算結果 |
| -------- | ------ | ---------- | -------- |
| == | 等於 | 1+1==2 | 1 |
| != | 不等於 | 3!=4 |1
| > | 大於 | 5>7 | 0 |
| >= | 大於等於 | 3>=5 |0
| < | 小於 | 2<6 |1
| <= | 小於等於 | 8<=8 |1
:::info
### 邏輯運算
C++ code 中文意思 舊C++ code
```cpp=
and 且 &&
or 或 ||
not 的相反 !
```
:::
:::info
### while迴圈
```cpp=
while( A.條件式 )
{
B.當條件A成立時,就重覆做的事...
}
```
執行起來流程如下
檢查條件A,成立就做B
==>檢查條件A,成立就做B
==>檢查條件A,成立就做B
...
...
==>檢查條件A,成立就做B
==>檢查條件A,不成立離開。
跳出迴圈 break
當滿足中斷條件時,就離開迴圈( while 或 for )
```cpp=
while / for( ... )
{
...
if( 中斷條件 ){
break;
}
...
}
```
:::
:::warning
### 語法 - 陣列宣告
長度為 n 的陣列,可用資料為[0] ~ [n-1], 共 n 個。
宣告時,陣列長度必須是實際數字,如100、200。不能是變數。
:::
:::warning
### 語法 - 陣列使用(指派、輸入、輸出)
與變數的使用完全相同,只要指定是對陣列的第幾格做操作即可。
#### 指派:
```cpp=
陣列名稱[第幾格] = 數值;
```
#### 輸入:
```cpp=
cin >> 陣列名稱[第幾格];
```
#### 輸出:
```cpp=
cout << 陣列名稱[第幾格];
```
:::
:::info
### for迴圈
比起while迴圈,for迴圈更適合處理有次序的事
:::
:::info
### 運算式簡寫
有些運算式實在太常用了
因此就有了一些簡寫方式
不一定要使用簡寫,但是最好能看懂簡寫的意思
:::
| 一般寫法 | 簡寫 | 意義 |
| -------- | ---- | --- |
| i=i+1 | i++ | i+1 |
| i=i-1 | i-- | i-1 |
| a=a+b | a+=b | 以a取代為a+b |
| a=a-b | a-=b | 以a取代為a-b |
| a=a*b | a*=b | 以a取代為a*b |
| a=a/b | a/=b | 以a取代為a/b |
| a=a%b | a%=b | 以a取代為a除b的餘數 |
### 常見的內建函式
函式庫 函式 功能 回傳值型態
math.h sqrt( float x ) 回傳 x 的開根號值 float
pow( float x, float y ) 回傳 x 的 y 次方 float
ctype.h isalpha( char c ) 回傳 c 是不是英文字母 bool
isdigit( char c ) 回傳 c 是不是數字 bool
string.h strlen( char s[ ] ) 回傳 s 的長度 int
:::success
## 可以參考的網站
[Zero Judge](https://zerojudge.tw/Problems?tabid=CONTEST#tab01)
[台中女中程式解題系統](http://www.tcgs.tc.edu.tw:1218/Problems?tab=tab02)
[C++介紹,功能介紹網站](https://www.csie.ntu.edu.tw/~b98902112/cpp_and_algo/cpp02/nested_loop.html)
[深度學習C++](http://www.ziyou.math.ncu.edu.tw/~ziyou/c++/practice/index.htm)
:::
:::success
## 資訊能力競賽雲端資料夾
[Google 雲端硬碟資料夾](https://drive.google.com/drive/folders/1D-7DrgnMj24uhBZsTt2ez5iJD3-pa3E5?usp=sharing)
##歷屆試題
https://hackmd.io/@cube/B1UpZzJmY#%E9%AB%98%E4%B8%AD%E8%B3%87%E8%A8%8A%E5%AD%B8%E7%A7%91%E8%83%BD%E5%8A%9B%E7%AB%B6%E8%B3%BD%E6%AD%B7%E5%B1%86%E8%A9%A6%E9%A1%8C
:::
## 實作題
### f821 nAnB
[題目](https://zerojudge.tw/ShowProblem?problemid=f821)
```cpp=
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
int main() {
cin.sync_with_stdio(false); cin.tie(nullptr);
bool have1[128], have2[128];
int amount, As, Bs, length;
string answer, guess;
while (cin >> answer >> amount) {
length = answer.size();
while (amount--) {
memset(have1, false, sizeof(have1));
memset(have2, false, sizeof(have2));
cin >> guess;
As = Bs = 0;
for (int i = 0; i < length; ++i)
if (guess[i] == answer[i])
++As, have1[guess[i]] = have2[guess[i]] = true;
for (int i = 0; i < length; ++i)
if (!have1[guess[i]])
for (int j = 0; j < length; ++j) {
if (guess[i] == answer[j] && !have2[answer[j]]) {
++Bs; have2[answer[j]] = true;
break;
}
}
cout << As << "A" << Bs << "B\n";
}
}
}
```
### a015 矩陣翻轉
[題目](https://zerojudge.tw/ShowProblem?problemid=a015)
```cpp=
#include <iostream>
using namespace std;
int main() {
int x, y;
while(cin >> y >> x) {
int nums[y][x];
for(int i = 0; i < y; i++) {
for(int k = 0; k < x; k++) {
cin >> nums[i][k];
}
}
for(int i = 0; i < x; i++) {
for(int k = 0; k < y; k++) {
cout << nums[k][i] << " ";
}
cout << endl;
}
}
return 0;
}
```
### 108-4
4. 判斷颱風的風力級數和強度分級
蒲氏風力級數(Beaufort wind force scale)原本是英國海軍依據風力對戰艦的風帆使用狀況所劃分的 14 個風力級數,後來國際氣象組織採用來作為颱風的天氣預報之用,並增加成為 18 個等級(0~17級風力),其計算公式為:
其中 V 為颱風的中心平均風速,單位為公尺/秒(m/s)。B 為蒲氏風力級數,其值範圍為 0~17。我
國中央氣象局的颱風預報也是依據颱風中心平均風速(V)來計算和發布颱風的風力級數(B)和颱風強
度分級,我國的颱風強度分級如下,其中(3)~(5)才算達到颱風等級:
(1) 熱帶擾動:中心平均風速 ≦ 11.3 公尺/秒。
(2) 熱帶性低氣壓:11.4 ≦中心平均風速 ≦ 17.1 公尺/秒。
(3) 輕度颱風:17.2 ≦ 中心平均風速 ≦ 32.6 公尺/秒。
(4) 中度颱風:32.7 ≦ 中心平均風速 ≦ 50.9 公尺/秒。
(5) 強烈颱風:中心平均風速 ≧ 51.0 公尺/秒。
本題輸入颱風的中心平均風速(單位為公尺/秒,精確到小數點以下 1 位數),請計算並輸出此颱風的風力級數以及強度分級。國際氣象組織的蒲氏風力級數是採四捨五入的整數,且超過 17 的範圍就只能算最大為 17 級數,亦即若計算出的風力級數為 8.49 時,其風力分級為 8,而 8.50 的風力級數則進位為 9。(C/C++的次方函數可以使用 pow())
**輸入說明:**
輸入多列資料,每列皆為一個浮點數(精確到小數點以下1位數),代表某一個颱風的中心平均風速(單
位為公尺/秒),列數不固定,針對每列資料的中心平均風速都要判斷此颱風的風力級數和強度分級。
**輸出說明:**
針對輸入檔中的每列颱風中心平均風速資料依序輸出,每列資料需輸出風力級數(整數值,範圍0~17)
和強度分級之數字編號(整數值,範圍1~5)。
**範例輸入:**
10.2
17.0
17.3
32.9
70.5
**範例輸出:**
5,1
7,2
8,3
12,4
17,5
```cpp=
#include <bits/stdc++.h>
using namespace std;
int main() {
double s;
while (cin >> s) {
double sw[6] = {0, 11.3, 17.1, 32.6, 50.9, INT_MAX};
cout << (round(pow(s / 0.836, 1 / 1.5)) > 17 ? 17 : round(pow(s / 0.836, 1 / 1.5))) << ',';
for (int i = 0; i < 5; i++)
if (s > sw[i] && s <= sw[i + 1]) {
cout << i + 1 << '\n';
break;
}
}
}
```
### 108-6
6. 巢狀費氏數列 (佔分 10 分)
費氏數列由 0 和 1 開始,之後的費式係數就是由之前的兩數相加而得出,即
·F(0) = 0
·F(1) = 1
·F(n) = F(n – 1) + F(n – 2) (n ≦ 2)

**輸入說明:**

**輸出說明:**

**範例輸入:**
4
2 2
2 3
3 2
3 3
**範例輸出:**
1
1
1
1
```cpp=
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main() {
ll f[100] = {0};
f[1] = 1;
for (int i = 2; i < 100; i++)
f[i] = f[i - 1] + f[i - 2];
int t, m, n;
cin >> t;
while (t--) {
cin >> m >> n;
ll ans = n;
for (int j = 0; j < m; j++)
ans = f[ans];
cout << ans << '\n';
}
}
```