練習 - 建置和測試迴圈以輸入新的寵物數據
在此練習中,您會開發控制新 ourAnimals 陣列資料輸入的程式碼。 您可以計算迴圈控件變數的初始值,並建構迴圈,以收集動物的使用者指定數據。 在此練習期間完成的詳細工作如下:
- 計算 petCount:撰寫程式代碼,計算已指派數據之陣列中的
ourAnimals寵物數目。 - 條件式訊息:撰寫程式代碼,以在
petCount小於maxPets時顯示訊息輸出。 - 外部迴圈:建置迴圈結構,以用於輸入新的
ourAnimals陣列資料。 - 允出準則:撰寫程式碼,評估「輸入新的 ourAnimals 陣列資料」迴圈的允出條件。
- 驗證測試:針對您在此練習中開發的程式代碼執行驗證測試。
這很重要
您必須先完成本課程模組中的上一個練習,才能開始此練習。
計算我們的Animals 陣列中的寵物數目
在這項工作中,您會建立數據輸入循環的結束準則,並建立迴圈 for ,以用來計算已指派數據的寵物 ourAnimals 數目。
確定 Visual Studio Code 已開啟,且您的Program.cs檔案會顯示在編輯器中。
找出
switch(menuSelection)語句,然後尋找case "2":代碼行。Console.WriteLine()找出顯示「即將推出」訊息的語句,然後將它取代為空白程式代碼行。在您建立的空白程式代碼行上,若要宣告
anotherPet和petCount變數,請輸入下列程式代碼:string anotherPet = "y"; int petCount = 0;這兩個變數會控制用來輸入新寵物資料的
while迴圈反覆運算。 您會將這兩個變數初始化為宣告的一部分。在
anotherPet迴圈開始之前,y會以while的值進行初始化。 它會在y循環內接收使用者指派的值,可能是n或while。petCount代表具有指派寵物特性的動物數目。 它會在while迴圈外指派已計算的值,而每次將新的動物新增至1陣列時,while迴圈內會遞增ourAnimals。
這很重要
變數的範圍應該一律盡可能窄。 在 Contoso Pets 應用程式中,您可以在應用層級設置範圍
petCount,而不是將範圍限縮至case "2":程式碼區塊。 較大的範圍可讓您從應用程式中的任何位置存取petCount。 如果petCount的作用範圍是在應用層級,您可以在建立範例數據時賦予它一個值,並透過程式設計來管理它在整個應用程式其他部分的值。 例如,當您找到寵物的家,並從ourAnimals陣列中移除該寵物時,可以將petCount減少1。 問題是,當您不確定變數是否會用於應用程式的其他部分時,您應該在哪個層級設定變數的範圍? 在此情況下,即使您不在其他地方使用,仍會想要將petCount設定為應用程式層級的範圍。 畢竟,將petCount設為應用程式層級的範圍,可確保若你決定在其他位置使用它,就可以使用。 也許您也可以在應用層級設定其他變數的範圍。 如此一來,您的變數一律位於範圍中且可存取。 那麼,為什麼當您認為這些變數可能在稍後在應用程式中使用時,為何不要將變數的範圍設定在應用層級? 將變數的範圍設定為高於必要層級可能會導致問題。 提高的範圍會擴大應用程式的資源需求,並可能會讓您的應用程式面臨不必要的安全性風險。 隨著您的應用程式變得更大且更複雜的,它們需要更多資源。 手機和電腦在所屬範圍內時,會為這些資源配置記憶體。 隨著您的應用程式變得更「真實世界」,因此更容易存取。 應用程式通常可從雲端或其他應用程式存取。 將這些問題加在一起,應用程式通常會在未使用時保持執行狀態。 務必讓應用程式的資源需求受到控制,並盡可能減少安全性影響。 雖然現今的作系統在管理資源和保護應用程式方面做得非常出色,但仍最佳做法是將變數的範圍保持在實際所需的層級。 在 Contoso Pets 應用程式中,如果您決定在應用程式中更廣泛地使用petCount,您可以將程式代碼更新為較高層級的範圍petCount。 請記得讓您的變數盡可能縮小範圍,並只在需要時增加其範圍。在變數宣告下方的程式代碼行上,若要建立迴圈來逐一查看陣列中的
ourAnimals動物,請輸入下列程序代碼:for (int i = 0; i < maxPets; i++) { }此程式代碼看起來應該很熟悉。 每次遍歷
for陣列時,您都會使用此ourAnimals迴圈。在我們的迴圈程式代碼區塊
for內,若要檢查寵物特性數據是否已指派給動物,請輸入下列程序代碼:if (ourAnimals[i, 0] != "ID #: ") { }同樣地,此程式代碼看起來應該很熟悉。 每次檢查是否已指派寵物特性時,您都會使用此
if語句。在您建立的程式
if代碼區塊中,若要遞增petCount1,請輸入下列程式代碼:petCount += 1;花一分鐘檢視已完成的
for迴圈。您的完整
for迴圈應該如以下代碼所示:for (int i = 0; i < maxPets; i++) { if (ourAnimals[i, 0] != "ID #: ") { petCount += 1; } }此程式碼將循環遍歷
ourAnimals陣列以檢查指派的資料。 當找到已指派資料的動物時,它會遞增petCounter。在 [Visual Studio Code 檔案] 功能表上,選取 [儲存]。
在 Visual Studio Code 中開啟 [整合式終端機] 面板,然後輸入命令以建置程式。
若要從 [總管] 檢視開啟 [整合式終端],請以滑鼠右鍵按一下 [起始],然後選取 [在整合式終端中開啟]。 您也可以使用 [ 檢視 ] 或 [ 終端機 ] 功能表來開啟 [整合式終端機] 面板。
若要建置程式,請從終端機命令提示字元輸入
dotnet build命令。在繼續之前,請先修正您看到的所有建置錯誤。
備註
目前,您可以忽略有關
anotherPet之已指派但從未使用的警告訊息。 您將在本練習稍後新增使用anotherPet的程式代碼。如果您有任何建置錯誤,請記住,建置錯誤和警告訊息會告訴您問題是什麼,您可以在何處找到問題。 如果您更新程式代碼,請記得在重建之前儲存變更。
關閉 [終端] 面板。
當 petCount 小於 maxPets 時顯示訊息輸出
在這項工作中,您會檢查是否 petCount 小於 ,如果小於 maxPets ,則會向使用者顯示訊息。
在您建立的
for迴圈下方的空白代碼行上,若要查看petCount是否小於maxPets,請輸入以下程式碼:if (petCount < maxPets) { }在
if陳述式的程式碼區塊中,若要向使用者顯示訊息,請輸入下列程式碼:Console.WriteLine($"We currently have {petCount} pets that need homes. We can manage {(maxPets - petCount)} more.");應用程式用戶即將輸入寵物特性。 此訊息提供重要的內容。
請花一分鐘的時間檢閱您
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;在 [Visual Studio Code 檔案] 功能表上,選取 [儲存]。
在 Visual Studio Code 中開啟 [整合式終端機] 面板,然後輸入命令以建置程式。
在繼續之前,請先修正您看到的所有建置錯誤。
再次,您可以忽略有關
anotherPet被指派但從未使用的警告訊息。 在下一個工作中,您將開始建置while迴圈,以用來輸入一或多個寵物的數據。 您為迴圈建立的while表示式將會使用anotherPet,而且這個警告訊息將會消失。請記住,警告訊息是您應該關注的事項,但不會阻止您執行程式。
在終端機命令提示字元中,輸入命令以執行程式。
在
dotnet run終端機命令提示字元中輸入 命令,以執行程序代碼。只要您的程式代碼不會產生運行時錯誤,現在應用程式的主選單應該會顯示在 [終端機] 面板中。
在終端機命令提示字元中,輸入 2
此值會對應至您的程式碼
case "2":分支。確認終端機中顯示下列訊息。
We currently have 4 pets that need homes. We can manage 4 more. Press the Enter key to continue.如果您沒有看到預期的訊息顯示,請檢閱您的程式代碼以識別並修正問題。 儲存您的變更、重建,然後再次執行應用程式。 繼續之前,請務必讓程式代碼如預期般運作。
在終端機命令提示字元中,按 Enter 繼續執行您的應用程式。
結束應用程式,然後關閉終端機面板。
建置循環結構,以用於輸入新的ourAnimals陣列數據
在這項任務中,您會建立一個while迴圈,當 anotherPet 等於 y 且 petCount 小於 maxPets 時,迴圈會不斷重複執行。
在程式代碼編輯器中,於程式
if (petCount < maxPets)代碼區塊下方建立空白程式代碼行。若要開始建立新
while循環的程式,請輸入下列程式代碼:while (anotherPet == "y" && petCount < maxPets) { }在 [Visual Studio Code 檔案] 功能表上,選取 [儲存]。
在 Visual Studio Code 中開啟 [整合式終端機] 面板,然後輸入命令以建置程式。
請注意,您不再收到關於
anotherPet未使用的警告訊息。如果報告了任何建置錯誤或警告,請先修正問題再繼續。
檢查新寵物迴圈的結束條件
在這項工作中,您會更新 while (anotherPet == "y" && petCount < maxPets) 代碼區塊。 新的程式代碼會先使 petCount 遞增,然後檢查 petCount 是否小於 maxPets。 如果 petCount 小於 maxPets,則會詢問使用者是否要輸入另一隻寵物的資訊,並確保回應為 y 或 n。 在 while (anotherPet == "y" && petCount < maxPets) 程式碼區塊之後,檢查 petCount 的值。 如果 petCount 等於 maxPets,您會通知使用者無法再新增任何寵物。
備註
用來輸入寵物數據的程式代碼會在下一個練習中開發。 現在, petCount 會遞增,就像輸入數據並儲存至 ourAnimals 陣列一樣。 這可讓您完成與 while 迴圈相關聯的程式代碼邏輯開發。
在您在上一個任務中建立的
while (anotherPet == "y" && petCount < maxPets)循環的程式代碼區塊內建立空白行。若要遞增
petCount,請輸入下列程式代碼:// increment petCount (the array is zero-based, so we increment the counter after adding to the array) petCount = petCount + 1;若要檢查 是否
petCount小於maxPets,請輸入下列程式代碼:// check maxPet limit if (petCount < maxPets) { }在您建立的語句的
if程式碼區塊內,輸入以下程式碼以詢問使用者是否要新增另一隻寵物:// another pet? Console.WriteLine("Do you want to enter info for another pet (y/n)");在您輸入的
WriteLine()訊息下方,若要讀取用戶回應,並確定使用者輸入 「y」 或 「n」,請輸入下列程式代碼:do { readResult = Console.ReadLine(); if (readResult != null) { anotherPet = readResult.ToLower(); } } while (anotherPet != "y" && anotherPet != "n");在您的
break語句中,找出case "2";語句,這語句用來分隔case "3";與switch。請注意
Console.WriteLine()程式碼結尾的Console.ReadLine()和case "2";陳述式。此程式代碼會向使用者顯示訊息,然後暫停應用程式。
若要將
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陣列。 您應該讓使用者知道何時發生此情況。若要通知使用者 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":花一分鐘的時間檢閱迴圈中的
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(); }在 [Visual Studio Code 檔案] 功能表上,選取 [儲存]。
在 Visual Studio Code 中開啟 [整合式終端機] 面板,然後輸入命令以建置程式。
在繼續之前,修正您看到的任何建置錯誤或警告。
檢查您的工作
在這項工作中,您會從整合式終端機執行我們的應用程式,並確認您已建立的迴圈和分支邏輯如預期般運作。
如有必要,請開啟 Visual Studio Code 的 [整合式終端] 面板。
在終端機命令提示字元中,輸入 dotnet run
在終端機命令提示字元中,輸入 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)在終端機命令提示字元中,輸入 n
確認您的程式代碼在您輸入 「n」 時結束輸入新寵物的迴圈。
如果您的程式代碼邏輯如預期般運作,您應該會看到終端機中顯示的主功能表。
如果您的程式代碼未在預期的情況下結束迴圈,請在終端機中按 Ctrl + C 以強制執行停止。 您必須手動逐行執行程式碼,並追蹤退出條件變數的值。 如有必要,請更新您的程式代碼,以確保使用者在輸入 「n」 時結束
while迴圈。 儲存您的變更、重建程式,然後執行驗證測試以回到此時。在終端機命令提示字元中,輸入 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)在終端機命令提示字元中,輸入 y
請花一分鐘考慮
petCount在程式碼中的使用方式。您必須先瞭解程式代碼邏輯,才能驗證程序代碼。
在此情況下,您的程式代碼邏輯依賴於
petCount與maxPets之間的關聯性。 您知道maxPets被指派的值是8,但petCount呢? 下列項目可協助您評估您已實作的邏輯:您知道
petCount即是4時,是在您輸入while迴圈的第一次反覆項目。您知道每當
petCount迴圈執行時,while就會遞增。您知道指派給
petCount的值,以及遞增的方式petCount會影響數據儲存在陣列中ourAnimals的方式。 下列項目說明petCount與ourAnimals中所儲存數據之間的關聯性:- 應用程式會在建立範例數據時,將四隻寵物新增至
ourAnimals陣列。 - 當的值
ourAnimals為petCount時,應用程式會將新的資料儲存至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 之後)。
- 迴圈
當您繼續測試應用程式時,請記住此程式碼邏輯的分析。
請注意,終端機面板會以相同的「另一個寵物?」訊息更新,但您的程式碼並未顯示已更新的
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)在終端機命令提示字元中,輸入 y
當您第二次輸入
y時,petCount會遞增至7。 因此petCount仍然小於maxPets在終端機命令提示字元中,輸入 y
當您輸入
y第三次時,petCount會遞增至8。 因此petCount現在等於maxPets第三次輸入
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。在終端機命令提示字元中,按 Enter 繼續執行您的應用程式。
結束應用程式,然後關閉終端機面板。