練習 - 建置和測試迴圈以輸入新的寵物數據

已完成

在此練習中,您會開發控制新 ourAnimals 陣列資料輸入的程式碼。 您可以計算迴圈控件變數的初始值,並建構迴圈,以收集動物的使用者指定數據。 在此練習期間完成的詳細工作如下:

  1. 計算 petCount:撰寫程式代碼,計算已指派數據之陣列中的 ourAnimals 寵物數目。
  2. 條件式訊息:撰寫程式代碼,以在petCount小於maxPets時顯示訊息輸出。
  3. 外部迴圈:建置迴圈結構,以用於輸入新的 ourAnimals 陣列資料。
  4. 允出準則:撰寫程式碼,評估「輸入新的 ourAnimals 陣列資料」迴圈的允出條件。
  5. 驗證測試:針對您在此練習中開發的程式代碼執行驗證測試。

這很重要

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

計算我們的Animals 陣列中的寵物數目

在這項工作中,您會建立數據輸入循環的結束準則,並建立迴圈 for ,以用來計算已指派數據的寵物 ourAnimals 數目。

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

  2. 找出switch(menuSelection)語句,然後尋找case "2":代碼行。

  3. Console.WriteLine()找出顯示「即將推出」訊息的語句,然後將它取代為空白程式代碼行。

  4. 在您建立的空白程式代碼行上,若要宣告 anotherPetpetCount 變數,請輸入下列程式代碼:

    string anotherPet = "y";
    int petCount = 0;
    

    這兩個變數會控制用來輸入新寵物資料的 while 迴圈反覆運算。 您會將這兩個變數初始化為宣告的一部分。

    • anotherPet迴圈開始之前,y會以while的值進行初始化。 它會在y循環內接收使用者指派的值,可能是nwhile

    • petCount 代表具有指派寵物特性的動物數目。 它會在 while 迴圈外指派已計算的值,而每次將新的動物新增至 1 陣列時,while 迴圈內會遞增 ourAnimals

    這很重要

    變數的範圍應該一律盡可能窄。 在 Contoso Pets 應用程式中,您可以在應用層級設置範圍 petCount,而不是將範圍限縮至 case "2": 程式碼區塊。 較大的範圍可讓您從應用程式中的任何位置存取 petCount 。 如果 petCount 的作用範圍是在應用層級,您可以在建立範例數據時賦予它一個值,並透過程式設計來管理它在整個應用程式其他部分的值。 例如,當您找到寵物的家,並從ourAnimals陣列中移除該寵物時,可以將petCount減少1。 問題是,當您不確定變數是否會用於應用程式的其他部分時,您應該在哪個層級設定變數的範圍? 在此情況下,即使您不在其他地方使用,仍會想要將 petCount 設定為應用程式層級的範圍。 畢竟,將 petCount 設為應用程式層級的範圍,可確保若你決定在其他位置使用它,就可以使用。 也許您也可以在應用層級設定其他變數的範圍。 如此一來,您的變數一律位於範圍中且可存取。 那麼,為什麼當您認為這些變數可能在稍後在應用程式中使用時,為何不要將變數的範圍設定在應用層級? 將變數的範圍設定為高於必要層級可能會導致問題。 提高的範圍會擴大應用程式的資源需求,並可能會讓您的應用程式面臨不必要的安全性風險。 隨著您的應用程式變得更大且更複雜的,它們需要更多資源。 手機和電腦在所屬範圍內時,會為這些資源配置記憶體。 隨著您的應用程式變得更「真實世界」,因此更容易存取。 應用程式通常可從雲端或其他應用程式存取。 將這些問題加在一起,應用程式通常會在未使用時保持執行狀態。 務必讓應用程式的資源需求受到控制,並盡可能減少安全性影響。 雖然現今的作系統在管理資源和保護應用程式方面做得非常出色,但仍最佳做法是將變數的範圍保持在實際所需的層級。 在 Contoso Pets 應用程式中,如果您決定在應用程式中更廣泛地使用 petCount ,您可以將程式代碼更新為較高層級的範圍 petCount。 請記得讓您的變數盡可能縮小範圍,並只在需要時增加其範圍。

  5. 在變數宣告下方的程式代碼行上,若要建立迴圈來逐一查看陣列中的 ourAnimals 動物,請輸入下列程序代碼:

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

    此程式代碼看起來應該很熟悉。 每次遍歷for陣列時,您都會使用此ourAnimals迴圈。

  6. 在我們的迴圈程式代碼區塊 for 內,若要檢查寵物特性數據是否已指派給動物,請輸入下列程序代碼:

    if (ourAnimals[i, 0] != "ID #: ")
    {
    }
    

    同樣地,此程式代碼看起來應該很熟悉。 每次檢查是否已指派寵物特性時,您都會使用此 if 語句。

  7. 在您建立的程式 if 代碼區塊中,若要遞增 petCount 1,請輸入下列程式代碼:

    petCount += 1;
    
  8. 花一分鐘檢視已完成的 for 迴圈。

    您的完整 for 迴圈應該如以下代碼所示:

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

    此程式碼將循環遍歷ourAnimals陣列以檢查指派的資料。 當找到已指派資料的動物時,它會遞增 petCounter

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

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

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

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

  11. 在繼續之前,請先修正您看到的所有建置錯誤。

    備註

    目前,您可以忽略有關 anotherPet 之已指派但從未使用的警告訊息。 您將在本練習稍後新增使用 anotherPet 的程式代碼。

    如果您有任何建置錯誤,請記住,建置錯誤和警告訊息會告訴您問題是什麼,您可以在何處找到問題。 如果您更新程式代碼,請記得在重建之前儲存變更。

  12. 關閉 [終端] 面板。

