0

だから私は、2つの辺のスペースで区切られた入力と三角形のhypotenuseを要求するこのコードを持っています。mainの下のメソッドは、三角形が正しい場合はtrueを返し、そうでない場合はfalseを返すことになっています。

何らかの理由で、入力した測定値が直角三角形であることがわかっていても、三角形は直角三角形ではないことが印刷されます。

私はしばらくの間このコードの論理エラーを検出しようとしてきましたが、comeoneは私を助け/呼び出すことができますか?

import java.util.Scanner;

public class VerifyRightTriangle { public static void main(String[] args) { Scanner sc = new Scanner(System.in);

    System.out.print("Please enter the two sides and the hypotenuse: ");
    String input = sc.nextLine();

    String[] values = input.split(" ");

    int[] nums = new int[values.length];

    for (int i = 0; i < nums.length; i++) {
        nums[i] = Integer.parseInt(values[i]);
    }

    double s1 = nums[0];
    double s2 = nums[1];
    double hyp = nums[2];

    System.out.printf("Side 1: %.2f Side 2: %.2f Hypotenuse: %.2f\n", s1, s2, hyp);

    boolean result = isRightTriangle(s1, s2, hyp);

    if (result == true) {
        System.out.println("The given triangle is a right triangle.");
    } else if (result == false) {
        System.out.println("The given triangle is not a right triangle.");
    }
}

/**
 * Determine if the triangle is a right triangle or not, given the shorter side, the longer
 * side, and the hypotenuse (in that order), using the Pythagorean theorem.
 * @param s1 the shorter side of the triangle
 * @param s2 the longer side of the triangle
 * @param hyp the hypotenuse of the triangle
 * @return true if triangle is right, false if not
 */

private static boolean isRightTriangle(double s1, double s2, double hyp) {
    double leftSide = s1 * s1 + s2 * s2;
    double rightSide = hyp * hyp;
    if (Math.sqrt(leftSide) == Math.sqrt(rightSide)) {
        return true;
    } else {
        return false;
    }
}

}

4

3 に答える 3

1

浮動小数点の計算は正確ではないため、数値が一致しないので、代わりにBigDecimalを使用してみてくださいdouble

編集:あなたはすでに整数を解析しているので、考え直して nums[i] = Integer.parseInt(values[i]);

int代わりに使用し、double使用しないでください。単にMath.sqrt使用してください。leftSide==rightside

于 2012-09-02T17:09:32.337 に答える
1

s1*s1 + s2*s2 == hyp*hypを使用せずにチェックする必要がありますsqrtピタゴラスの定理を参照してください。

于 2012-09-02T17:12:40.713 に答える
1

入力がint値であることを考えると、エラーは発生しないはずです。テストしたら

public static void main(String... args) {
    for (int i = 3; i <= 11; i += 2) {
        int side1 = (i * i - 1) / 2;
        int side2 = side1 + 1;
        System.out.println(i + "," + (side1 - 1) + " and " + (side2 - 1) + " is " + isRightTriangle(i, side1 - 1, side2 - 1));
        System.out.println(i + "," + side1 + " and " + side2 + " is " + isRightTriangle(i, side1, side2));
        System.out.println(i + "," + (side1 + 1) + " and " + (side2 + 1) + " is " + isRightTriangle(i, side1 + 1, side2 + 1));
    }
}

それは印刷します

3,3 and 4 is false
3,4 and 5 is true
3,5 and 6 is false
5,11 and 12 is false
5,12 and 13 is true
5,13 and 14 is false
7,23 and 24 is false
7,24 and 25 is true
7,25 and 26 is false
9,39 and 40 is false
9,40 and 41 is true
9,41 and 42 is false
11,59 and 60 is false
11,60 and 61 is true
11,61 and 62 is false

どちらが正しい。

この方法が失敗するユースケースを提供できますか?


小さなエラーを許容するために、代わりにこれを試してください。

private static boolean isRightTriangle(double s1, double s2, double hyp) {
    double leftSide = s1 * s1 + s2 * s2;
    double rightSide = hyp * hyp;
    return Math.abs(leftSide - rightSide) < 1e-9;
}

2 つの値の が等しい場合sqrt、2 つの値は等しいです。

Math.sqrt() にはエラーが含まれているため、回避できる場合は回避する必要があります。

于 2012-09-02T17:16:22.103 に答える