2012-09-28 171 views
-3

這裏是我的函數定義,根據兩個出價之間的關係計算拍賣中的贏家。它沒有提供正確的「winningBid」,並且即使在這些條件未被滿足時也經常跳到printErrorMessage 4。C++函數不起作用

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); 
} 
+1

-1您的代碼很難閱讀。縮小嵌套的「if」更好。另外,請爲您的問題選擇更多提示性標題。 –

+7

當發佈這樣的問題時,在觀察錯誤行爲的地方顯示功能的實際輸入是有幫助的。這比「這裏是我的代碼,它不工作,告訴我爲什麼」更體貼。 –

回答

0

在倒數第二else if我想你的意思bid2<reservePrice,不bid2>reservePrice

0
  • 你不處理的情況下,bid2<reservePrice && bid1>=reservePrice因爲你的比較錯字。
  • bid2>=reservePrice && bid1>=reservePrice情況下,內部的邏輯是腥(例如,如果bid2<bid1,則winningBid值可能大於bid1
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); 
} 

這就是我怎麼會在訂單結構這樣的代碼,有明確定義的規則優先級降低。這樣,這是您的英文規則和您的代碼之間的簡單映射。


對於它的價值,我覺得你有你的原代碼,至少有兩個問題:

  • 首先,else if (bid2>reservePrice && bid1>=reservePrice){應該已經檢查bid2下面儲備(使bid1默認爲贏)。
  • 其次,else if (bid2>=bid1 && bid2<(bid1+.50)){else if (bid2>(bid1+.50)){考慮到的可能性,bid2可能是正好等於bid1 + 0.5。這會導致winningBid/winningBidder被留在「隨機」值,這意味着您的輸出可能是任何東西。

但我真的不會考慮回去修復它們。在我看來,更好地實施我在代碼中給出的基於先例的規則方法。儘管您擁有的規則可能與我提供的規則不完全匹配,但要弄清楚應該做出哪些更改(與您的原始代碼相對)要容易得多。

我在代碼中的評論基本上是英文規則集,你採取的方法應該是類似的。

+0

單元測試失蹤! – nurettin

+0

@pwned,'main'函數,設計規範以及需求追蹤矩陣也是如此。如果按照我的正常工作來領取報酬,你可以得到他們全部:-)事實上,我希望爲OP保留一些工作。 – paxdiablo