我本周刚刚开始学习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();
}
}
}
答案 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)
创建infinite-loop。所以现在循环永远不会结束,除非我们明确告诉它。
接下来,您只需解析结果并确保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.");
}
}
快乐编码!