---
# System prepended metadata

title: '[筆記]程式設計（C++）—成為爆肝工程師的第一步'

---

#  [筆記]程式設計（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計算。
  
:::






