我正在学习方法,类,对象和参数。并决定制作我自己的程序,但是当我使用参数,对象等时,我得到了错误的结果。 这是代码:
class Resavanje {
double temeA, temeB, temeC, povrsinaS;
public Resavanje(double aX, double aY, double bX, double bY, double cX, double cY) {
// Izracunavanje temena.
temeA = Math.sqrt(Math.pow(bX - cX, 2) + Math.pow(bY - cY, 2));
temeB = Math.sqrt(Math.pow(cX - aX, 2) + Math.pow(cY - aY, 2));
temeC = Math.sqrt(Math.pow(aX - bX, 2) + Math.pow(aY - bY, 2));
}
double uzmiS() {
return ((temeA + temeB + temeC) / 2);
}
// Povrsina trougla sa temenima
double uzmiPovrsinuSaTemenima() {
return Math.sqrt(povrsinaS * (povrsinaS - temeA) * (povrsinaS - temeB) * (povrsinaS - temeC));
}
}
和
public class PoblemTrougla {
public static void main(String[] args) {
Resavanje objekat = new Resavanje(1, 1, 5, 2, 3, 6);
System.out.println(objekat.uzmiPovrsinuSaTemenima());
}
}
当我调用方法objekat.uzmiPovrsinuSaTemenima()
时,它应显示:9.000...7
但结果是-0.0
如果我在main方法中使用它:
double s, p, a, b, c;
a = objekat.temeA;
b = objekat.temeB;
c = objekat.temeC;
s = (a + b + c) / 2;
p = Math.sqrt(s * (s - a) * (s - b) * (s - c));
我得到结果9.000...7
,这是正确的结果。当我在方法中进行计算时,为什么我不能得到相同的结果?
答案 0 :(得分:1)
double uzmiS()
{
return ((temeA + temeB + temeC)/2);
}
此函数永远不会运行,其结果是:s = (a+b+c)/2;
计算的一部分永远不会运行。
尝试运行类似:
povrsinaS = uzmiS(temeA, temeB, temeC);
在运行函数uzmiPovrsinuSaTemenima()
为清晰起见更新
所以,这句话:
objekat.uzmiPovrsinuSaTemenima()
告诉您的计算机运行:
double uzmiPovrsinuSaTemenima() {
return Math.sqrt(povrsinaS *(povrsinaS-temeA)*(povrsinaS - temeB)*(povrsinaS- temeC));
}
代码。你有一个类似于那个的方法:
double uzmiS() {
return ((temeA + temeB + temeC)/2);
}
您的计算机永远不会运行它,因为没有调用它!
执行像povrsinaS = uzmiS(temeA, temeB, temeC);
这样的命令告诉您的计算机"嘿,我将运行uzimiS函数并将return
该值放入变量povrsinaS
。
这相当于在您提供的第二个示例中执行s = (a+b+c)/2;
此步骤。
答案 1 :(得分:0)
基本上你应该从main方法跟踪,它调用一个构造函数(有6个参数)
Resavanje objekat = new Resavanje(1, 1, 5, 2, 3, 6);
它将计算你的objekat对象的3个属性,但它从不计算它们的平均值(在你的情况下是povrsinaS属性)。所以uzmiPovrsinuSaTemenima方法将执行,povrsinaS的值为0.要处理它,你可以将这一行添加到你的构造函数中:
povrsinaS = uzmiS(temeA, temeB, temeC);
或在uzmiPovrsinuSaTemenima方法中设置:
double uzmiPovrsinuSaTemenima() {
povrsinaS = uzmiS(temeA, temeB, temeC);
return Math.sqrt(povrsinaS *(povrsinaS-temeA)*(povrsinaS - temeB)*(povrsinaS- temeC));
}
它将为uzmiPovrsinuSaTemenima提供povrsinaS的价值。
答案 2 :(得分:0)
添加此行
povrsinaS = this.uzmiS();
方法uzmiPovrsinuSaTemenima()
,如下所示:
class Resavanje {
double temeA, temeB, temeC, povrsinaS;
public Resavanje(double aX, double aY, double bX, double bY, double cX, double cY) {
// Izracunavanje temena.
temeA = Math.sqrt(Math.pow(bX - cX, 2) + Math.pow(bY - cY, 2));
temeB = Math.sqrt(Math.pow(cX - aX, 2) + Math.pow(cY - aY, 2));
temeC = Math.sqrt(Math.pow(aX - bX, 2) + Math.pow(aY - bY, 2));
}
public double uzmiS() {
return ((temeA + temeB + temeC) / 2);
}
// Povrsina trougla sa temenima
double uzmiPovrsinuSaTemenima() {
povrsinaS = this.uzmiS(); // <------ Add this line
return Math.sqrt(povrsinaS * (povrsinaS - temeA) * (povrsinaS - temeB) * (povrsinaS - temeC));
}
}
您的程序将有效,并返回真实结果:
9.000000000000007
P / S:三角形为Heron's formula。我也喜欢数学。