while while循环是否在没有满足条件的情况下进入下一步

时间:2017-08-09 12:11:13

标签: c# do-while

我本周刚刚开始学习C#,并试图运行一个简单的代码,提示用户输入一个数字,如果他们输入文本,或提示他们输入一个正数,如果他们输入一个负数(所以文本的布尔运算,以及负数的if语句。如果他们输入有效(正)数字,程序将继续执行其余步骤。

然而,使用此代码,如果用户输入负数,然后是文本,则输入另一个负数等等,它似乎打破了循环并继续进行下一个操作。

代码是更大程序的一部分,因此我将其缩小并仅拉出最关键的部分以便运行。有人能够发现我在这里错过的东西吗?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace IncomeTaxCalculator
{
    class IncomeTax
    {
        public static void Main()
        {
            double income;
            income = income_input();
            show_output(income);
        }
        public static double income_input()
        {
            double income; string income_string; bool bad_value = true;
            do
            {
                Console.Write("What is your total income: ");
                income_string = Console.ReadLine();
                if (double.TryParse(income_string, out income))
                {
                    bad_value = false;
                }
                else
                {
                    Console.WriteLine("Enter your income as a whole-dollar numeric figure.");
                }
                if (income < 0)
                {
                    Console.WriteLine("Your income cannot be a negative");
                }
            } while (bad_value || income < 0);
            return income;
        }
              public static void show_output(double income)
        {
            Console.WriteLine("Your income is " + income);
            Console.WriteLine("\n\n Hit Enter to exit.");
            Console.ReadLine();
        }
    }
}

3 个答案:

答案 0 :(得分:4)

这是发生了什么。输入负数时,bad_value将设置为false。然后,当您输入非数字值income时,TryParse将设置为0。现在你bad_value || income < 0的条件是假的。要解决此问题,您只需在每个循环开始时将bad_value重置为true。

另外,你可以像RenéVogt建议在其他地方将bad_value设置为true,另外在if中检查它是否为负数然后你可以while(bad_value)

do
{
    Console.Write("What is your total income: ");
    income_string = Console.ReadLine();
    if (double.TryParse(income_string, out income))
    {
        bad_value = false;
    }
    else
    {
        Console.WriteLine("Enter your income as a whole-dollar numeric figure.");
        bad_value = true;
    }
    if (income < 0)
    {
        Console.WriteLine("Your income cannot be a negative");
        bad_value = true;
    }
} while (bad_value);

答案 1 :(得分:0)

将您的代码更改为:

 double income;
 string income_string;
 do
 {
        Console.Write("What is your total income: ");
        income_string = Console.ReadLine();
 } while (!double.TryParse(income_string, out income) || income < 0);
//rest of your code here, in another method that takes the valid income

您应该将从中获得收入的方法拆分为具有(业务)逻辑的方法。

答案 2 :(得分:0)

我意识到这已经被接受,但这可以在一个简单的循环中完成。为什么不在满足值时创建无限循环和break / return。而不是检查无效输入搜索有效输入。

我不会详细说明为什么这是一个更可接受的解决方案,考虑给出的指令,如果你输入无效的输入,那么你的指令是错误的。而是检查积极的结果。 Read This!!

static double income_input()
{
    double income = double.NaN;
    while (true)
    {
        Console.WriteLine("What is your income?:");
        if (double.TryParse(Console.ReadLine(), out income) && income > 0)
            return income;
        Console.WriteLine("Invalid input. Please enter a valid number greater than zero.");
    }
}

我们在这里所做的一切都是使用while(true)创建。所以现在循环永远不会结束,除非我们明确告诉它。

接下来,您只需解析结果并确保double.TryParse成功和income > 0的条件。请注意,返回只是退出循环。

现在编译(注意最后没有返回),因为编译器理解唯一的退出点是通过return语句。 Example Post

如果您想使用最短的代码,可以使用inline variables的一些C#7语法。

static double income_input()
{
    while (true)
    {
        Console.WriteLine("What is your income?:");
        if (double.TryParse(Console.ReadLine(), out double income) && income > 0)
            return income;
        Console.WriteLine("Invalid input. Please enter a valid number greater than zero.");
    }
}

快乐编码!