練習 - 撰寫程式碼以顯示ourAnimals陣列的所有數據

已完成

在此練習中,您會撰寫巢狀循環結構和選擇代碼區塊,用來顯示 ourAnimals 陣列資訊。 在此練習期間完成的詳細工作如下:

  1. 外部迴圈:建置外部迴圈以逐一查看 ourAnimals 陣列中的動物。
  2. 數據檢查:撰寫程式代碼,檢查現有的寵物數據,並在寵物的數據存在時顯示寵物標識符。
  3. 內部迴圈:建置內部迴圈,其使用指派的資料顯示寵物的所有寵物特性。
  4. 驗證測試: 針對您在此練習中開發的程式碼執行驗證測試。

這很重要

您必須先完成本課程模組中的上一個練習,才能開始此練習。

建置迴圈以逐一查看 ourAnimals 陣列

在此任務中,您會建立外部 for 迴圈,用來遍歷 ourAnimals 陣列中的動物。 您會檢查陣列維度與循環參數 for 之間的關聯性。 使用多維度陣列時,您也會考慮for語句和foreach語句之間的差異。

  1. 確定 Visual Studio Code 已開啟,且您的Program.cs檔案會顯示在編輯器中。

  2. 在選取語句的程式代碼區塊 switch(menuSelection) 內,找出下列程式代碼行:

    case "1":
        // List all of our current pet information
        Console.WriteLine("this app feature is coming soon - please check back to see progress.");
        Console.WriteLine("Press the Enter key to continue.");
        readResult = Console.ReadLine();
        break;
    
  3. 刪除用來顯示「即將推出」訊息的Console.WriteLine()語句,並在// List all of our current pet information程式碼註解行的下方保留一行空白代碼。

    因為您將顯示ourAnimals陣列的內容,因此不需要回饋訊息。 當您開發對應至其他功能表選項的程式代碼時,也會更新這些意見反應訊息。

    留下訊息,其內容為 Press the Enter key to continue.

  4. 從您建立的空白程式代碼行開始,開始 for 語句,如下所示:

    for ()
    {
    }
    
  5. 花一分鐘時間考慮您需要使用此 for 語句達成什麼目的。

    回想一下,一個 for 語句有三個部分控制其執行迴圈的方式:初始化條件,以及 迭代器。 針對 初始化表達式條件反覆運算器 指派給 的值,會根據您需要使用 for 語句達成的目標。

    在此情況下,for 迴圈會用來迭代這 ourAnimals 陣列。 您知道陣列是零索引的,這表示具有 n 元素的陣列會從 0 索引到 n-1。 您需要 針對初始設定式針對條件,以及 針對列舉程式,以符合陣列維度。 在此情況下,您希望迴圈從 for 開始,以 0 遞增,並在 1 結束。

    您的 ourAnimals 陣列宣告如下: string[,] ourAnimals = new string[maxPets, 6];。 您知道指定給 maxPets 的值是 8。 在此宣告中, maxPets 指定陣列第一個維度中的項目數目,而不是您用來參考陣列中元素的以零起始的索引編號。 因此,儘管maxPets = 8,陣列的索引編號範圍是從07

  6. 若要指定迴圈的 for 控制項值,請更新程式碼,如下所示:

    for (int i = 0; i < maxPets; i++)
    {
    }
    

    如您所見,將 for 初始化器 設定為 int i = 0; 與零起始的陣列索引對齊。 同樣地,將 for 條件 設定為 i < maxPets; 與陣列的第一個維度對齊。 最後,將 for 迴圈控制變數設定為i++ ,會針對每次迴圈運行遞增迴圈控件值 1

  7. 請花一分鐘的時間來思考,逐一查看 ourAnimals 陣列時,陳述式與 for 陳述式 foreach 之間的選擇。

    目標是一次逐一查看 ourAnimals 陣列中的一個動物。 那麼,為什麼不使用 foreach 迴圈? 畢竟,您知道 foreach 語句是為了當您想要遍歷項目陣列中的每個項目時所設計的。

    在此情況下,您不使用foreach迴圈的原因是因為ourAnimals陣列是多維陣列。 由於 ourAnimals 是多維字串陣列,因此 ourAnimals 中的每個元素都是字串類型的獨立項目。 如果您使用 foreach 迴圈遞迴遍歷 ourAnimals,那麼 foreach 會將每個字串識別為字串項目清單中的 48 個項目之一(8 x 6 = 48)。 foreach語句不會個別處理兩個陣列維度。 換句話說,foreach 迴圈無法辨識 8 字串元素的列,其中每列包含一欄 6 項目。 由於您想要一次處理一隻動物,並在單一迭代中處理所有六種動物特性,因此使用 foreach 語句並不是正確的選擇。

    不過,如果 ourAnimals 陣列是設定為由字串陣列組成的不規則陣列,您可以使用 foreach 語句。 在這種情況下,您需要為外部迴圈建立foreach,並為內部迴圈建立第二個foreach。 外部迴圈會逐一查看不規則陣列中的「字串陣列」元素。 字串陣列是二維陣列中的「行」。 內部迴圈會遍歷字串陣列中包含的「string」元素。 字串陣列中的字串元素是二維陣列中的「數據行」。

    下列程式碼範例示範了鋸齒陣列的方法。

    string[][] jaggedArray = new string[][]
    {
        new string[] { "one1", "two1", "three1", "four1", "five1", "six1" },
        new string[] { "one2", "two2", "three2", "four2", "five2", "six2" },
        new string[] { "one3", "two3", "three3", "four3", "five3", "six3" },
        new string[] { "one4", "two4", "three4", "four4", "five4", "six4" },
        new string[] { "one5", "two5", "three5", "four5", "five5", "six5" },
        new string[] { "one6", "two6", "three6", "four6", "five6", "six6" },
        new string[] { "one7", "two7", "three7", "four7", "five7", "six7" },
        new string[] { "one8", "two8", "three8", "four8", "five8", "six8" }
    };
    
    foreach (string[] array in jaggedArray)
    {
        foreach (string value in array)
        {
            Console.WriteLine(value);
        }
        Console.WriteLine();
    }
    

    針對 Contoso Pets 應用程式,使用多維字串陣列和巢狀 for 迴圈可能比較容易,而不是鋸齒狀陣列和巢狀 foreach 迴圈。 現在,您會看到每個選項的運作方式,您可以在未來的編碼專案中做出自己的選擇。

  8. 在 [Visual Studio Code 檔案 ] 功能表上,選取 [ 儲存]。

  9. 在 Visual Studio Code 中開啟 [整合式終端機] 面板,然後輸入命令以建置程式。

    若要從 [總管] 檢視開啟 [整合式終端],請以滑鼠右鍵按一下 [起始],然後選取 [在整合式終端中開啟]。 您也可以使用 [ 檢視 ] 或 [ 終端機 ] 功能表來開啟 [整合式終端機] 面板。

    若要建置程式,請從終端機命令提示字元輸入 dotnet build 命令。

  10. 在繼續之前,修正您所看到的任何建置錯誤或警告。

    請記住,建置錯誤和警告訊息會告訴您問題所在,以及您可以在何處找到問題。 解決問題時,最好從接近程式碼頂端的問題開始,然後依序往下解決。

  11. 關閉 [終端] 面板。

