0

メソッドを作成しました:

public double Calculouno(double x1,double x2,double y1,double y2)
{
    double ecuacion1;
    ecuacion1= (x2-x1)+(y2-y1);
    ecuacion1= Math.sqrt(ecuacion1);
    return ecuacion1;
}

私のプログラムが and などの数学関数を使用して ecuacion1 を計算しようとするpowsqrt(少なくともそれは私が疑っていることです)、コンパイラの警告なしで動作を停止し、「ビルドは成功しました」と表示されます。助けてください。

この部分(メソッド)に到達すると、コンパイラは「ビルドが成功しました」と言って終了します。私のプログラムは、この部分までうまく機能します。

これがソースコード全体です。

    import java.util.Scanner;
import java.lang.Math;

public class Ejercicio12
{
    public static void main(String args[])
    {
        double[] x= new double[3];
        double[] y= new double[3];
        double a,b,c;
        int con=0, con2=0;
        double[] angulo= new double[3];
        Scanner entrada = new Scanner(System.in);
        Calculos cal= new Calculos();

        for(con=0;con<3;con++)
        {
        System.out.println("Ingrese un valor x para el punto "+(con+1)+": ");
        x[con]= entrada.nextDouble();
        System.out.println("Ingrese un valor y para el punto "+(con+1)+": ");
        y[con]= entrada.nextDouble();
        }

        a= cal.Calculouno(x[0],x[1],y[0],y[1]);
        b= cal.Calculouno(x[1],x[2],y[1],y[2]);
        c= cal.Calculouno(x[2],x[0],y[2],y[0]);

        angulo[0]= cal.Angulo(a,b,c);
        angulo[1]= cal.Angulo(c,a,b);
        angulo[2]= cal.Angulo(b,a,c);

        if(angulo[0]>90||angulo[1]>90||angulo[2]>90)
        {
            System.out.println("El triangulo es obtusangulo");
        }
        else
        {
            if(angulo[0]==90||angulo[1]==90||angulo[2]==90)
            {
                System.out.println("El triangulo es rectangulo");
            }
            else
            {
                if(angulo[0]<90&&angulo[1]<90&&angulo[2]<90)
                {
                    System.out.println("El triangulo es acutangulo");
                }
            }

        }
    }


}



 import static java.lang.Math.sqrt;
    import static java.lang.Math.pow;
    import static java.lang.Math.acos;
    public class Calculos
    {
    public double Calculouno(double x1,double x2,double y1,double y2)
        {
            double ecuacion1;
            double dx= (x2-x1);
            double dy= (y2-y1);
            return Math.sqrt(dy+dx);

        }


        public double Angulo(double a1,double b1, double c1)
        {
            double ecuacion2;
            double a11 = pow(a1,2);
            double b11 = pow(b1,2);
            double c11 = pow(c1,1);

            double xx=(b11+c11-a11);
            double zz=(2*b1*c1);

            return Math.acos(xx/zz);
     }

}
4

2 に答える 2

1

解決したい問題をよく説明していると思われる2つのリンクを次に示します。

http://mathworld.wolfram.com/AcuteTriangle.html

http://mathworld.wolfram.com/ObtuseTriangle.html

これが私がそれを書くかもしれない方法です。私はそれを徹底的にテストしませんでした:

package cruft;

/**
 * Junk description here
 * @author Michael
 * @link
 * @since 9/8/12 10:19 PM
 */

public class Triangle {

    private final Point p1;
    private final Point p2;
    private final Point p3;

    public static void main(String args[]) {
        if (args.length > 5) {
            Point p1 = new Point(Double.valueOf(args[0]), Double.valueOf(args[1]));
            Point p2 = new Point(Double.valueOf(args[2]), Double.valueOf(args[3]));
            Point p3 = new Point(Double.valueOf(args[4]), Double.valueOf(args[5]));
            Triangle triangle = new Triangle(p1, p2, p3);
            double angle = triangle.calculateAngle();
            System.out.println(triangle);
            if (angle > 0.0) {
                System.out.println("obtuse");
            } else if (angle < 0.0) {
                System.out.println("acute");
            } else {
                System.out.println("right triangle");
            }
        } else {
            System.out.println("Usage: Triangle x1 y1 x2 y2 x3 y3");
        }
    }

    public Triangle(Point p1, Point p2, Point p3) {
        this.p1 = p1;
        this.p2 = p2;
        this.p3 = p3;
    }

    public double calculateAngle(){
        double a = Point.distance(this.p1, this.p2);
        double b = Point.distance(this.p2, this.p3);
        double c = Point.distance(this.p3, this.p1);
        return Math.acos(a*a + b*b - c*c)/2.0/a/b;
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder();
        sb.append("Triangle");
        sb.append("{p1=").append(p1);
        sb.append(", p2=").append(p2);
        sb.append(", p3=").append(p3);
        sb.append('}');
        return sb.toString();
    }
}

class Point {
    public final double x;
    public final double y;

    public Point(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public static double distance(Point q1, Point q2) {
        double dx = Math.abs(q1.x-q2.x);
        double dy = Math.abs(q1.y-q2.y);
        if (dx > dy) {
            double r = dy/dx;
            return dx*Math.sqrt(1.0+r*r);
        } else {
            double r = dx/dy;
            return dy*Math.sqrt(1.0+r*r);
        }
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder();
        sb.append('(').append(x);
        sb.append(',').append(y);
        sb.append(')');
        return sb.toString();
    }
}
于 2012-09-09T01:46:58.200 に答える
1

スニペットのコードには、プログラムを(直接)「警告なしで停止」させるものは何もありません。

  • ビルドが失敗する原因となる構文エラー (など) はありません。(そして、それはあなたが報告したものと一致します。)

  • 「悪い」入力を与えMath.sqrtても、停止したり、例外をスローしたりすることはありません。javadoc には、「[戻り値] a の正の平方根。引数が NaN またはゼロ未満の場合、結果は NaN になります。」と記載されています。つまり、入力が悪いとNaN値が返されます。

  • 不正な入力によって、sqrt呼び出しの前に算術演算が例外をスローすることはありません。JLS は、(浮動小数点+-演算子について) 「[i]どちらかのオペランドが NaN の場合、結果は NaN です」と述べています。

したがって、アプリケーションが停止する直接の原因は、アプリケーションの別の場所にあるはずです。

このメソッドから予期しない結果 (おそらく NaN) が返されたときに、コードの他の部分が例外をスローしていて、アプリケーションが例外を押しつぶしていると思われます。


私は今問題を理解しています。

何が起こっているかというと、演算および/または呼び出しsqrtpow>>are<< が NaN 値を生成しているということです。いずれかの関係演算子を使用して NaN 値をテストすると、式の結果は常にfalse になります。つまり、println呼び出しが行われないコードです。

あなたのコードは実際には停止していません。むしろ、出力を生成せずに正常に完了しています。

そして、計算が NaN 値を生成している根本的な理由は ... @duffymo が指摘したように ... 幾何学的な式を正しく実装していないことです。


ちなみに、関係式で NaN 値を使用すると、特殊な動作をします。例えば:

    double x = 0.0 / 0.0;  // generate a NaN
    System.out.println(0.0 == x);
    System.out.println(0.0 != x);
    System.out.println(0.0 < x);
    System.out.println(0.0 > x);
    System.out.println(x == x);
    System.out.println(x != x);
    System.out.println(x < x);
    System.out.println(x > x);

上記のすべての意志は「false」を出力します。はい、全員です!

NaN をテストする唯一の方法は、Double.isNaN(double)orを使用することFloat.isNaN(float)です。

于 2012-09-09T02:08:50.023 に答える