當 petCount 小於 maxPets 時顯示訊息輸出

在這項工作中,您會檢查是否 petCount 小於 ,如果小於 maxPets ,則會向使用者顯示訊息。

  1. 在您建立的for迴圈下方的空白代碼行上,若要查看petCount是否小於maxPets,請輸入以下程式碼:

    if (petCount < maxPets)
    {
    }
    
  2. if 陳述式的程式碼區塊中,若要向使用者顯示訊息,請輸入下列程式碼:

    Console.WriteLine($"We currently have {petCount} pets that need homes. We can manage {(maxPets - petCount)} more.");
    

    應用程式用戶即將輸入寵物特性。 此訊息提供重要的內容。

  3. 請花一分鐘的時間檢閱您 case "2": 程式語句的 switch 代碼分支。

    此時,您的程式 case "2": 代碼分支看起來應該像下列程序代碼:

    case "2":
        // Add a new animal friend to the ourAnimals array
        string anotherPet = "y";
        int petCount = 0;
        for (int i = 0; i < maxPets; i++)
        {
            if (ourAnimals[i, 0] != "ID #: ")
            {
                    petCount += 1;
            }
    
        }
    
        if (petCount < maxPets)
        {
            Console.WriteLine($"We currently have {petCount} pets that need homes. We can manage {(maxPets - petCount)} more.");
        }
    
        Console.WriteLine("Press the Enter key to continue.");
        readResult = Console.ReadLine();
        break;
    
  4. 在 [Visual Studio Code 檔案] 功能表上,選取 [儲存]。

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

  6. 在繼續之前,請先修正您看到的所有建置錯誤。

    再次,您可以忽略有關 anotherPet 被指派但從未使用的警告訊息。 在下一個工作中,您將開始建置 while 迴圈,以用來輸入一或多個寵物的數據。 您為迴圈建立的 while 表示式將會使用 anotherPet ,而且這個警告訊息將會消失。

    請記住,警告訊息是您應該關注的事項,但不會阻止您執行程式。

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

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

    只要您的程式代碼不會產生運行時錯誤,現在應用程式的主選單應該會顯示在 [終端機] 面板中。

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

    此值會對應至您的程式碼 case "2": 分支。

  9. 確認終端機中顯示下列訊息。

    We currently have 4 pets that need homes. We can manage 4 more.
    Press the Enter key to continue.
    

    如果您沒有看到預期的訊息顯示,請檢閱您的程式代碼以識別並修正問題。 儲存您的變更、重建,然後再次執行應用程式。 繼續之前,請務必讓程式代碼如預期般運作。

  10. 在終端機命令提示字元中,按 Enter 繼續執行您的應用程式。

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

建置循環結構,以用於輸入新的ourAnimals陣列數據

在這項任務中,您會建立一個while迴圈,當 anotherPet 等於 ypetCount 小於 maxPets 時,迴圈會不斷重複執行。

  1. 在程式代碼編輯器中,於程式 if (petCount < maxPets) 代碼區塊下方建立空白程式代碼行。

  2. 若要開始建立新 while 循環的程式,請輸入下列程式代碼:

    while (anotherPet == "y" && petCount < maxPets)
    {
    }
    
  3. 在 [Visual Studio Code 檔案] 功能表上,選取 [儲存]。

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

  5. 請注意,您不再收到關於anotherPet未使用的警告訊息。

    如果報告了任何建置錯誤或警告,請先修正問題再繼續。

