无法获取while循环工作
我正在使用while循环使其在用户输入除“Yes”或“No”之外的任何内容时,它会告诉他们输入新的内容,但每次输入其他内容时只是垃圾邮件“这不是一个选项”,而不是从顶端开始。有人可以向我解释为什么?先谢谢你。无法获取while循环工作
using System;
class CalculatorProgram
{
//varibale for do-while loop
private static string endAnswer;
public static void Main() // <----- The Entry point
{
//Variables
string Choice1;
string mathChoice;
decimal Num1;
decimal Num2;
decimal Answer;
bool userWrong = true;
Console.Write("Would you like to use Lane's Custom Calculator?(Yes/No): ");
Choice1 = Console.ReadLine();
while(userWrong)
{
if (Choice1 == "Yes")
{
do
{
Console.Write("Would you like to Add, Subtract, Multiply, or Divide? (Case Sensitive): ");
mathChoice = Console.ReadLine();
//User inputs the 2 numbers
//Math Choices
if (mathChoice == "Add")
{
Console.WriteLine("What 2 numbers would you like to use?");
Console.Write("Number 1 is: ");
Num1 = decimal.Parse(Console.ReadLine());
Console.Write("Number 2 is: ");
Num2 = decimal.Parse(Console.ReadLine());
Answer = Num1 + Num2;
Console.WriteLine("Your expression is: " + Num1 + " + " + Num2 + " = " + Answer);
}
else if (mathChoice == "Subtract")
{
Console.WriteLine("What 2 numbers would you like to use?");
Console.Write("Number 1 is: ");
Num1 = decimal.Parse(Console.ReadLine());
Console.Write("Number 2 is: ");
Num2 = decimal.Parse(Console.ReadLine());
Answer = Num1 - Num2;
Console.WriteLine("Your expression is: " + Num1 + " - " + Num2 + " = " + Answer);
}
else if (mathChoice == "Multiply")
{
Console.WriteLine("What 2 numbers would you like to use?");
Console.Write("Number 1 is: ");
Num1 = decimal.Parse(Console.ReadLine());
Console.Write("Number 2 is: ");
Num2 = decimal.Parse(Console.ReadLine());
Answer = Num1 * Num2;
Console.WriteLine("Your expression is: " + Num1 + " X " + Num2 + " = " + Answer);
}
else if (mathChoice == "Divide")
{
Console.WriteLine("What 2 numbers would you like to use?");
Console.Write("Number 1 is: ");
Num1 = decimal.Parse(Console.ReadLine());
Console.Write("Number 2 is: ");
Num2 = decimal.Parse(Console.ReadLine());
Answer = Num1/Num2;
Console.WriteLine("Your expression is: " + Num1 + "/" + Num2 + " = " + Answer);
}
else
{
Console.WriteLine("This is not an option! Shutting Down..");
Console.ReadKey();
Environment.Exit(0);
}
//varibale for while loop to continue if selected Yes.
Console.Write("Another Equation?: ");
endAnswer = Console.ReadLine();
} while (endAnswer == "Yes");
//Goodbye Message
Console.WriteLine("Thank you for using my program, goodbye ");
Console.ReadKey();
Environment.Exit(0);
userWrong = false;
}
//If someone selects no for wanting to use my program.
else if (Choice1 == "No")
{
Console.WriteLine("Thank you for using my program, goodbye ");
Console.ReadKey();
Environment.Exit(0);
}
else
{
Console.WriteLine("That is not an option");
Console.ReadLine();
}
}
}
}
该程序正在等待用户输入新的答案后,它打印出“这不是一个选项”,你只是从来没有提示他们。你也绝不会存储Choice1
再根据他们对新的输入,所以它总是会检查您do-while循环的第一if
条件用他们最初插嘴说。
要解决它,你else
分支体更改为类似这个。
//...
else
{
Console.WriteLine("That is not an option");
// reprompt the user so they know to type something in
Console.Write("Would you like to use Lane's Custom Calculator?(Yes/No): ");
// store the new choice to recheck next loop iteration
Choice1 = Console.ReadLine();
}
非常感谢你! – Laneciar
可能你的问题是你没有对输入做出正确的验证。 现在,您从控制台读取输入并与静态字符串进行比较,因此 “添加”与“添加”不同,并且与“添加(空间)”不同。 我建议你做一个更强大的输入验证:
Console.Write("Would you like to Add, Subtract, Multiply, or Divide? (Case Sensitive): ");
mathChoice = Console.ReadLine();
mathChoice = mathChoice.ToUpper().Trim();
//User inputs the 2 numbers
//Math Choices
if (mathChoice == "ADD")
{
Console.WriteLine("What 2 numbers would you like to use?");
....
}
根据提示的提示,“区分大小写”的验证是正确的,为了使其不区分大小写,最好使用接受比较类型的'string.Equals'覆盖,比如'OrdinalIgnoreCase'或其他类似的东西。然而,重复循环的问题与从控制台读取的else语句中的“添加”它的验证无关,但将结果转储到地板上,因此循环继续检查相同的错误值,而不是存储最新的一个进入。 – pstrjds
我知道,我为新用户提供了一个简单的解决方案。如果我实现了这个功能,我将使用带有标志的enum.TryParse。我的回答是关于正确输入验证的重要性。 – Linefinc
我明白你在说什么,我正在解释我的downvote的原因,你没有回答实际问题。问题在于没有读入循环中的输入,而不是用户键入“添加”的验证,但你声明“可能你的问题是你没有做出正确的验证......” – pstrjds
你没读过的用户选择第二次,你这样做的,而循环之外,然后在循环里,你只是打印“这是不是一种选择“并重复。只需用你在while循环之外的同一行更新你的代码就可以了:'Choice1 = Console.ReadLine();' – pstrjds
顺便说一句,欢迎来到SO。您正在学习编程并且我不希望您在提问时感到气馁,即使我已经投票决定将此问题视为排版错误的结果。当你学习编程时,你会有更多的问题,这是一个很好的论坛来解答这些问题。作为另一个无关的方面说明,您可能希望在比较时使用[string.Equals](https://msdn.microsoft.com/en-us/library/858x0yyx(v = vs.110).aspx)方法'strings'。它允许您在比较时指定序号,区分大小写,文化等。 – pstrjds
非常感谢! – Laneciar