iT邦幫忙

2023 iThome 鐵人賽

DAY 5
0
自我挑戰組

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

Day 5 for / while迴圈轉轉轉

  • 分享至 

  • xImage
  •  

前言

還記得在Day3的時候提到的總合計算嗎?

下面這裡就是如何使用for迴圈,來去加總數字。

int sum = 0;
for (int i = 1; i <= 10; i++)
{
    sum += i;
}
Console.WriteLine(sum);

這段程式碼將迭代從 1 到 10 的數字,並將它們相加,最後顯示總和,結果也是 55。

但是程式這樣是怎麼跑的??

當初身為初學者的我,當時也嗯….看不懂,for後面那三個是甚麼?啊我知道會迴圈一直跑,所以怎麼跑,誰先跑?是要跑去哪?為什麼這樣就算出來了


那就來一步步解釋,首先解釋for迴圈的使用語法如下

for (initialization; condition; update)
{
    // 要執行的程式碼
}
//**initialization**  是初始化語句,用於設定初始值;
//**condition** 是判斷條件,當條件為真時,迴圈繼續執行;
//**update** 是更新語句,用於更新計數器或變數的值,以便下一次迴圈能夠正確執行。

當我們想要重複執行一段程式碼多次時,可以使用 for 迴圈。這個迴圈的結構是透過三個部分來控制的:

  1. 初始化 (Initialization):可以看到for後面的小括號裡面第一個,會先在這裡設定一個變數,通常是用來追蹤我們要執行多少次迴圈。在跑第一次迴圈前,這個變數會被初始化,設定的變數常常可以看到變數是i,可能會是i=0或是i=1看起始的條件是甚麼。
  2. 條件 (Condition):中間就會放一個條件判斷式(在Day4有提到條件判斷),只有在條件為真時,迴圈內的程式碼才會執行。如果條件為假,則迴圈結束。
  3. 更新 (Update):這一部分用於更新在迴圈中使用的變數,通常是透過增加或減少它的值。這是為了確保在每次迴圈後,條件會再次被檢查,並控制是否要繼續迴圈。

換個方式來說,當你想要重複做一樣的事情多次,就像玩疊疊樂一樣,你可以使用一個特殊的"迴圈"工具。這個迴圈就像一個小火車,一直跑來跑去,直到達到一個特別的地方才停下來。

如果把這個小火車拆解成三個部分:

  1. 開始號誌 (Initialization):這是一個特殊的旗子,告訴小火車從哪個站開始出發。比如說,我們可以說火車要從第 0 站開始。
  2. 停車條件 (Condition):這是告訴小火車什麼時候應該停下來的規則。像是我們可以告訴小火車只有當它到達第 5 站時才應該停下來,這就是昨天提到的條件判斷的部分。
  3. 前進指令 (Update):這裡就要告訴小火車如何前進的指示。我們可以設定如果每次小火車到一個站時,就向前走一站,也就是說從第 0 站走到第 1 站,再從第 1 站走到第 2 站,一直到第 5 站。

所以,當小火車開始時,它在第 0 站,然後它會檢查停車條件。

如果停車條件是真的(也就是它還沒到達第 5 站),小火車就會向前走一站,再次檢查停車條件。

當停車條件變成假的(也就是它到達了第 5 站),小火車就會停下來。

這樣,小火車就完成了它的任務,這就是迴圈的概念!它讓你可以輕鬆地一次又一次地完成相同的工作,就像小火車一樣不停地走來走去。

如果好像有一點概念的話,那就再用一個簡單的例子,說明 for 迴圈的工作原理:

// 初始化:宣告一個變數 i,並設定初始值為 0,也就是int i = 0;
// 條件:只要 i 小於 5,就繼續執行迴圈 , i < 5
// 更新:每次迴圈結束後,將 i 增加 1
for (int i = 0; i < 5; i++)
{
    Console.WriteLine(i);
}
//所以第一個i 是初始值 = 0,判斷i確實<5`,所以會直接先顯示出來
//再來會跳到i++,變成 i = 0+1 =1,判斷i確實<5,所以顯示1
//再來會跳到i++,變成 i = 1+1 =2,判斷i確實<5,所以顯示2
//再來會跳到i++,變成 i = 2+1 =3,判斷i確實<5,所以顯示3
//再來會跳到i++,變成 i = 3+1 =4,判斷i確實<5,所以顯示4
//再來會跳到i++,變成 i = 4+1 =5,判斷i不<5,所以不顯示

這段程式碼會在控制台上輸出數字 0 到 4,因為變數 i 從 0 開始,每次迴圈會增加 1,直到 i 不再小於 5 為止。

剛剛上面簡單的介紹完,要來增加運算摟~

  • 寫奇數練習(輸出1~10的奇數數字)
