我需要有关此Java继承程序的帮助

时间:2013-04-27 04:35:56

标签: java inheritance

我的代码所基于的问题可在以下网站找到:

http://practiceit.cs.washington.edu/problem.jsp?category=Building+Java+Programs%2C+3rd+edition%2FBJP3+Chapter+9&problem=bjp3-9-e11-FilteredAccount

基本上,我的代码适用于布尔值,但对于以下方法: percentFiltered ,我的代码变得狂暴。

通过上面提供的链接提交我的代码时, 我的输出 是:

  

percentFiltered(ini​​tial):0.0

     

process(0)进程返回值:true percentFiltered:100.0
  super.process名为:false

     

进程(0)进程返回值:true percentFiltered:200.0

但是,这是 正确 输出

  

percentFiltered(ini​​tial):0.0

     

process(0)进程返回值:true percentFiltered:100.0
  super.process名为:false

     

process(0)进程返回值:true percentFiltered:100.0

请注意,我的预期答案是100.0(我得到200.0,他们得到100.0)。所以现在我很难过。我对这个继承的东西还很新,所以我不知道我哪里出错了。这是我编写和提交的代码:

public class FilteredAccount extends Account {
    private int nonzeroTransCnt = 1;
    private int zeroTransCnt;

    public FilteredAccount(Client c) {
        super(c);
    }

    public double percentFiltered() {
        return zeroTransCnt / nonzeroTransCnt * 100.0;
    }

    public boolean process(Transaction t) {
        if (t.value() == 0) {
            zeroTransCnt++;
            super.__processCalled = false;
            return true;
        }
        else {
            nonzeroTransCnt++;
            super.__processCalled = true;
            return t.value() > -100 && t.value() < 1000000;
        }
    }
}

如果您点击上面的链接,他们会有一个名为帐户的扩展文件。 如果你能帮助我,请提前致谢。

1 个答案:

答案 0 :(得分:1)

问题是您的公式不正确。您需要除以交易总数,而不是未过滤交易的数量。你还遇到了一个问题,你在进行双击之前你正在进行int分裂。

    public double percentFiltered() {
        return (100.0 * zeroTransCnt) / (nonzeroTransCnt + zeroTransCnt);
    }

另一方面,您可以使用super来简化流程。你可能不应该直接设置旗帜。

public boolean process(Transaction t) {
    if (t.value() == 0) {
        zeroTransCnt++;
        return true;
    }
    else {
        nonzeroTransCnt++;
        return super.process(t);
    }
}

编辑:

另一个问题是你最初将nonzeroTransCnt设置为1。虽然它确实阻止了初始调用的零误差,但它会得到不正确的结果。

private int nonzeroTransCnt;

您可能希望为初始调用添加单独的检查。

    public double percentFiltered() {
        if ((nonzeroTransCnt + zeroTransCnt) == 0) {return 0.0;} //for initial call
        return (100.0 * zeroTransCnt) / (nonzeroTransCnt + zeroTransCnt);
    }