---
# System prepended metadata

title: 30509黃緯廷的C#筆記
tags: [C#]

---

# 30509黃緯廷的C#筆記

## 0.前情提要

* ==**由於本人為程式語言初學者，此份筆記為我高中自主學習計畫，筆記一切內容由本人觀看學習影片後自行統整，因此內容可能有疏漏或是不完善、錯誤、用字不精準之部分，若有建議，可留言告知，望海涵，謝謝。**==


## 1.自主學習參考影片

* [【C#】3小時初學者教學 ｜Csharp ｜ C# 教學 ｜ C# 入門 | C++++](https://www.youtube.com/watch?v=T9BeejD3i0g&t=0s)

## 2.環境建置、第一支程式
* 本次自主學習使用==Visual Studio 2022==當作開發環境
```csharp=
System.Console.WriteLine("Hello World!");
```

## 3.常見資料型態 & 變數

### a.常見資料型態一覽

* 字串 例:string"您好"
    * 字串==需用" "==
* 字元 例:char'a'
    * 字元==需用' '==
* 整數 例:int 100
* 浮點數 例:double 1.5
* 布林值 例:bool ture false
Visual Studio頁面截圖1
![螢幕擷取畫面 2024-04-20 213358](https://hackmd.io/_uploads/H17PBSWbC.png)

Visual Studio輸出截圖1
![螢幕擷取畫面 2024-04-20 214456](https://hackmd.io/_uploads/rJ0xwBb-0.png)



### b.指定變數

* 範例
```csharp=
string name = "黃緯廷";
```
:::warning
* string為變數的==資料型態==。
* name為變數的==名稱==。
* "黃緯廷"為==變數內容==。
:::

:::danger
* ==變數內容==可中途改變。
* ==資料型態==不可中途改變。
:::

### c.變數自介

```csharp=
//姓名 黃緯廷
string name = "黃緯廷";
System.Console.WriteLine("姓名"+name);
//性別 M(Male)
char sex = 'M';
System.Console.WriteLine("性別"+sex);
//年紀 18
int age = 18;
System.Console.WriteLine("年紀"+age);
//身高 158.9
double high = 158.9;
System.Console.WriteLine("身高"+high);
//是女性? 否
bool is_female = false;
System.Console.WriteLine("是女性"+is_female);
```

Visual Studio頁面截圖2
![螢幕擷取畫面 2024-04-20 214904](https://hackmd.io/_uploads/Sy-YOrZ-0.png)

Visual Studio輸出截圖2
![螢幕擷取畫面 2024-04-20 214929](https://hackmd.io/_uploads/SyLidHbZC.png)

## 4.字串常見用法

### a.\n換行

:::success
* \n為換行作用。
:::
```csharp=
//單程式內換行
System.Console.WriteLine("Hellow \nWorld!");
```
Visual Studio頁面截圖3
![螢幕擷取畫面 2024-04-21 142651](https://hackmd.io/_uploads/HyN-QEzbR.png)

Visual Studio輸出截圖3
![螢幕擷取畫面 2024-04-21 142704](https://hackmd.io/_uploads/rkh-Q4GZR.png)

### b.利用反斜線告知特殊符號為字串內容

```csharp=
//利用反斜線告知符號為字串
System.Console.WriteLine("\"Hellow\"  \'World!\'");
```
Visual Studio頁面截圖4
![螢幕擷取畫面 2024-04-21 143125](https://hackmd.io/_uploads/B1VM7NzbA.png)

Visual Studio輸出截圖4
![螢幕擷取畫面 2024-04-21 143138](https://hackmd.io/_uploads/S1b7m4zbC.png)

### c.字串相加

```csharp=
//字串相加
System.Console.WriteLine("Hellow" + "World!");
```
Visual Studio頁面截圖5
![螢幕擷取畫面 2024-04-21 143913](https://hackmd.io/_uploads/BJfkrVGb0.png)

Visual Studio輸出截圖5
![螢幕擷取畫面 2024-04-21 143951](https://hackmd.io/_uploads/SyRkSNMZR.png)

### d.Length判別字串長度

:::success
* Length可判別字串長度。
:::
```csharp=
//判別長度
System.Console.WriteLine("Hellow World!".Length);
```
Visual Studio頁面截圖6
![螢幕擷取畫面 2024-04-21 144305](https://hackmd.io/_uploads/rJeyUNM-R.png)

Visual Studio輸出截圖6
![螢幕擷取畫面 2024-04-21 144315](https://hackmd.io/_uploads/SkIyUVzWA.png)

### e.ToUpper/ToLower轉換大小寫

:::success
* ToUpper可轉換大寫。
* ToLower可轉換小寫。
:::
```csharp=
//轉換大寫
System.Console.WriteLine("Hellow World!".ToUpper());
//轉換小寫
System.Console.WriteLine("Hellow World!".ToLower());
```
Visual Studio頁面截圖7
![螢幕擷取畫面 2024-04-21 145148](https://hackmd.io/_uploads/HJypwEzW0.png)

Visual Studio輸出截圖7
![螢幕擷取畫面 2024-04-21 145200](https://hackmd.io/_uploads/Skp6D4fZA.png)

### f.Contains判斷字串中是否含有指定內容

:::success
* Contains可判斷字串中是否含有指定內容。
:::
```csharp=
//判斷字串中是否含有指定內容
System.Console.WriteLine("Hellow World!".Contains("Hellow"));
```
Visual Studio頁面截圖8
![螢幕擷取畫面 2024-04-21 145807](https://hackmd.io/_uploads/SJVVFVMbA.png)

Visual Studio輸出截圖8
![螢幕擷取畫面 2024-04-21 145817](https://hackmd.io/_uploads/HyfHYNM-R.png)
:::warning
* 若無指定內容則判斷False。
:::

### g.判斷字串中特定位置的值

```csharp=
//判斷字串中特定位置的值([0]表第1位)，因此[1]會表示第2位。
System.Console.WriteLine("Hellow World!"[1]);
```
Visual Studio頁面截圖9
![螢幕擷取畫面 2024-04-21 150823](https://hackmd.io/_uploads/B1dm2EfbA.png)

Visual Studio輸出截圖9
![螢幕擷取畫面 2024-04-21 150833](https://hackmd.io/_uploads/BJ_VnEM-C.png)

:::danger
* 在C#中[0]表第1位，因此[1]會表示第2位。
:::

### h.IndexOf判斷字串中特定值的位置

:::success
* IndexOf可判斷字串中特定值的位置。
:::
#### h1.判斷字串中特定值的位置

```csharp=
//判斷字串中特定值的位置
System.Console.WriteLine("Hellow World!".IndexOf("H"));
```
Visual Studio頁面截圖10
![螢幕擷取畫面 2024-04-21 151517](https://hackmd.io/_uploads/Hk646VzWR.png)

Visual Studio輸出截圖10
![螢幕擷取畫面 2024-04-21 151530](https://hackmd.io/_uploads/SyNHpVz-0.png)

#### h2.判斷字串中重複特定值的位置

```csharp=
//判斷字串中重複特定值的位置
System.Console.WriteLine("Hellow World!".IndexOf("l"));
```
Visual Studio頁面截圖11
![螢幕擷取畫面 2024-04-21 160129](https://hackmd.io/_uploads/rJKSdHGZR.png)

Visual Studio輸出截圖11
![螢幕擷取畫面 2024-04-21 160138](https://hackmd.io/_uploads/Sy88uBG-R.png)

:::danger
* 若欲尋找之值在目標字串中有重複，則優先傳回較先檢索到之值位置。如欲尋找l，則會傳回2而非3。
:::
#### h3.判斷字串中特定字串的位置

```csharp=
//判斷字串中特定字串的位置
System.Console.WriteLine("Hellow World!".IndexOf("World"));
```
Visual Studio頁面截圖12
![螢幕擷取畫面 2024-04-21 160158](https://hackmd.io/_uploads/B1st_SzWA.png)

Visual Studio輸出截圖12
![螢幕擷取畫面 2024-04-21 160207](https://hackmd.io/_uploads/HyLjOSMZ0.png)

:::danger
* 若欲尋找之值為字串，則傳回搜尋目標中字串開頭之位置。如欲尋找World，則傳回7。
:::
#### h4.判斷字串中不存在之字串的位置

```csharp=
//判斷字串中不存在之字串的位置
System.Console.WriteLine("Hellow World!".IndexOf("Yes"));
```
Visual Studio頁面截圖13
![螢幕擷取畫面 2024-04-21 160224](https://hackmd.io/_uploads/r1oTOSfWA.png)

Visual Studio輸出截圖13
![螢幕擷取畫面 2024-04-21 160233](https://hackmd.io/_uploads/r1tAuBf-0.png)

:::danger
* 若目標中無欲搜尋之目標，則傳回-1。
:::

### i.Substring切割字串

:::success
* Substring可切割字串。
:::

#### i1.切割字串

```csharp=
//切割字串
System.Console.WriteLine("Hellow World!".Substring(7));
```
Visual Studio頁面截圖14
![螢幕擷取畫面 2024-04-21 153734](https://hackmd.io/_uploads/HJzcMBGWR.png)

Visual Studio輸出截圖14
![螢幕擷取畫面 2024-04-21 153743](https://hackmd.io/_uploads/HJOAfBzW0.png)

#### i2.切割字串至指定位置

```csharp=
//切割字串至指定位置
System.Console.WriteLine("Hellow World!".Substring(7, 3));
```
Visual Studio頁面截圖15
![螢幕擷取畫面 2024-04-21 160628](https://hackmd.io/_uploads/BJuSYSMZR.png)

Visual Studio輸出截圖15
![螢幕擷取畫面 2024-04-21 160638](https://hackmd.io/_uploads/BybIYBGZ0.png)
:::danger
* 括號中第二個數字表由第一數字位置往後計算的位數。如Substring(7, 3)表由第7個位置後切割到後3個字。
:::

## 5.數字常見用法(整數、浮點數)

### a.四則運算

#### a1.整數與浮點數四則運算

```csharp=
//整數加法
System.Console.WriteLine(2 + 3);
//整數減法
System.Console.WriteLine(2 - 3);
//整數乘法
System.Console.WriteLine(2 * 3);
//整數除法
System.Console.WriteLine(2 / 3);
```

Visual Studio頁面截圖16
![螢幕擷取畫面 2024-04-28 152128](https://hackmd.io/_uploads/H1xrKujZR.png)

Visual Studio輸出截圖16
![螢幕擷取畫面 2024-04-28 152140](https://hackmd.io/_uploads/S1urK_sbR.png)

:::danger
* 由於是整數2與整數3之間的運算，因此輸出結果僅為0.6循環小數中的整數部分0。
* 若要輸出浮點數，只需將其中一邊整數改為浮點數即可。

```csharp=
//浮點數除法
System.Console.WriteLine(2.0 / 3);
```
Visual Studio頁面截圖17
![螢幕擷取畫面 2024-04-28 154210](https://hackmd.io/_uploads/H1C_0usbR.png)

Visual Studio輸出截圖17
![螢幕擷取畫面 2024-04-28 154226](https://hackmd.io/_uploads/BJSt0OobR.png)

:::

#### a2.連續四則運算

```csharp=
//先乘除後加減
System.Console.WriteLine(2 + 3 * 5);
//括號內先算
System.Console.WriteLine((2 + 3) * 5);
```

Visual Studio頁面截圖18
![螢幕擷取畫面 2024-04-28 154941](https://hackmd.io/_uploads/r1ZkgYiWC.png)

Visual Studio輸出截圖18
![螢幕擷取畫面 2024-04-28 154952](https://hackmd.io/_uploads/SkbJgYjZA.png)

### b.常用數學方法

:::success
* Abs可取絕對值。
* Pow可取次方。
* Sqrt可開根號。
* Max可取較大值。
* Min可取較小值。
* Round可將浮點數四捨五入。
:::

```csharp=
//絕對值
System.Console.WriteLine(System.Math.Abs(-10));
//次方
System.Console.WriteLine(System.Math.Pow(10,3));
//開根號
System.Console.WriteLine(System.Math.Sqrt(16));
System.Console.WriteLine(System.Math.Sqrt(8));
//取較大值
System.Console.WriteLine(System.Math.Max(2,100));
//取較小值
System.Console.WriteLine(System.Math.Min(2, 100));
//浮點數四捨五入
System.Console.WriteLine(System.Math.Round(5.4));
System.Console.WriteLine(System.Math.Round(5.5));
```

Visual Studio頁面截圖19
![螢幕擷取畫面 2024-04-28 161112](https://hackmd.io/_uploads/H1VTNKiWC.png)

Visual Studio輸出截圖19
![螢幕擷取畫面 2024-04-28 161121](https://hackmd.io/_uploads/H1nTNYib0.png)

:::danger
* 次方的使用中，第一個數為底數，第二個數為次方的值。
:::

## 6.取得用戶輸入

### a.用戶輸入

:::success
* ReadLine可要求用戶端輸入。
:::

```csharp=
//提示用戶輸入名字
System.Console.WriteLine("請輸入您的名字:");
//取得用戶輸入
System.Console.ReadLine();

//提示用戶輸入名字(不換行)
System.Console.Write("請輸入您的名字:");
//取得用戶輸入
System.Console.ReadLine();
```
Visual Studio頁面截圖20
![螢幕擷取畫面 2024-04-28 161925](https://hackmd.io/_uploads/SJ3yYtj-R.png)

Visual Studio輸出截圖20
![螢幕擷取畫面 2024-04-28 162002](https://hackmd.io/_uploads/HknJtYjbA.png)
:::danger
* 去掉WriteLine中的Line可拒絕換行
:::
### b.用戶輸入變數

```csharp=
//提示用戶輸入名字
System.Console.Write("請輸入您的名字:");
//取得用戶輸入 將變數name設為用戶輸入
string name = System.Console.ReadLine();
//輸出歡迎你+用戶名
System.Console.WriteLine("歡迎您" + name + "先生");
```

Visual Studio頁面截圖21
![螢幕擷取畫面 2024-04-28 164044](https://hackmd.io/_uploads/HyMRiFsZA.png)

Visual Studio輸出截圖21
![螢幕擷取畫面 2024-04-28 164106](https://hackmd.io/_uploads/HkMAoYj-0.png)

:::danger
* 當然也可同時取得多個輸入。
```csharp=
//提示用戶輸入名字
System.Console.Write("請輸入您的名字:");
//取得用戶輸入 將變數name設為用戶輸入
string name = System.Console.ReadLine();
//提示用戶輸入年紀
System.Console.Write("請輸入您的年紀:");
//取得用戶輸入 將變數age設為用戶輸入
string age = System.Console.ReadLine();
//輸出歡迎你+用戶名
System.Console.WriteLine("歡迎您" + age + "歲的" + name + "先生");
```

Visual Studio頁面截圖22
![螢幕擷取畫面 2024-04-28 164632](https://hackmd.io/_uploads/ryfVatiWR.png)

Visual Studio輸出截圖22
![螢幕擷取畫面 2024-04-28 164651](https://hackmd.io/_uploads/H1GEpFs-R.png)

:::

### c.建立基礎計算機

:::success
* Convert可改變資料型態。
    * ToInt32可指定改變資料型態為整數。
    * ToDouble可指定改變資料型態為浮點數。
:::

#### c1.整數加法計算機

```csharp=
//提示用戶輸入第一個數
System.Console.Write("請輸入第一個數:");
int num1 = System.Convert.ToInt32(System.Console.ReadLine());
//提示用戶輸入第二個數
System.Console.Write("請輸入第二個數:");
int num2 = System.Convert.ToInt32(System.Console.ReadLine());
System.Console.WriteLine(num1 + num2);
```

Visual Studio頁面截圖23
![螢幕擷取畫面 2024-04-28 223942](https://hackmd.io/_uploads/B1um-kh-0.png)

Visual Studio輸出截圖23
![螢幕擷取畫面 2024-04-28 223959](https://hackmd.io/_uploads/S1SNZ1hW0.png)



#### c2.浮點數加法計算機

```csharp=
//提示用戶輸入第一個數
System.Console.Write("請輸入第一個數:");
double num1 = System.Convert.ToDouble(System.Console.ReadLine());
//提示用戶輸入第二個數
System.Console.Write("請輸入第二個數:");
double num2 = System.Convert.ToDouble(System.Console.ReadLine());
System.Console.WriteLine(num1 + num2);
```

Visual Studio頁面截圖24
![螢幕擷取畫面 2024-04-28 224418](https://hackmd.io/_uploads/HyyBW1hZ0.png)

Visual Studio輸出截圖24
![螢幕擷取畫面 2024-04-28 224438](https://hackmd.io/_uploads/SJJrbJ2ZR.png)

## 7. Array 陣列

### a.創建陣列

```csharp=
//創建整數陣列
int[] scores = {60, 90, 75, 46, 89};

//輸出陣列內容
System.Console.WriteLine(scores[0]);
System.Console.WriteLine(scores[1]);
System.Console.WriteLine(scores[2]);
System.Console.WriteLine(scores[3]);
System.Console.WriteLine(scores[4]);
```

Visual Studio頁面截圖25
![螢幕擷取畫面 2024-04-28 230016](https://hackmd.io/_uploads/ry-WBy2-C.png)

Visual Studio輸出截圖25
![螢幕擷取畫面 2024-04-28 230024](https://hackmd.io/_uploads/SyZZS13ZC.png)

### b.中途改變陣列內容

```csharp=
//創建整數陣列
int[] scores = {60, 90, 75, 46, 89};
//改變第一位分數為65
scores[0] = 65;
//輸出陣列內容
System.Console.WriteLine(scores[0]);
System.Console.WriteLine(scores[1]);
System.Console.WriteLine(scores[2]);
System.Console.WriteLine(scores[3]);
System.Console.WriteLine(scores[4]);
```

Visual Studio頁面截圖26
![螢幕擷取畫面 2024-04-28 230602](https://hackmd.io/_uploads/SkszI13WR.png)

Visual Studio輸出截圖26
![螢幕擷取畫面 2024-04-28 230611](https://hackmd.io/_uploads/HJiML12b0.png)

### c.創建空陣列

```csharp=
//創建字串空陣列，指定陣列內可容納4個值
string[] ages = new string[4];
//設定陣列內容
ages[0] = "18";
ages[1] = "23";
ages[2] = "57";
ages[3] = "69";
System.Console.WriteLine(ages[0]);
System.Console.WriteLine(ages[1]);
System.Console.WriteLine(ages[2]);
System.Console.WriteLine(ages[3]);
```

Visual Studio頁面截圖27
![螢幕擷取畫面 2024-04-28 232225](https://hackmd.io/_uploads/r1gf91hbR.png)

Visual Studio輸出截圖27
![螢幕擷取畫面 2024-04-28 232235](https://hackmd.io/_uploads/By9Gcy2ZA.png)
:::danger
```csharp=
//創建字串空陣列，指定陣列內可容納4個值
string[] ages = new string[4];
```
* 此式中之中括號[指定陣列內可容納之值之數量]不是由0開始計算!
:::

## 8.If(else)判斷句

### a.if判斷

```csharp=
//設置變數為true
bool hungry = true;
//如果變數為true
if (hungry)
//輸出
{
    System.Console.WriteLine("我就去吃飯");
}
```

Visual Studio頁面截圖28
![螢幕擷取畫面 2024-04-29 094454](https://hackmd.io/_uploads/BkY6i_3ZR.png)

Visual Studio輸出截圖28
![螢幕擷取畫面 2024-04-29 094514](https://hackmd.io/_uploads/ByYpoO2bC.png)

### b.if, else判斷

```csharp=
//設置變數為false
bool rainy = false;
//如果變數為true
if (rainy)
//輸出
{
    System.Console.WriteLine("我就坐車去上學");
}
//若非，則輸出
else
{
    System.Console.WriteLine("我就走路去上學");
}
```

Visual Studio頁面截圖29
![螢幕擷取畫面 2024-04-29 101816](https://hackmd.io/_uploads/Hy_pXKnZC.png)

Visual Studio輸出截圖29
![螢幕擷取畫面 2024-04-29 101842](https://hackmd.io/_uploads/Syd6mY3Z0.png)

### c.巢狀選擇

```csharp=
//設置變數(分數=40)
int score = 40;
//若分數為100
if (score == 100)
//輸出
{
    System.Console.WriteLine("Your grade is A!");
}
//或是如果分數為80
else if (score >= 80)
//輸出
{
    System.Console.WriteLine("Your grade is B!");
}
//或是如果分數為60
else if (score >= 60)
//輸出
{
    System.Console.WriteLine("Your grade is C!");
}
//否則
else
{
    System.Console.WriteLine("Your grade is D!");
}
```

Visual Studio頁面截圖30
![螢幕擷取畫面 2024-04-29 112453](https://hackmd.io/_uploads/Sk3NXqnWA.png)


Visual Studio輸出截圖30
![螢幕擷取畫面 2024-04-29 104555](https://hackmd.io/_uploads/rk5Q9F3ZC.png)

### d.且&&

```csharp=
//設置變數(分數=100，畢業=否)
int score = 100;
bool graduation = false;
//若滿足兩個條件(且)
if (score == 100 && graduation) 
//輸出
{
    System.Console.WriteLine("我給你10000元獎金");
}
//若其一不滿足，則輸出
else
{
    System.Console.WriteLine("重修高中");    
}
```

Visual Studio頁面截圖31
![螢幕擷取畫面 2024-04-29 111930](https://hackmd.io/_uploads/H1Zez92-0.png)

Visual Studio輸出截圖31
![螢幕擷取畫面 2024-04-29 111946](https://hackmd.io/_uploads/ryWxz93bA.png)

### e.或||

```csharp=
/設置變數(分數=100，畢業=否)
int score = 100;
bool graduation = false;
//若滿足其一條件(或)
if (score == 100 || graduation)
//輸出
{
    System.Console.WriteLine("我給你10000元獎金");
}
//否則
else
{
    System.Console.WriteLine("重修高中");
}
```

Visual Studio頁面截圖32
![螢幕擷取畫面 2024-04-29 113110](https://hackmd.io/_uploads/HyusN5h-A.png)

Visual Studio輸出截圖32
![螢幕擷取畫面 2024-04-29 113121](https://hackmd.io/_uploads/HJl3EqnWR.png)

### f.不等於!=

```csharp=
//設置變數(分數=100，畢業=否)
int score = 100;
bool graduation = false;
//若不滿足兩個條件(且)
if (score != 100 && !graduation)
//輸出
{
    System.Console.WriteLine("重修高中");
}
//若其一滿足，則輸出
else
{
    System.Console.WriteLine("我給你10000元獎金");
}
```

Visual Studio頁面截圖33
![螢幕擷取畫面 2024-04-29 114442](https://hackmd.io/_uploads/BknxOqnWC.png)


Visual Studio輸出截圖33
![螢幕擷取畫面 2024-04-29 114452](https://hackmd.io/_uploads/Byrbu53W0.png)

## 9.進階計算機

```csharp=
//提示用戶輸入第一個數
System.Console.Write("請輸入第一個數:");
double num1 = System.Convert.ToDouble(System.Console.ReadLine());

System.Console.Write("請輸入要做的運算:");
string oper = System.Console.ReadLine();

//提示用戶輸入第二個數
System.Console.Write("請輸入第二個數:");
double num2 = System.Convert.ToDouble(System.Console.ReadLine());

if (oper == "+")
{
    System.Console.WriteLine(num1 + num2);
}
else if (oper == "-")
{
    System.Console.WriteLine(num1 - num2);
}
else if (oper == "*")
{
    System.Console.WriteLine(num1 * num2);
}
else if (oper == "/")
{
    System.Console.WriteLine(num1 / num2);
}
else
{
    System.Console.Write("不合法的運算符號");
}
```

## 10.While迴圈

### a.while基礎用法
```csharp=
//設置變數為1
int num = 1;
//當變數小於5
while (num <= 5)
//加1直到5
{
    System.Console.WriteLine(num);
    num = num+1;
}
```

Visual Studio頁面截圖34
![螢幕擷取畫面 2024-04-29 151954](https://hackmd.io/_uploads/SJqr9p3-C.png)

Visual Studio輸出截圖34
![螢幕擷取畫面 2024-04-29 152007](https://hackmd.io/_uploads/By5B5TnbC.png)

### b. do, while先執行再判斷

```csharp=
int num = 6;
do
{
    System.Console.WriteLine(num);
    num = num + 1;
}
```

Visual Studio頁面截圖35
![螢幕擷取畫面 2024-04-29 192040](https://hackmd.io/_uploads/HkihzW6bC.png)

Visual Studio輸出截圖34
![螢幕擷取畫面 2024-04-29 192102](https://hackmd.io/_uploads/SJi3MZaZC.png)

## 11.猜數字遊戲

```csharp=
//設置變數
//答案
int answer = 89;
//玩家猜測的答案
int guess = 0;
//玩家猜測次數
int guess_counts = 0;
//猜測次數限制
int guess_limit = 5;
//目前獲勝狀況
bool win = false;

//告知玩家遊戲玩法
System.Console.WriteLine("猜數字遊戲，請輸入整數，我會告訴你答案更大或更小!");

//先執行
do
{
    //告知玩家動作
    System.Console.Write("請輸入猜測:");
    //將玩家回應之答案字串轉為整數
    guess = System.Convert.ToInt32(System.Console.ReadLine());
    //玩家猜測次數+1
    guess_counts = guess_counts + 1;

    //若玩家答案太大
    if (guess > answer)
    {
        //給予對應提示
        System.Console.WriteLine("太大");
    }
    //若玩家答案太小
    else if (guess < answer)
    {
        //給予對應提示
        System.Console.WriteLine("太小");
    }
    //若玩家答案正確
    else
    {
        //給予對應回應
        System.Console.WriteLine("恭喜答對!");
        win = true;
    }
}
//當玩家未勝利且玩家猜測次數未達猜測次數限制，重複以上
while (guess != answer && guess_counts < guess_limit);

//若執行完上述程式，目前獲勝狀況依舊為否
if (win == false)
{
    ////給予對應回應
    System.Console.WriteLine("再接再厲!");
}
```
Visual Studio頁面截圖36~37
![螢幕擷取畫面 2024-04-29 214526](https://hackmd.io/_uploads/H1fbSmpbC.png)
![螢幕擷取畫面 2024-04-29 214556](https://hackmd.io/_uploads/S1GWrQp-0.png)

Visual Studio輸出截圖36~37
![螢幕擷取畫面 2024-04-29 214712](https://hackmd.io/_uploads/ByzWrXaWR.png)
![螢幕擷取畫面 2024-04-29 214630](https://hackmd.io/_uploads/HJY-H76ZC.png)

## 12.For迴圈

### a.for基礎用法
```csharp=
//for(設置目標變數；判斷迴圈繼續條件；每次執行完前述迴圈執行)
for (int x = 1; x <= 5; x = x + 1)
{ 
    System.Console.WriteLine(x);
}
```

Visual Studio頁面截圖38
![螢幕擷取畫面 2024-04-29 231411](https://hackmd.io/_uploads/Sk99FNp-R.png)

Visual Studio輸出截圖38
![螢幕擷取畫面 2024-04-29 231419](https://hackmd.io/_uploads/Sk95tVpWR.png)


### b.取出陣列中的數

```csharp=
//設置陣列
int[] nums = { 3, 4, 5, 6, 8, 10, 5, 12, 13 };
//for(設置i=0；若i小於陣列長度則再次執行；再次執行前i+1)
for (int i = 0; i < nums.Length; i++)
{   
    //輸出陣列第i位
    System.Console.WriteLine(nums[i]);
}
```

Visual Studio頁面截圖39
![螢幕擷取畫面 2024-04-29 231456](https://hackmd.io/_uploads/HkNjYE6bR.png)

Visual Studio輸出截圖39
![螢幕擷取畫面 2024-04-29 231503](https://hackmd.io/_uploads/HJNitN6WC.png)

:::danger
* i++與i+=1作用相同於i=i+1。
:::

## 13.二維陣列

### a.創建二維陣列

```csharp=
//設置二維陣列
int[,] nums = {
    { 1, 2, 3 },
    { 4, 5, 6 }, 
    { 7, 8, 9 } 
};
//寫出第[0]橫排第[0]位
System.Console.WriteLine(nums[0, 0]);
```

Visual Studio頁面截圖40
![螢幕擷取畫面 2024-04-30 111641](https://hackmd.io/_uploads/HkyTz1AbR.png)

Visual Studio輸出截圖40
![螢幕擷取畫面 2024-04-30 111653](https://hackmd.io/_uploads/BkyTM10ZC.png)

:::danger
* row指的是橫行。
* colume指的是直排。
:::

### b.創建空二維陣列

```csharp=
//設置空二維陣列 [3row, 4colume]
int[,] nums = new int[3, 4];
//宣告[第一橫行，第一直排]值為1
nums[0, 0] = 1;
//宣告[第一橫行，第二直排]值為2
nums[0, 1] = 2;
```

Visual Studio頁面截圖41
![螢幕擷取畫面 2024-04-30 113042](https://hackmd.io/_uploads/SkJmLkAW0.png)

Visual Studio輸出截圖41
![螢幕擷取畫面 2024-04-30 113051](https://hackmd.io/_uploads/HJJm8J0bR.png)


## 14.class 類別 & object 物件

### a.創建類別(資料型態)

:::success
* 想創建類別，必須對右方專案名稱點擊右鍵，接著點擊加入->新增項目，然後選取類別後命名即可。

Visual Studio方案總管截圖1
![螢幕擷取畫面 2024-04-30 131551](https://hackmd.io/_uploads/H1LGeWCbA.png)

Visual Studio新增項目截圖1
![螢幕擷取畫面 2024-04-30 131730](https://hackmd.io/_uploads/ryUGlWR-R.png)
:::

### b.創建物件

* 專案Person.cs

```csharp=
//class創建類別接欲創建資料型態名稱 
class Person
//大括號內定義此資料型態之屬性
{
    public double height;
    public int age;
    public string name;
}
```

Visual Studio類別專案頁面截圖1
![螢幕擷取畫面 2024-04-30 134452](https://hackmd.io/_uploads/SkKQ8ZA-R.png)

:::warning
* public表示屬性可以在任何地方被存取。
:::

* 專案Program.cs
```csharp=
//由模板創造出來的變數person1稱為物件
Person person1 = new Person();
//設定物件屬性
person1.height = 158.9;
person1.age = 18;
person1.name = "小黃";

System.Console.WriteLine(person1.height);
System.Console.WriteLine(person1.age);
System.Console.WriteLine(person1.name);
```

Visual Studio頁面截圖42
![螢幕擷取畫面 2024-04-30 134501](https://hackmd.io/_uploads/HJhrLZC-A.png)

Visual Studio輸出截圖42
![螢幕擷取畫面 2024-04-30 134512](https://hackmd.io/_uploads/H1KUUbAWR.png)

## 15.namespace、using

:::success
* namespace可將模板做分類跟管理。
* using可在一個C#專案內要求程式使用指定namespace的模板。
:::

### a.namespace

* 專案Person.cs

```csharp!
namespace Characters
{
    class Person
    {
        public double height;
        public int age;
        public string name;
    }
}
```

Visual Studio類別專案頁面截圖2
![螢幕擷取畫面 2024-04-30 200046](https://hackmd.io/_uploads/S1hY6IA-C.png)

### b.using

* 專案Program.cs

```csharp=
using Characters;

Person person1 = new Person();

person1.height = 158.9;
person1.age = 18;
person1.name = "小黃";

System.Console.WriteLine(person1.height);
System.Console.WriteLine(person1.age);
System.Console.WriteLine(person1.name);
```

Visual Studio頁面截圖43
![螢幕擷取畫面 2024-04-30 200225](https://hackmd.io/_uploads/B1gq-0LAWC.png)

Visual Studio輸出截圖43
![螢幕擷取畫面 2024-04-30 200255](https://hackmd.io/_uploads/SJ5bAIAb0.png)

:::warning
* System是C#中內建的namespace，而Console為其中的class，因此在專案中使用using System;，即可不用在Console前加上System了!

```csharp=
using Characters;
using System;

Person person1 = new Person();

person1.height = 158.9;
person1.age = 18;
person1.name = "小黃";

Console.WriteLine(person1.height);
Console.WriteLine(person1.age);
Console.WriteLine(person1.name);
```

Visual Studio頁面截圖44
![螢幕擷取畫面 2024-04-30 201114](https://hackmd.io/_uploads/HJWGgP0WC.png)

Visual Studio輸出截圖44
![螢幕擷取畫面 2024-04-30 201124](https://hackmd.io/_uploads/B1bMgvAW0.png)

:::

## 16.method 方法

:::success
* method方法，就是可以讓我們在class中定義一些功能來使用。
:::

* 專案class1.cs
```csharp=
using System;
namespace ConsoleApp14
{
    class Person
    {
        public double height;
        public int age;
        public string name;

        public void SayHi()
        {
            Console.WriteLine("你好阿，我叫" + name);
        }

        public bool IsAdult()
        {
            if (age >= 18)
            {
                return(true);
            }
            else 
            {
                return (false);
            }
        }
    }
}
```
Visual Studio類別專案頁面截圖3
![螢幕擷取畫面 2024-04-30 220830](https://hackmd.io/_uploads/HkcKoOAZC.png)
:::danger
* void表示後面的方法不會有回傳值。
:::

* 專案Program.cs
```csharp=
using ConsoleApp14;

Person person1 = new Person();

person1.height = 158.9;
person1.age = 18;
person1.name = "小黃";
person1.SayHi();
person1.IsAdult();

System.Console.WriteLine(person1.IsAdult());
```

Visual Studio頁面截圖45
![螢幕擷取畫面 2024-04-30 220838](https://hackmd.io/_uploads/S1kij_0WC.png)

Visual Studio輸出截圖45
![螢幕擷取畫面 2024-04-30 220848](https://hackmd.io/_uploads/B1kij_0bR.png)


:::danger
* return會回傳資料到呼叫端。
:::

## 17.Main 方法

:::success
* main方法可以幫助C#知道程式是由何處開始執行的，一般情況下C#會自動幫我們把程式處理好。
:::

```csharp=
class Program 
{
    static void Main()
    {
        System.Console.WriteLine("Hello, World!");
    }
}
```

Visual Studio頁面截圖46
![螢幕擷取畫面 2024-04-30 223516](https://hackmd.io/_uploads/SkjpZtCWA.png)

Visual Studio輸出截圖46
![螢幕擷取畫面 2024-04-30 223525](https://hackmd.io/_uploads/S1ip-tA-R.png)


:::warning
* static是屬於class本身的屬性，而非物件的屬性。
:::

## 18.constructor 建構方法

:::success
* constructor 建構方法，當我們每創建一次物件就會被回傳，他可以幫助我們創建重複類型的物件時，幫助設定需要被重複設定的屬性。
:::

### a.創建成功時執行建構方法

* 專案class1.cs
```csharp=
using System;
namespace Characters
{
    class Person
    {
        public double height;
        public int age;
        public string name;

        public Person(string particle)
        {
            Console.WriteLine("創建成功" + particle);
        }
    }
}
```

Visual Studio類別專案頁面截圖4
![螢幕擷取畫面 2024-04-30 230908](https://hackmd.io/_uploads/SyJpKtRWC.png)


* 專案Program.cs
```csharp=
using Characters;

Person person1 = new Person("第一次，真棒!");

person1.height = 158.9;
person1.age = 18;
person1.name = "小黃";


Person person2 = new Person("第二次，真好!");

person1.height = 185.6;
person1.age = 16;
person1.name = "小緯";
```

Visual Studio頁面截圖47
![螢幕擷取畫面 2024-04-30 231207](https://hackmd.io/_uploads/S1pD9YRWA.png)


Visual Studio輸出截圖47
![螢幕擷取畫面 2024-04-30 231215](https://hackmd.io/_uploads/ryPu5FR-R.png)

### b.簡化需重複設定的屬性

* 專案class1.cs
```csharp=
using System;
namespace Characters
{
    class Person
    {
        public double height;
        public int age;
        public string name;

        public Person(double height, int age, string name)
        {
            this.height = height;
            this.age = age;
            this.name = name;
        }
    }
}
```

Visual Studio類別專案頁面截圖5
![螢幕擷取畫面 2024-04-30 232208](https://hackmd.io/_uploads/rJiQpKAWC.png)


* 專案Program.cs
```csharp!
using Characters;

Person person1 = new Person(158.9, 18, "小黃");
Person person2 = new Person(185.6, 16, "小緯");

System.Console.WriteLine(person1.height);
System.Console.WriteLine(person1.age);
System.Console.WriteLine(person1.name);
System.Console.WriteLine(person2.height);
System.Console.WriteLine(person2.age);
System.Console.WriteLine(person2.name);
```

Visual Studio頁面截圖48
![螢幕擷取畫面 2024-04-30 232216](https://hackmd.io/_uploads/Hyur6FRbC.png)

Visual Studio輸出截圖48
![螢幕擷取畫面 2024-04-30 232224](https://hackmd.io/_uploads/rkGL6FAZR.png)

## 19.getter、setter

* 專案class1.cs
```csharp=
using System;
namespace ConsoleApp17
{
    class Video
    {
        public string title;
        public string auther;
        //影片類型只有四種:教育，娛樂，音樂，其他
        private string type;

        public Video(string title, string auther, string type)
        {
            this.title = title;
            this.auther = auther;
            Type = type;
        }
        public string Type
        {
            get { return type; }
            set {
                if ( value == "教育" || value == "娛樂" || value == "音樂" || value == "其他") 
                {
                    type = value;
                }
                else 
                {
                    type = "其他";
                }
            }
        }

    }
}
```

Visual Studio類別專案頁面截圖6
![螢幕擷取畫面 2024-05-01 220142](https://hackmd.io/_uploads/B1NtiaJMA.png)


* 專案Program.cs
```csharp=
using ConsoleApp17;
using System;

Video video1 = new Video("第一集", "小黃", "教育");
Video video2 = new Video("第二集", "小緯", "搞笑");

Console.WriteLine(video1.Type);
Console.WriteLine(video2.Type);
```

:::warning
* private表示限制屬性只能在class內存取存取。
    * 大寫變數Type是小寫type的對外代理人，因為private限制了對type的存取，因此你只能取得大寫Type。
        * 當你試圖取得大寫Type，執行期大括號內的程式碼
* get可幫助存取回傳值。
* set可幫我們在判斷後重新設置小寫type的值
* value為我們原先設置在小寫type的值
:::

Visual Studio頁面截圖49
![螢幕擷取畫面 2024-05-01 220153](https://hackmd.io/_uploads/rJl5jakGC.png)

Visual Studio輸出截圖49
![螢幕擷取畫面 2024-05-01 220215](https://hackmd.io/_uploads/Bkgco61GA.png)

## 20.static attribute 靜態屬性

### a.創建class的屬性

* 專案class1.cs
```csharp=
using System;
namespace ConsoleApp18
{
    class Video
    {
        public string title;
        public string auther;
        public string type;
        public static int video_count = 0;

        public Video(string title, string auther, string type)
        {
            this.title = title;
            this.auther = auther;
            this.type = type;

            video_count++;
        }

    }
}
```

Visual Studio類別專案頁面截圖7
![螢幕擷取畫面 2024-05-01 222720](https://hackmd.io/_uploads/ByN_ZR1f0.png)


* 專案Program.cs
```csharp=
using ConsoleApp18;
using System;

Console.WriteLine(Video.video_count);
Video video1 = new Video("第一集", "小黃", "教育");
Console.WriteLine(Video.video_count);
Video video2 = new Video("第二集", "小緯", "娛樂");
Console.WriteLine(Video.video_count);
```

Visual Studio頁面截圖50
![螢幕擷取畫面 2024-05-01 222729](https://hackmd.io/_uploads/rkW9b0yf0.png)

Visual Studio輸出截圖50
![螢幕擷取畫面 2024-05-01 222737](https://hackmd.io/_uploads/BJW9bRkG0.png)

### b.透過物件屬性輸出static

* 專案class1.cs
```csharp=
using System;
namespace ConsoleApp18
{
    class Video
    {
        public string title;
        public string auther;
        public string type;
        public static int video_count = 0;

        public Video(string title, string auther, string type)
        {
            this.title = title;
            this.auther = auther;
            this.type = type;

            video_count++;
        }

        public int getVideoCount()
        { 
            return video_count;
        }
    }
}
```

Visual Studio類別專案頁面截圖8
![螢幕擷取畫面 2024-05-01 224320](https://hackmd.io/_uploads/rkyKBRkfR.png)

* 專案Program.cs
```csharp=
using ConsoleApp18;
using System;

Video video1 = new Video("第一集", "小黃", "教育");
Console.WriteLine(video1.getVideoCount());
Video video2 = new Video("第二集", "小緯", "娛樂");
Console.WriteLine(video1.getVideoCount());
```

Visual Studio頁面截圖51
![螢幕擷取畫面 2024-05-01 224331](https://hackmd.io/_uploads/H1X6SR1GA.png)

Visual Studio輸出截圖51
![螢幕擷取畫面 2024-05-01 224340](https://hackmd.io/_uploads/BJaTHRyM0.png)

## 21.static method 靜態方法 & static class 靜態類別

### a.設置一個static method

:::success
* static method就像是一個工具包，不需要創建物件就可以直接執行。
:::

* 專案Tool.cs
```csharp=
using System;

namespace ConsoleApp19
{
    class Tool
    {
        public static void SayHi()
        {
            Console.WriteLine("Hellow!");
        }
    }
}
```

Visual Studio類別專案頁面截圖9
![螢幕擷取畫面 2024-05-01 231555](https://hackmd.io/_uploads/Bkk03AJzR.png)


* 專案Program.cs
```csharp=
using System;
using ConsoleApp19;


Tool.SayHi();
```

Visual Studio頁面截圖52
![螢幕擷取畫面 2024-05-01 231601](https://hackmd.io/_uploads/r1sbpRkGR.png)

Visual Studio輸出截圖52
![螢幕擷取畫面 2024-05-01 231638](https://hackmd.io/_uploads/SyPf6RkMA.png)


### b.設置一個static class

:::success
* 因為static method不需要創建物件就可以直接執行，因此可以將它的類別設為靜態，因為它不需要被用於創造物件。
    * 當一個類別為static class表示它不需要用於創建物件。
:::

* 專案Tool.cs
```csharp=
using System;

namespace ConsoleApp19
{
    static class Tool
    {
        public static void SayHi()
        {
            Console.WriteLine("Hellow!");
        }
    }
}
```
Visual Studio類別專案頁面截圖10
![螢幕擷取畫面 2024-05-01 232005](https://hackmd.io/_uploads/rJ23a0Jz0.png)

:::danger
* 此時若在專案Program.cs專案中寫Tool tool = new Tool();就會發生錯誤。
:::

## 22.inheritance 繼承 

:::success
* 當兩個class的需創建的屬性大部分重疊時，可以使用inheritance來讓較細之項目與主項目重疊部分簡化。
    * 用法是在較細之項目後面加上冒號:，接著打出要繼承的主項目名稱。
:::

* 專案Person.cs
```csharp=
using System;

namespace ConsoleApp20
{
    class Person
    {
        public string name;
        public int age;

        public void PrintName()
        {
            Console.WriteLine(this.name);
        }
        public void PrintAge()
        {
            Console.WriteLine(this.age);
        }
    }
}
```

Visual Studio類別專案頁面截圖10
![螢幕擷取畫面 2024-05-02 211920](https://hackmd.io/_uploads/rJ4-7G-GA.png)


* 專案Student.cs
```csharp=
using System;

namespace ConsoleApp20
{
    class Student:Person
    {
        public string school;

        public Student(string name, int age, string school) 
        {
            this.name = name;
            this.age = age;
            this.school = school;
        }

        public void PrintSchool()
        { 
            Console.WriteLine(school);
        }
    }
}

```

Visual Studio類別專案頁面截圖11
![螢幕擷取畫面 2024-05-02 211933](https://hackmd.io/_uploads/S1KzXMbfA.png)


* 專案Program.cs
```csharp=
using System;
using ConsoleApp20;

Student student1 = new Student("小黃", 18, "北門高中");
Console.WriteLine(student1.name);
Console.WriteLine(student1.age);
Console.WriteLine(student1.school);

student1.PrintName();
student1.PrintAge();
student1.PrintSchool();
```

Visual Studio頁面截圖53
![螢幕擷取畫面 2024-05-02 211940](https://hackmd.io/_uploads/BycEXzWMC.png)

Visual Studio輸出截圖53
![螢幕擷取畫面 2024-05-02 212118](https://hackmd.io/_uploads/ByiD7M-MR.png)

