iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 15
0
Modern Web

C#與ASP.Net入門-我要成為工程師!!系列 第 15

Day15-C#-for迴圈VS foreach(例:經典九九乘法表/排版後的九九乘法表)

電腦在讀程式碼是一行一行讀,讀過去的程式碼就過去了,跟逝去的青春一樣(遠目)。

當你有某段程式需要一直重複做~例如需要重複印出"我這個月一定要減肥成功!"(我就是在說沒毅力的我QQ),你可能需要 Ctrl+C/Ctrl+v Cnsole.WriteLine();12次 (或者不只12次...)

BUT!!!一但這件事情要重複做100萬次,你總不能人生都浪費在複製貼上上面R~~~

於是,需要重複執行程式碼的區塊,就是出動迴圈的時候了!!!!


四大迴圈

迴圈有分成四種:
1. for:在程式中遇到要重複同樣動作的指令,就要使用迴圈指令。通常用在執行的次數為已知
2. foreach:通常配合陣列使用,指的是執行陣列的每一個物件,陣列有10個就跑10次,執行次數=陣列長度。
3. while:前測試迴圈,通常用在當需要重複執行同樣動作,且執行的次數為未知時使用。
4. do...while:後測試迴圈,與while相同,但是不管你條件為何,都先執行一次再說。

無論是哪一種迴圈,都可以搭配在switch這篇提到的break、goto、return、throw 或是continue(註)陳述式調整或是結束迴圈

註:continue:將控制權轉移給其所在的封閉式 while、do、for 或 foreach 陳述式的下一個反覆項目。

本篇會先介紹for跟foreach的部分~


for

先來看看for迴圈的結構

for (initializer初始設定式; condition條件; iterator迭代器)
{
陳述式
}

恩....我翻譯了翻譯白話文↓↓↓↓

for(a.變數起始值;b.迴圈存在條件;c.每圈執行後變數的動作)
{
每一圈要執行的內容
}

運作邏輯:進入迴圈後,從a變數起始值開始跑,檢查是否符合b的條件,每圈結束後執行c的動作

a,b,c間用 ; 分開,讓我們來詳細看一下a,b,c的內容

  • a.變數起始值(initializer初始設定式):
    • 這裡的變數只在for迴圈內用,迴圈外無法存取(除非已經在迴圈外宣告)
    • 變數可以不只一個
  • b.迴圈存在條件(condition條件):
    • 此條件為True/False的布林運算式。符合條件執行{ }一次,不滿足條件時跳出迴圈
  • c.每圈執行後變數的動作(iterator迭代器):
    • 針對a部分的變數執行的動作,這樣每跑完一圈才能改變條件狀況,判斷是否不符合b部分條件而離開迴圈

上述a,b,c不一定要存在,例如for(;;)代表無窮迴圈。
for迴圈的層數沒有限制,但越多效率越差。

好,馬上來試寫看看!

題目一: 求N階層,也就是輸入N之後,求1x2x3x...xN。

程式邏輯:

我們先觀察一下,求的結果是從1開始,每次都乘以下一個數,直到要求的數字為止
所以會變成這樣1x(1+1)x((1+1)+1)x(((1+1)+1)+1)....xN

所以我的程式碼:

int answer = 1;
//先給answer一個初始值,由於1乘以任何數都不變,故設定為1
//因為要在for迴圈外讀取answer的結果,所以要宣告在外面
Console.WriteLine("計算1×2×3×…×N,請輸入N=");
int N = Convert.ToInt32(Console.ReadLine());
for (int i = 2; i <= N; i++)
//迴圈從2開始跑,跑到N為止,i每次跑完後+1
//也可以從1開始跑,但是1*1還是1阿沒有必要XD
//不能從0開始跑喔,*0什麼東西都是0了XD
{
    answer *= i;
    //answer=answer*i;把每一次都乘以i之後賦值給answer
    //也就是i=2的時候,執行answer=answer*2。
    //於是此時answer=2,i會+1=3
    //3如果仍<=N,就再進行一次answer=answer(2)*i(3),直到i不符合<=N的條件為止
}
Console.WriteLine($"answer={answer}");
Console.ReadKey();

好,應該對for有多一點了解了吧?那我們來試著印出99乘法表吧!

題目二:九九乘法表
請印出從2開始的九九乘法表,範例如下圖:
https://ithelp.ithome.com.tw/upload/images/20190915/20120055HjLVATZf8G.png

好的,一樣先讓我們來觀察一下九九乘法表 i x j = ixj

i從2開始,乘以j從1~9後,就換下一個數繼續乘。也就是我從2開始到9的每個數我都要分別乘以1~9(重複做)

恩...i要動,j也要動,而且都同一個規律。看來是撰寫巢狀迴圈的時候了!!!!

*巢狀迴圈:for裡面包著for