檢查現有的寵物數據並顯示結果

在這項工作中,您會使用 if 語句來尋找在 ourAnimals 陣列中已指派寵物特性資料的每個寵物。 找到具有已指派資料的寵物時,您會顯示寵物識別碼。 未指派任何數據時,不會顯示任何數據。 您執行程式碼以確認 forif 語句是否正常運作。

  1. 在您的for語句程式碼區塊內建立空白程式碼行,如下所示:

    for (int i = 0; i < maxPets; i++)
    {
    
    }    
    
  2. 若要建立 if 檢查寵物標識碼數據的語句,請更新您的程式代碼,如下所示:

    for (int i = 0; i < maxPets; i++)
    {
        if (ourAnimals[i, 0] != "ID #: ")
        {
        }
    }    
    
  3. 請花一分鐘時間來考慮此 if 語句正在評估的內容,以及原因。

    首先,請考慮表達式的左側: ourAnimals[i, 0]。 請注意,迴圈控制變數 i 是用來指定正在檢查的動物。 如您所回想的,0[i, 0] 中對應於 petID 特性。 由於陣列的第一個維度會對應至動物的「數位」,因此表達式的這一端可確保您的程式代碼會檢查指派給 petID 陣列中每個動物的值。

    其次,請考慮比較運算符的選擇。 請注意,使用了不相等運算子 !=。 當指派給 petID 的值 true 不等於方程式右側所列的值時,表示式會評估為 ourAnimals[i, 0]

    第三,請考慮等式右側的數值。 請注意,會使用靜態字串值 "ID #: "。 這是產生範例數據時指派 petID 的預設值。 將特性指派給動物時,會 petID 更新值,且不會等於預設值。

    這會告訴您,當目前的動物具有定義的特徵時,if 語句的代碼區塊將會被執行。

    備註

    這是在應該使用 != 的時候的一個好範例。 只要值不是預設值,您就不必擔心指派 petID 給哪個值。

  4. 若要建立 Console.WriteLine() 方法,以在 petID 陳述式的程式碼區塊內顯示 if,請更新您的程式碼,如下所示:

    for (int i = 0; i < maxPets; i++)
    {
        if (ourAnimals[i, 0] != "ID #: ")
        {
            Console.WriteLine(ourAnimals[i, 0]);
        }
    }    
    

    請注意,呼叫 WriteLine() 方法時,可以使用陣列元素作為參數。

  5. 在 [Visual Studio Code 檔案 ] 功能表上,選取 [ 儲存]。

  6. 開啟 [整合式終端機] 面板,然後輸入命令來建置您的程式。

  7. 在繼續之前,修正您所看到的任何建置錯誤或警告。

  8. 在終端機命令提示字元中,輸入命令以執行程式。

    dotnet run 終端機命令提示字元中輸入 命令,以執行程序代碼。

    如果您的程式代碼產生運行時錯誤,請修正錯誤、儲存更新,然後重新啟動應用程式。

  9. 在終端機命令提示字元中,若要確認您的新程式代碼邏輯如預期般運作,請輸入 1

    您應該看到下列 petID 值顯示:

    ID #: d1
    ID #: d2
    ID #: c3
    ID #: c4
    Press the Enter key to continue.
    

    這些識別碼會對應至已指派資料的寵物。

    如果您在選取選單選項 1 時顯示不同的輸出,請檢閱並更新您的程式代碼。 請記住,進行更新之後,您必須儲存Program.cs檔案。

  10. 結束應用程式,然後關閉終端機面板。

