-1

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

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

所以基本上,我的代码适用于布尔值,但对于以下方法:percentFiltered,我的代码会发疯。

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

percentFiltered(初始):0.0

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

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

但是,这是正确的 输出

percentFiltered(初始):0.0

process(0) 进程返回值:true percentFiltered:100.0
super.process called: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;
        }
    }
}

如果您单击上面的链接,他们有一个名为Account的扩展文件。提前谢谢,如果你能帮助我。

4

1 回答 1

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);
    }
于 2013-04-27T04:40:52.320 回答