练习 - 添加建议的捐赠数据

已完成

在开发过程的本步骤中,你将更新起始项目文件夹中提供的代码,为应用程序添加“建议的捐赠”功能。 起始 project.cs 文件应在 Visual Studio Code 中打开。 如果需要入门说明,请返回到上一个准备单元。

创建“建议的捐赠”功能

添加的捐赠功能需要你创建 suggestedDonation 变量,并扩展 ourAnimals 数组以适应新的捐赠数据。 此外,你需要为每只动物添加建议的捐赠金额,并在缺少建议的捐赠信息时实现默认金额。

添加对建议的捐赠数据的支持

需要创建一个新变量来保存建议的捐赠,并扩展 ourAnimals 数组以保存新数据。

  1. 请注意注释 #1 下的代码,该代码声明用于填充每只动物的 ourAnimals 数组的变量。

    需要为建议的捐赠数据声明另一个 string

    // #1 the ourAnimals array will store the following: 
    string animalSpecies = "";
    string animalID = "";
    string animalAge = "";
    string animalPhysicalDescription = "";
    string animalPersonalityDescription = "";
    string animalNickname = "";
    
  2. animalNickname 的声明下方创建 suggestedDonation 变量。

    suggestedDonation 的声明是使用以下代码添加的:

    string suggestedDonation = "";
    
  3. 在注释 #3 下找到用于创建 ourAnimals 数组的代码。

    以下代码行创建数组:

    string[,] ourAnimals = new string[maxPets, 6];

    定义数组的两个维度的大小是宠物的最大数量 maxPets 和最初定义的六个字符串的数量 6,但没有空间容纳新的 suggestedDonation 数据。

  4. 更新 ourAnimals 数组以保存每只动物的 7“列”数据,而不是 6

    下行显示了更新的代码:

    string[,] ourAnimals = new string[maxPets, 7];

    你扩展了 ourAnimals 数组以支持添加 suggestedDonation 的数据。

