2017-06-04 12 views
0

whileループを使用して、ユーザーが「はい」または「いいえ」以外の文字を入力すると、何か新しいものを入力するように指示しますが、トップから戻るのではなく、 "それはオプションではありません"というスパムだけです。誰かがなぜ私に説明することができますか?前もって感謝します。それはあなたがちょうどそれのためにそれらを促したことがない「それはオプションではありません」プリントアウトした後Cant get 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(); 


     } 

    } 





    } 
} 
+0

あなたが二度目に、ユーザーの選択肢を読んだことがない、あなたはwhileループの外でそれを行うと、ループ内であなただけの、これはオプションではありません」印刷"と繰り返します。 elseブロックのコードをwhileループの外側にある同じ行で更新するだけです。 - Choice1 = Console.ReadLine(); ' – pstrjds

+0

BTW、ようこそ。あなたがプログラムすることを学んでいることは素晴らしいことです。私は、この質問をタイポグラフィの誤りの結果であると票決したにもかかわらず、質問をすることについてあなたが落胆することを望んでいませんでした。あなたがプログラムを学ぶにつれて、より多くの質問があります。そして、これはそれらの質問に答えるためのすばらしいフォーラムです。別の関連しない別のメモとして、比較するときに[string.Equals](https://msdn.microsoft.com/en-us/library/858x0yyx(v = vs.110).aspx)メソッドを使用して調べることができます'文字列'比較するときに序数、大文字と小文字を区別する、文化などを指定することができます。 – pstrjds

+0

ありがとう! – Laneciar

答えて

2

プログラムを入力するユーザーのための新しい答えを待っています。あなたはまた、再び彼らの新しい入力に基づいて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(); 
} 
+0

ありがとうございました! – Laneciar

-1

恐らく入力の正しい検証を行わないという問題があります。 これで、コンソールからの入力を読み込み、静的な文字列と比較するので、 「追加」は「追加」と異なり、「追加(スペース)」とは異なります。 私はあなたがより強力な入力検証を行うことをお勧め:

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?"); 
    .... 
} 
+0

プロンプトが示唆しているように、 'Case Sensitive'の検証は正しいです。大文字小文字を区別しないようにするには、' OrdinalIgnoreCase'かそのような性質のような比較型を受け入れる 'string.Equals'オーバーライドを使う方が良いでしょう。繰り返しループの問題は、コンソールから読み込み中の結果をフロアにダンプするelseステートメントの「追加」の検証とは関係がないため、ループは最新のものを保存するのではなく、誤った同じ値をチェックし続けます入力されたもの。 – pstrjds

+0

私は知っている、私は新しいユーザーのための簡単なソリューションを提供します。この関数を実装した場合は、フラグ付きのenum.TryParseを使用します。私の答えは正しい入力検証の重要性です。 – Linefinc

+0

私はあなたが言っていることを理解しています、私は私のダウンワードの理由を説明していました、あなたは実際の問題に答えていません。問題はループの入力ではなく、 "Add"と入力したユーザの検証ではなく、 "おそらくあなたの問題はあなたが正しい検証をしていないということです" – pstrjds

関連する問題