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