练习 - 添加建议的捐赠数据
在开发过程的本步骤中,你将更新起始项目文件夹中提供的代码,为应用程序添加“建议的捐赠”功能。 起始 project.cs 文件应在 Visual Studio Code 中打开。 如果需要入门说明,请返回到上一个准备单元。
创建“建议的捐赠”功能
添加的捐赠功能需要你创建 suggestedDonation 变量,并扩展 ourAnimals 数组以适应新的捐赠数据。 此外,你需要为每只动物添加建议的捐赠金额,并在缺少建议的捐赠信息时实现默认金额。
添加对建议的捐赠数据的支持
需要创建一个新变量来保存建议的捐赠,并扩展 ourAnimals 数组以保存新数据。
请注意注释 #1 下的代码,该代码声明用于填充每只动物的
ourAnimals数组的变量。需要为建议的捐赠数据声明另一个
string。// #1 the ourAnimals array will store the following: string animalSpecies = ""; string animalID = ""; string animalAge = ""; string animalPhysicalDescription = ""; string animalPersonalityDescription = ""; string animalNickname = "";在
animalNickname的声明下方创建suggestedDonation变量。suggestedDonation的声明是使用以下代码添加的:string suggestedDonation = "";在注释 #3 下找到用于创建
ourAnimals数组的代码。以下代码行创建数组:
string[,] ourAnimals = new string[maxPets,6];定义数组的两个维度的大小是宠物的最大数量
maxPets和最初定义的六个字符串的数量6,但没有空间容纳新的suggestedDonation数据。更新
ourAnimals数组以保存每只动物的7“列”数据,而不是6。下行显示了更新的代码:
string[,] ourAnimals = new string[maxPets,7];你扩展了
ourAnimals数组以支持添加suggestedDonation的数据。
向示例数据添加 suggestedDonation 金额
花一点时间查看注释 #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;使用以下值在
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;- 案例 0:
在你的 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;请注意,
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");。
在注释 #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都表示正确的小数。确保验证代码位于正确位置!
添加的两行应在代码中显示为以下代码的前两行:
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才能在代码中使用它。在注释 #2 下面声明
decimalDonation,在string menuSelection = "";的后面进行:decimal decimalDonation = 0.00m;最后,你已准备好为每只宠物填充
suggestedDonation数据。在注释 #5 之前,紧邻完成的
TryParse右中括号}之后添加以下代码:ourAnimals[i, 6] = $"Suggested Donation: {decimalDonation:C2}";你使用了建议的捐赠数据的
decimalDonation版本。 你还在输出中使用了字符串内插和货币格式设置。花一点时间查看建议的捐赠数据最终是如何融入到
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" 缺少添加的数据。
请注意注释 #5 下的代码,针对
case 1中的菜单循环。打印宠物属性的内部循环“
for (int j = 0; j <6; j++)”需要考虑到添加的suggestedDonation数据。更新内部循环代码退出条件。 将退出条件增加“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 所有宠物信息将显示:
- 输出包括所有示例宠物信息,包括:ID、物种、年龄、昵称、身体描述和性格描述。
- 对于每只宠物,会用货币符号和两个小数位数的精度显示建议的捐赠。
检查你的工作
生成并运行以测试代码。 每次需要测试代码时,请使用这些步骤。
在 Visual Studio Code 的“文件”菜单上,选择“保存”。
在“资源管理器”视图中,右键单击“Starter”,然后选择“在集成终端中打开”。
终端面板应会在代码编辑器区域下方打开。
可通过多种方式打开 Visual Studio Code 的集成终端。 例如,顶部菜单提供从“视图”菜单和“终端”菜单对终端面板的访问。 此外,打开 TERMINAL 面板的键盘快捷方式是提高编码效率的宝贵选项。 每种方法都是可接受的。
请注意,终端面板包含命令行提示符,并且提示符显示当前文件夹路径。 例如:
C:\Users\someuser\Desktop\GuidedProject\Starter>可以使用终端面板运行命令行接口 (CLI) 命令,例如
dotnet build和dotnet run。dotnet build命令将编译代码,并显示与代码语法相关的错误和警告消息。重要说明
需要确保终端命令提示符对项目工作区的根目录打开。 在本例中,项目工作区的根目录是 Starter 文件夹,Starter.csproj 和 Program.cs 文件位于该文件夹中。 在终端中运行命令时,这些命令会尝试使用当前文件夹位置执行作。 如果尝试从不包含文件的文件夹位置运行
dotnet build或dotnet run命令,这些命令将生成错误消息。在终端命令提示符处,若要生成项目代码,请输入以下命令:
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 build和dotnet run。如果看到“错误”或“警告”消息,需要先修复它们,然后再继续。
“错误”和“警告”消息列出了可在其中找到问题的代码行。 以下消息是
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代码,以帮助隔离和修复代码中的问题。
在开发自己的解决方案时避免依赖解决方案代码。 请记住,从错误中吸取教训,每个开发人员都花点时间来查找和修复错误。
测试更新的控制台应用,在终端命令提示符处,输入
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 文件开始,如果仍然遇到问题,请检查此练习的解决方案文件夹代码。
- 输入“
在应用菜单中键入
exit来结束程序,然后关闭终端面板。