2016-10-31 5 views
0

私はプログラミングとjavaを初めて使用しており、正しく動作することがありますが、矛盾していることがあります。私は特定の値で一度それを実行し、直接前と同じ正確な入力で再実行しようとしました。次回以降は動作しません。この信頼性をいかに修正するかを教えてください。私は自分のコードでこれの理由を見つけることができません。助けてください。正確に同じ入力値でプログラムが予期せず実行される

import java.util.*; 
public class Calculator { 

    public static void main(String[] args) { //void 
     boolean done = false; 
     Scanner console = new Scanner(System.in); 
     while (!done){ 
      displayMenu(); 
      String selection = getUsersSelection(console); 
      done = processSelection(selection, console); 
      //caluculateResults(console); 
     } 
     System.out.println("Thank you for using this program"); 
    } 

    private static boolean processSelection(String selection, Scanner console) { 
     boolean done = false; 
     if (!selection.equalsIgnoreCase("Q")){ 
      if (selection.equalsIgnoreCase("U")){ 
       caluculateResults(console); 
       } 
      else if (selection.equalsIgnoreCase("H")){ 

      } 
      else { 
       System.out.println("Incorrect entry...try again!"); 
      } 
     } 
     else { 
      done = true; 
     } 
     return done; 
    } 

    private static void caluculateResults(Scanner console) { 
     displayCalculatorInstructions(); 
     double operand1 = console.nextDouble(); 
     char operator = console.next().charAt(0); 
     double operand2 = console.nextDouble(); 
     double result = 0.00; //double from int 
     boolean isOperatorValid = true; 
     if (operator == '+'){ 
      result = operand1 + operand2; 
     } 
     else if (operator == '-'){ 
      result = operand1 - operand2; 
} 
     else if (operator == '*'){ 
      result = (double) operand1 * (double) operand2; 
     } 
     else if (operator == '/'){ 
      if (operand2 != 0.00){ 
       result = operand1/operand2; 
      } 
      else { 
       result = (int)Double.NaN; 
      } 
     } 
     else if (operator == '^'){ 
      result = Math.pow(operand1, operand2); 
     } 
     else { 
      isOperatorValid = false; 
      System.out.println("Invalid operator"); 
} 
     if (isOperatorValid){ 
      System.out.println("The result of your operation is: "); 
      System.out.printf(operand1 +" "+operator+" "+operand2+" = %5.3f", result); 
      System.out.println(); 
     } 
    } 

    private static void displayCalculatorInstructions() { 
     System.out.println("Enter a mathematical expression to evaluate"); 
     System.out.println("Valid operations are: +, -, /, *,^for power"); 
     System.out.println("Expression are entered with spaces between the values and operator"); 
     System.out.println("Here is the valid format:"); 
     System.out.println("\t<value><space><operator><space><value>"); 
     System.out.print("Your expression: "); 
    } 


    private static String 
    private static void displayMenu() { 
     System.out.println("Enter one these options:"); 
     System.out.println("\tH for Help"); 
     System.out.println("\tU for using calculator"); 
     System.out.println("\tQ for exiting this program"); 
     System.out.print("Your selection: ");getUsersSelection(Scanner console) { 
     String selection = console.next(); 
return selection; 
    } 

    } 

} 
+0

'この不確かさを修正する'私はあなたが本当にこの動作を見ているのか疑問です。どちらの場合も同じ入力が正確に入力されていることは確かですか? –

+0

私はあなたのコードを実行し、その正常に動作しています。あなたは信頼できない答えを得ている入力を教えてくれますか? –

+0

出力結果がどのように変化するのか不思議です。たとえば、私の入力は12.2^3でした。初めての出力は1815.848で、2度目は無効な入力警告を受け取りました。 – Elea

答えて

0

上記の提供されたコードは、少し変更を加えることなくコンパイルされると確信しています。私はあなたのcaluculateResultsメソッドとは異なる結果を得たことがないので、どこかで入力が悪いと確信しています。 「;」after private static Stringの中

主な問題は、まず、コンパイラが行方不明について警告でしょう...これは問題のカップルを持っている

private static String 
private static void displayMenu() { 
    System.out.println("Enter one these options:"); 
    System.out.println("\tH for Help"); 
    System.out.println("\tU for using calculator"); 
    System.out.println("\tQ for exiting this program"); 
    System.out.print("Your selection: ");getUsersSelection(Scanner console) { 
    String selection = console.next(); 
    return selection; 
} 

} 

の下にあなたの供給displayMenu方法です。そして、System.out.print("Your selection: ");getUsersSelection(Scanner console) {という行はまったく見えません。ユーザー入力を選択しようとしているようですか?それから?最後にこのメソッドでは、selectionという文字列変数を返すように見えますが、メソッドにはStringを返すシグネチャはなく、メインメソッドでもそれをキャプチャしていません。この場合、Stringを返すと仮定します。 以下は、このメソッドの変更点です。あなたの主な方法で

private static String displayMenu(Scanner console) 
{ 
    System.out.println("Enter one these options:"); 
    System.out.println("\tH for Help"); 
    System.out.println("\tU for using calculator"); 
    System.out.println("\tQ for exiting this program") 
    System.out.print("Your selection: "); 
    String selection = console.next(); 
    return selection; 
} 

...

public static void main(String[] args) 
{ 
    boolean done = false; 
    Scanner console = new Scanner(System.in); 
    while (!done){ 
     displayMenu(); 
     String selection = getUsersSelection(console); 
     done = processSelection(selection, console); 
     //caluculateResults(console); 
    } 
    System.out.println("Thank you for using this program"); 
} 

マイナーな変更がメインで必要とされます。まず、displayMenu()はキャプチャしない文字列を返すことになっています。あなたはそれをキャプチャしていないので、displayMenu()はユーザに入力を求めただけですが、あなたはそれを取得しなかったので、基本的にユーザに再度入力を求めています。だから、で文字列を返すので、displayMenu()からユーザーの入力を取得して、単純に行を削除してくださいString selection = getUsersSelection(console);これは、あなたのメソッドのcalculateResultsがテストで異なる結果を出すことはないので、

public static void main(String[] args) 
{ 
    boolean done = false; 
    Scanner console = new Scanner(System.in); 
    while (!done) 
    { 
    String selection = displayMenu(console); 
    done = processSelection(selection, console); 
    System.out.println(""); 
    } 
    System.out.println("Thank you for using this program"); 
} 

希望します。

+0

これは非常に徹底した、ありがとうございます。 – Elea

関連する問題