for (int i = 1; i <= 10; i = i + 2)
  {
				Console.WriteLine(i);
	}

這個for迴圈會列印出 1、3、5、7 和 9,因為這些是 1 到 10 之間的奇數數字。

依樣從i=1開始,再跑的每個循環都檢查 i 是否小於或等於 10,如果是的話就繼續執行下面的Console.WriteLine(i);這個動作,這個動作就不用多解釋,之前幾天都有用過就是把放進去當下的變數 i 的值給齣齣呈現在畫面上。

後面我們寫 i = i + 2所以從一開始,每次加2,這樣1印出來以後,變成 3、5、7、9,以此類推。

再來迴圈中間有設定條件會結束的,所以每次跑都會檢查這個條件 i 是否小於或等於 10,如果是對的話繼續執行下一個循環,但如果 i 變成 11,那麼條件就不對啦,迴圈就結束了。

  • 列出1~20偶數
for(int i=1 ; i<=20;i++)
{
	Console.WriteLine(2i);
}

這個for迴圈會列印出 2、4、6、…18、 20,因為這些是 1 到 20 之間的偶數數字。

從i=1開始,跑的每個循環都檢查 i 是否小於或等於 20,如果是的話就繼續執行下面的Console.WriteLine(2i);這個動作,裡面的變數 i 會乘以2,再輸出結果呈現 2、4、6…。

後面我們寫 i++ 所以從一開始的 i = 1,每次加1。

再來迴圈中間有設定條件會結束的,所以每次跑都會檢查這個條件 i 是否小於或等於 20,如果是對的話繼續執行下一個循環,但如果 i 變成 21,那麼條件就不對啦,迴圈就結束了。

這裡我們小小的使用

  • 使用副程式的方式去執行,讓數字自己變成兩倍
static void Main()
    {
        for (int i = 1; i <= 20; i++)
        {
            if (IsEven(i))
            {
                Console.WriteLine(i);
            }
        }
    }

    static bool IsEven(int num)
    {
        return num % 2 == 0;
    }

再寫程式的時候,如果一直重複寫一樣的就會不好維護,因為一個地方要改,其他地方就一直要修改,所以才會在這裡使用副程式。

(先解釋副程式(Subroutine)通常被稱為函數(Function)或方法(Method),是一段獨立的程式碼,它可以被多次調用,並在需要時執行特定的任務或操作。)

那來解釋上面的使用副程式的方法,先定義了一個名為 IsEven 的副程式,它的作用是將輸入的整數乘以2。
然後,我們使用 for 迴圈從1到20迭代,每次迭代中都調用 IsEven 副程式,可以看到我們在if裡面的判斷是寫了(IsEven(i)把 IsEven 副程式呼叫來這裡當成判斷式使用。)透過這種方式來檢查當前數字是否為偶數,如果是偶數,就將其印出。

這樣,我們就能夠印出1到20之間的所有偶數,呈現的結果如下圖所示。
https://ithelp.ithome.com.tw/upload/images/20230917/20151470TH0Qe3Cew7.png

除了可以呈現數字,也可以使用for迴圈創建圖案,通常會使用巢狀的for迴圈,這樣可以更容易地控制圖案的形狀和大小。
下面是一個簡單的例子,使用巢狀的for迴圈來創建一個簡單的星號圖案,這個圖案具有三個星號的高度和寬度:

for (int i = 0; i < 3; i++)
{
    for (int j = 0; j < 3; j++)
    {
        Console.Write("*");
    }
    Console.WriteLine(); // 在每行結束後換行
}

可以看到使用兩個for迴圈,外部的迴圈(i從0到2,總共3個)用於控制行數,內部的迴圈(j從0到2)用於在每行上打印星號。
在內部迴圈完成後,我們使用 Console.WriteLine() 來換行,以便下一行可以開始。可以看到結果呈現如下圖。
https://ithelp.ithome.com.tw/upload/images/20230917/20151470mf7WdLaeXe.png

在我去面試工作的時候,有遇到需要手寫考99乘法表的題目。99乘法表是一個經典的例子,使用for迴圈可以輕鬆生成這個表。
那就使用巢狀for迴圈生成99乘法表的例子:

for (int i = 1; i <= 9; i++)
{
    for (int j = 1; j <= 9; j++)
    {
        int result = i * j;
        Console.Write($"{i} x {j} = {result}\t");
    }
    Console.WriteLine(); // 在每行結束後換行
}

跟上面印出星星的方式很像,一樣使用兩個for迴圈,只是外迴圈數量變成(i從1到9)用於控制行數,內迴圈(j從1到9)用於計算每一行的乘法表達式然後把結果印出來。

