iT邦幫忙

2023 iThome 鐵人賽

DAY 3
1
自我挑戰組

30天開啟.NET後端工程師的旅程系列 第 3

Day3 資料型態 - 字串串呀串

  • 分享至 

  • xImage
  •  

前言

如果Day2 的3個問題有試試看,那這裡附上解答

  • 如果一個整數超過了 int 資料型別的範圍,會發生什麼?
    當一個整數的值超出了 int 資料型別的範圍時,會發生整數溢位(Integer Overflow)。Day 2 提到int 整數型別的範圍大約是正負21億之間,超出這個範圍的數值將無法正確表示,因此會導致整數溢位,結果可能不會如預期。

所以在處理大數值時,要特別注意(不然想像一下,銀行的戶頭超過21億的人去看存款,一超過21億就變負的,臉應該會綠掉吧….叫你主管給我出來!!!),確保程式碼能夠處理可能的整數溢位情況,或者考慮使用更大的整數資料型別,如 long。

  • 用上面撰寫C#程式碼的方式,計算出並顯示1+2+3+...+9+10的總和?

如果你直接寫的是1+2+3+...+9+10然後在Console.WriteLine也可以。

但這裡其實可以使用梯形公式梯形公式**(首項 + 末項) * 項數量 / 2是用來計算一個等差數列的總和,它對於計算連續數字的總和是一個快速的方法,尤其是當你知道起始值和結束值時(1 + 10) * 10 / 2** ,結果是 55。

int firstTerm = 1;
int lastTerm = 10;
int numberOfTerms = 10;
int sum = (firstTerm + lastTerm) * numberOfTerms / 2;

Console.WriteLine("1+2+3+...+9+10的總和是:" + sum);

如果你想要計算 1+2+3+...+9+10 的總和,當然也可以使用迴圈來實現(但是這題裡面使用梯形公式只需要進行一次運算,而 for 迴圈需要進行10次遞增和加法操作。在這題裡面使用梯形公式的解法會比較有效率一些。)後面再來說明如何使用for迴圈,來去加減計算總和。

  • 用上面撰寫C#程式碼的方式,計算出199跟200分別是奇數或偶數。

要使用C#計算199和200分別是奇數還是偶數,你可以使用餘數運算符 % 來檢查一個數是否可以被2整除。如果一個數可以被2整除,那麼它就是偶數,否則就是奇數。以下是示範的C#程式碼:

int number1 = 199;
int number2 = 200;

bool isOdd1 = number1 % 2 != 0; // 如果餘數不等於0,就是奇數
bool isOdd2 = number2 % 2 != 0; // 如果餘數不等於0,就是奇數

Console.WriteLine($"{number1} {(isOdd1 ? "是奇數" : "是偶數")}");
Console.WriteLine($"{number2} {(isOdd2 ? "是奇數" : "是偶數")}");

這題目主要是想要讓初學者記得,可以使用 % 找餘數的方式來去分辨數字是奇數或是偶數。

上面的程式碼中,使用 % 運算符來計算number1 和 number2 是否為奇數。
然後,我們使用三元運算式,裡面條件運算符 ? 來根據結果輸出相對應的訊息。這樣,你就可以確定199是奇數,而200是偶數。

特別解釋一下Console.WriteLine($"{number1} {(isOdd1 ? "是奇數" : "是偶數")}");

  1. ${number1}${number2}:這是字串插值的部分。${} 是一種用來插入變數值到字串中的語法。在這裡, number1 和 number2 是整數變數,它們的值將被插入到相應的位置。
  2. isOdd1 和 isOdd2:這是布林變數,它們用來表示 number1 和 number2 是否是奇數。如果是奇數,則對應的布林變數值為 true ,否則為 false 。
  3. (isOdd1 ? "是奇數" : "是偶數")(isOdd2 ? "是奇數" : "是偶數"):這是條件運算符(Conditional Operator)的部分。條件運算符用來根據條件的真假返回不同的值。這裡的例子呢是拿來檢查 isOdd1 和 isOdd2 的值,如果這兩個都是 true ,就回傳 "是奇數",否則返回 "是偶數"。

看完還是不懂,專有名詞有夠多,越看越多…認真去查越查也越多...

沒關係(我剛開始也是這樣一知半解的,但請務必試著練習看看,要去思考有甚麼方式可以解題,有時候不見得只有一種解題方式,多方嘗試也可以自己比較出差異,根據不同狀況判斷怎麼使用),那後面也陸續都會解釋到~~

