我本周刚刚开始学习 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("nn Hit Enter to exit.");
Console.ReadLine();
}
}
}
这是正在发生的事情。 当您输入负数时bad_value
将设置为 false。 然后,当您输入非数字值时income
将被TryParse
设置为 0。 现在你的bad_value || income < 0
条件是错误的。 要修复它,您只需在每个循环开始时将bad_value
重置为 true。
或者,您可以像 René Vogt 建议的那样,在 else 中将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);
我意识到这已经被接受,但这可以在一个更简单的循环中完成。为什么不创建一个无限循环并在满足值时break
/return
。而不是检查无效输入,而是搜索有效输入。
我不会详细说明为什么这是一个更可接受的解决方案,请考虑给出的说明,如果您执行无效输入,那么您的说明是错误的。而是检查阳性结果。读这个!!
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 语句。示例帖子
如果你想使用尽可能短的代码,可以对内联变量使用一些 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.");
}
}
快乐编码!.
将代码更改为如下所示:
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
您应该将获取收入的方法与包含(业务(逻辑的方法分开。