以指派的資料顯示寵物的所有寵物特性

在這項工作中,您會在 for 語句程式碼區塊內建立一個 if 迴圈,用來顯示目前寵物的所有特性。

  1. 在程式代碼編輯器中,找出Program.cs檔案中的下列程式代碼行:

    for (int i = 0; i < maxPets; i++)
    {
        if (ourAnimals[i, 0] != "ID #: ")
        {
            Console.WriteLine(ourAnimals[i, 0]);
        }
    }    
    
  2. 若要建立 for 迴圈來逐一查看每個寵物的特性,請更新您的程序代碼,如下所示:

    for (int i = 0; i < maxPets; i++)
    {
        if (ourAnimals[i, 0] != "ID #: ")
        {
            Console.WriteLine(ourAnimals[i, 0]);
            for (int j = 0; j < 6; j++)
            {
            }
        }
    }    
    

    請注意,您現在有在第一個 for 迴圈的程式碼區塊內「巢狀」的第二個 for 迴圈。 如您所知,外部迴圈會依序遍歷 ourAnimals 陣列中的動物。 目的是讓內部迴圈逐一查看每個動物的特性。 由於動物數據會儲存在多維度陣列中,因此很容易存取動物特性。

  3. 花一分鐘的時間檢閱 for 您輸入的語句。

    請注意,迴圈控制項變數名稱為 j。 當您巢狀 for 迴圈時,其中一個傳統方法是在外部迴圈中使用 i 和內部迴圈中使用 j。 遵循這樣的慣例,讓其他人更容易閱讀您的程序代碼。

    由於每個動物會儲存六個特性,for 初始化項int j = 0;for 條件j < 6;。 這個初始化表示式和條件的組合符合您需要的陣列索引範圍, 0 - 5

  4. 若要在個別行上顯示寵物的每個特性,請更新您的程式代碼,如下所示:

    for (int i = 0; i < maxPets; i++)
    {
        if (ourAnimals[i, 0] != "ID #: ")
        {
            Console.WriteLine(ourAnimals[i, 0]);
            for (int j = 0; j < 6; j++)
            {
                Console.WriteLine(ourAnimals[i, j]);
            }
        }
    }    
    
  5. 花點時間考慮您已建立的巢狀結構,以及程式代碼將產生的顯示輸出。

    請注意,寫入主控台 ourAnimals[i, j]的值會使用外部和內部 for 迴圈中的迴圈控件變數。

    您知道下列每個項目:

    • ourAnimals 陣列的第一個維度對應至不同的寵物。
    • 陣列的第 ourAnimals 二個維度對應於每個寵物的特性。
    • 當沒有分派寵物數據給當前寵物時,if 語句會防止內部循環執行。
    • 內部迴圈在外部迴圈的每次迭代中完成其所有迭代。

    因此,您知道每個動物的特性都會如預期般顯示。

  6. 若要以空白 WriteLine()取代 petID 訊息,請更新您的程式代碼,如下所示:

    for (int i = 0; i < maxPets; i++)
    {
        if (ourAnimals[i, 0] != "ID #: ")
        {
            Console.WriteLine();
            for (int j = 0; j < 6; j++)
            {
                Console.WriteLine(ourAnimals[i, j]);
            }
        }
    }    
    

    此最終更新可讓您更輕鬆地在輸出顯示到主控台時看到寵物之間的分隔。

  7. 在 [Visual Studio Code 檔案 ] 功能表上,選取 [ 儲存]。

  8. 開啟 [終端機] 窗格並建置程式。

  9. 在繼續之前,修正您所看到的任何建置錯誤或警告。