讓我們繼續看下去。


延續Day 2 的資料型態 - 字串 布林

字串

上一篇剛講完數字,這裡當然就是針對文字的部分來說明啦~

字串(String)是一種數據型別,用來表示一系列的文字字符。字串可以包含字母、數字、符號、空格等等,通常用在儲存和處理文本數據,例如文字訊息、文件內容、用戶輸入等等,像是要輸入名字等等的。

字串是一個內建的數據型別,通常以雙引號括住(不可以用單引號),例如:

string myString = "這是一個字串。";
string myAge = "3"; // myAge 被視為字串,而不是數字

當你將一個值放在雙引號內,即使該值具有數字外觀,C# 仍然將其視為字串(string)資料型別。這是因為雙引號(")是字串文字的標識符,用來表示文字資料。
因此,無論你的字串內容是數字還是文字,只要使用了雙引號,它就會被視為字串。

  • 宣告一個變數
string name = "Charlie";//變數用小寫開頭,不能用大寫或數字開頭
string fullName = "Charlie Puth";//若有多個意思,就第二個字首字母大寫
string greeting = "Hi " + name;

Console.WriteLine(greeting);
//下面打ReadLine();按F5之後視窗就不會自己關掉
Console.ReadLine();

https://ithelp.ithome.com.tw/upload/images/20230915/20151470V0P8UNDlyk.png

  • 增加字串變化(可以看到字串之間,如果再賦值的時候Charlie後面沒有加上一個空格,或是Puth前面沒有一個空格,就會直接連接在一起)
string firstName = "Charlie";
string lastName = "Puth";
string greeting = "Hi "+ firstName + lastName;

Console.WriteLine(greeting);
Console.ReadLine();

https://ithelp.ithome.com.tw/upload/images/20230915/20151470MjqDpKiJ3D.png

  • 字串與數字串接
string name = "Alice";
int age = 30;
string message = "我的名字是 " + name + ",年齡是 " + age + " 歲。";
Console.WriteLine(message);

https://ithelp.ithome.com.tw/upload/images/20230915/20151470Cb0GHqf720.png

  • 字串與多個數字串接

    這裡需要注意,如果希望後面的薪水先加總起來,再加上前面的字串呈現,但如果照這個寫法呈現的答案就會跟預期的不一樣。

int salary1 = 100;
int salary2 = 200;
int salary3 = 250;
string totalSalary = "你的薪水是:" + salary1 +  salary2 +  salary3;
Console.WriteLine(totalSalary );

可以看到下圖,這個薪水數字噌噌噌的往上升,收到這個的員工應該會嗨起來,但老闆可能會直接讓你出去了。
https://ithelp.ithome.com.tw/upload/images/20230915/20151470pnwc3XFp5l.png
應該改成這樣

int salary1 = 100;
int salary2 = 200;
int salary3 = 250;
string totalSalary = "你的薪水是:" +( salary1 + salary2 + salary3);
Console.WriteLine(totalSalary );

https://ithelp.ithome.com.tw/upload/images/20230915/20151470DsA7iCRPsO.png

  1. 字串值為null
    表示直接給word1賦予null值
string word1 = null;
string word2 = "Charlie";
string result = word1 + word2;
Console.WriteLine(result);

https://ithelp.ithome.com.tw/upload/images/20230915/2015147023n71jfPlb.png

  • 開始增加輸入的變化
Console.Write("請輸入您的姓名: ");
//接受輸入值
string name = Console.ReadLine();
//接收輸入訊息一行字元

string greeting = "Hi "+ name;
Console.WritLine(greeting);

Console.Read();
//讀取輸入的一個字int,寫在最後只是為了不要立刻停止,避免閱讀困難,輸入完還要可以看到

以下是每個部分的詳細解釋:

  1. Console.Write("請輸入您的姓名: ");
    • Console.Write 在控制台上輸出文字,但不換行。畫面輸出顯示提示訊息,要求使用者輸入姓名。
  2. string name = Console.ReadLine();
    • Console.ReadLine 用於從控制台讀取一行文字輸入。讓使用者輸入姓名,會把輸入的文字儲存在我們命名為 name 的字串變數中。
  3. string greeting = "Hi " + name;
    • 這行把使用者輸入的姓名與問候詞 "Hi " 串聯起來,形成一個完整的問候訊息,然後存在我們命名為 greeting 的字串變數中。
  4. Console.Read();
    • 加上最後一行 Console.Read() 只是為了等待使用者按下任意鍵,以確保程式在輸出結束後不立即結束,如果輸出完馬上就關閉會就像是拿答案在你面前晃一下這樣,不認真看答案就不見了,所以多這句只是為了讓我們有時間可以看輸出的結果是甚麼,然後在手動關閉。
      如下圖
      https://ithelp.ithome.com.tw/upload/images/20230915/20151470RU1R8BWbzP.png
      可以看到下圖的Write是不換行的,但我們使用WriteLine就會換行。
      然後在後面輸入名字之後,換行後,結合字串就會顯示出問候訊息。
      https://ithelp.ithome.com.tw/upload/images/20230915/20151470EXnAFbp0Df.png
  • ///<summary> 標籤用於描述下面的程式碼塊或成員(通常是類、方法、屬性等)的用途和功能。

