【问题标题】:Can't get the same result when I calculate in methods当我在方法中计算时无法得到相同的结果
【发布时间】:2015-03-14 11:38:43
【问题描述】:

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

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

【问题讨论】:

    标签: java oop methods


    【解决方案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; 这一步。

    【讨论】:

    • 对不起,不明白。你能多放一些代码吗?在哪里使用这个? povrsinaS = uzmiS(temeA, temeB, temeC);
    • 更新:我希望你有工具,但如果你需要,我很乐意展示一个明确的实现!
    • 是的,是的。我明白。在 Resavanje 类中,我添加了 povrsinaS = uzmiS();当我尝试通过对象变量 povrsinaS 调用并打印它的值时它仍然有 0.0,那是怎么回事?
    【解决方案2】:

    基本上你应该从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 的价值。

    【讨论】:

    • 当我添加你给我的代码时它不起作用......无法弄清楚我该怎么做,它报告错误。
    • 对不起,这是我的错,你只需要把它改成povrsinaS = uzmiS(temeA, temeB, temeC);this.povrsinaS = this.uzmiS();
    【解决方案3】:

    添加这一行

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

    【讨论】:

    • 哇,当我添加那行时,它现在可以工作了。你能告诉我为什么当我使用这个代码时:double temeA, temeB, temeC, povrsinaS = uzmiS();当我从方法中赋予它值时,povrsinaS 的值仍然为 0 吗?是的,这是 Heron 的公式,我喜欢数学并尝试解决一些任务 :)
    • 在你的情况下,在初始化 povrsinaS ----> povrsinaS = 0 ----> 它什么都不做。您必须调用方法uzmiS()。解决方案是添加这一行:povrsinaS = this.uzmiS(); 同时,uzmiS() 做某事什么返回povrsinaS的真实值
    • 但是等等...我可以做任何可以增加 povrsinaS 价值的方法吗?例如 void setPovrsinaS() { povrsinaS = this.uzmiS(); // 仍然得到 0 吗?但是当我添加这一行时: povrsinaS = this.uzmiS();在你告诉我它有效的方法中,为什么它在不同的方法中不起作用,无效?
    • @miljannet ,它仍然有效:gist.github.com/donhuvy/…
    • 我的意思是当我打电话给 Resavanje objekat = new Resavanje(1, 1, 5, 2, 3, 6); System.out.println(objekat.povrsinaS); // 变量仍然是 0,但是我们将它设置为在 uzmiS 方法中返回的值?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    相关资源
    最近更新 更多