因為不是只要印出圖案或一個字即可,所以我們Console.Write()來印出表達式,使用Day3教字串插值,$"{i} x {j} = {result}\t"是一個格式化的字串,包含i、j和它們的乘積。
在內部迴圈完成後,我們使用 Console.WriteLine() 來換行,以便下一行可以開始。
下圖就是印出來的內容呈現的樣子。
https://ithelp.ithome.com.tw/upload/images/20230917/2015147049ZcHJVHDH.png

關於使用的格式化字串,這裡再重複前面有教到的印象(格式化字串是一種特殊的字串,在Day3的時候有提到一些也就是有使用到像是字串插值或是string.Format的部分。)讓我們來解釋這個具體的例子:

$"{i} x {j} = {result}\t"
  • $ 符號:在字串的開頭,它表示這是一個插補字串(interpolated string),可以包含變數或運算式,並將它們嵌入到字串中。
  • {} 大括號:大括號用於定義要插入到字串中的變數或運算式。在這個字串中,有三對大括號。
  • ijresult:這些是變數或運算式的名稱,它們的值將被插入到對應的大括號中。
  • x=\t:這些是字串中的文字內容,它們將直接顯示在最終的格式化字串中。

當這個格式化字串被處理時,大括號內的變數或運算式將被計算並插入到對應的位置,以生成最終的字串。例如,如果 i 的值為 5、 j 的值為 3,並且 result 的值為 15,則這個格式化字串將生成以下字串:

5 x 3 = 15    // 使用制表符(\t)添加了一個定位製表符

While 迴圈

一樣都是迴圈但while跟for使用的狀況不同,除了這兩個還有do…while。
while 通常用在不知道跑幾圈,跑到對為止。
for是知道有幾圈的時候使用。
do…while無論如何先跑一次,在決定是否要在跑一次

當你不確定要執行多少次迭代時, while 迴圈是一個很好的選擇。
像是下面的例子,使用Console.WriteLine不斷地詢問使用者是否要繼續,直到使用者輸入"no"為止。

string input;
while (true)
{
    Console.WriteLine("繼續嗎?(yes/no)");
    input = Console.ReadLine();
    if (input.ToLower() == "no")
    {
        break; // 如果輸入是 "no",則退出迴圈
    }
}
Console.WriteLine("程式結束");

這個程式用 while 迴圈,並在迴圈的條件中用 true ,這意思就是因為都一直是對的,所以沒有打斷就會變成無窮迴圈一直運行,直到裡面有加上 break ,當break被調用就會退出迴圈。

在每次迭代中都問使用者是否繼續,並且讀使用者輸入的內容。
直到輸入是 "no",則調用 break 退出迴圈,不然就會一直跑迴圈。(如果在迴圈中使用 break 時,就會立即結束迴圈的執行,不再執行剩餘的迴圈,只要滿足某種條件的時候就可以使用的。)

可以看到下圖,只要使用者輸入yes就會再詢問一次,如果使用者輸入後就會跳出迴圈,執行外面的程式碼,所以才會印出程式結束。
https://ithelp.ithome.com.tw/upload/images/20230917/20151470p0cbmAPSYx.png
迴圈部分解釋到這裡,那就要好好的來,解釋最開頭我們提出來關於1加到10 使用的for 迴圈總和了。

這段程式碼使用了一個 for 迴圈,其目的是計算並列印出 1 到 10 之間所有整數的總和。

int sum = 0; // 初始化一個整數變數 sum 並設為 0

先宣告了一個整數變數 sum ,並把這個值初始值設為 0。因為這個變數後面要用來儲存最終的總和。

for (int i = 1; i <= 10; i++) // 使用 for 迴圈
{
    sum += i; // 在每個迴圈迭代中,將 i 的值加到 sum 上
}

這個 for 迴圈 有三個主要部分:

  1. 初始化(initialization):宣告一個整數變數 i,初始值設為 1。
  2. 條件(condition):定義了一個條件,只有當 i 的值小於或等於 10 時,迴圈才會繼續執行。
  3. 更新(update):在每個迴圈迭代的結尾 (i++),也就是每跑完一圈i 就+1。

在每個迴圈迭代中執行下面這些操作:

  • i 的值加到 sum 上,這樣就累積了所有迴圈迭代中的整數值。
  • 然後, i 的值會進行更新 (i++),以便進行下一次迴圈迭代。

最後,迴圈結束後,使用 Console.WriteLine(sum) 將變數 sum 的值印出,即印出了 1 到 10 之間所有整數的總和。在這個例子中,1 + 2 + 3 + ... + 10 的總和等於 55,因此程式會輸出 55。
以上就是關於迴圈的簡易使用方法啦~


第五天挑戰完成,幸好來得及在今天趕上~


上一篇
Day4 條件判斷 & 數值運算
下一篇
Day 6 綜合小練習
系列文
30天開啟.NET後端工程師的旅程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言