练习 - 生成和测试用于输入新宠物数据的循环

已完成

在本练习中,你将开发用于控制新 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 循环的迭代。 将这两个变量初始化为声明的一部分。

    • anotherPety 循环开始前用 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。 请记住,将变量的范围保持尽可能窄,并仅在需要时才增加其范围。

  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 中打开集成终端面板,并输入用于生成程序的命令。

    若要从 EXPLORER 视图中打开“集成终端”,请右键单击 “初学者”,然后选择“ 在集成终端中打开”。 还可以使用 “视图 ”或“ 终端 ”菜单打开“集成终端”面板。

    若要生成程序,请从终端命令提示符输入 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 循环的第一次迭代时,4while

    • 你知道每次 petCount 循环迭代时 while 都会递增。

    • 你知道分配给 petCount 的值以及递增的方式 petCount 会影响数据存储在数组中 ourAnimals 的方式。 以下项目说明了petCount与存储在ourAnimals中的数据之间的关系:

      • 应用程序在创建示例数据时将 ourAnimals 四个宠物添加到数组。
      • ourAnimals的值为petCount时,应用程序会将新数据存储到4数组中。 这不是一个漏洞。 当你回忆起数组元素是从零开始的时,代码是有意义的。 例如, ourAnimals[0,0] 包含动物 1 的宠物 ID,并 ourAnimals[3,0] 包含动物 4的宠物 ID。 因此,当petCount4时,您正在存储第五只宠物的数据。
      • 应用程序会在增加 petCount 之前将宠物数据存储到数组中。
      • 应用程序会在提示用户添加其他宠物之前增加 petCount
      • 当应用程序第一次显示“您想为其他宠物输入信息吗(y/n)?”提示时, 已设置为
    • 如果用户在第一次 您是否要为另一只宠物输入信息 (y/n) 提示时输入 y,则您知道:

      • 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. 退出应用程序,然后关闭终端面板。