编写一个程序,模拟重复翻转硬币并继续直到三个连续的头被抛出。
#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;?
答案 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)永远不要给两个相同名称的东西,并且(尝试)在同一个环境中使用它们。
这将为您节省一些严重的头部刮伤案例。