练习 - 生成和测试用于输入新宠物数据的循环
在本练习中,你将开发用于控制新 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代码块中,要将petCount增加 1,请输入以下代码: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 中打开集成终端面板,并输入用于生成程序的命令。
若要从 EXPLORER 视图中打开“集成终端”,请右键单击 “初学者”,然后选择“ 在集成终端中打开”。 还可以使用 “视图 ”或“ 终端 ”菜单打开“集成终端”面板。
若要生成程序,请从终端命令提示符输入
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如何在代码中使用。需要先了解代码逻辑,然后才能验证代码。
在这种情况下,代码逻辑依赖于两者之间的关系
petCountmaxPets。 你知道maxPets被分配了一个值8,那么petCount呢? 以下项有助于评估已实现的逻辑:你了解在进入
petCount循环的第一次迭代时,4为while。你知道每次
petCount循环迭代时while都会递增。你知道分配给
petCount的值以及递增的方式petCount会影响数据存储在数组中ourAnimals的方式。 以下项目说明了petCount与存储在ourAnimals中的数据之间的关系:- 应用程序在创建示例数据时将
ourAnimals四个宠物添加到数组。 - 当
ourAnimals的值为petCount时,应用程序会将新数据存储到4数组中。 这不是一个漏洞。 当你回忆起数组元素是从零开始的时,代码是有意义的。 例如,ourAnimals[0,0]包含动物1的宠物 ID,并ourAnimals[3,0]包含动物4的宠物 ID。 因此,当petCount是4时,您正在存储第五只宠物的数据。 - 应用程序会在增加
petCount之前将宠物数据存储到数组中。 - 应用程序会在提示用户添加其他宠物之前增加
petCount。 - 当应用程序第一次显示
“您想为其他宠物输入信息吗(y/n)?”提示时, 已设置为 。
- 应用程序在创建示例数据时将
如果用户在第一次 您是否要为另一只宠物输入信息 (y/n) 提示时输入 y,则您知道:
-
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 继续运行应用程序。
退出应用程序,然后关闭终端面板。