向示例数据添加 suggestedDonation 金额

  1. 花一点时间查看注释 #4 下 switch 语句内的 case 0:

    以下代码在创建 suggestedDonation 数据之前为第一个宠物定义示例数据。 它非常适合用在 animalNickname 下!

        case 0:
            animalSpecies = "dog";
            animalID = "d1";
            animalAge = "2";
            animalPhysicalDescription = "medium sized cream colored female golden retriever weighing about 45 pounds. housebroken.";
            animalPersonalityDescription = "loves to have her belly rubbed and likes to chase her tail. gives lots of kisses.";
            animalNickname = "lola";
            break;
    
  2. 使用以下值在 break 语句上为 case 0;default: 插入 suggestedDonation 值:

    • 案例 0:suggestedDonation = "85.00";
    • 案例 1:suggestedDonation = "49.99";
    • 案例 2:suggestedDonation = "40.00";
    • 案例 3:suggestedDonation = "";
    • 默认值:suggestedDonation = "";

    以下代码显示添加了“suggestedDonation”的 case 0: 代码:

        case 0:
            animalSpecies = "dog";
            animalID = "d1";
            animalAge = "2";
            animalPhysicalDescription = "medium sized cream colored female golden retriever weighing about 45 pounds. housebroken.";
            animalPersonalityDescription = "loves to have her belly rubbed and likes to chase her tail. gives lots of kisses.";
            animalNickname = "lola";
            suggestedDonation = "85.00";
            break;
    
  3. 在你的 project.cs 文件中,找到以下用 case 语句中的宠物数据填充的数组(它就在注释 #5 前面):

        ourAnimals[i, 0] = "ID #: " + animalID;
        ourAnimals[i, 1] = "Species: " + animalSpecies;
        ourAnimals[i, 2] = "Age: " + animalAge;
        ourAnimals[i, 3] = "Nickname: " + animalNickname;
        ourAnimals[i, 4] = "Physical description: " + animalPhysicalDescription;
        ourAnimals[i, 5] = "Personality: " + animalPersonalityDescription;
    
  4. 请注意,suggestedDonation 数据未作为用于填充数组的示例数据起始代码的一部分包含在内。

    可以使用类似下面的语句来填充数组:

    ourAnimals[i, 6] = "Suggested Donation: "  + suggestedDonation;
    

    但是,你未添加该代码。 在下一部分中,你将使用另一种方法。

使用 TryParse() 进行数据验证

尽管变量 suggestedDonation 旨在作为数值,但却被作为 string 收集并存储。 考虑将来的情况,您必须验证 suggestedDonation 是否表示小数,并且能将其转换为小数,以便用于计费计算。 若要避免用户在文本格式输入数字时出现错误,例如 twenty,需要使用 TryParse 验证。

注意

本练习中的代码示例是根据 en-US 区域性设置而设计的,使用句点 (.) 作为小数点分隔符。 在使用其他小数分隔符(如逗号 ,)的区域性设置下生成和运行代码经常会产生意外的结果或错误。 若要解决此问题,请将代码示例中的句点小数点分隔符替换为你的本地小数点分隔符(例如 ,)。 或者,若要使用 en-US 区域性设置运行程序,请将 using System.Globalization; 添加到程序顶部。 在任何其他 using 语句之后,添加 CultureInfo.CurrentCulture = new CultureInfo("en-US");

  1. 在注释 #5 之前,在代码块的末尾处添加代码以验证 suggestedDonation 是否可以转换为小数。

    添加以下代码:

    if (!decimal.TryParse(suggestedDonation, out decimalDonation)){
        decimalDonation = 45.00m; // if suggestedDonation NOT a number, default to 45.00
    }
    

    suggestedDonation如果变量无法强制转换为变量decimal,则代码将赋值默认值decimalDonation = 45.00m;。 如果强制转换成功,TryParse 将填充 decimalDonation。 无论哪种方式,decimalDonation 都表示正确的小数。

  2. 确保验证代码位于正确位置!

    添加的两行应在代码中显示为以下代码的前两行:

        if (!decimal.TryParse(suggestedDonation, out decimalDonation)){
            decimalDonation = 45.00m; // if suggestedDonation NOT a number, default to 45.00
        }
    }
    
    // #5 display the top-level menu options
    

    请注意,验证仍然不起作用。 请记住,你需要声明 decimalDonation 才能在代码中使用它。

  3. 在注释 #2 下面声明 decimalDonation,在 string menuSelection = ""; 的后面进行:

    decimal decimalDonation = 0.00m;
    

    最后,你已准备好为每只宠物填充 suggestedDonation 数据。

  4. 在注释 #5 之前,紧邻完成的 TryParse 右中括号 } 之后添加以下代码:

    ourAnimals[i, 6] = $"Suggested Donation: {decimalDonation:C2}";
    

    你使用了建议的捐赠数据的 decimalDonation 版本。 你还在输出中使用了字符串内插和货币格式设置。

  5. 花一点时间查看建议的捐赠数据最终是如何融入到 ourAnimals 数组中的。

    以下代码会在 TryParse() 的上下文中填充 ourAnimals 数组:

    if (!decimal.TryParse(suggestedDonation, out decimalDonation)){
        decimalDonation = 45.00m; // if suggestedDonation NOT a number, default to 45.00
        }
    ourAnimals[i, 6] = $"Suggested Donation: {decimalDonation:C2}";
    }
    
    // #5 display the top-level menu options
    

    请注意,通过使用代码 {decimalDonation:C2},建议的捐赠(来自 decimalDonation)按照货币格式设置 :C2 的指示显示当地货币符号和两个小数位数。

查看并更新应使用 ourAnimals 数组的位置

添加 suggestedDonation 数据后需要进一步更新。 菜单选项 "1. List all of our current pet information" 缺少添加的数据。

  1. 请注意注释 #5 下的代码,针对 case 1 中的菜单循环。

    打印宠物属性的内部循环“for (int j = 0; j < 6; j++)”需要考虑到添加的 suggestedDonation 数据。

  2. 更新内部循环代码退出条件。 将退出条件增加“1”,因此它变得 j <7。 检查代码是否与以下代码匹配:

    case "1":
    // list all pet info
    for (int i = 0; i < maxPets; i++)
    {
        if (ourAnimals[i, 0] != "ID #: ")
        {
            Console.WriteLine();
            for (int j = 0; j < 7; j++) // increased exit condition
            {
                Console.WriteLine(ourAnimals[i, j]);
            }
        }
    }
    

测试概述

添加多个代码后,需要确认代码是否按预期工作。 两个重要的测试区域是:

  1. 代码编译,未出现错误。

  2. 选择菜单选项 1 所有宠物信息将显示:

    • 输出包括所有示例宠物信息,包括:ID、物种、年龄、昵称、身体描述和性格描述。
    • 对于每只宠物,会用货币符号和两个小数位数的精度显示建议的捐赠。

检查你的工作