檢查新寵物迴圈的結束條件

在這項工作中,您會更新 while (anotherPet == "y" && petCount < maxPets) 代碼區塊。 新的程式代碼會先使 petCount 遞增,然後檢查 petCount 是否小於 maxPets。 如果 petCount 小於 maxPets,則會詢問使用者是否要輸入另一隻寵物的資訊,並確保回應為 yn。 在 while (anotherPet == "y" && petCount < maxPets) 程式碼區塊之後,檢查 petCount 的值。 如果 petCount 等於 maxPets,您會通知使用者無法再新增任何寵物。

備註

用來輸入寵物數據的程式代碼會在下一個練習中開發。 現在, petCount 會遞增,就像輸入數據並儲存至 ourAnimals 陣列一樣。 這可讓您完成與 while 迴圈相關聯的程式代碼邏輯開發。

  1. 在您在上一個任務中建立的 while (anotherPet == "y" && petCount < maxPets) 循環的程式代碼區塊內建立空白行。

  2. 若要遞增 petCount,請輸入下列程式代碼:

    // increment petCount (the array is zero-based, so we increment the counter after adding to the array)
    petCount = petCount + 1;
    
  3. 若要檢查 是否 petCount 小於 maxPets,請輸入下列程式代碼:

    // check maxPet limit
    if (petCount < maxPets)
    {
    }
    
  4. 在您建立的語句的if程式碼區塊內,輸入以下程式碼以詢問使用者是否要新增另一隻寵物:

    // another pet?
    Console.WriteLine("Do you want to enter info for another pet (y/n)");
    
  5. 在您輸入的 WriteLine() 訊息下方,若要讀取用戶回應,並確定使用者輸入 「y」 或 「n」,請輸入下列程式代碼:

    do
    {
        readResult = Console.ReadLine();
        if (readResult != null)
        {
            anotherPet = readResult.ToLower();
        }
    
    } while (anotherPet != "y" && anotherPet != "n");
    
  6. 在您的break語句中,找出case "2";語句,這語句用來分隔case "3";switch

  7. 請注意 Console.WriteLine() 程式碼結尾的 Console.ReadLine()case "2"; 陳述式。

    此程式代碼會向使用者顯示訊息,然後暫停應用程式。

  8. 若要將 Console.WriteLine()Console.ReadLine() 語句括在 if 語句內,請按如下更新您的程式碼:

    
    if (petCount >= maxPets)
    {
        Console.WriteLine("Press the Enter key to continue.");
        readResult = Console.ReadLine();
    }
    
    break;
    
    case "3":
    

    petCount 的值會在 while 迴圈內遞增。 如果 petCount 等於 maxPets,則不能再將寵物新增至 ourAnimals 陣列。 您應該讓使用者知道何時發生此情況。

  9. 若要通知使用者 Contoso Pets 已達到其容量,請更新您的程式代碼,如下所示:

    
        if (petCount >= maxPets)
        {
            Console.WriteLine("We have reached our limit on the number of pets that we can manage.");
            Console.WriteLine("Press the Enter key to continue.");
            readResult = Console.ReadLine();
        }
    
        break;
    
    case "3":
    
  10. 花一分鐘的時間檢閱迴圈中的 while 程序代碼,以及您已建立的使用者訊息。

    要顯示使用者訊息的 while (anotherPet == "y" && petCount < maxPets) 迴圈和程式碼應該看起來如以下程式碼所示:

    while (anotherPet == "y" && petCount < maxPets)
    {
        // increment petCount (the array is zero-based, so we increment the counter after adding to the array)
        petCount = petCount + 1;
    
        // check maxPet limit
        if (petCount < maxPets)
        {
            // another pet?
            Console.WriteLine("Do you want to enter info for another pet (y/n)");
            do
            {
                readResult = Console.ReadLine();
                if (readResult != null)
                {
                    anotherPet = readResult.ToLower();
                }
    
            } while (anotherPet != "y" && anotherPet != "n");
        }
    }
    
    if (petCount >= maxPets)
    {
        Console.WriteLine("We have reached our limit on the number of pets that we can manage.");
        Console.WriteLine("Press the Enter key to continue.");
        readResult = Console.ReadLine();
    }
    
  11. 在 [Visual Studio Code 檔案] 功能表上,選取 [儲存]。

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

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

檢查您的工作

