-1

私のコードが基づいている問題は、次の Web サイトにあります。

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

問題は、式が正しくないことです。フィルタリングされていないトランザクションの数ではなく、トランザクションの総数で割る必要があります。double にキャストする前に 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);
    }
}

編集:

もう 1 つの問題は、最初に 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 に答える