---
# System prepended metadata

title: 第一周【程式課程】第一章 HelloWorld 筆記
tags: [程式課程]

---

# 第一周【程式課程】第一章 HelloWorld 筆記
###### tags: `程式課程`

講者：錢鼠Coinmouse
## Hello world
```cs
using System; // 引用相關命名空間的程式碼

class Program{
    static void Main(string[] args){ // 程式進入點
        Console.WriteLine("Hello World!"); // 資料輸出
    }
}
```
## 變數(Variable)與宣告(Declare)
* int、string 這類詞彙為資料類型，又為程式碼內建的關鍵字
```cs
// 這是一個整數(integer)
int number1; // 不指派初始值時，預設為o
int number2 = 13; // 宣告同時指派初始值

// 這是一個字串
string text = "hello"; // 字串必須用兩個雙引號標記
// 浮點數若有小數點則必須加上f字尾，不然會被表示成雙浮點數(Double)
float value = 2.5f;

// 布林值(true 或 false)
bool youAreSmart = true;
```
變數的限制
* 同一個區域內不能宣告已存在的變數名稱
* 可以使用特殊字元("_","@")為開頭
* 程式碼內建的關鍵字不能為變數名稱
* 不能以數字為開頭

```cs
//同名稱錯誤
int number = 1;
int number = 2; // 不合法
int Number = 3; // 合法

// 關鍵字不可作為名稱
string string = "It is impossible!"; // 不合法
string @string = "It is possible!"; // 合法

// 數字開頭錯誤
float 8Plus9 = 17f;// 不合法
float _8Plus9 = 17f;// 合法
```

命名原則
1. 大駝峰命名法(Upper Camel Case)
`int GoodGame;`
2. 小駝峰命名法(Lower Camel Case)
`int goodGame;`
3. 具有意義的變數名稱，盡量以英文表達
4. 可以用特殊字元，但在特定規範下才這樣用

變數類型
* int
    * `int hp = 100`
    * 沒有小數點
    * 可以負號
* float
    * `float hp = 45.9f`
    * 有小數點
    * 有誤差問題，需要精確的運算盡量不要用
* double
    * 比 float 範圍大，也更精確，但記憶體也吃的比較多
* char
    * 只能儲存單一字元
* string
    * 能存多字元，基本單位為 char
    * 加法可以把字串串起來
* uint
* byte
* short
* ushort
* long
* ...etc.

轉型(Casting)

```cs
int hp = 100;
float atk = 5.5f; 
hp = hp - (int)atk; // 將 atk 轉成整數後計算
```
* 值域大轉小會造成溢位(Overflow)
* 轉型可能使值發生變化

## 運算子
```cs
int x = 1;
int y = 2;
int length = x * x + y * y; // length 為5
bool isGreater = x > y //為 false

float div = 1.5f/0 //會報錯
```

```cs
int a = 1;
int b = 2;
int c = 3;

int n = (a + b) * c; // 括號優先計算，再來先乘除後加減
```

```cs
n = n % 2 // n 除以 2
n++; // n = n + 1，為一種語法糖
n--; // n = n - 1
n += 2 // n = n + 2
```
```cs
int bp =1;
int atk = 2;
int def = 3;
int dodge = 1;
bool isBlock = def > atk; //結果為true
bool isDead = hp <= 0; //結果為false
bool isAlive = !isDead; // 驚嘆號表示相反結果,所以是true
bool isDodge = dodge > atk;

//如果沒格檔且沒避.則造成傷害
bool hasDamage = !isBlock && !isDodge;
hasDamage = ! (isBlock || isDodge) ; /格檔或避都沒有成功,則結果同上
```
每個位元可以當作單獨的布林值(Boolean)看待:

```cs
int n = 3&5; //00000011
             //00000101
             //00000001 結果為1
             
int m= 3 | 5;//00000011
             //00000101
             //00000111 結果為7

int 1 = 1 << 2; //00000001 向左位移2個位元
                //00000100結果是4
```

## 判斷式
字串最常用的運算子就是加法:
```cs
string firstName = "John"
string lastName = "Wick"
string nickName = "Killer"
string fullName = firstName + lastName; John Wick
bool isEqual = fullName =二 nickName; 結果為false
```
* 字串沒有乘法除法運算
* 字串的的比對大於、小於)是逐字判斷的,通常情況還是使用數字類變數來比較

