2

計算された角度 angleA、angleB、angleC を返すメソッドを (別のクラスで) 呼び出すと、結果 NaN が返されます。すべての計算を 3 回チェックしたので、プログラムの設定方法に何らかの問題があるはずです。私は何を間違えましたか??

/* Write a Java program enabled to compute and show the following properties of a given triangle :
    The individual length of all sides
    The angles at all corners
    The perimeter
    The area

    */

   public class Triangle
   {
    private double x1, x2, x3, y1, y2, y3;
    double sideA, sideB, sideC;
    private double angleA, angleB, angleC;
    double longestSide, shortSide1, shortSide2;
    private double perimeter, halfPerimeter, triangleArea;
    private String stringLongestSide;

    public Triangle(double x1, double y1, double x2, double y2, double x3, double y3)
    {
        this.x1 = x1;
       this.y1 = y1;
       this.x2 = x2;
       this.y2 = y2;
       this.x3 = x3;
       this.y3 = y3;
    }

    public double getSideA()
    {
    return (Math.sqrt(Math.pow((x3-x2),2)+Math.pow((y3-y2),2)));
    }

    public double getSideB()
    {
    return (Math.sqrt(Math.pow((x3-x1),2)+Math.pow((y3-y1),2)));
    }

    public double getSideC()
    {
    return (Math.sqrt(Math.pow((x2-x1),2)+ Math.pow((y2-y1),2)));
    }



        //Begin by using the cosine rule to find the largest angle
    public double getAngleA()
    {
            //which side is the longest?

        longestSide = sideA;
        shortSide1 = sideB;
        shortSide2 = sideC;

        if (longestSide < sideC)
        {
            longestSide = sideC;
            shortSide1 = sideA;
            shortSide2 = sideB;             
        }
            else
            if (longestSide < sideB)
            {
            longestSide = sideB;
            shortSide1 = sideA;
            shortSide2 = sideC;
            }

    return (Math.acos((Math.pow(shortSide1,2)+Math.pow(shortSide2,2)-Math.pow(longestSide,2))/(2*shortSide1*shortSide2)))*180/Math.PI;
    }

        //Use the sine rule to find one of the remaining angles 
    public double getAngleB()
    {
    return ((Math.asin((shortSide1*Math.sin((angleA*Math.PI/180))/longestSide)))*180/Math.PI);
    }   

        //Use the 'sum of internal angles' rule to find the third angle
    public double getAngleC()
    {
    return (180 - (angleA + angleB));
    }


    //Calculating the perimeter
    public double getPerimeter()
    {
    return (sideA + sideB + sideC);
    }

//Calculating the area of the triangle
    public double getArea()
    {
    halfPerimeter = perimeter/2;
    return (Math.sqrt(halfPerimeter*(halfPerimeter-sideA) * (halfPerimeter-sideB) * (halfPerimeter-sideC)));
    }

    }

メソッドを呼び出すクラス:

/* ShellApplication
    Rakel Bára Þorvaldsdóttir
*/
import java.util.Scanner;
import java.text.DecimalFormat;

public class Interaction
{
    public static void main(String [] args)  //required
    {
    //write your code here
    double x1, x2, x3, y1, y2, y3;
    double sideA, sideB, sideC;
    double angleA, angleB, angleC;
    double perimeter, area;

    DecimalFormat coordinates = new DecimalFormat ("#");
    DecimalFormat calculations = new DecimalFormat ("#.##");

    System.out.println("Welcome!");
    System.out.println("Please enter the coordinates of your triangle, the x-coordinate first each time and then the y-coordinate.\n\t------------------------\n");

    String garbage;

    Scanner scan = new Scanner( System.in );

    System.out.print( "Enter the x-coordinate for the first point, and then press Enter: ");
    while (! scan.hasNextInt())
    {
        garbage = scan.nextLine();
        System.out.println("Please enter an integer.");
    } 
        x1 = scan.nextDouble( );

    System.out.print( "Enter the y-coordinate for the first point, and then press Enter: ");
    while (! scan.hasNextInt())  //creating a while loop to ensure only integer numbers are accepted
    {
        garbage = scan.nextLine();
        System.out.println("Please enter an integer.");
    }
       y1 = scan.nextDouble( );

    System.out.print( "Thanks for entering the first point. Now on to the next! \n\t------------------------\n");

    System.out.print( "Enter the x-coordinate for the second point, and then press Enter: ");
    while (! scan.hasNextInt())
    {
        garbage = scan.nextLine();
        System.out.println("Please enter an integer.");
    }
      x2 = scan.nextDouble( );

    System.out.print( "Enter the y-coordinate for the second point, and then press Enter: ");
    while (! scan.hasNextInt())
    {
        garbage = scan.nextLine();
        System.out.println("Please enter an integer.");
    }
      y2 = scan.nextDouble( );

    System.out.print( "Thanks for entering the second point. Just one more left! \n\t------------------------\n");

    System.out.print( "Enter the x-coordinate for the third point, and then press Enter: ");
    while (! scan.hasNextInt())
    {
        garbage = scan.nextLine();
        System.out.println("Please enter an integer.");
    }
      x3 = scan.nextDouble( );

    System.out.print( "Enter the y-coordinate for the third point, and then press Enter: ");
    while (! scan.hasNextInt())
    {
        garbage = scan.nextLine();
        System.out.println("Please enter an integer.");
    }
      y3 = scan.nextDouble( );

    System.out.println( "You did it!  Your triangle has the following coordinates: ");
    System.out.println( "Point A: ("+coordinates.format(x1) +" , " +coordinates.format(y1) +")" + " , Point B: ("+coordinates.format(x2) +" , " +coordinates.format(y2) +")" +  " , Point C: ("+coordinates.format(x3) +" , " +coordinates.format(y3) +")");

    Triangle userTriangle = new Triangle(x1, y1, x2, y2, x3, y3);   

     sideA = userTriangle.getSideA();
     sideB = userTriangle.getSideB();
     sideC = userTriangle.getSideC();

     angleA = userTriangle.getAngleA();
     angleB = userTriangle.getAngleB();
     angleC = userTriangle.getAngleC();

     perimeter = userTriangle.getPerimeter();
     area = userTriangle.getArea();

     System.out.println( "-----------------");
     System.out.println( "SideA is: " +calculations.format(sideA));
     System.out.println( "SideB is: " +calculations.format(sideB));
     System.out.println( "SideC is: " +calculations.format(sideC));
     System.out.println( "-----------------");

     System.out.println( "AngleA is: " +angleA);
     System.out.println( "AngleB is: " +angleB);
     System.out.println( "AngleC is: " +angleC);
     System.out.println( "-----------------");

     System.out.println( "Perimeter is: " +perimeter);
     System.out.println( "Area is: " +area);


    }
}

