2012-09-28 125 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