在Main的上方打三條斜線”///”就會出現,是註釋的一部分,用於提供有關程式碼的簡要說明和文檔。

如下,///<summary> 註釋提供了對 Add 方法的說明,包括它的功能以及參數的說明。

///<summary>
/// 這個方法用於計算兩個整數的和。
///</summary>
///<param name="a">第一個整數</param>
///<param name="b">第二個整數</param>
///<returns>兩個整數的和</returns>
public int Add(int a, int b)
{
    return a + b;
}

逸出字元

反斜線 (反斜線在鍵盤Enter的上方)

\\ - 反斜線: 如果你想要在字串中包含實際的反斜線字符,則需要使用兩個連續的反斜線 \\。例如:

string path = "C:\\Windows\\System32\\";

這個字串 path 包含了多個反斜線字符。

\" - 雙引號: 如果你想要在字串中包含雙引號字符,則需要使用逸出字元 \"。例如:

string quoted = "這是一個\"引號\"的示例";

這個字串 quoted 包含了雙引號字符。
https://ithelp.ithome.com.tw/upload/images/20230915/20151470jZPBXAEbsr.png
如果沒有這樣寫,就會看到紅波浪的錯誤訊息
https://ithelp.ithome.com.tw/upload/images/20230915/20151470cgLJJTGEmU.png

  • '\r'是回車,'\n'是換行

這些字符的使用方式源於早期的打字機和印刷機技術,其中回車意味著移動打字機的滑軌回到當前行的開頭,而換行意味著將紙卷向上以創建新的一行。(反斜線在鍵盤Enter的上方)

撥一下的行為是反斜線R(return)
紙往上捲就是反斜線N(new line)

	//分號要記得輸入
	Console.WriteLine("Hello, World!");
	String message = ("早安,\r\n你好,\r\n不要吵!");
	Console.WriteLine(message);

https://ithelp.ithome.com.tw/upload/images/20230915/20151470L995vMWenF.png

  • @ 特殊字元可用為逐字識別項(verbatim string)。

為什麼需要用到這個呢?因為字串不可以折成兩行,所以才會用這個可以折行的方式。

//在字串前方加一個小老鼠,直接Enter換行不要按空白鍵調整位置,不然空白鍵也會算輸入內容
string message = @"床前明月光
疑是地上霜
舉頭望明月
低頭吃便當";
			Console.WriteLine(message);

https://ithelp.ithome.com.tw/upload/images/20230915/201514707tK9SgAsKh.png

字串串接

講到這種字串串接的方式,就會是以下三種方式

string name = "Allen";
//用加號,缺點是較難閱讀
string message = "Hi"+name+" '+lastName;

//使用字串插值,後來才有的新寫法
string message2 = $"HI{name}{lastName}";

