# [筆記]程式設計(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**

* Syntax errors (語法錯誤)例如:沒加引號標示字串、宣告資料類型錯誤。可被compile辨識出來。
* Logic errors(邏輯錯誤)是整題而言順序、資料的錯誤。只能靠開發者自己檢查解決。
#### 4.**Formatting a C++ program** 
* 兩個statements不要放在同一行
* Indention 不同 Blocks以顯示階層
* 變數宣告宣要有意義的名字
* 不同用途的Code用空行隔開
* 記得寫註解
:::
:::info
### :two: 程式設計第二講-Selection and Repetition
#### 1.**電腦功能** 
* 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++起手式

* `#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.**變數不同會影響可處存的內容大小**

* 以二進制碼為例,long>int>short,可視情況選擇變數以節省電腦效能
2.**byte與sizeof**
* 可用sizeof檢查變數占多少byte
* 可用`#include <climits>`檢查變數範圍
* 兩個int值運算後的值只會是整數
3.**bool值確認對錯**

* bool為單純確認對錯的變數
4.**float與double**

* float稱為浮點數,大多用於存取有小數的值,double則是float的進階,可存取更多數。float是4bytes,double是8bytes。
5. 轉換變數static_cast<>()

* 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.**陣列的寫法**

* 陣列與一般變數不同,不能直接宣告 `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**

```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功能**

* 可從function執行過程中呼叫另一function

* 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,回傳問號前或冒號後的值。

* 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**

* peintarray在宣告的時候不限制一維的範圍
* 輸出後,未標明數字的變數變成0

* const宣告此變數除了在宣告式可變以外,其餘運算、宣告皆不影響這個值
4.**fuction定義特殊情況**

* c++中可接受不同函數有相同名字,稱為函數多載。
* 上圖中即表示pow函數有4種不同形式,當在程式中呼叫pow,會依據給的變數值選用何種pow函數。

* default arguments是函數宣告的時候,給予變數一個默認值名稱
* `double circleArea(double, double = 3.14)`,如同這個算圓面積的公式,前方變數應輸入半徑,後方變數如果沒有給值,則視為3.14計算。
:::