結果は次のとおりです。


SideA: 14,32 SideB: 5,83

SideC: 11,18

角度 A は: NaN 角度 B は: NaN

角度 C は: 180.0

周囲: 0.0 面積: 0.0

4

3 に答える 3

3

一部の変数は、使用する前に適切な値で初期化されていません。たとえば、sideA、sideB、および sideC は、getAngleA() メソッドではすべて 0.0 です。

デフォルト値 (クラス変数: double の場合は明らかに 0.0) を使用して、それで除算しようとすると、結果は NaN になります (実際には無限大ですが、無限大を使用して計算しようとすると、結果として NaN が得られます)。 .

呼び出しから getAngleA() を呼び出す場合:

angleA = userTriangle.getAngleA();

次のメソッド変数を出力すると、それらはすべて 0.0 になります

メソッド getAngleA() で設定された変数:

longestSide = sideA;
shortSide1 = sideB;
shortSide2 = sideC;

設定直後の値のプリントアウト:

System.out.println("longestSide = " + longestSide);
System.out.println("shortSide1 = " + shortSide1);
System.out.println("shortSide2 = " + shortSide2);

これが出力されたものです: longSide = 0.0 shortSide1 = 0.0 shortSide2 = 0.0

そのため、0.0 以外の値が設定されていません。

于 2012-11-11T17:26:29.860 に答える
2

フィールドを正しくカプセル化するには、すべてのクラス変数をプライベート アクセスに設定し、getter と setter を使用して値を設定および取得する必要があります。

したがって、Sura の回答を拡張するには、これらのメソッドを Triangle クラスに追加し、sideA、sideB、sideC (および他のすべてのクラス変数) を private に設定します。

例えば

public double getSideA()
{
  return sideA;
}

public double getSideB()
{
  return sideB;
}

public double getSideC()
{
  return sideC;
}

public void setSideA()
{
  sideA = (Math.sqrt(Math.pow((x3-x2),2)+Math.pow((y3-y2),2)));
}

public void setSideB()
{
  sideB =  (Math.sqrt(Math.pow((x3-x1),2)+Math.pow((y3-y1),2)));
}

public void setSideC()
{
  sideC = (Math.sqrt(Math.pow((x2-x1),2)+ Math.pow((y2-y1),2)));
}

そうは言っても、三角形の場合、初期入力値(x、y、z変数)を変更せずにサイド測定値を更新することを人々に許可したくないと思います。その場合、セッターを省略します完全に削除し、代わりに Sura の 3 つのサイド設定行をコンストラクターの下部に追加して、オブジェクトの初期化時に設定されるようにします。

sideA = (Math.sqrt(Math.pow((x3-x2),2)+Math.pow((y3-y2),2))); 
sideB = (Math.sqrt(Math.pow((x3-x1),2)+Math.pow((y3-y1),2)));  
sideC = (Math.sqrt(Math.pow((x2-x1),2)+ Math.pow((y2-y1),2)));

人々が三角形の寸法を変更できるようにしたい場合は、単一の updateTriangle() メソッドを提案します。これは、新しい値に対して入力メニューを再度実行し、更新するために下部にこれらの 3 行をもう一度含めます。新しい価値観へのあなたの側面。

于 2012-11-11T19:15:14.027 に答える
2

これは、Trangle クラスで行う必要がある変更です。各サイド取得メソッドでは、値を返す代わりに、最初に値をサイドA、サイドB、サイドCに割り当ててから返す必要があります

public double getSideA()
 {
  sideA = (Math.sqrt(Math.pow((x3-x2),2)+Math.pow((y3-y2),2)));
  return sideA;
}

 public double getSideB()
{
sideB =  (Math.sqrt(Math.pow((x3-x1),2)+Math.pow((y3-y1),2)));
 return sideB;
}

 public double getSideC()
 {
 sideC = (Math.sqrt(Math.pow((x2-x1),2)+ Math.pow((y2-y1),2)));
 return sideC;
 }
于 2012-11-11T17:48:40.020 に答える