3

だから私はJavaを始めたばかりで、他のいくつかの言語の経験が少しあります。私はこの基本的な電卓を作ろうとしましたが、多くの問題がありましたが、ほとんどの問題を解決することができました. 私が理解できない最後のことは、プログラムが1回実行されるたびに、ランダムにトリガーされる「これは無効な入力です」です。「...」は無関係なコードを示します。他のすべては正常に機能しているようです。前もって感謝します!

import java.util.Scanner;
public class Calc {
...
        System.out.println("Would you like to use the calculator?(Y/N)");
        while(use){
            String usage=in.nextLine().toLowerCase();
            if(usage.equals("n")){use=false;}
        //input
            //operations
            else if(usage.equals("y")){
                ...(calculator code)
            System.out.println("Continue use? (Y/N)");
            }
            else {System.out.println("That is not a valid input");}
        }
    }
}

私のコードを数回実行した後、私の出力は

Would you like to use the calculator?(Y/N)
Y
Please input an operation: +,-,*,/,%, ^, or root
+
Calculator: Please input your first number.
1
Now enter your second number.
2
Calculating
3.0
Continue use? (Y/N)
That is not a valid input  <-- right there is the confusing part, why is that triggered?
Y
Please input an operation: +,-,*,/,%, ^, or root

何らかの形で必要な場合は、完全なコードがペーストビンにあります。http://pastebin.com/Qee2Hxe3

4

3 に答える 3

6

私は完全なコードをチェックし、ループが最初に繰り返される直前に への呼び出しがあります。このメソッドは double を読み取りますが、行末を消費in.nextDouble()しません。これにより、次のリターンがすぐに返され、後続のテストが失敗します。in.readLine()\n

簡単な解決策は、ラインエンドを手動で消費することです。

System.out.println(ans);
System.out.println("Continue use? (Y/N)");
in.nextLine();
于 2013-06-28T14:03:06.340 に答える
3

コードをテストしたところ、次のように while ループ内でスキャナーを宣言することで解決できることがわかりました。

while (use) {
            Scanner in = new Scanner(System.in);
            String usage = in.nextLine().toLowerCase();

問題は次のとおりです。まず、while ループに入り、使用法が in.nextLine() に等しく設定されます。次の行がないので、あなたが入力するのを待ちます。yes と入力してから、数式を入力します。その後、答えを返し、while ループの先頭に戻ります。繰り返しになりますが、使用法は in.nextLine と同じに設定されていますが、既に次の行 (空白行) があるため、使用法は "y" でも "n" でもない空の文字列 ("") に設定されています。次に、すぐに最後の「else」オプションに移動し、「無効な」メッセージを出力します。
while ループの反復ごとにスキャナーを再割り当てすると、この問題が解決します。

于 2013-06-28T14:45:51.907 に答える
2

計算時にコードで読み取った最後の入力は次のとおりです。

  num2=in.nextDouble();

これにより、次の文字が読み取られ、double に変換されます。ただし、番号を入力するときに、Enter キーも押します。これは、double が読み取られた後も、入力バッファーに改行文字が残っていることを意味します。

コードが に戻ると、String usage=in.nextLine().toLowerCase(); この改行が読み取られます。

たとえば、次のようにして、空の入力を無視することができます

 String usage=in.nextLine().toLowerCase().trim();
 if (usage.isEmpty()) {
      continue;
  }
于 2013-06-28T14:08:27.047 に答える