我的工作是计算给定三角形的以下属性:所有边的长度,所有角的角度,周长和面积。我有一个Triangle类和一个Triangle测试器类。我认为我已正确编码周长和面积?但我开始考虑不是为我的周长设置一个恒定的变量侧,我应该使用所有边的长度来找到我的周长。我坚持的是找到长度和角度。由于某些原因,当我运行我的测试器类时,它们都是1.0。任何意见,将不胜感激!谢谢!
import java.util.Scanner;
public class Triangle
{
Scanner in = new Scanner(System.in);
/**
* Variables
*/
double x1;
double x2;
double x3;
double y1;
double y2;
double y3;
double lengthA;
double lengthB;
double lengthC;
double angleA;
double angleB;
double angleC;
double area;
double perimeter;
double base;
double height;
double p;
/**
Constructs x and y coordinates
@param x1, x2, x3 to x1, x2, x3
@param y1, y2, y3 to y1, y2, y3
*/
public Triangle(double x1, double x2, double x3, double y1, double y2, double y3)
{
this.x1 = x1;
this.x2 = x2;
this.x3 = x3;
this.y1 = y1;
this.y2 = y2;
this.y3 = y3;
}
/**
*Find lengths of all sides
*/
public double getLengthA()
{
lengthA = Math.sqrt(Math.pow((x2 - x1), 2) + Math.pow((y2 - y1), 2));
return lengthA;
}
public double getLengthB()
{
lengthB = Math.sqrt(Math.pow((x3 - x2), 2) + Math.pow((y3 - y2), 2));
return lengthB;
}
public double getLengthC()
{
lengthC = Math.sqrt(Math.pow((x1 - x3), 2) + Math.pow((y1 - y3), 2));
return lengthC;
}
/**
* Find angles at all corners
@return angles at all corners
*/
public double getAngleA()
{
angleA = lengthA + lengthB + lengthC - (lengthB * lengthC);
return angleA;
}
public double getAngleB()
{
angleB = lengthB + lengthA + lengthC - (lengthA * lengthC);
return angleB;
}
public double getAngleC()
{
angleC = lengthC + lengthA + lengthB - (lengthA * lengthB);
return angleC;
}
/**
* Constant Variables
*/
public Triangle()
{
base = 5;
height = 15;
}
/**
* Find perimeter of triangle
*/
public double getPerimeter()
{
perimeter = lengthA + lengthB + lengthC;
return perimeter;
}
public double getHalfPerimeter()
{
p = perimeter / 2;
return p;
}
/**
* Find area of triangle
*/
public double getArea()
{
double area = Math.sqrt(p * (p - lengthA) * (p - lengthB) * (p - lengthC));
return area;
}
}
这是我的测试人员类:
import java.util.Scanner;
import javax.swing.JOptionPane;
public class TriangleSimulator
{
public static void main (String[] args)
{
Scanner in = new Scanner(System.in);
String input = JOptionPane.showInputDialog("Enter X coordinate for the first corner of the triangle: ");
double x1 = Double.parseDouble(input);
input = JOptionPane.showInputDialog("Enter Y coordinate for the first corner of the triangle: ");
double y1 = Double.parseDouble(input);
input = JOptionPane.showInputDialog("Enter X coordinate for the second corner of the triangle: ");
double x2 = Double.parseDouble(input);
input = JOptionPane.showInputDialog("Enter Y coordinate for the second corner of the triangle: ");
double y2 = Double.parseDouble(input);
input = JOptionPane.showInputDialog("Enter X coordinate for the third corner of the triangle: ");
double x3 = Double.parseDouble(input);
input = JOptionPane.showInputDialog("Enter Y coordinate for the third corner of the triangle: ");
double y3 = Double.parseDouble(input);
Triangle t = new Triangle(x1, x2, x3, y1, y2, y3);
System.out.println("Length A is: " + t.getLengthA());
System.out.println("Length B is: " + t.getLengthB());
System.out.println("Length C is: " + t.getLengthC());
System.out.println("Angle A is: " + t.getAngleA());
System.out.println("Angle B is: " + t.getAngleB());
System.out.println("Angle C is: " + t.getAngleC());
System.out.println("Area: " + t.getArea());
System.out.println("Perimeter: " + t.getPerimeter());
in.close();
}
}
答案 0 :(得分:3)
您正在显示提示用户输入的JOptionPanes,但您未获取输入,因此您不使用输入来设置Triangle的状态,从而创建默认值三角形对象使用其无参数构造函数。理解Java编程没有魔力,你的Triangle对象不会神奇地知道用户输入的数字并相应地改变自己。相反,你必须将这些信息提供给你的三角形。
您必须做的是分配从JOptionPanes返回的结果,将它们解析为双精度数,然后使用这些数字创建三角形,使用带有数值参数的构造函数,而不是默认构造函数。做到这一点,你应该做得很好。
e.g。
String input = JOptionPane.showInputDialog("Enter X coordinate for the first corner of the triangle: ");
double x1 = Double.parseDouble(input);
input = JOptionPane.showInputDialog("Enter Y coordinate for the first corner of the triangle:
double y1 = Double.parseDouble(input);
//.... etc repeat...
Triangle triangle = new Triangle(x1, x2, x3, y1, y2, y3);
修改
此构造函数忽略传入的值:
公共三角形(双x1,双x2,双x3,双y1,双y2,双y3) { x1 = 0; x2 = 0; x3 = 0; y1 = 0; y2 = 0; y3 = 0; }
像你需要的构造函数应该获取传入的值,并使用这些值来设置类字段。例如:
public class Foo {
private int bar; // the bar field
public Foo(int bar) {
this.bar = bar;
}
}
请注意,我使用上面的this.bar
,以便Java知道我想要使用bar参数保持的值设置bar字段(条形没有 this
)。你需要做的只有6个参数,而不是一个。
然后,您在一个名为初始化程序块的单独代码块中进行所有计算:
{
/**
* Find lengths of all sides
*/
lengthA = Math.pow(Math.pow((x2 - x1), 2) + Math.pow((y2 - y1), 2) * .05, lengthA);
lengthB = Math.pow(Math.pow((x3 - x2), 2) + Math.pow((y3 - y2), 2) * .05, lengthB);
lengthC = Math.pow(Math.pow((x1 - x3), 2) + Math.pow((y1 - y3), 2) * .05, lengthC);
}
此代码在构造函数之前被称为,因此即使您正确设置了Triangles字段,此代码也不起作用。你不想使用初始化程序块,你可以忘记我甚至提到它们,除了告诉你不要使用它们。而是在构造函数中进行计算,并在设置所有字段后执行。
请注意,我故意没有为您的问题发布解决方案,因为我坚信我们大多数人需要的是理解我们遇到的任何问题的基本概念,然后使用这种理解来创建我们自己的代码解决方案。
最重要的是,阅读你的文本,不要更好,学习你的文本,因为你所犯的错误涉及基本概念,并表明你还没有理解这些概念并且已经诉诸于猜测。这将永远不会奏效,因为如果你能够在这门课程中取得进步,你需要了解所有这些并理解它。
祝你好运! 编辑2
对汤姆来说,运行:
public class TestInitializerBlock {
public TestInitializerBlock() {
System.out.println("Inside of constructor");
}
{
System.out.println("Inside of initializer block");
}
public static void main(String[] args) {
new TestInitializerBlock();
}
}