# 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( 條件1 ) { 如果條件成立時做什麼... } else if( 條件2 ) { 否則做什麼... } else { 否則 } ``` ### 關係運算 關係運算就是比較兩個數的關係 注意:=在C++中是指派(詳見指派變數值) ==才是判斷是否相等 | 關係運算子 | 意義 | 使用範例 | 範例運算結果 | | -------- | ------ | ---------- | -------- | | == | 等於 | 1+1==2 | 1 | | != | 不等於 | 3!=4 |1 | > | 大於 | 5>7 | 0 | | >= | 大於等於 | 3>=5 |0 | < | 小於 | 2<6 |1 | <= | 小於等於 | 8<=8 |1 :::info ### 邏輯運算 C++ 中文意思 舊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的餘數 | ### 常見的內建函式 函式庫 函式 功能 回傳值型態 ```cpp= 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) ::: ## 實作題 ### 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] << " "<< endl; } cout << endl; } } return 0; } ``` ### 108-4 4. 判斷颱風的風力級數和強度分級 蒲氏風力級數(Beaufort wind force scale)原本是英國海軍依據風力對戰艦的風帆使用狀況所劃分的 14 個風力級數,後來國際氣象組織採用來作為颱風的天氣預報之用,並增加成為 18 個等級(0~17級風力),其計算公式為:![](https://i.imgur.com/wADCgwQ.png) 其中 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) ![](https://i.imgur.com/opl8KqS.png) **輸入說明:** ![](https://i.imgur.com/cmOyhpy.png) **輸出說明:** ![](https://i.imgur.com/FBCyYGh.png) **範例輸入:** 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'; } } ``` ## 2022 實作題 ### 0921-1 **內容** 有一天佛列德接受到一個整數的數學計算任務,其數學式子包括正整數以及加法(+)和乘法(*)運算子(Operators)。 由於此運算任務將來有可能常發生,佛列德必須要有一個程式讀寫運算式並利用電腦得出結果。 **輸入說明** 輸入僅有一行,代表需要讀入並計算的運算式,所有參與運算的正整數值最大可為 230。 運算子和數值間並沒有空格,輸入長度最多可達 1500 字元。 **輸出說明** 輸出只有一行,包含一個整數,表示這個運算式的值。 注意:當答案長度多於 5 位時,只輸出最後 5 位(前導 0 不輸出)。 ![](https://i.imgur.com/BC8UgJ8.png) ```cpp= #include<bits/stdc++.h> #include<string.h> using namespace std; int main() { int a; while(cin>>a) { } } ``` ### 0921-2 **輸入說明** 第一行有三個整數 N、C 以及 M,以空格間隔。 第一個整數 N 代表後續資料的行數( 1 ≤ N ≤ 100 ), 第二個整數 C 為一個 32 位元的整數,作為要帶入多項式的變數。 第三個整數 M 則代表要顯示計算答案的最後幾位數( 2 ≤ M ≤ 9 )。 接下來 N 行用來表示一元多項式。 每一行有兩個數字 A 和 B,以空格間隔, 用來表示 B ( 0 ≤ B ≤ 100 ) 次項的係數為 A,A 為一個 32 位元的整數。 請注意,這 N 行資料並不會進行排序。 **輸出說明** 輸出為一個整數值,也就是多項式計算結果的最後 M 位數,不足的位數請補 0。 請注意,你不需要顯示正負號。 **範例輸入 #1** 3 10 2 -7 0 5 3 2 1 **範例輸出 #1** 13 **範例輸入 #2** 4 2 3 -1 5 -1 3 1 6 1 4 **範例輸出 #2** 040 ```cpp= #include<bits/stdc++.h> using namespace std; int main() { cin>>N>>C>>M>>"\n"; } ``` ## 0928-1 ![](https://i.imgur.com/ajhF6TT.png) ```cpp= #include<iostream> #include<bits/stdc++.h> using namespace std; int main() { int n; cin >> n; int arr[n-1]; for(int i=0;i<n;i++) { cin >> arr[i]; } for(int j=0;j<n;j++) { cout << arr[j]+1<<endl; } return 0; } ``` ```cpp= #include<iostream> #include<bits/stdc++.h> using namespace std; int main() { int n; while(cin >> n) { int arr[n-1]; for(int i=0;i<n;i++) { cin >> arr[i]; } for(int j=0;j<n;j++) { cout << arr[j]+1<<endl; } } return 0; } ``` ![](https://i.imgur.com/fPxac6J.png) ![](https://i.imgur.com/hPtGG2E.png) ```cpp= ``` ## 0928-2 令小美今年 d 歲, 已知小美的媽媽是小美年紀的位數交換,其中當小美年紀為; 並且 n 年後,小美的媽媽年紀會是小美的 2 倍。 在媽媽今年至少 18 歲,並且媽媽不會活超過 99 歲的情況下, 給定 n 值,求小美今年可能的年紀,即 d 值; 若無解,請輸出 "no answer"。 舉例來說,當 n = 5, 假設今年小美 13 歲,則媽媽 31 歲, 5 年後,小美 18 歲,媽媽 36 歲。 符合 n 年後媽媽年紀為小美的 2 倍。 舉例來說,當 n = 24, 假設今年小美 3 歲,則媽媽 30 歲, 24 年後,小美 27 歲,媽媽 54 歲。 符合 n 年後媽媽年紀為小美的 2 倍。 ![](https://i.imgur.com/IZ2Zv4N.png) ```cpp= #include <bits/stdc++.h> using namespace std; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, d; bool noAns = true; cin >> n; // n 年後,媽媽的年紀也不能超過 99 for (int m = 18; m <= 99-n; m++){ d = (m % 10) * 10 + (m / 10); if (d >= m) continue; if ((d + n) * 2 == m + n){ noAns = false; cout << d << "\n"; } } if (noAns) cout << "no answer\n"; return 0; } ``` ![](https://i.imgur.com/Ym9FOMq.png) #### 輸入說明 測試資料只有一行,有兩個數字 n 及 m, 其值為 1 至 1000 的整數,表示黑色的屋瓦有 n 行及 m 列。 這兩個數字之間用空格(white space)隔開。 #### 輸出說明 輸出資料為一個正整數,表示白色屋瓦有幾塊。 #### 範例輸入一: 1 3 #### 範例輸入二: 2 3 #### 範例輸出一: 14 #### 範例輸出二: 25 ```cpp= #include<iostream> #include<bits/stdc++.h> using namespace std; int m,n,a,b; int main() { while(cin>>m>>n){ a = n*m-1 ; b = 6+a*4 ; cout<< b <<endl; } return 0 ; } ```