生成并运行以测试代码。 每次需要测试代码时,请使用这些步骤。

  1. 在 Visual Studio Code 的“文件”菜单上,选择“保存”。

  2. 在“资源管理器”视图中,右键单击“Starter”,然后选择“在集成终端中打开”

    终端面板应会在代码编辑器区域下方打开。

    可通过多种方式打开 Visual Studio Code 的集成终端。 例如,顶部菜单提供从“视图”菜单和“终端”菜单对终端面板的访问。 此外,打开 TERMINAL 面板的键盘快捷方式是提高编码效率的宝贵选项。 每种方法都是可接受的。

  3. 请注意,终端面板包含命令行提示符,并且提示符显示当前文件夹路径。 例如:

    C:\Users\someuser\Desktop\GuidedProject\Starter>
    

    可以使用终端面板运行命令行接口 (CLI) 命令,例如 dotnet builddotnet rundotnet build 命令将编译代码,并显示与代码语法相关的错误和警告消息。

    重要说明

    需要确保终端命令提示符对项目工作区的根目录打开。 在本例中,项目工作区的根目录是 Starter 文件夹,Starter.csproj 和 Program.cs 文件位于该文件夹中。 在终端中运行命令时,这些命令会尝试使用当前文件夹位置执行作。 如果尝试从不包含文件的文件夹位置运行 dotnet builddotnet run 命令,这些命令将生成错误消息。

  4. 在终端命令提示符处,若要生成项目代码,请输入以下命令:dotnet build

    几秒钟后,应会看到一条消息,告知生成成功,有 0 Warnings and 0 Errors

    Determining projects to restore...
    All projects are up-to-date for restore.
    Starter -> C:\Users\someuser\Desktop\GuidedProject\Starter\bin\Debug\net6.0\Starter.dll
    
    Build succeeded.
        0 Warning(s)
        0 Error(s)
    

    注意

    每次需要在此模块中的练习中测试代码时,请使用之前的步骤 dotnet builddotnet run

  5. 如果看到“错误”或“警告”消息,需要先修复它们,然后再继续。

    “错误”和“警告”消息列出了可在其中找到问题的代码行。 以下消息是 Build FAILED 错误消息的示例:

    C:\Users\someuser\Desktop\GuidedProject\Starter\Program.cs(53,18): error CS1002: ; expected [C:\Users\someuser\Desktop\GuidedProject\Starter\Starter.csproj]

    此消息告知检测到的错误类型以及查找位置。 在本例中,消息告知你 Program.cs 文件包含错误 - error CS1002: ; expected; expected 表明你忘记了在语句末尾处包含 ;。 消息的 Program.cs(53,18) 部分告知你错误位于代码行 53 上左侧 18 个字符的位置。

    类似这样的语法错误会阻止生成成功(生成失败)。 某些生成消息提供“警告”而不是“错误”,这意味着需要考虑一些事项,但你可以尝试运行程序(生成成功)。

    修复问题并保存更新后,可以再次运行 dotnet build 该命令。 继续,直到有 0 Warning(s) and 0 Error(s)

    如果在自行解决问题时遇到问题,请检查安装过程中下载中包括的最终文件夹中的Program.cs代码。 “最终”文件夹中Program.cs代码表示本模块中所有练习的结论,因此它包含尚未创建的代码。

    解决方案代码看起来通常与此时在引导式项目中开发的 Program.cs 代码不同。 但是,可以在 Final 中检查Program.cs代码,以帮助隔离和修复代码中的问题。

    在开发自己的解决方案时避免依赖解决方案代码。 请记住,从错误中吸取教训,每个开发人员都花点时间来查找和修复错误。

  6. 测试更新的控制台应用,在终端命令提示符处,输入 dotnet run 以使用一个命令来生成并运行项目代码。 代码运行时,会显示两个菜单项。

    • 输入“1”以测试“显示所有宠物”输出
    • 输入“2”以测试占位符消息“正在构造中”消息

    菜单项 #1 的输出应与以下示例紧密匹配:

    ID #: d1
    Species: dog
    Age: 2
    Nickname: lola
    Physical description: medium sized cream colored female golden retriever weighing about 45 pounds. housebroken.
    Personality: loves to have her belly rubbed and likes to chase her tail. gives lots of kisses.
    Suggested Donation: $85.00
    
    ID #: d2
    Species: dog
    Age: 9
    Nickname: gus
    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.
    Suggested Donation: $49.99
    
    ID #: c3
    Species: cat
    Age: 1
    Nickname: snow
    Physical description: small white female weighing about 8 pounds. litter box trained.
    Personality: friendly
    Suggested Donation: $40.00
    
    ID #: c4
    Species: cat
    Age:
    Nickname: lion
    Physical description:
    Personality:
    Suggested Donation: $45.00
    

    如果一切按预期正常工作,那么恭喜你! 否则,请通过检查所涉及的代码指令步骤来查找错误。 如果需要,请从新的起始 Project.cs 文件开始,如果仍然遇到问题,请检查此练习的解决方案文件夹代码。

  7. 在应用菜单中键入 exit 来结束程序,然后关闭终端面板。