当我在方法中计算时,不能得到相同的结果

时间:2015-03-14 11:38:43

标签: java oop methods

我正在学习方法,类,对象和参数。并决定制作我自己的程序,但是当我使用参数,对象等时,我得到了错误的结果。 这是代码:

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,这是正确的结果。当我在方法中进行计算时,为什么我不能得到相同的结果?

3 个答案:

答案 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。我也喜欢数学。