翻转硬币直到出现3个头

时间:2015-02-26 12:48:33

标签: c++

编写一个程序,模拟重复翻转硬币并继续直到三个连续的头被抛出。

#include <iostream>
#include <cmath>
#include <string>
#include <cstdlib>
#include "random.h"

using namespace std;
enum CoinSide {heads, tails}; 
CoinSide FlipCoin(int flip);

int main(){ 
    int flip;
    int heads = 0;
    int total_flips = 0;
    while( heads < 3){
        total_flips++;
        if(FlipCoin(flip) == heads){
            heads++;
        } else{
            heads = 0;
        }
    }
    cout << "it took " << total_flips << "to get 3 consecutive heads. " << endl;

}   

CoinSide FlipCoin(int flip) {
    if (randomChance(0.50)) {
        return "heads";
    } else {
        return "tails";
    }
}

现在我收到一个未知错误,当​​我运行此代码时,任何人都知道为什么它不会运行&gt;?

2 个答案:

答案 0 :(得分:3)

FlipCoin返回一个布尔值(整数)值,与const char*的比较是非法的。 "heads""tails"只是那个。

您可以返回std::string进行比较,但我建议你有一个enum CoinSide {HEADS, TAILS};并将其返回。

CoinSide FlipCoin(int flip) {
    if (randomChance(0.50)) {
        return HEADS;
    }
    return TAILS;
}

if (FlipCoin(flip) == HEADS)

答案 1 :(得分:1)

除上述答案外:

请自己和任何可能需要查看您的代码的人,从不使用相同的名称来处理不同的事情,并尝试在相同的上下文中使用这些不同的东西。在这种情况下,我正在谈论

enum CoinSide {heads, tails}; // <- This
CoinSide FlipCoin(int flip);

int main(){ 
    int flip;
    int heads = 0;            // <- in combination with this! Because:
    int total_flips = 0;
    while( heads < 3){
        total_flips++;
        if(FlipCoin(flip) == heads){ 
            // You might think you're comparing
            // FlipCoin(int)::CoinSide vs. CoinSide::heads
            // But(!) you compare
            // FlipCoint(int)::CoinSide vs. main::heads
            // The very main::heads you're going to increase now.
            heads++;
        } else{
            heads = 0;
        }
    } // Will never terminate.
    cout << "it took " << total_flips << "to get 3 consecutive heads. " << endl;

}

如果你使用的常数值意味着你应该

a)使它们在视觉上脱颖而出,例如在枚举中使用 HEADS TAILS 代替 head tails 。 b)永远不要给两个相同名称的东西,并且(尝试)在同一个环境中使用它们。

这将为您节省一些严重的头部刮伤案例。