0

いくつかの if-else ステートメントのネストに問題があります。少なくともそれが問題だと思います。私はこのコードを理解するために何度か解体したので、元の状態に戻して助けを求めることにしました。ユーザーは、3 から 15 までの奇数を入力するように求められます。その入力を検証し、3 から 15 までの範囲でない場合は、エラー メッセージを出力する必要があります。奇数でない場合も同様で、別の数値を出力する必要があります。以下のコードを実行しているときに、偶数、文字、または <3 または >15 の数字を入力すると、両方のエラー メッセージが表示されます。入力が 3 から 15 の間の奇数であれば、問題なく動作します。2つのエラーを区別する必要があることはわかっていますが、それを行う方法を理解して、コードを適切に実行/機能させることができませんでした。運が悪い場合は、他の方法も試しました。確かにそれはばかげたことですが、私の間違いのほとんどはばかげた側にあるようです。ご協力いただきありがとうございます!

public static void main(String[] args) {

    // Declare variables
    String inputString;
    boolean done = false;
    int numRows = 0;

    // Prompt for user input  
    do
    {
        inputString = JOptionPane
            .showInputDialog("Enter number of rows (odd number between 3 and 15): ");

        // Validating input
        try
        {
            numRows = Integer.parseInt(inputString);
        }
        catch (NumberFormatException e)
        {
            done = true;
        }
        if(numRows % 2 == 0) // Validating input is an odd number
             done = true; 
        if((numRows < 3) || (numRows > 15))// Validating input is between 3 and 15
            done = true;
        else
            done = false;

        if(done)
            JOptionPane.showMessageDialog(null, "Error, not an ODD number. Re-enter odd number between 3 and 15",
                "Error", JOptionPane.ERROR_MESSAGE);    

        if(done)
            JOptionPane.showMessageDialog(null, "Error, number not between 3 and 15. Re-enter odd number between 3 and 15",
                "Error", JOptionPane.ERROR_MESSAGE);
        }
    while(done);
    }
4

1 に答える 1

4

ここで興味深いのは、if ステートメントが必要ないことです。ブール式を大幅に簡素化 (および修正) できます。

まず、 の動作を確立しましょう(numRows < 3) || (numRows > 15)。これが真であるためにnumRowsは、厳密に 3 未満、または厳密に 15 より大きい必要があります。これは数値の範囲を検証しません。これを AND ステートメントに切り替える必要があります。しかし、それだけでは正しい範囲が検証されません。3 ~ 15以外のすべてを検証することになります。

それを修正するには、不等式を反転する必要があります。

あなたは今持ってい(numRows >= 3) && (numRows <= 15)ます。これが真であるためにnumRowsは、3 から 15 の範囲内にある必要があります。

さて、それを奇数/偶数のチェックと組み合わせてみましょう。これに到達します。

 done = (numRows % 2 == 0) || ((numRows >= 3) && (numRows <= 15));

このステートメントの動作は次のとおりです。

  • いずれかnumRowsが偶数、または
  • numRowsは 3 から 15 の間でバインドされます。

ステートメントを組み合わせることについてもいくつかの考えがありますJOptionPaneが、それはコードの問題というよりもプレゼンテーションの問題です。それは読者の演習として残します。

于 2013-09-14T16:50:08.103 に答える