前言:
雖然前面幾天有提到了關於變數命名相關的注意事項,但在開始前可以再好好的講述一下關於變數命名的部分。
畢竟變數命名是讓程式碼增加我們可以看得懂才好維護的首要的部分,不能重複就不多說了。
下面是一些在變數命名時需要注意的事項:
描述性名稱:變數名稱應該具有描述性,能夠清晰地表達該變數的用途。避免使用過於太簡單什麼abc之類的或一看就滿頭問號還要去找甚麼意思的名稱。例如,使用 age
而不是 a
來表示年齡。
遵循命名慣例:遵循通用的命名慣例,例如使用駝峰式命名法(CamelCase)或蛇形命名法(snake_case)來命名變數。因為是通用的,所以多數開發人員一看就知道,一個名稱還要花很多時間去猜這甚麼意思的就別這樣命名了。例如,firstName
或 first_name
。
避免保留字:不要使用程式語言的保留字或關鍵字來命名變數,因為編譯器會跟你說你的變數名稱用到關鍵字了。可以參考官方文件https://learn.microsoft.com/zh-tw/dotnet/csharp/language-reference/keywords/
避免使用縮寫:盡量避免使用過多的縮寫,除非縮寫是廣泛接受且容易理解。再用這個舉一次例子使用 age 而不是 a,不然開發看到 a 會滿頭問號的( 哪個混蛋命名的?? a 是啥意思????)。
不要使用特殊字符:變數名稱通常應該只包含字母、數字和底線(_),不應包含特殊字符或空格。
大小寫敏感:大多數程式語言是大小寫敏感的,因此變數名稱的大小寫必須精確匹配。例如,myVariable
和 myvariable
是不同的變數。
意義清晰:變數名稱應該是根據內容或用途來去命名的,讓其他開發者容易理解。
不好的變數命名:
int x = 10; // 這個變數名稱不清楚它的用途
string s = "Hello"; // 變數名稱 "s" 不表達任何信息
double d = 3.14; // "d" 不告訴我們這是什麼類型的數據
好的變數命名**:**
int age = 30; // "age" 讓人知道這是一個年齡的變數
string greeting = "Hello"; // "greeting" 表示這是一個問候語
double pi = 3.14; // "pi" 提示我們這是圓周率
總之,好的變數命名是好看 好理解 好維護的關鍵。如果可以盡量照著上面這些原則,可以加快我們寫程式的速度,也使我們的程式碼比較乾淨簡潔,容易懂。
好了~上面的提醒注意事項結束,開始進入正文。
字串跟數字都結束後,就要開始進階啦~
先來解釋Day 3 的流程控制部分(條件判斷式)
允許我們根據不同的條件執行不同的程式碼路徑。在C#中,我們經常使用if-else語句來實現這種控制流程。
像是下面這樣,使用if判斷式做出判斷
int num1 = 10;
int num2 = 20;
int maxValue;
//宣告變數時不一定要給予值,這邊告知maxValue這個是整數
//在這裡先宣告,下面其他地方就可以使用
if (num1 > num2)
{
maxValue = num1;
}
else
{
maxValue = num2;
}
Console.WriteLine(maxValue);
但是,如果我們想要更簡潔的方式來實現相同的功能,可以使用C#中的三元運算子(Ternary Operator),它的語法如下:
int num1 = 10;
int num2 = 20;
int maxValue = num1 > num2 ? num1 : num2;
//請問num1有大於num2嗎? 有的話就等於1 沒有就等於2
//三元運算式 (A ? B : C)
Console.WriteLine(maxValue);
在這個例子中,我們使用三元運算子來比較 num1 和 num2 的值,如果**num1
大於num2
,則maxValue
等於num1
,否則等於num2
**。這個語法更簡潔且易於閱讀。
另外,如果我們想要更進一步簡化,也可以使用**Math.Max
**方法,如下所示:
int num1 = 10;
int num2 = 20;
int maxValue = Math.Max(num1, num2);
Console.WriteLine(maxValue);
**Math.Max
**方法會比較兩個數值並返回其中較大的那個,這樣我們就不用手動寫if-else語句或三元運算子。
當我們需要在程式中根據一個條件選擇不同的操作時,C#提供了一個非常簡潔的方式來實現這一目標,稱為「三元運算式」。這種運算式的形式如下:
condition ? expression1 : expression2
其中,condition 是一個布林表達式,expression1 和 expression2 是運算式,用來決定要回傳的值。
如果 condition 的值為 true,則回傳前面 expression1 的結果;
如果 condition 的值為 false,則回傳冒號後面 expression2 的結果。
提醒!!!!如果把條件判斷寫成一行,會變得難以閱讀那就不要這樣做,要讓其他人是好閱讀的才是好的程式碼喔!!
這裡舉個例子應該能更好理解上面在講甚麼
int score = 59;
string result = score >= 60 ? "及格" : "不及格";
string message = "您的考試成績是: " + score + "\n您的成績是: " + result;
Console.WriteLine(message);
先檢查 score 有沒有大於或等於 60 ,如果有,就把 result 設為"及格",不然分數不到60的就是"不及格",然後建立訊息,把score 分數跟 result 結果放進去,輸出產生判斷後的訊息。
假設你正在跟小朋友玩一個遊戲,遊戲規則是根據他們的表現給予不同的獎勵。
這裡有一個簡單的例子:
bool goodBehavior = true; // 表現好
int score = 8; // 分數
string reward = ""; // 初始化獎勵
if (goodBehavior)
{
if (score >= 5)
{
reward = "小禮物"; // 表現好且得分大於等於 5,獲得小禮物
}
else
{
reward = "稱讚"; // 表現好但得分不足 5,獲得稱讚
}
}
else
{
reward = "反省時間"; // 表現不好,需要反省時間
}
Console.WriteLine("你的獎勵是: " + reward);
在這個遊戲中,小朋友要根據他們的表現和得分來獲得獎勵。
如果他們表現良好且得分大於等於 5,他們將獲得一個小禮物;
如果他們表現好但得分不足 5,他們將獲得稱讚;
如果他們表現不好,則需要反省時間。
改成運用三元方程式
bool goodBehavior = true; // 表現好
int score = 8; // 分數
string reward = score >= 5 ? "小禮物" : "稱讚"; // 使用三元運算式
reward = goodBehavior ? reward : "反省時間"; // 再次使用三元運算式
Console.WriteLine("你的獎勵是: " + reward);
如果我想要改成 score 是可以手動輸入分數的話呢?
Console.WriteLine("請輸入你的分數");
bool goodBehavior = true; // 表現好
string input = Console.ReadLine();
int score = int.Parse(input); // 分數
string reward = score >= 5 ? "小禮物" : "稱讚"; // 使用三元運算式
reward = goodBehavior ? reward : "反省時間"; // 再次使用三元運算式
Console.WriteLine("你的獎勵是: " + reward);
上面看到了.Parse,當你從外部來源(例如使用者的輸入或檔案讀取)獲得資料時,通常以字串的形式提供。
所以就需要使用相應資料型別的 .Parse 方法來將字串轉換為該資料型別(像是上面就轉換成整數),以便在程式中進一步處理。
以下是兩個常見的 .Parse 方法的例子:
int.Parse
:這個方法可以把字串轉換成整數(int)資料型別。例如:string numberString = "42";
int number = int.Parse(numberString); // 將字串 "42" 轉換為整數 42
bool.Parse
:這個方法用於將字串轉換成布林值( bool)資料型別。通常,它將字串解析為布林值 true 或 false。例如:string boolString = "true";
bool isTrue = bool.Parse(boolString); // 將字串 "true" 轉換為布林值 true
使用 .Parse 方法時,要確保字串的內容可以成功轉換為目標資料型別,否則可能會引發例外情況。如果字串無法成功轉換,則會引發 FormatException 或相應的例外情況。
換個方式解釋,使用 .Parse 方法就像是在教電腦一個魔術,如果你給它的東西不對,它就無法完成魔術,並告訴你它需要一個正確的魔法道具。要確保給電腦的東西是對的,否則它會發脾氣。
還有另一個**TryParse
** 方法可以把字串轉換成其他資料型態。
相較於.Parse的方法來說,使用 TryParse 是一個安全的轉換方法,它把字串轉換為目標資料類型,如果成功,則返回 true ,並將轉換後的值存儲在指定的變數中。
如果轉換失敗,則返回 false ,並且不像.Parse的方法,這個轉換失敗也不會引發異常。
string numberStr = "123";
int result;
bool success = int.TryParse(numberStr, out result);
if (success)
{
Console.WriteLine("轉換成功,結果是:" + result);
}
else
{
Console.WriteLine("轉換失敗,無效的數字格式");
}
在這個例子中,int.TryParse
嘗試將字串 "123" 轉換為整數,並將結果存儲在 result 變數中。
如果轉換成功, success 將為 true ,否則為 false 。
所以,如果你不確定字串是否能成功轉換,建議使用 TryParse 。如果你確定字串格式正確,可以使用 Parse 。
大致上可以將運算符分為四大類:算術運算符、比較運算符、賦值運算符和邏輯運算符。
(剛開始學的時候知道運算符怎麼用就好~不用太琢磨分成什麼類別。)
算術運算符 是我們在數學中熟悉的運算符號,也就是基本的加減乘除,還有取餘數也是。除此以外,我們還可以使用自增(++)和自減(--)運算符來對變數進行增加或減少操作,這兩個又是甚麼呢?
下面舉兩個例子來解釋。
int count = 5;
count++; // 自增操作,等同於 count = count + 1;
Console.WriteLine(count); // 這會輸出 6
int apples = 10;
apples--; // 自減操作,等同於 apples = apples - 1;
Console.WriteLine(apples); // 這會輸出 9
關於++,還有分前++跟後++(剛學的時候越看越頭痛,不過就是+1嘛~為什麼也搞得太複雜了吧??)
下面來分別描述,雖然這兩個結果看起來是相同的,但在運算的過程其實是不一樣的。
前置遞增(++A): 在表達式中,如果我們使用前置遞增,首先會將變數增加 1,然後返回增加後的值。讓我們看一個例子:
int A = 2;
int B = ++A; // B = 3, A = 3
//我們將 A 的值增加 1,然後將增加後的值賦給 B,所以 B 的值為 3,A 的值也為 3。
後置遞增(A++): 在表達式中,如果我們使用後置遞增,首先會返回原始值,然後才將變數增加 1。讓我們看一個例子:
int A = 2;
int B = A++; // B = 2, A = 3
//我們先將 A 的原始值(2)賦給 B,然後再將 A 的值增加 1,所以 B 的值為 2,A 的值為 3。
還是沒很理解的話,再換另一個方式去解釋
比較運算符 就跟字詞上的意思一樣是用來比較值的大小。
可以使用等號運算符(==)來檢查兩個值是否相等。
使用不等運算符(!=)來檢查它們是否不相等。
使用大於(>)、大於等於(≥)、小於(<)和小於等於(≤)等運算符來執行比較操作。
賦值運算符 用於將值分配給變數。
最常見的賦值運算符是等號(=),它將右側的值賦給左側的變數。
還有複合賦值運算符,如加法賦值(+=)、減法賦值(-=)、乘法賦值(*=)和除法賦值(/=),它們可以簡化賦值操作。
int num = 20;
num -= 7; // 從 num 中減去 7,相當於 num = num - 7;
Console.WriteLine(num); // 輸出 13
int num = 6;
num *= 4; // 將 num 乘以 4,相當於 num = num * 4;
Console.WriteLine(num); // 輸出 24
自增(++)和 += 1 之間的差異。
自增運算符(++)只對變數的值增加 1,而 += 則是一個賦值運算符,可以用來對變數增加任意數量的值。
例如:
int num = 7;
num++; // 自增 1,num 變成 8
num += 5; // 增加 5,num 變成 13
Console.WriteLine(num); // 這會輸出 13
自增(++)專注於增加 1,而 += 允許我們增加任何數字。
邏輯運算符 顧名思義就是用在執行邏輯操作,例如在條件語句中使用它們來控制程式流程。(看完還是一知半解)
我們可以使用邏輯與(&&)和邏輯或(||)來組合多個條件,還可以使用邏輯非(!)來反轉條件的真假。
&& 表示"與"也就是(AND),只在所有條件都為 true 時返回 true ,否則返回 false(好饒舌,請看下圖範例) 。
“ || ” 這個pipe 打兩個就是"或"的意思,它只要任何一個條件為 true,就返回 true,只有在所有條件都為 false 時才返回 false(繼續參考下圖範例)。
前面有講到變數,如果命名一樣下面是可以更改裡面的值,但是當我們在程式中使用 const 關鍵字時,就是正在創建一個常數而不是變數。
常數是一個固定的值,在程式運行期間無法更改其值的變數,通常用在程式中不應該更改的常數,如數學常數、設定值等(就像圓周率就是固定的,不是我們自己改就會變更的)。
//這裡設定const是設定常數的意思,而且常數不能更改,如果設定是變數,如果命名一樣下面是可以更改的
//最初設定常數,如果中途想更改那編譯就會失敗。
const double Pi = 3.14159;
// 常數的值無法更改
// Pi = 3.14; // 這行將引發編譯錯誤
Console.WriteLine("圓周率 Pi 的值是: " + Pi);
可以看到如果後面在想修改常數會有編譯錯誤。
當我們需要判斷字串的長度時,通常是因為我們希望確保字串的長度滿足特定的要求,例如檢查密碼是否足夠強大(不要在設定12345了...)或驗證輸入的手機號碼是否正確(只輸入0800是不會通過的!!)。
想要知道字串有多長可以使用 .Length
屬性,這個長度是以字元為單位計算的。
下面簡單的範例,可以如何知道使用 .Length 屬性來判斷一個字串的長度是否大於10:
string phoneNumber = "1234567890";
bool isPhoneNumberValid = phoneNumber.Length == 10;
在這個例子中,我們將 phoneNumber 這個字串的長度與10進行比較,確保它是一個合法的手機號碼。
如果長度正好是10,isPhoneNumberValid 將設置為 true ,否則將設置為 false 。
需要注意的是,使用.Length 屬性即使字串中包含不同字元(例如中文字元和英文字元),每個字元都算1個。
所以不管字串裡面是中文還是英文,一個字的長度都被視為1。
///<summarty>
///取得使用者姓名,且不能超過10個字
Console.WriteLine("請輸入姓名: ");
string name = Console.ReadLine();
if(name.Length > 10 ){
Console.WriteLine("名字不能超過10個字");
//if裡面寫的是判斷式是否正確,如果正確就會執行,不正確就會執行else
}
else{
Console.WriteLine("Hi, "+ name);
}
使用 if / else 條件語句時,通常有兩種方式來定義其程式碼塊。
除了上面使用大括號的方法,把多行程式碼包裝在 if / else 中,這是較佳的寫法,因為它確保程式碼的可讀性和一致性。
下面原本是使用大括號的範例:
int score = 8;
if (score < 10)
{
Console.WriteLine("A");
}
else
{
Console.WriteLine("B");
}
這種方式更容易閱讀,也有助於避免可能的錯誤。
但是,如果程式碼只有一行而已,也可以在 if / else 中只包含一行程式碼,不用使用大括號。
這樣做通常稱為“單行if語句”,但它可能會降低程式碼的可讀性,特別是當你需要添加更多邏輯時。
以下是一個使用單行if語句的範例:
int score = 8;
if (score < 10) Console.WriteLine("A");
else Console.WriteLine("B");
可以看到下圖雖然沒有大括號,但程式碼一樣可以運作且判斷的喔!
艱難的完成第四天的發文(也才第四天...),被如果怎樣...就怎樣...搞到自己暈頭轉向的。