那讓我們來看一下程式碼

for (int i = 2; i < 10; i++)//i從2開始跑,跑到<10為止(也就是跑到9),i每跑一次就+1
{
    for (int j = 1; j < 10; j++)//j從2開始跑,跑到<10為止(也就是跑到9),j每跑一次就+1
    {
        Console.WriteLine($"{i}x{j}={i*j}");
    }
}
Console.ReadKey();

上述程式碼一步一步跟著程式碼跑的話會像以下這樣

  1. 第一個迴圈i從2開始
  2. 接著進入第二個迴圈j從1開始
  3. 先輸出2x1=2之後,j+1=2,發現還是符合j<10的條件
  4. i不變,繼續印出2x2=4,然後j+1=3,發現還是符合,於是一直重複3~4的步驟
  5. 直到跑到2x9=18,j+1=10之後發現不滿足<10的條件了!於是跳出內層迴圈
  6. 而此時i一直維持2,跳出內層迴圈後,外層迴圈第一圈也結束了,於是進行i+1=3,發現符合i<10的條件,所以又進入內層迴圈
  7. 反覆重複以上直到i=10跳出迴圈為止
  8. 然後你就寫出來了!!!棒棒!!!

看來這個對你來說太簡單了,那我們來小小變化一下

題目三:九九乘法表(變化版)
請輸出如下圖範例
https://ithelp.ithome.com.tw/upload/images/20190916/20120055aBfSe7VU9h.png

先給個提示:
https://ithelp.ithome.com.tw/upload/images/20190916/201200550EvKvXmG2e.png

好!開始囉!
解法一

for (int i = 1; i < 10; i += 3)//從1開始跑,每輪跑完後+3(三組分別是1,4,7開頭)
{
    for (int j = 1; j < 10; j++)//每輪從1開始跑,跑9次,這裡是要乘的1~9
    {
        //以下以每一列為輸出單位
        Console.Write($"{i:##} * {j:##} = {i * j:##}\t\t");
        //輸出每一列第一段,中間加入間隔\t(同tab鍵)排版,並規定輸出為2個字元空間方便對齊
        Console.Write($"{(i + 1):##} * {j:##} = {(i + 1) * j}\t\t");
        //輸出每一列第二段,中間加入間隔\t排版,並規定輸出為2個字元空間方便對齊
        Console.WriteLine($"{(i + 2):##} * {j:##} = {(i + 2) * j}");
        //輸出每一列第三段並換行跑下一個j,並規定輸出為2個字元空間方便對齊
     }//#字號為數字預留位置符號,注意不會輸出非有效位數的零
    Console.WriteLine();//每完成一個i多換行一次,也就是跑完3,6,9換行(每一組)
}
Console.ReadKey();

\t用法請參考跳脫字元
##用法請參考上一篇String.Format

解法二

for (int i = 1; i < 10; i += 3)//分成上中下三個區塊1,4,7,每個區塊開頭差3
{
    for (int j = 1; j < 10; j++)//每區塊會從1-9共跑9次
    {
        for (int k = i; k < (i + 3); k++)//*前方數字每行從i開始,符合<i+3就跑一圈
        {
            Console.Write($"{k:##} * {j:##} = {k * j:##}\t");
            //每次輸出不換行但用\t隔開,直到k=(i+3)
        }
        Console.WriteLine();//不符合k<(i+3)後跳出迴圈並換行
    }
Console.WriteLine();//跑完每一個區塊後換行,也就是i=3,6,9時
}
Console.ReadKey();

foreach

與for用法相同,但不用指定初始值、條件、迭代器。他會將集合中(如陣列)內的所有元素逐一指定給變數,直到每一個元素都處理完畢才離開迴圈。就是元素有幾個就跑幾圈!更詳細的用法會在陣列時說明。
架構如下:

foreach (每一元素 in 陣列)
{
每一圈要執行的內容;
}

有限迴圈就介紹到這啦~
下一篇我們來看看無窮迴圈~


參考資料

MSDN-continue(C#參考)
MSDN-for(C#參考)
MSDN-foreach、in(C#參考)


上一篇
Day14-C#-輸出格式好幫手String.Format/有$好辦事=ˇ=
下一篇
Day16-C#- while與do..while(例:求因數、求最大公因數、怎麼讓console重複執行?)
系列文
C#與ASP.Net入門-我要成為工程師!!31

1 則留言

0
小朱
iT邦新手 4 級 ‧ 2019-09-16 12:06:04

有限迴圈和無窮迴圈用 for/foreach/while/do...while 區分上怪怪的,while/do...while 一樣可做有限迴圈,for 也可以做無窮迴圈,真正可歸類有限的只有 foreach (看集合中的物件有多少個)。

恩恩..同意!!!立馬修改!!感謝大大!

我要留言

立即登入留言