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

C#控制台程序:如何实现嵌套while循环独立执行?

解决嵌套while循环冲突的问题

我看了你的代码,问题出在内层循环的逻辑设计上——当用户输入错误的薪资发放类型时,你把AskQuestion设为false,导致内层循环结束,但外层的while(wageCalculated == false)还在运行,所以整个程序就重启了。而且内层循环没有重新读取用户的输入,根本达不到“重复询问直到输入正确”的目的。

下面是修复后的思路和代码:

关键修复点

  • 内层循环应该持续运行直到用户输入W或B,所以要在输入错误时重新读取用户输入,保持循环条件为true直到输入正确。
  • 把“是否重启程序”的逻辑移到内层循环外面,确保只有当用户完成一次正确的薪资计算后,才会触发重启询问。
  • 重置内层循环的状态变量,避免后续循环出现异常。

修改后的完整代码

using System;

namespace WageCalc
{
    class Program
    {
        static void Main(string[] args)
        {
            // Variables
            string hourWorkedInput;
            string wageInput;
            double hourlyWage = 0.00;
            int hoursWorkedAWeek = 0;
            double payCheck;
            bool wageCalculated = false;

            // Actual Code
            while (!wageCalculated)
            {
                Console.WriteLine("Welcome to the Monthly Wage Calculator");
                Console.WriteLine("Please enter how much you are paid an hour");
                wageInput = Console.ReadLine();
                // 新增:处理非数字输入的异常情况
                while (!double.TryParse(wageInput, out hourlyWage))
                {
                    Console.WriteLine("请输入有效的数字!");
                    wageInput = Console.ReadLine();
                }

                Console.WriteLine("Please enter how many hours you work a week");
                hourWorkedInput = Console.ReadLine();
                // 新增:处理非整数输入的异常情况
                while (!int.TryParse(hourWorkedInput, out hoursWorkedAWeek))
                {
                    Console.WriteLine("请输入有效的整数!");
                    hourWorkedInput = Console.ReadLine();
                }

                Console.WriteLine("Do you get paid (W)eekly or (B)iweekly?");
                string often = Console.ReadLine();
                bool askQuestion = true;

                // 内层循环:仅处理薪资类型输入错误的重复询问
                while (askQuestion)
                {
                    if (often.Equals("W", StringComparison.OrdinalIgnoreCase))
                    {
                        payCheck = hoursWorkedAWeek * hourlyWage;
                        Console.WriteLine("You will make {0} on every paycheck", payCheck);
                        askQuestion = false; // 输入正确,结束内层循环
                    }
                    else if (often.Equals("B", StringComparison.OrdinalIgnoreCase))
                    {
                        payCheck = (hoursWorkedAWeek * 2) * hourlyWage;
                        Console.WriteLine("You will make {0} on every paycheck", payCheck);
                        askQuestion = false; // 输入正确,结束内层循环
                    }
                    else
                    {
                        Console.WriteLine("Please pick W or B");
                        often = Console.ReadLine(); // 重新读取用户输入,继续循环
                    }
                }

                // 内层循环结束后,统一询问是否重启程序
                Console.WriteLine("Would you like to Calculate another Paycheck?");
                string repeat = Console.ReadLine();
                switch (repeat.ToUpper())
                {
                    case "Y":
                        wageCalculated = false;
                        break;
                    case "N":
                        wageCalculated = true;
                        break;
                    default:
                        Console.WriteLine("Invalid input, exiting program.");
                        wageCalculated = true;
                        break;
                }
            }
        }
    }
}

额外优化说明

  • 新增了double.TryParse和int.TryParse逻辑,避免用户输入非数字内容导致程序崩溃。
  • 用StringComparison.OrdinalIgnoreCase实现不区分大小写的输入识别,用户输入w或b也能正常响应,提升交互友好度。
  • 彻底分离了两个循环的职责:内层循环只负责修正薪资类型的错误输入,外层循环只控制整个程序的重启逻辑,两者不再互相干扰。

这样修改后,输入错误的薪资类型时只会重复询问该问题,不会触发整个程序重启,完全符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:58:08