C#购物清单程序调试求助:循环逻辑与控制台输出问题
C#购物清单程序问题分析与修正
核心问题梳理
- 无输入提示: 原代码将提示文本存入
items数组而非打印到控制台,用户完全看不到输入指引。 - 循环逻辑混乱: 外层
do-while循环多余,终止条件i != 0毫无意义;判断录入终止的逻辑错误,拿提示字符串和"0"对比,而非用户实际输入的内容。 - 变量与计算错误:
- 重复命名变量(
subtotal/subTotal/Subtotal)导致计算逻辑混乱,且税费、总计仅在初始化时计算一次,未随商品录入更新。 - 单个商品小计计算错误,用提示文本而非实际输入的价格、数量值计算。
- 重复命名变量(
- 计数错误: 每次录入商品时
count被递增两次,导致计数是实际商品数的两倍。 - 输出逻辑错误: 嵌套循环重复打印总计信息多次,格式混乱。
- 输入不安全: 使用
Convert.ToDouble强制转换,用户输入非数字会直接崩溃。
修正后的代码
using System; class ShoppingListProgram { static void Main() { // 存储商品信息:[商品名, 单价, 数量, 单个小计] string[,] items = new string[100, 4]; int itemCount = 0; decimal totalSubtotal = 0; const decimal TaxRate = 0.065M; // 税率常量,便于维护 while (itemCount < 100) { // 输入商品名称 Console.WriteLine("请输入商品名称(输入0终止录入):"); string itemName = Console.ReadLine().Trim(); if (itemName == "0") break; // 输入商品单价(带验证) decimal price; while (true) { Console.WriteLine("请输入商品单价:"); if (decimal.TryParse(Console.ReadLine(), out price) && price > 0) break; Console.WriteLine("无效输入,请输入正数价格!"); } // 输入商品数量(带验证) int quantity; while (true) { Console.WriteLine("请输入商品数量:"); if (int.TryParse(Console.ReadLine(), out quantity) && quantity > 0) break; Console.WriteLine("无效输入,请输入正整数数量!"); } // 计算并累加小计 decimal itemSubtotal = price * quantity; totalSubtotal += itemSubtotal; // 存储商品信息 items[itemCount, 0] = itemName; items[itemCount, 1] = price.ToString("0.00"); items[itemCount, 2] = quantity.ToString(); items[itemCount, 3] = itemSubtotal.ToString("0.00"); itemCount++; } // 计算最终税费与总计 decimal tax = totalSubtotal * TaxRate; decimal total = totalSubtotal + tax; // 打印购物清单 Console.WriteLine("\n===== 购物清单 ====="); if (itemCount == 0) { Console.WriteLine("未录入任何商品"); return; } // 打印表头与明细 Console.WriteLine($"{"商品名称",-15} {"单价",-10} {"数量",-8} {"小计",-10}"); Console.WriteLine(new string('-', 43)); for (int i = 0; i < itemCount; i++) { Console.WriteLine($"{items[i,0],-15} ${items[i,1],-9} {items[i,2],-8} ${items[i,3],-9}"); } // 打印总计信息 Console.WriteLine(new string('-', 43)); Console.WriteLine($"{"商品总数:",-33} {itemCount}"); Console.WriteLine($"{"不含税小计:",-33} ${totalSubtotal.ToString("0.00")}"); Console.WriteLine($"{"税费(6.5%):",-33} ${tax.ToString("0.00")}"); Console.WriteLine($"{"总计:",-33} ${total.ToString("0.00")}"); } }
关键改进说明
- 明确输入指引: 用
Console.WriteLine输出提示,用户清楚知道需要输入什么。 - 简化循环逻辑: 单个
while循环控制录入流程,输入"0"直接终止,逻辑清晰易懂。 - 输入安全验证: 使用
TryParse确保用户输入有效数字,避免崩溃并给出友好提示。 - 正确计算逻辑: 单个商品小计用实际输入值计算,整体小计随商品录入累加,税费和总计在录入完成后统一计算。
- 清晰输出格式: 先打印商品明细表头与所有商品,再一次性打印总计信息,排版整齐易读。
- 代码可维护性: 将税率设为常量,变量命名统一规范,便于后续修改。
内容的提问来源于stack exchange,提问作者eeeee12345
相关产品推荐
相关产品推荐

