您好我是Java的新手。我真的不知道如何才能使这段代码完全正常工作。
public class Distance
{ private int xOne,yOne,xTwo,yTwo;
private double distance;
public Distance()
{
}
public Distance(int x1, int y1, int x2, int y2)
{ x1=xOne;
x2=xTwo;
y1=yOne;
y2=yTwo;
}
public void setCoordinates(int x1, int y1, int x2, int y2)
{
xOne=4;
yOne=3;
xTwo=6;
yTwo=56;
}
public void calcDistance()
{
Math.sqrt((xTwo-xOne)*(xTwo-xOne)+(yTwo-yOne)*(yTwo-yOne));
}
public void print( )
{
out.println("x1:");
out.println("y1:");
out.println("x2:");
out.println("y2:");
out.println(distance);
}
}
答案 0 :(得分:3)
整个Distance
类可以简化为单个方法。但我想这是一次学习练习,所以我会尽力帮助你逐步完成所有工作:
如果这些点的int
变量是double
,那么它们的所有变量都会更有用。然后你可以使用分数位置和更大的距离范围。
这些变量:private int xOne,yOne,xTwo,yTwo;
更好地命名为x1, y1, x2, y2
。
您的setCoordinates
方法当前正在忽略参数并分配硬编码值,我猜想进行测试。无论如何,假设您修复了这个并且按照我的建议更改了字段名称,您需要区分本地变量和同名字段,您可以通过使用前缀{来限定对字段的访问权限来执行此操作{1}},所以你得到:
this.
由于作业是向后的,所以这个构造函数没有做任何事情:
public void setCoordinates(double x1, double y1, double x2, double y2) {
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
}
应该是:
public Distance(int x1, int y1, int x2, int y2)
{ x1=xOne;
x2=xTwo;
y1=yOne;
y2=yTwo;
}
等等。
但是,你已经有一个 xOne=x1;
方法来做同样的事情,所以调用它而不是重复自己是有道理的:
setCoordinates
public Distance(double x1, double y1, double x2, double y2) {
setCoordinates(x1, y1, x2, y2);
}
方法当前不起作用,因为在计算答案后,它并未将其分配给calcDistance
变量,或对其执行任何其他操作。作业应该是:
distance
存在专用函数Math.hypot
,用于计算public void calcDistance() {
distance = Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
}
。使用它简化了事情:
√(x² + y²)
接下来,考虑何时实际调用public void calcDistance() {
distance = Math.hypot(x2 - x1, y2 - y1);
}
方法......总是在设置坐标后,对吧?那么为什么不将数学包含在calcDistance
中,并完全删除setCoordinates
方法,以简化类的使用:
calcDistance
检查您的public void setCoordinates(double x1, double y1, double x2, double y2) {
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
this.distance = Math.hypot(x2 - x1, y2 - y1);
}
方法时,打印坐标的语句实际上并非如此:
print
应该是:
out.println("x1:");
使用out.println("x1:" + x1);
是合法的,假设您在文件的顶部有一个声明out.println(...);
,但它是非标准的。请考虑将其更改为import static java.lang.System.out;
。
最后,重新考虑整个System.out.println(...);
课程。它应该计算点之间的距离,但大多数方法都致力于将坐标放入其中并从中获取结果。您已经提供了两种不同的方法来获取坐标:使用no-args构造函数后跟Distance
,或者使用4-args构造函数。
您提供了一种获取结果的方法setCoordinates
方法,但它的用处有限。它不是通用,因为它只允许输出到控制台(在GUI应用程序中无用),并且只能以固定格式输出。您可以添加print
方法(或制作getDistance
字段distance
)以增加其实用性,但让我们看看它会是什么样子。
想象一下,该类的典型用法总是如下所示:
public
事实证明/* ... get x1,y1,x2,y2 ... */
Distance distance = new Distance();
distance.setCoordinates(x1, y1, x2, y2);
double result = distance.getDistance();
/* ... do something with the result ... */
只是一个美化的功能。因此,让我们把它变成一个直接返回结果的真实函数:
Distance
(它的static double calcDistance(double x1, double y1, double x2, double y2) {
return Math.hypot(x2 - x1, y2 - y1);
}
因为它不再需要创建一个类的实例。)这种方法现在非常小巧便携,可以放在任何一个类中,并且不会。需要专门的static
课程。例如,您可以将它放在一个名为Distance
的类中,以及其他有用的部分。无论如何,使用它现在更简单:
MathUtils
打印输出怎么样?那么,以该特定格式打印不是该函数的通用有用性的一部分。如果你只需要做一次,这可以在调用者中完成。如果您需要从代码中的多个位置以该格式计算和打印距离,那么它是方法的候选者,但不是相同的方法,因为保持/* ... get x1,y1,x2,y2 ... */
double distance = MathUtils.calcDistance(x1, y1, x2, y2);
/* ... do something with the result ... */
本身更好一般。这样的事情可以做到:
calcDistance
无论如何,我希望这能解决你的问题。如您所愿,请随意使用此答案的任何/所有部分。
答案 1 :(得分:0)
您忘记使用结果
设置距离变量distance = Math.sqrt((xTwo-xOne)*(xTwo-xOne)+(yTwo-yOne)*(yTwo-yOne));
答案 2 :(得分:0)
您应该使用Math.sqrt((xTwo-xOne)*(xTwo-xOne)+(yTwo-yOne)*(yTwo-yOne));
更改distance = Math.sqrt( (x1-x2)^2 + (y1-y2)^2 );
。
和,
out.println("x1:");
out.println("y1:");
out.println("x2:");
out.println("y2:");
out.println(distance);
与
System.out.println("x1 : " + x1);
System.out.println("y1 : " + y1);
System.out.println("x2 : " + x2);
System.out.println("y2 : " + y2);
System.out.println("distance : " + distance);
您可以参考this website来学习java基础知识。
答案 3 :(得分:0)
说实话,有几件事是错误的。
Distance
构造函数中正确地将全局变量分配给本地变量。setCoordinates
方法无用。Math.sqrt()
分配给值System.out.println()
而非println()