<style> /* 顏色Color */ .colorRed{color:#C7254E;} .colorDarkRed{color:#842029;} .colorGreen{color:#A9FF33;} .colorUfoGreen{color:#2DCC76;} .colorGold{color:#FFBB01;} .colorBlue{color:#6699CC;} .colorSkyBlue{color:#9FFFFF;} .colorPurple{color:#CC99CC;} .colorDarkPurple{color:#A141E8;} .colorCyan{color:#0A9396;} .colorOrange{color:#FF6347;} .colorAlertDangerText{color:#A94442;} .colorAlertWarningText{color:#8A6D3B;} .colorAlertInfoText{color:#31708F;} .colorAlertSuccessText{color:#3C763D;} .colorAlertDangerBg{color:#F2DEDE;} .colorAlertWarningBg{color:#FCF8E3;} .colorAlertInfoBg{color:#D9EDF7;} .colorAlertSuccessBg{color:#DFF0D8;} /* 警報Alerts */ .alertBox {text-align: left;} .alertBoxTitle{font-size: 26px; font-weight: bold;} .alertBoxBody{font-size: 18px;} .alertBoxBodyBlock{color: #FFF; background-color: #191919; padding: 5px; border-radius: 5px;} </style> <!-- 簡報開始 --> # 電研社C++教學 #### by盧冠佑 ##### 善有善報 星有星爆 不是不爆 十秒未到 <!-- .slide: data-background="https://images7.alphacoders.com/599/599379.jpg"--> <iframe width="1" height="1" src="https://www.youtube.com/embed/T9MLjIsfUOU?si=vabLryMqpEVH2IlM" title="YouTube video player" frameborder="0" allow="accelerometer;?autoplay=1&mute=100&loop=1; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe> --- ## <span class="colorGold">好聽的歌?</span> <!-- .slide: data-background="https://images7.alphacoders.com/599/599379.jpg"--> <iframe width="1200" height="600" src="https://www.youtube.com/embed/T9MLjIsfUOU?si=vabLryMqpEVH2IlM" title="YouTube video player" frameborder="0" allow="accelerometer;?autoplay=1&mute=100&loop=1; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe> --- ## 目錄 1. 用來寫程式的軟體 2. 我的第一個C++程式 3. 變數 4. 基本輸入/輸出 5. 算術運算子 6. 條件分歧 7. 關係/邏輯運算子 8. while 迴圈 9. for迴圈 10. 迴圈中的流程改變 11. 陣列 --- ### [用來寫程式的軟體](https://replit.com/) ![](https://replit.com/public/images/ogBanner.png) note:方便免費的線上工具,不用存檔還有版本紀錄 --- ## 第一個 C++ 程式 ---- ## 輸出 Hello, World! ---- 請先完成以下程式碼骨架 ```cpp #include <bits/stdc++.h> using namespace std; int main(){ return 0; } ``` note: 先完成這段程式碼 稍後的課程會再做說明 這是 C++ 最根本的「骨幹」,之後每一份程式碼都是從它開始。 replit 應該都自動打好了 然後你可能會發現 replit 沒有 return 0 ; 這個稍後也會做說明 不過有些軟體需要自己手刻骨架 或著出去比賽、考試可能也會需要自己刻 ---- 接下來的主程式請都寫在 <span class="colorRed">main()</span> 函式中 Note: main() 在英文中就是主要的意思,表示主程式,所有的程式都寫在其中。 ---- 輸出用 <span class="colorGreen">cout</span> 以 << 連接內容 ```cpp cout << "Hello World!"; ``` ```cpp cout << 3 + 5; //輸出結果:8 ``` <!-- .element: class="fragment" data-fragment-index="2" --> ```cpp cout << "3 + 5"; ``` <!-- .element: class="fragment" data-fragment-index="3" --> ---- :::warning <div class="colorAlertWarningText"> <div style="text-align: left; padding: 15px;"> <span class="alertBoxTitle">注意!</span><br> <span class="alertBoxBody"> 在 C++ 中大寫與小寫字母視為不同的文字,並不共通。<br> 請小心誤用大寫字母的情況。 </span> </div> </div> ::: <br> :::danger <div class="colorAlertDangerText"> <div style="text-align: left; padding: 15px;"> <span class="alertBoxTitle">常見錯誤:忘記加分號</span><br> <span class="alertBoxBody"> 因為 C++ 的單一命令可以分成很多行來寫,只認分號作為結尾。<br> 缺漏分號必須在下一行發現跟上一行未完結的命令銜接不起來,才能判斷出錯誤。 </span> </div> </div> ::: note:提醒一下新手常見的錯誤是忘記加分號,如果你在編譯過程中出現了錯誤,可以檢查看看是不是漏了分號 ---- ## 體驗 AC 的快樂 ---- ### 要怎麼知道自己寫的程式是不是對的呢 ---- ## 線上評測系統 Online Judge ---- [ZeroJudge](https://zerojudge.tw/) ![](https://hackmd.io/_uploads/H1qOtFP63.png) ---- [ZeroJudge d483. hello, world](https://zerojudge.tw/ShowProblem?problemid=d483) ---- :::warning <div class="colorAlertWarningText"> <div style="text-align: left; padding: 15px;"> <span class="alertBoxTitle">只有「範例」算對是遠遠不夠的</span><br> <span class="alertBoxBody"> <span class="alertBoxBodyBlock">範例測試資料對了,不等於你的程式是正確的。</span><br> 題目敘述提供的測試資料只是「範例」,是協助理解格式、供你做最初步的確認用的。<br> 上傳後才能獲得完整且可靠的評測。 </span> </div> </div> ::: ---- ## <span class="colorGold">解答</span> ```cpp= #include <bits/stdc++.h> using namespace std; int main() { cout << "hello, world"; return 0; } ``` --- ## 變數 ---- ### 常用變數類型 | 型態 | 名稱 | 範例 | | --- | --- | --- | | <span class="colorGreen">int</span> (<span class="colorGreen">long long</span>) | 整數 | 9453、2048... | | <span class="colorGreen">float</span> (<span class="colorGreen">double</span>) | 浮點數 | 3.1415、1.414... | | <span class="colorGreen">bool</span> | 布林值 | <span class="colorRed">True</span>、<span class="colorBlue">False</span> | | <span class="colorGreen">char</span> | 字元 | a、0... | | <span class="colorGreen">string</span> | 字串 | TcsshCSC | Note: 型態有其他大小,布林值非0者(0.5, -1...)皆為True。 ---- ### 變數的宣告 ```c++ int a;//資料型態(空格)變數名稱 ``` note:要先宣告變數才可使用 ---- ### 變數的賦值 宣告後的變數要先賦值 ```c++ int main(){ int a = 4; } ``` ```c++ int main(){ int a; a = 4; } ``` note:不保證宣告來的變數都是乾淨的 ---- ### 變數命名規則 * 只能使用英文 (A-Z a-z)、數字 (0-9)、底線 (_) * 開頭不能為數字 * 不能重複使用同一名稱 (即使資料型態不同) * 不能使用保留字 Note: C++保留字如case, break, do, switch... ---- ### <span class="colorGreen">int</span> $-2147483648 \sim 2147483647$ $-2^{31} \sim 2^{31}-1$ ```cpp int n = INT_MAX;//要大寫 int m = INT_MIN;//要大寫 ``` ---- ### <span class="colorGreen">long long int</span> $-9223372036854775807 \sim 9223372036854775807$ $-2^{63} \sim 2^{63}-1$ ```cpp long long n = 314159265358979323 ``` 通常看到數字大於$10^6$就可以考慮使用 ---- ### <span class="colorGreen">浮點數</span> | 型態 | bits | 精準度 | | --- | --- | --- | | <span class="colorGreen">float</span> | 32 | $6 \sim 7 位$ | | <span class="colorGreen">double</span> | 64 | $15 \sim 16 位$ | | <span class="colorGreen">long double</span> | 128 | $18\sim 19 位$ | 浮點數存在誤差,盡量不使用 ---- ### <span class="colorGold">範例</span> ```cpp= float f1 = 3.1415927; double f2 = 3.141592653589793; long double f3 = 3.1415926535897932384; ``` ---- ### <span class="colorGreen">bool</span> 布林值 (<span class="colorBlue">true</span> / <span class="colorRed">false</span>) 同時也能作為 1 跟 0 使用 ```cpp bool b1 = true, b2 = false; ``` ---- ### <span class="colorGold">範例</span> ```cpp= int main(){ bool b1 = true; cout << (b1+b1)*2; // output = 4 } ``` ```cpp= int main(){ bool b1 = -3; cout << b1 + 1; // output = 2 } ``` <!-- .element: class="fragment" data-fragment-index="2" --> ---- ## <span class="colorGreen">char</span> 字元 常配合陣列 (<span class="colorPurple">Array</span>) 使用 或是利用ASCII編碼特性使用 ```cpp char w = 'a'; ``` ---- ## <span class="colorGreen">string</span> 字串 一個比樓上的 <span class="colorGreen">char</span> 還好用的東西 用來儲存字元序列 ```cpp string text = "hello world"; ``` Note: Array會在之後進行說明,而ASCII則不在此說明 --- ## 基本輸入 輸出 ---- 使用 <span class="colorGreen">cin</span> 與 <span class="colorGreen">cout</span> 進行 ++輸入++ 與 ++輸出++ ---- 具體來說應該怎麼用呢? ---- ### <span class="colorGold">範例</span> ```cpp= #include<iostream> using namespace std; int main(){ string text; cin>>text; cout<<text; } ``` <span class="colorGreen">cin</span> 搭配 **>>** 使用 <span class="colorGreen">cout</span> 搭配 **&lt;&lt;** 使用 note: cin / cout 要用 >> 或 << 傻傻分不清? ---- 幾個 <span class="colorGreen">cin</span> 與 <span class="colorGreen">cout</span> 需注意的點 ---- ### <span class="colorGreen">cin</span> 遇到空格就會結束一個輸入 ```cpp= string a, b; cin >> a >> b; ``` 若輸入 `"tcssh better than tcfsh"` 則 a 的值為 ++tcssh++ b 的值為 ++better++ 你會發現 than 跟 tcfsh 沒有被記錄下來 ---- ### <span class="colorGreen">cout</span> 不會換行 如果需要換行可以使用 <span class="colorGreen">std</span>::<span class="colorGreen">endl</span> 或是跳脫字元 <span class="colorGreen">'\n'</span> ``` ``` <span class="colorGold">範例</span> ```cpp cout << "Hello" << endl << "World"; ``` ```cpp cout << "Hello\nWorld"; ``` ---- ### <span class="colorGold">++&nbsp;補 充 說 明&nbsp;++</span> #### 跳脫字元 (`\`) #### 跳脫字元是會改變下一個文字的原意義 ![](https://i.imgur.com/W6uytoB.png) <!-- .element: class="fragment" data-fragment-index="1" --> Note: 原本 n 的意義被跳脫、轉變成「換行」,而不是原先 n 這個文字。 ---- ### <span class="colorGold">++&nbsp;補 充 說 明&nbsp;++</span> #### 常用的跳脫字元 | 符號 | 名稱 | | --- | --- | | \\' | 單引號 (single quote) | | \\" | 雙引號 (double quote) | | \\\\ | 反斜線 (backslash ) | | \n | 換行 (line feed) | ##### 詳細內容請見 [維基百科:跳脫字元](https://zh.wikipedia.org/zh-tw/转义字符) ---- :::warning <div class="colorAlertWarningText"> <div style="text-align: left; padding: 15px;"> <span class="alertBoxTitle" style="font-weight: bold;">額外補充</span><br> <span class="alertBoxBody"> 實際上,任何傳達給外界的訊息都屬於輸出,包括喇叭發出聲音、或亮燈熄燈等。<br> 由於競程只用上文字的輸出,在此不會提及其它種類的輸出。 若對其它種類輸出感興趣,可自行搜尋相關資料。 </span> </div> </div> ::: ---- ### <span class="colorGold">小試身手</span> [ZeroJudge a001. 哈囉](https://zerojudge.tw/ShowProblem?problemid=a001) ---- #### 題目要求輸入一組文字並依格式輸出 ---- ### 觀察範例 | 輸入 | 輸出 | | --- | --- | | world | hello, world | | C++ | hello, C++ | | Taiwan | hello, Taiwan | ---- 不難發現, 輸出的格式都是 hello, {輸入} ##### 注意:逗點後有一個空格 Note: 下一頁為參考答案 ---- ### 參考答案 ```cpp= #include <bits/stdc++.h> using namespace std; int main() { string text; cin >> text; cout << "hello, " << text; return 0; } ``` <!-- .element: class="fragment" data-fragment-index="1" --> --- ## 算術運算子 ---- ### 二元算術運算子 | 名稱 | 符號 | | --- | --- | | 加 | <span class="colorBlue">+</span> | | 減 | <span class="colorBlue">-</span> | | 乘 | <span class="colorBlue">*</span> | | 除(取商) | <span class="colorBlue">/</span> | | 模除(取餘) | <span class="colorBlue">%</span> | note:特別說明c++ 不存在^ 次方運算子 ---- ### <span class="colorGold">範例</span> ```cpp= int n1 = 2 + 3; // n1 = 5 int n2 = 5 - 2; // n2 = 3 int n3 = 6 * 2; // n3 = 12 int n4 = 9 / 4; // n4 = 2 int n5 = 9 % 4; // n5 = 1 ``` Note: //是註解 ---- ### 縮寫 *** 一個整數 <span class="colorPurple">n1</span> 的值為 3 ```cpp int n1 = 3; ``` 若要將 <span class="colorPurple">n1</span> 再加上 5 可以這樣寫 ```cpp n1 = n1 + 5; ``` 或是下面的縮寫 ```cpp n1 += 5; ``` ---- ### <span class="colorGold">範例</span> ```cpp int n = 8; n -= 5; // n=3 n *= 6; // n=18 n /= 3; // n=6 n %= 3; // n=0 ``` ---- ### 一元算術運算子 | 名稱 | 符號 | | ---- | ---------------------------------- | | 自增 | <span class="colorBlue">++</span> | | 自減 | <span class="colorBlue">-\-</span> | | 變號 | <span class="colorBlue">-</span> | ---- ### 前後差很多! 前:先 <span class="colorPurple">++改變++</span> 再**使用** ```cpp= int a = 10; int b = ++a; // a 和 b 都是 11 ``` 後:先 <span class="colorPurple">++使用++</span> 再**改變** ```cpp= int a = 10; int c = a++; // c 是 10,a 是 11 ``` ---- ### 內建函式 | 名稱 | 寫法 | | --- | --- | | 高斯符號 [x] | <span class="colorBlue">floor(x)</span> | | 取頂符號⌈ x ⌉ | <span class="colorBlue">ceil(x)</span> | | 四捨五入x | <span class="colorBlue">round(x)</span> | | 絕對值\|x\| | <span class="colorBlue">abs(x)</span> | | 根號x | <span class="colorBlue">sqrt(x)</span> | | x的n次方 | <span class="colorBlue">pow(x,n)</span> | |以10為底的對數x | <span class="colorBlue">log10(x)</span> | note:特別說明c++ 不存在^ 次方運算子 ---- ### <span class="colorGold">範例</span> ```cpp= int n1 = floor(3.14); // n1 = 3 int n2 = ceil(1.732); // n2 = 1 int n3 = round(1.414); // n3 = 1 int n4 = abs(-43); // n4 = 43 int n5 = sqrt(4); // n5 = 2 int n6 = pow(2,10); // n6 = 1024 int n7 = log10(10000); // n7 = 4 ``` Note: //是註解 ---- ### <span class="colorGold">小試身手</span> *** [ZeroJudge a002. 簡易加法](https://zerojudge.tw/ShowProblem?problemid=a002) [ZeroJudge d049. 中華民國萬歲!](https://zerojudge.tw/ShowProblem?problemid=d049) [ZeroJudge d827. 買鉛筆](https://zerojudge.tw/ShowProblem?problemid=d827) <!-- [ZeroJudge a003. 兩光法師占卜術](https://zerojudge.tw/ShowProblem?problemid=a003) --> --- ## 條件分歧 ---- ## <span class="colorPurple">if</span> ---- 當條件 (<span class="colorGreen">condition</span>) 成立 (<span class="colorBlue">True</span>) 時 執行裡面的程式碼 ```cpp= if (condition) { // do something } ``` 可以簡單理解成 <span class="colorPurple">如果</span><span class="colorGreen">條件成立</span>,<span class="colorPurple">就</span>`____` ---- ## <span class="colorPurple">else</span> 需要和 <span class="colorPurple">if</span> 一起使用 ```cpp= if (condition) { // do something } else { // do another something } ``` 可以簡單理解成 <span class="colorPurple">如果</span><span class="colorGreen">條件成立</span>,<span class="colorPurple">就</span>`___`,<span class="colorPurple">否則</span>`___` ---- ## <span class="colorPurple">else if</span> 需要和 <span class="colorPurple">if</span> 一起使用 ```cpp= if (condition1) { // do something } else if (condition2) { // do another something } ``` 可以簡單理解成 <span class="colorPurple">如果</span> <span class="colorGreen">條件1成立</span>,<span class="colorPurple">就</span>`___` <span class="colorPurple">或是 如果</span> <span class="colorGreen">條件2成立</span>,<span class="colorPurple">就</span>`___` ---- ### <span class="colorGold">三個放一起</span> ```cpp= int n = 4; if (n == 1) { cout << "n = 1"; } else if (n == 2) { cout << "n = 2"; } else if (n == 3){ cout << "n = 3"; } else { cout << "n != {1, 2, 3}"; } ``` <span class="colorPurple">else if</span> 可以有無數個 <span class="colorPurple">else</span> 可有可無 但只能有一個 且只能放在最後 ---- ### 小結論 <span class="colorPurple">if</span> 語法結構: <span class="colorPurple">if</span> + $0 \sim n$ 個 <span class="colorPurple">else if</span> + $0 \sim 1$ 個 <span class="colorPurple">else</span> ---- 如果`{}`中的程式碼**只有一句** 則大括號可以省略 ---- <span class="colorGold">範例</span> ```cpp= if (true) { cout << "hello world"; } ``` ```cpp if (true) cout << "hello world"; ``` ```cpp if (true) cout << "hello world"; ``` ```cpp if (false) cout << "hello world"; cout << "123"; ``` <!-- .element: class="fragment" data-fragment-index="2" --> ---- ### 所以 <span class="colorGreen">條件</span> 要放什麼? *** 能生出布林值的東西 --- ## 關係 / 邏輯運算子 ---- ### 關係運算子 | 名稱 | 符號 | | --- | --- | | 大於 | <span class="colorGold">></span> | | 小於 | <span class="colorGold">&lt;</span> | | 等於 | <span class="colorGold">==</span> | | 不等於 | <span class="colorGold">!=</span> | | 大於等於 | <span class="colorGold">>=</span> | | 小於等於 | <span class="colorGold">&lt;=</span> | note:說明== ---- ### <span class="colorGold">小試身手</span> *** [ZeroJudge a003. 兩光法師占卜術](https://zerojudge.tw/ShowProblem?problemid=a003) [ZeroJudge d064. ㄑㄧˊ 數?](https://zerojudge.tw/ShowProblem?problemid=d064) [ZeroJudge a005. Eva 的回家作業](https://zerojudge.tw/ShowProblem?problemid=a005) [ZeroJudge a053. Sagit's 計分程式](https://zerojudge.tw/ShowProblem?problemid=a053) ---- ### 邏輯運算子 | 名稱 | 符號 | | --- | --- | | 非(not) | <span class="colorCyan">!</span> | | 且(and) | <span class="colorCyan">&&</span> | | 或(or) | <span class="colorCyan">\|\|</span> | note:可以直接打英文not、and、or ---- ### not 真值表 | A | not A | | --- | --- | | <span class="colorBlue">True</span> | <span class="colorRed">False</span> | | <span class="colorRed">False</span> | <span class="colorBlue">True</span> | ---- ### and 真值表 | A | B | A and B | | --- | --- | --- | | <span class="colorBlue">True</span> | <span class="colorBlue">True</span> | <span class="colorBlue">True</span> | | <span class="colorBlue">True</span> | <span class="colorRed">False</span> | <span class="colorRed">False</span> | | <span class="colorRed">False</span> | <span class="colorBlue">True</span> | <span class="colorRed">False</span> | | <span class="colorRed">False</span> | <span class="colorRed">False</span> | <span class="colorRed">False</span> | ---- ### or 真值表 | A | B | A or B | | --- | --- | --- | | <span class="colorBlue">True</span> | <span class="colorBlue">True</span> | <span class="colorBlue">True</span> | | <span class="colorBlue">True</span> | <span class="colorRed">False</span> | <span class="colorBlue">True</span> | | <span class="colorRed">False</span> | <span class="colorBlue">True</span> | <span class="colorBlue">True</span> | | <span class="colorRed">False</span> | <span class="colorRed">False</span> | <span class="colorRed">False</span> | ---- ![](https://hackmd.io/_uploads/r1kZ3pF1T.png) ---- ### <span class="colorGold">關係與邏輯運算子混用範例</span> ```cpp= bool a = !true; // a = false bool b = false && true; // b = false ``` <span class="colorCyan">關係運算子</span> 與 <span class="colorCyan">邏輯運算子</span> 運算順序為:<span class="colorCyan">括號</span>$\rightarrow$<span class="colorCyan">關係</span>$\rightarrow$<span class="colorCyan">邏輯</span> 運算後的結果應該視為 <span class="colorOrange">布林值</span> ---- ### <span class="colorGold">小試身手</span> *** 請問 b 是 <span class="colorBlue">True</span> 還是 <span class="colorRed">False</span> ```cpp= bool b = !(1 == (5>4) || 3 < 2); ``` ## <br>答案是 <span class="colorRed">False</span> <!-- .element: class="fragment" data-fragment-index="1" --> ---- ### <span class="">說明</span> ```cpp= bool b = !(1 == (5>4) || (3<2)); = !(True == True || False) = !(True || False) = !(True) = False ``` ---- ### <span class="colorGold">小試身手</span> *** [ZeroJudge d067. 格瑞哥里的煩惱 (1 行版)](https://zerojudge.tw/ShowProblem?problemid=d067) [ZeroJudge d066. 上學去吧!](https://zerojudge.tw/ShowProblem?problemid=d066) ---- ### <span class="colorGold">小試身手</span> <span class="colorGreen">試試看不使用 <span class="colorPurple">if</span> 來完成這些題目吧!</span> *** [ZeroJudge d050. 妳那裡現在幾點了?](https://zerojudge.tw/ShowProblem?problemid=d050) [ZeroJudge d073. 分組報告](https://zerojudge.tw/ShowProblem?problemid=d073) [ZeroJudge d068. 該減肥了!](https://zerojudge.tw/ShowProblem?problemid=d068) [ZeroJudge d060. 還要等多久啊?](https://zerojudge.tw/ShowProblem?problemid=d060) [ZeroJudge d058. BASIC 的 SGN 函數](https://zerojudge.tw/ShowProblem?problemid=d058) --- ## <span class="colorPurple">while 迴圈</span> ---- 重複執行直到<span class="colorGreen">條件</span>不成立 ```cpp=reen while (條件式) { // do something } ``` 可以簡單理解成 只要<span class="colorGreen">條件</span>成立就重複執行`___` ---- ### <span class="colorGold">範例</span> ```c++ while( A.條件式 ) { B.當條件成立時,就... } ``` 檢查條件A,成立就做B $\rightarrow$檢查條件A,成立就做B ... $\rightarrow$檢查條件A,成立就做B $\rightarrow$檢查條件A,不成立離開。 ---- ## <span class="colorGold">小試身手</span> ```cpp= int n=0; while (n>3) cout<<"*"; ``` 請問以上的程式會輸出幾個 * #### <br>答案是 0 個</span> <!-- .element: class="fragment" data-fragment-index="1" --> ---- ## <span class="colorGold">小試身手</span> ```cpp= int n=0; while (n<3){ cout<<"*"; n++; } ``` 請問以上的程式會輸出幾個 * #### <br>答案是 3 個</span> <!-- .element: class="fragment" data-fragment-index="1" --> ---- ## 重複輸入 ---- ### 將輸入句 cin 放入 while 中 ```cpp= while(cin >> 變數) { 當輸入變數就... } ``` ```cpp= while( cin >> 變數1 >> 變數2 ) { 每次輸入變數1、變數2時,要做什麼事... } ``` <!-- .element: class="fragment" data-fragment-index="1" --> 使用 while 可以反覆輸入</br>直到碰到 End Of File (EOF) <!-- .element: class="fragment" data-fragment-index="2" --> ---- ### <span class="colorGold">小試身手</span> [ZeroJudge a004. 文文的求婚](https://zerojudge.tw/ShowProblem?problemid=a004) ---- ![padoru](https://hackmd.io/_uploads/Hy7wguYL6.gif) --- ## <span class="colorPurple">for 迴圈</span> ---- <span class="colorPurple">for</span> 迴圈的語法相比於 while 稍微複雜些 <!-- for (init; condition; increment){ // do something } --> ```cpp for(A.一開始先做... ; B.條件式 ; D.等C每做完一次,就做... ) { C.當B條件成立,就重複做... } ``` 先做 A $\rightarrow$ 檢查 B 條件,成立就做 C,接著做D ... $\rightarrow$ 檢查 B 條件,成立就做 C,接著做 D $\rightarrow$ 檢查B條件,不成立離開 <!-- 1. for迴圈的開始會先進行<font color=#edbd3a>初始化(init)</font> 2. 接著判斷<span class=condition>條件(condition)</span>是否成立 2-1. 如果成立就執行區塊中的程式碼 2-2. 執行<font color=#a141e8>遞增(increment)</font> 2-3. 回到 2. 3. 若<span class=condition>條件(condition)</span>不成立 結束迴圈 --> Note: 比起 while 迴圈,for 迴圈更適合處理有次序的事。 其實 for 迴圈能做的事,while 迴圈都能做。 while 迴圈能做的事,for 迴圈也都能做。 for 是另一種迴圈的語法,基本和 while 沒有太大區別。為了視覺上的方便,因此要學習 for 迴圈。 ---- ### <span class="colorPurple">for</span> vs <span class="colorPurple">while</span> ![](https://www.csie.ntu.edu.tw/~b98902112/cpp_and_algo/cpp02/for_vs_while.png) Note: n = 5 在for迴圈裡定義的為區域變數 離開迴圈後即失效 ---- ## <span class="colorGold">範例</span> ```cpp= for (int i = 1; i < 6; i++) cout << i; ``` 請依剛剛講的流程 想看看輸出的會是多少 ---- ### 輸出為 <span class="colorRed">12345</span> <!-- .element: class="fragment" data-fragment-index="1" --> Note: 需隱藏 ---- ```cpp for(A.一開始先做... ; B.條件式 ; D.等C每做完一次,就做... ) { C.當B條件成立時,就重複做... } ``` Note: 直接跳下頁 可往回 ---- ### <span class="colorGold">初始化</span> 與 <span class="colorDarkPurple">下一輪的前置</span> *** <span class="colorGold">初始化</span> 可用來定義區域變數 <span class="colorDarkPurple">下一輪的前置</span> 通常用來改變該變數的值<br>但不一定是增加 這兩個可以不用存在 Note: 上頁有for ---- ### <span class="colorGold">範例</span> ```cpp= int i = 3; for (; i > 0;) cout << i--; ``` 有沒有很像前面講的某個語法 ---- 當 <span class=colorPurple>for</span> 迴圈沒 <span class="colorGold">初始化</span> 與 <span class="colorDarkPurple">下一輪的前置</span> 部份時 可以當 <span class="colorPurple">while</span> 迴圈使用 ###### ~~怎麼不直接寫while就好~~ ---- ### 巢狀迴圈 簡單來說就是在一個迴圈當中還有好幾層的迴圈 ```cpp= for (int i=0; i<10; i++) { for (int j=0; j<10; j++) { // do something } } ``` Note: 兩層迴圈區域變數要不同 ---- ## <span class="colorGold">範例</span> ```cpp= for (int i = 0; i < 4; i++) { for (int j = 0; j < 3; j++) { cout << "*"; } cout << endl; } ``` *** 請推測輸出的結果為何 ---- `***` `***` `***` `***` ---- ### <span class="colorGold">小試身手</span> [ZeroJudge a058. MOD3](https://zerojudge.tw/ShowProblem?problemid=a058) [ZeroJudge a148. You Cannot Pass?!](https://zerojudge.tw/ShowProblem?problemid=a148) --- ## 迴圈中的流程改變 ---- ## <span class="colorPurple">break</span> <span class="colorPurple">break</span> 在英文中有 ++打破++ ++打斷++ 的意思 而在 C++ 中則用於跳出一個迴圈 ---- ### <span class="colorGold">範例</span> *** ```cpp= int n = 0; while (n<10) { cout << n; if (n==2) break; n++; } ``` 請問輸出的值為何? ## <br>答案是 `012` <!-- .element: class="fragment" data-fragment-index="1" --> ---- ## <span class="colorPurple">continue</span> 用於 ++直接進入下一次迴圈++ ---- ### <span class="colorGold">範例</span> *** ```cpp= for (int i=0; i<5; i++) { if (i == 3) continue; cout << i; } ``` 結果為:`0124` ---- ### <span class="colorGold">範例</span> *** ```cpp= for (int i=10; i>0; i--) { if (i%4 == 0) continue; if (i == 3) break; cout << i; } ``` 想想看輸出的結果為何? ## <br>答案是 `109765` <!-- .element: class="fragment" data-fragment-index="1" --> ---- ### <span class="colorGold">小試身手</span> [ZeroJudge a147. Print it all](https://zerojudge.tw/ShowProblem?problemid=a147) --- ## 陣列 ---- 可以把陣列想成是有多個同名的變數相連在一起 但彼此之間以編號做區別 ---- 若今天有一組整數陣列,陣列名稱為 arr | 編號 | 0 | 1 | 2 | | --- | --- | ---| ---| | 值| 10 | 20 | 30 | ---- ### 注意 在大部分的程式語言中編號都從零開始計算 在習慣上會說第一項,但對程式來說是第 0 項 ---- ### 注意 編號實際上應稱為「索引值」(index value) ---- ### 陣列宣告 ```cpp= int arr[5]; ``` 以上程式碼會宣告一個長度為 5 的整數陣列 *** 格式 ```text= 型別 陣列名稱[長度]; ``` ---- ### <span class="colorGold">範例</span> #### 錯誤寫法 ```cpp= int main() { int n; cin >> n; int arr[n]; } ``` 其中陣列長度需為 常數 不得為 變數 #### 這在大部分的編譯器會提示錯誤 ---- <!-- ### 補充:宣告常數 使用 <span class="colorPurple">const</span> 關鍵字來宣告一個常數 *** ### <span class="colorGold">範例</span> ```cpp const int i = 1e6; ``` --> 如果我想要陣列中有預設值? ```cpp int arr[5] = {2, 4, 6, 8, 10}; ``` ```cpp int arr[] = {2, 4, 6, 8, 10}; ``` <!-- .element: class="fragment" data-fragment-index="1" --> ```cpp int arr[5] = {2, 4, 6}; ``` <!-- .element: class="fragment" data-fragment-index="2" --> ---- 如何存取陣列中的值? ```cpp= int arr[5] = {2, 4, 6, 8, 10}; arr[0] = 9; // 第零項 2 -> 9 cout<<arr[4]; // output: 10 ``` 同一般變數使用 但使用 <span class="colorBlue">[]</span> 存取陣列中的值 ---- ### <span class="colorGold">小試身手</span> [ZeroJudge f345. 新手練習題—陣列](https://zerojudge.tw/ShowProblem?problemid=f345) [ZeroJudge e968. 2. 班級名單 (Student list)](https://zerojudge.tw/ShowProblem?problemid=e968) [ZeroJudge d074. 電腦教室](https://zerojudge.tw/ShowProblem?problemid=d074) ---- ## 二維陣列 ---- 宣告方式 型態 名 [大小][大小] int f[2][3] ---- ### 二維陣列類似exccel一樣為一推變數組成的平面陣列 ---
{"description":"用來寫程式的軟體","title":"高二社團","contributors":"[{\"id\":\"c76bed1b-fb21-4b17-b55a-3c804f01e602\",\"add\":33044,\"del\":9103}]"}
    203 views