在這項工作中,您會從整合式終端機執行我們的應用程式,並確認您已建立的迴圈和分支邏輯如預期般運作。

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

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

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

  4. 確認您看到下列訊息:

    We currently have 4 pets that need homes. We can manage 4 more.
    Do you want to enter info for another pet (y/n)
    
  5. 在終端機命令提示字元中,輸入 n

  6. 確認您的程式代碼在您輸入 「n」 時結束輸入新寵物的迴圈。

    如果您的程式代碼邏輯如預期般運作,您應該會看到終端機中顯示的主功能表。

    如果您的程式代碼未在預期的情況下結束迴圈,請在終端機中按 Ctrl + C 以強制執行停止。 您必須手動逐行執行程式碼,並追蹤退出條件變數的值。 如有必要,請更新您的程式代碼,以確保使用者在輸入 「n」 時結束 while 迴圈。 儲存您的變更、重建程式,然後執行驗證測試以回到此時。

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

    再次顯示下列訊息:

    We currently have 4 pets that need homes. We can manage 4 more.
    Do you want to enter info for another pet (y/n)
    
  8. 在終端機命令提示字元中,輸入 y

  9. 請花一分鐘考慮 petCount 在程式碼中的使用方式。

    您必須先瞭解程式代碼邏輯,才能驗證程序代碼。

    在此情況下,您的程式代碼邏輯依賴於petCountmaxPets之間的關聯性。 您知道 maxPets 被指派的值是 8,但 petCount 呢? 下列項目可協助您評估您已實作的邏輯:

    • 您知道 petCount 即是 4 時,是在您輸入 while 迴圈的第一次反覆項目。

    • 您知道每當 petCount 迴圈執行時,while 就會遞增。

    • 您知道指派給 petCount 的值,以及遞增的方式 petCount 會影響數據儲存在陣列中 ourAnimals 的方式。 下列項目說明 petCountourAnimals 中所儲存數據之間的關聯性:

      • 應用程式會在建立範例數據時,將四隻寵物新增至 ourAnimals 陣列。
      • 當的值ourAnimalspetCount時,應用程式會將新的資料儲存至4陣列。 這不是錯誤。 當您回憶起陣列元素是以零起始時,程式代碼是合理的。 例如, ourAnimals[0,0] 包含動物 1 的寵物標識符,並 ourAnimals[3,0] 包含動物 4的寵物標識符。 因此,當petCount4時,您正在儲存第五隻寵物的數據。
      • 應用程式會將寵物資料儲存至陣列,然後再遞增 petCount
      • 應用程式會先遞增petCount,然後再提示使用者是否新增另一隻寵物。
      • 當應用程式第一次顯示「您要輸入另一隻寵物的資訊嗎 (y/n)?」的提示時,已被設定為 petCount
    • 如果使用者在第一次輸入 y您是否要輸入另一個寵物的資訊 (y/n) 的提示時,您就會知道:

      • 迴圈 while (anotherPet == "y" && petCount < maxPets) 將會反覆運行。 您知道循環會迭代,因為 anotherPet == "y"petCount < maxPets
      • petCount 迴圈執行時,指派給 while 的值將會遞增。
      • 指派給 petCount 的值將會是 6(使用者第一次輸入 y 之後)。

    當您繼續測試應用程式時,請記住此程式碼邏輯的分析。

  10. 請注意,終端機面板會以相同的「另一個寵物?」訊息更新,但您的程式碼並未顯示已更新的petCount

    終端機面板現在應該會顯示下列輸出:

    We currently have 4 pets that need homes. We can manage 4 more.
    Do you want to enter info for another pet (y/n)
    y
    Do you want to enter info for another pet (y/n)
    
  11. 在終端機命令提示字元中,輸入 y

    當您第二次輸入 y 時, petCount 會遞增至 7。 因此 petCount 仍然小於 maxPets

  12. 在終端機命令提示字元中,輸入 y

    當您輸入 y 第三次時, petCount 會遞增至 8。 因此 petCount 現在等於 maxPets

  13. 第三次輸入 while 時,請確認您的程式代碼是否結束迴圈。

    終端機面板現在應該會顯示下列輸出:

    We currently have 4 pets that need homes. We can manage 4 more.
    Do you want to enter info for another pet (y/n)
    y
    Do you want to enter info for another pet (y/n)
    y
    Do you want to enter info for another pet (y/n)
    y
    We have reached our limit on the number of pets that we can manage.
    Press the Enter key to continue.
    

    如果您的程式碼未如預期結束迴圈,請手動逐步執行程式碼,並追蹤允出準則變數的值。 更新您的程式代碼,以確保當 petCount 達到等於 maxPets 的值時,迴圈結束。 請持續回答「y」,直到您知道 petCount 等於 maxPets,其預設值為 8

  14. 在終端機命令提示字元中,按 Enter 繼續執行您的應用程式。

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