You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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")}");
    }
}

关键改进说明

  1. 明确输入指引: 用Console.WriteLine输出提示,用户清楚知道需要输入什么。
  2. 简化循环逻辑: 单个while循环控制录入流程,输入"0"直接终止,逻辑清晰易懂。
  3. 输入安全验证: 使用TryParse确保用户输入有效数字,避免崩溃并给出友好提示。
  4. 正确计算逻辑: 单个商品小计用实际输入值计算,整体小计随商品录入累加,税费和总计在录入完成后统一计算。
  5. 清晰输出格式: 先打印商品明细表头与所有商品,再一次性打印总计信息,排版整齐易读。
  6. 代码可维护性: 将税率设为常量,变量命名统一规范,便于后续修改。

内容的提问来源于stack exchange,提问作者eeeee12345

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 19:18:32