基本的判斷式(`if`)寫法:
```cs
/如果HP小於等於.表示玩家死亡,顯示Log
if (hp <= 이)(
Console. WriteLine ("You Died") ;
//也可以使用帶入boo1變數的方式,與上面遇輯一致
bool isDead = hp <= O;
if (isDead)(
Console.WriteLine ("You Died") ;
```
多重判斷式寫法:
```cs
//升級!!!
if (job == 1)( //職業代號1
    atk += 1; //攻擊成長1
) else if (job == 2) ( //職業代號2
    def += 1; //防禦成長2
) else (
// do something finally ...
```
* `if`作為開頭,中間可以有數個`elseif`
* `else`可以省略,後面不可以再接任何判斷式

區塊(Block)
```cs
int hp = 100;
int atk = 10;
int def = 5;
//大括號內的範圍稱之為區塊(block)
if (atk - def > 0){
    int damage = atk - def;
    hp -= damage;
}
Console.WriteLine (damage) ;
//不合法由於damage在if的區塊內被宣告·編譯無法在外部找到該數
```
```cs
三元條件運算子:
//腐朽狀態
bool isDecay = true;

//如果是腐朽狀態,治療會變成傷害
hp += isDecay ? -heal : heal; //可讀性差，不推薦用

//等同下列判斷式
if (isDecay) {
    hp -= heal;
} else {
    hp += heal;
}
```
## 函式
```cs
範例:
int Attack(int hp, int damage){
if (damage <= 0) {
    return hp;
}
    hp -= damage;
    return hp;
}
//秀出結果"Hp:90"
static void Main(string[] args){
    Console.writeLine("Hp:" + Attack(100, 10));
} 
```
* `Main`是整個程式的進入點,也同時是函式的名稱
* `string[] args`是開啟程式時所需要的參數·可以透過指令的方式注入
* `void`是`Main`這個函式的回傳值
* `static` 這是一個關鍵詞,示他的記憶體是靜態的(不會重新分配給其他的變數)一般的變數都會在被宣告的區塊結束後被清除，但static的方法和變數不會

## 註解
```cs
// 單行註解

/*
多行
註解
*/
```
## 額外補充：測試環境選擇
* [C# and .Net in Visual Studio Code ( vscode ) | Set up and Installation Guide | 2022 | IAmUmair
](https://www.youtube.com/watch?v=GVmtPO-UEps)
* [GDB online Debugger](https://www.onlinegdb.com/)

## 額外補充：format 顯示趴數的寫法 by Bogay
format 的部份，如果要顯示趴數可以不用那樣寫（{(critRate * 100).ToString().Substring(0, 2)}%），C# 的 string interpolation 可以指定 format，用 {critRate:P} 應該就可
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated
https://learn.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings#PFormatString
根據 MS 官方文件的說明，string interpolation 中的 interpolation expression 格式長這樣：{<interpolationExpression>[,<alignment>][:<formatString>]}。
可以看到他有兩個可選的部分 `alignment` 和 `formatString`，分別是可以讓我們控制轉成字串後的寬度，還有該如何把前面的 expression 轉成字串。
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated#structure-of-an-interpolated-string

那麼 `formatString` 的內容到底可以怎麼填呢？他被寫在這邊，根據官方說法總共有三種情境。
https://learn.microsoft.com/en-us/dotnet/standard/base-types/composite-formatting#format-string-component
- A standard or custom numeric format string if the corresponding object is a numeric value.
- A standard or custom date and time format string if the corresponding object is a DateTime object.
- An enumeration format string if the corresponding object is an enumeration value.

因為在小試身手的練習中我們是要針對數值做格式化，所以就跟著下面連結看看 C# 中內建哪些 numeric format string。
然後就可以看到 percent format specifier (P) 剛好符合這邊的需求，得出 formatString 內容應該要填上 P 的結論。
https://learn.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings

## 程式顏色渲染(大部分 md 都適用)
```cs
int Attack(int hp, int damage){
if (damage <= 0) {
    return hp;
}
               
程式內容...
```
可以產生對應區塊跟C#的程式碼上色
