# 第一周【程式課程】第一章 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#的程式碼上色