-4

これは、2 つの入札間の関係に応じてオークションの勝者を計算する関数の定義です。正しい「落札価格」が表示されず、条件が満たされていない場合でも、printErrorMessage 4 にスキップすることがよくあります。

void calcWinner(string bidder1, string bidder2, string lotName, 
                double bid1, double bid2, double reservePrice)
{
    double winningBid;
    string winningBidder;
    if (bid2<reservePrice && bid1<reservePrice) 
        printErrorMessage(4);
    else if (bid2>=reservePrice && bid1>=reservePrice)
    {
        if (bid2<bid1){
            winningBid=bid2+.50;
            winningBidder=bidder1;}
        else if (bid2>=bid1 && bid2<(bid1+.50)){
            winningBidder=bidder1;
            winningBid=bid1;}
        else if (bid2>(bid1+.50)){
            winningBidder=bidder2;
            winningBid=(bid1+.50);}
    }
    else if (bid2>reservePrice && bid1>=reservePrice){
        winningBidder=bidder1;
        winningBid=reservePrice;}
    else if (bid2>=reservePrice && bid1<reservePrice){
        winningBidder=bidder2;
        winningBid=bid2;}
    printWinner(winningBidder, lotName, winningBid);
}
4

3 に答える 3

3

コードではなく平易な英語でルールを実際に書き留めて (まだ書いていないと仮定して)、単純化するようにしてください。これは、基本的に (私が思うに) に要約される状況では、非常に大量のコードのように思えます。

void calcWinner (string bidder1, string bidder2, string lotName,
                 double bid1, double bid2, double reservePrice)
{
    // Error if both less than reserve.

    if ((bid2 < reservePrice) && (bid1 < reservePrice) ) {
        printErrorMessage (4);
        return;
    }

    // If only ONE less than reserve, other one wins.

    if (bid1 < reservePrice) {
        printWinner (bidder2, lotName, bid2);
        return;
    }

    if (bid2 < reservePrice) {
        printWinner (bidder1, lotName, bid1);
        return;
    }

    // Both at least reserve at this point, bidder1 wins if higher bid, but
    // only pays bid2 + 50c.

    if (bid1 >= bid2) {
        printWinner (bidder1, lotName, bid2 + 0.5);
        return;
    }

    // Bidder1 also wins if bidder2 didn't beat them by 50c or more, but
    // only pays what they bid.

    if (bid2 < bid1 + 0.5) {
        printWinner (bidder1, lotName, bid1);
        return;
    }

    // Otherwise, bidder2 wins, pays 50c more than bid1.

    printWinner (bidder2, lotName, bid1 + 0.5);
}

これが、優先順位の低い順に明確に定義された一連のルールを使用して、このようにコードを構造化する方法です。そうすれば、英語のルールとコードを簡単にマッピングできます。


元のコードには少なくとも 2 つの問題があったと思います。

  • まず、リザーブを下回っているelse if (bid2>reservePrice && bid1>=reservePrice){ことを確認する必要がありました(デフォルトで勝つため)。bid2bid1
  • 第 2 に、が と正確に等しくなる可能性を考慮しないelse if (bid2>=bid1 && bid2<(bid1+.50)){else if (bid2>(bid1+.50)){ください。これにより、「ランダムな」値のままになります。つまり、出力は何でもかまいません。bid2bid1 + 0.5winningBid/winningBidder

しかし、私は真剣にそれらを修正するために戻ることさえ考えていません. 私の意見では、コードで示した前例に基づくルール アプローチを実装する方がはるかに優れています。あなたが持っているルールは私が提供したものと完全に一致しないかもしれませんが、(元のコードとは対照的に) どのような変更を加える必要があるかを理解するのははるかに簡単です。

コード内のコメントは基本的に英語のルール セットであり、アプローチも似ているはずです。

于 2012-09-28T06:23:45.637 に答える
0
  • bid2<reservePrice && bid1>=reservePrice比較のタイプミスのため、ケースを処理しません。
  • ケース内のロジックbid2>=reservePrice && bid1>=reservePriceが怪しい (たとえばbid2<bid1winningBid値が よりも大きい場合bid1)
于 2012-09-28T06:07:34.293 に答える
0

最後から 2 番目は、 ではなく、else ifという意味だったと思います。bid2<reservePricebid2>reservePrice

于 2012-09-28T05:55:55.843 に答える