檢查您的工作

在這項任務中,您會從整合式終端機執行應用程式,並確認您的forif語句的巢狀組合產生預期的結果。

  1. 如有必要,請開啟 Visual Studio Code 的 [整合式終端] 面板。

  2. 在終端機命令提示字元中,輸入 dotnet run

  3. 在終端機命令提示字元中,輸入 1

  4. 確認寵物資料已針對已指派資料的四隻寵物顯示。

    ID #: d1
    Species: dog
    Age: 2
    Nickname: lola
    Physical description: medium sized cream colored female golden retriever weighing about 65 pounds. housebroken.
    Personality: loves to have her belly rubbed and likes to chase her tail. gives lots of kisses.
    
    ID #: d2
    Species: dog
    Age: 9
    Nickname: loki
    Physical description: large reddish-brown male golden retriever weighing about 85 pounds. housebroken.
    Personality: loves to have his ears rubbed when he greets you at the door, or at any time! loves to lean-in and give doggy hugs.
    
    ID #: c3
    Species: cat
    Age: 1
    Nickname: Puss
    Physical description: small white female weighing about 8 pounds. litter box trained.
    Personality: friendly
    
    ID #: c4
    Species: cat
    Age: ?
    Nickname:
    Physical description:
    Personality:
    Press the Enter key to continue.
    

    備註

    如果您沒有看到預期的結果顯示,請確定您已儲存更新Program.cs檔案。 如果您沒有看到預期的結果,而且無法識別問題,您可以在 [最終] 資料夾中檢查Program.cs程序代碼。 最終資料夾包含在您於安裝過程中完成的下載內容中。 建議您花時間嘗試識別並修正程序代碼中的語法和邏輯問題,然後再檢查 Final 資料夾中的 Program.cs 檔案。

  5. 結束應用程式,然後關閉終端機面板。