//用string.format,比較老的寫法
string message3 = string.Format("Hi"{0} {1}",name , lastName);
  • 字串插值:

字串插值是一種方便的方式,用於將變數的值插入到字串中,以創建新的字串。在C#中,字串插值使用 ${} 語法,讓你可以在字串內插入變數,方法是將變數包裝在 ${} 中,可以輕鬆地組合文字和變數,使程式碼更具可讀性和彈性。

例子:
假設有兩個變數 name 和 age 分別表示名字和年齡,如果想要把變數的值插入到一個歡迎訊息中。

string name = "Alice";
int age = 30;
string welcomeMessage = $"歡迎,{name}!你今年 {age} 歲。";
Console.WriteLine(welcomeMessage);

在這個例子中,我們使用字串插值將 name 和 age 的值插入到 welcomeMessage 字串中。${name} 將被替換為 "Alice",${age} 將被替換為 30,最終的 welcomeMessage 將成為 "歡迎,Alice!你今年 30 歲。"。
https://ithelp.ithome.com.tw/upload/images/20230915/201514700eLMFIQ1zw.png
這使得在字串中插入變數變得非常容易和直觀,並且提高了程式碼的可讀性。

  • string.Format套用的內容
			string name = "Charlie";
			int age = 31;
			DateTime birthday = new DateTime(1991, 12, 2);

			string template = "Hi, {0} ,您的年紀是{1}, 生日是{2}";
			string template2 = "Hi, {0} , 生日是{2}";

			string template3 = "Hi, {0} ,您的年紀是{1}, 生日是{2}";
			string template4 = "Hi , 生日是{2}, {0} ,您的年紀是{1}";

			//可以任意調動一插值,順序不同也可以
			//template再根據想呈現的字串變數更改,下面的message裡面的的template跟上方變數名稱要相同
			//string.Format(想呈現的字串內容,{0},{1},{2})
			string message = string.Format(template, name, age, birthday);
			string message4 = string.Format(template4, name, age, birthday);

			Console.WriteLine(message);
			Console.WriteLine(message4);

https://ithelp.ithome.com.tw/upload/images/20230915/20151470go6nLnSdow.png
針對裡面創建字串模板跟占位符的部分來去解釋。

  1. string template = "Hi, {0} ,您的年紀是{1}, 生日是{2}";:創建一個字串模板 template ,其中包含三個占位符 {0} 、 {1} 和 {2},分別用來表示名字、年齡和生日。
  2. string template4 = "Hi , 生日是{2}, {0} ,您的年紀是{1}";:創建另一個字串模板 template4,這次占位符的順序不同,但仍然表示相同的變數。
  3. string message = string.Format(template, name, age, birthday);:使用 string.Format 方法將 template 中的占位符替換為實際的變數值,並將結果存儲在 message 變數中。
  4. string message4 = string.Format(template4, name, age, birthday);:使用相同的方式,將 template4 中的占位符替換為變數值,並將結果存儲在 message4 變數中。

布林數據型別 (bool)

布林(Boolean)是一種基本的數據型別,它代表了兩種可能的值:真(true)和假(false)。

布林型別通常用於表示條件或邏輯值,如開關、條件測試的結果等。布林數據型別在程式中用於控制流程和做決策,因此它在程式設計中非常重要。

例子

以下是一個簡單的例子,演示了如何使用布林型別和條件語句:

bool isRaining = true;
bool isSunny = false;

if (isRaining)
{
    Console.WriteLine("今天下雨了。");
}
else if (isSunny)
{
    Console.WriteLine("今天天晴。");
}
else
{
    Console.WriteLine("今天的天氣我不知道。");
}

在這個例子中,我們創建了兩個布林變數 isRainingisSunny,分別表示是否下雨和是否晴天。然後,我們使用 ifelse if 條件語句來檢查這些變數的值。根據變數的值,程式將輸出相對應的訊息。
在這個情況下,因為 isRaining 的值為 true,所以程式將輸出 "今天下雨了。"。這個例子顯示了布林型別的用法,它用於控制程式的流程和執行不同的程式碼路徑,具有決策能力。

上面關於提到的控制程式的流程,就像當你寫程式的時候,有時候你想要讓電腦做一些決定。
舉例像小朋友們在玩遊戲時需要根據不同的情況做不同的事情一樣。那麼,if...else 就像是告訴電腦如何做這些決定的工具。

想像一個遊戲,你有一個大盒子裡面有很多糖果,而你的小朋友想要拿糖果。你可以告訴他們:

  1. 如果你的房間整理得很乾淨,那麼你可以拿一顆糖果。(這就像 if 部分,如果某個條件成立,就執行這個情況)
  2. 但如果你的房間一團糟,那麼你不能拿糖果。(這就像 else 部分,如果前面的條件不成立,就執行這個情況)

所以,if...else 就是告訴電腦根據情況做出不同的決定。如果某件事情是對的,就做一件事;如果不對,就做另一件事。這就是程式中的決策能力,就像小朋友們在玩遊戲時必須做出選擇一樣。
關於if判斷式跟三元運算式就在明天的時候繼續說明啦~


第三天結束~準備的時間都比去年前端的時間還來的長,還要去思考該如何正確描述~
希望整理的內容還算有解釋到充足的C# 基礎知識,也歡迎給予指教~~


上一篇
Day2 Hello C# 寫下你的第一個C#程式
下一篇
Day4 條件判斷 & 數值運算
系列文
30天開啟.NET後端工程師的旅程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言