# [筆記]程式設計(C++)—成為爆肝工程師的第一步 :white_check_mark:**Create time :9/18/2023** :white_check_mark:**Project Name:開放式課程筆記** :white_check_mark:**Project Type:C++** :white_check_mark:**sourc:台大開放式課程** ## :pencil:學習內容 :::success ### :one: 程式設計第一講-Introduction #### 1.code基本功能 ```c++= #include <iostream> using namespace std; int main() { int num1 = 0, num2 = 0; cout << "Please enter one number:"; cin >> num1; cout << "Please enter another number:"; cin >> num2; cout << "The sum is " << num1 + num2; return 0; } ``` * 這是任課老師第一個教的可與使用者互動的程式碼,裡面包含組成一個完整code的基本要素,例如:資料庫iostream、宣告int、cout、cin、終止點return 0...等 * `""`宣告此為文字資料 * `int num1 = 0, num2 = 0`宣告兩個值為0的變數,等待使用者輸入 * `cout << "Please enter one number:` `cout << "Please enter another number:"`是輸出引導指示讓使用者了解接下來他們要怎麼與程式互動 * `cin >> num1` `cin >> num2`使輸入的值進入宣告的變數裡 * ` cout << "The sum is << num1 + num2" ` 讓使用者知道這個程式做了什麼,且計算變數值<br/>(由於compile右讀的特性,所以值會被先算出來才輸出文字) * `return 0`回傳0值給電腦,讓電腦知道終止這個程式 #### 2.基本迴圈 ```c++= #include <iostream> using namespace std; int main() { int num1 = 0,num2 = 0; cout << "Please enter two number, " << "srparated by white space: "; cin >> num1 >> num2; if (num1 > num2) cout << "The larger one is " << num1; if (num1 < num2) cout << "The larger one is " << num2; if (num1 == num2) cout << "The two are equal " ; return 0; } ``` * 此code與上面大抵相同,差別在迴圈與數學運算的不同 * `<<`功能為接續上一段話<br/>(因為沒有出現換行符,所以compile判定為同一行) * `srparated by white space: `告訴使用者這次的兩個變數要一次輸入,且用空白鍵隔開 * `cin >> num1 >> num2`電腦讀取使用者輸入<br/>(compile本身就視中間有空白鍵的兩字串為不同資料) * `if`為迴圈功能,負責判斷`if()`內的事件是否有發生,有的話就執行下列code(在此為輸出值),沒有發生compil則自動跳過下列code ```c++= #include <iostream> using namespace std; int main() { int num1 = 0,num2 = 0; cout << "Please enter two number, " << "srparated by white space: "; cin >> num1 >> num2; while (num1 > num2) { cout << "number 1 is " << num1 << "\n"; num1 = num1 - 1; } return 0; } ``` * 此code與上面大抵相同,差別在選擇迴圈與輸出不同 * `while ()`當`()`的條件成立的時候執行此迴圈,不成立則compil忽略 * `"\n"`是換行符號 * `num1 = num1 - 1` 是在輸出一個值後再將`num1 - 1`的值輸入`num1`裡 * `while (num1 > num2)`此時因為`num1`變數值改變,若定義後的`num1`仍然大於一開始輸入的`num2`,則再次執行迴圈 * 此code的回傳`return 0`停止將會在輸出到`num2+1`的值時停止<br/>(印為此時`()`內的算式不再成立) #### 3.**Syntax errors VS.Logic errors** ![](https://hackmd.io/_uploads/Bk-_vBSka.png) * Syntax errors (語法錯誤)例如:沒加引號標示字串、宣告資料類型錯誤。可被compile辨識出來。 * Logic errors(邏輯錯誤)是整題而言順序、資料的錯誤。只能靠開發者自己檢查解決。 #### 4.**Formatting a C++ program** ![](https://hackmd.io/_uploads/r1kU_BSJp.png) * 兩個statements不要放在同一行 * Indention 不同 Blocks以顯示階層 * 變數宣告宣要有意義的名字 * 不同用途的Code用空行隔開 * 記得寫註解 ::: :::info ### :two: 程式設計第二講-Selection and Repetition #### 1.**電腦功能** ![](https://hackmd.io/_uploads/Sk_sgOAJT.png) * input,output即直觀功能,不過多贅述 * Storage為non-volatile storage(非揮發性記憶體),關機後裡面的東西不會消失,具題呈現為硬碟 * CPU(中央處理器),將資訊導至硬體且處理運算 * Memory是volatile storage space,主要儲存會被重製的東西,且如果Memory不夠東西會自動存到Storage * Storage VS. Memory,具體例子為,某人今天寫了一份Word,文章內容為Storage,word軟體為Memory,所以當他重新開機時,需要再開啟一次word,卻不用再寫一次內容 * 儲存code為Storage,執行code在CPU,變數值儲存在Memory #### 2.C++起手式 ![](https://hackmd.io/_uploads/rkgnnuAJp.png) * `#include`告訴C++去copy接下來的<>內的東西並用copy的東西取代第一行 * `iostream`是一個standard library,內容包含已被寫好的C++的泛用指令,例如cin、return。為標準資料庫,任何開發環境皆有此資料庫 * namespace是存名稱的地方,`std`則存了大量的泛用指令*名稱*,例如寫了`#include <iostream>`卻沒打`using namespace std`就使用cin,則有cin*功能*,但電腦不知道cin是此功能的*名稱*,因此出錯 * 可在所有iostream提供的指令前打上`std::`來取代`using namespace std` #### 3.運算子與條件限制 * C++的else會自動配對最接近且還未被其他else配對的if * 邏輯運算子有&&(and)、||(or)、!(not),可用於限定條件 * 如果有多個括號,內部的括號先處理 * switch使用在有多個結果的情況,case後要加:,要執行到break才會停,如果條件成立,整個break前的可能情況都會被輸出 #### 4.switch回圈 ```c++= #include <iostream> using namespace std; int main() { int year = 0, month = 0; cin >> year >> month; int days = 0; switch (month) { case 1:case 3:case 5:case 7:case 8:case 10:case 12: days = 31; break; case 4:case 6:case 9:case 11: days = 30; break; case 2: if ((year % 400 == 0) || (year % 4 == 0 && (year % 100 != 0))) days = 29; else days = 28; break; } cout << days << "\n"; } ``` * switch使用在有多個結果的情況,case後要加: * 要執行到break才會停,如果條件成立,整個break前的可能情況都會被輸出 * 通常switch迴圈只認整數 * 此code是判斷某西元年某月天數的switch的判斷式 #### 5. do while 迴圈 ```C++= #include <iostream> int main() { int count = 1; do { std::cout << "這是第 " << count << " 次迴圈。\n"; count++; } while (count <= 5); return 0; } ``` * 此為do while迴圈 * 無論如何先做一次括號內的程式 * while的條件寫在後面 ::: :::danger ### :three: 程式設計第三講:Variables and Arrays 1.**變數不同會影響可處存的內容大小** ![螢幕擷取畫面 2023-10-30 104628.png](https://hackmd.io/_uploads/rJ8t_0rmT.png) * 以二進制碼為例,long>int>short,可視情況選擇變數以節省電腦效能 2.**byte與sizeof** * 可用sizeof檢查變數占多少byte * 可用`#include <climits>`檢查變數範圍 * 兩個int值運算後的值只會是整數 3.**bool值確認對錯** ![螢幕擷取畫面 2023-10-30 110223.png](https://hackmd.io/_uploads/S1NQ30S7p.png) * bool為單純確認對錯的變數 4.**float與double** ![螢幕擷取畫面 2023-10-30 112407.png](https://hackmd.io/_uploads/Syx2QhRrXa.png) * float稱為浮點數,大多用於存取有小數的值,double則是float的進階,可存取更多數。float是4bytes,double是8bytes。 5. 轉換變數static_cast<>() ![螢幕擷取畫面 2023-10-30 114756.png](https://hackmd.io/_uploads/SkrV2Ar7a.png) * static_cast<>()為轉換運算子,<>內放想換成的類型,()內放變數名稱。如上圖就是將int轉成float的情況。 * `ch = static_cast<char>(i); `這是把i變數改成char並且放入名稱叫做ch的變數的程式碼 4.**陣列內部相比找最大值** ```c++= #include <iostream> using namespace std; int main() { float value[10] = { 0 }; for (int i = 0; i < 10; i++) cin >> value[i]; float max = value[0]; for (int i = 1; i < 10; i++) { if (value[i] > max) max = value[i]; } cout << max; return 0; } ``` * 此為一維陣列作輸入10數字找最大值的程式碼,使輸入值存在一陣列中,每個相比找最大值 5.**陣列的寫法** ![螢幕擷取畫面 2023-11-06 110456.png](https://hackmd.io/_uploads/HkBunRB7a.png) * 陣列與一般變數不同,不能直接宣告 `int array[x]`,要宣告成`int*array=new int[x]` 6.**陣列的應用** ```c++= #include <iostream> using namespace std; int main() { int a[2][3] = { {1, 2, 3}, {1, 2, 3} }; int b[2][3] = { {4, 5, 6}, {7, 8, 9} }; int c[2][3] = { 0 }; for (int i = 0; i < 2; i++) // matrix addition for (int j = 0; j < 3; j++) c[i][j] = a[i][j] + b[i][j]; for (int i = 0; i < 2; i++) // print out c { for (int j = 0; j < 3; j++) cout << c[i][j] << " "; cout << "\n"; } return 0; } ``` * 設定a,b兩固定二維陣列,相加求c陣列(第一格[ ]代表y軸,第二格[ ]代表X軸) * 兩個for迴圈限制c有數字的範圍與a,b相同(c空格未定義) * `c[i][j] = a[i][j] + b[i][j]`表示c為a,b相加 * 陣列編號第一個是0,所以y軸<2,x軸<3 * 輸出時也用for迴圈限制範圍(其餘全是未定義) ::: :::warning ### :four:程式設計第四講:Function 1.**基本定義function** ![螢幕擷取畫面 2023-12-04 115236](https://hackmd.io/_uploads/Sko8pzsSp.png) ```c++= float add(float, float); void test(float); int main() { int c = add(10.5, 20.6); cout << c << "\n"; return 0; } float add(float num1,float num2) { test(num1+num2); return num1 + num2; } void test(float toPrint) { cout << toPrint << "\n"; } ``` * 以上圖為例,定義function要有上面的類似宣告式的東西,才能接著宣告global variable的全域通用的函式,格式為{資料類型__名稱(輸入值的資料類型,輸入值的資料類型)} * float,void宣告此函數的類型 * 此程式最後回傳值是30.1與30,其中30.1來源於第11行的`test(num1+num2);`從跑add函式的過程中呼叫test函數的輸出值,並且因為void的特性沒有被int掉。30是`return num1 + num2;`後的回傳值被int的結果。 2.**fuction功能** ![螢幕擷取畫面 2023-12-04 115615](https://hackmd.io/_uploads/BkBuTGiSp.png) * 可從function執行過程中呼叫另一function ![螢幕擷取畫面 2023-12-04 165830](https://hackmd.io/_uploads/SJ6d6GoHa.png) * argument是引入值,parmerters是宣告的變數 * 上圖中num1,num2是parmerters,q1,q2-3是argument ```c++= #include <iostream> using namespace std; int max(int a, int b); int main() { int n = 0, m = 0, p = 0; cin >> n >> m >> p; cout << max(max(n, m), p); return 0; } int max(int a, int b) { return (a > b) ? a : b; } ``` * 此程式碼表示輸入三個值找最大,在cout階段連用了兩次函數將兩者最大值與第三者相比。 * `return (a > b) ? a : b;`它的意思是:如果 'a' 大於 'b',就回傳 'a';否則,回傳 'b'。問號前的條件被評估,根據它是 true 還是 false,回傳問號前或冒號後的值。 ![螢幕擷取畫面 2023-12-04 172951](https://hackmd.io/_uploads/ryUqpMsBT.png) * local variable在Fuction數裡比global variable有更高的優先級(同一代號,不同數值的變數) * 函式中的local variable只作用於自己的函式內 ```c++= #include <iostream> using namespace std; int test(); int main() { for (int x = 0; x < 10; x++) cout << test() << " "; return 0; // 1, 1, ..., 1 } int test() { static int a = 0; a++; return a; } ``` * 此時第一次做完`test()`的static int a會把a存取為 global variable,並且在接下來每次使用`test()`時自動採用 global variable的a,並忽略`test()`中的`static int a = 0;` 3.**array結合fuction** ![螢幕擷取畫面 2023-12-15 145529](https://hackmd.io/_uploads/rkuCh7p8a.png) * peintarray在宣告的時候不限制一維的範圍 * 輸出後,未標明數字的變數變成0 ![螢幕擷取畫面 2023-12-15 160248](https://hackmd.io/_uploads/H1Byam6IT.png) * const宣告此變數除了在宣告式可變以外,其餘運算、宣告皆不影響這個值 4.**fuction定義特殊情況** ![螢幕擷取畫面 2023-12-15 160433](https://hackmd.io/_uploads/Hk2yampUa.png) * c++中可接受不同函數有相同名字,稱為函數多載。 * 上圖中即表示pow函數有4種不同形式,當在程式中呼叫pow,會依據給的變數值選用何種pow函數。 ![螢幕擷取畫面 2023-12-15 161147](https://hackmd.io/_uploads/HkqbpXaLT.png) * default arguments是函數宣告的時候,給予變數一個默認值名稱 * `double circleArea(double, double = 3.14)`,如同這個算圓面積的公式,前方變數應輸入半徑,後方變數如果沒有給值,則視為3.14計算。 :::