0

我正在为我的 c++ 类制作一个抛硬币程序,我们需要制作一个函数来翻转硬币并打印出它是正面还是反面,并且每行打印 10 个。当我运行程序时,虽然我用来检测硬币是正面还是反面的 if 语句不足以从两者中挑选出来。

#include <iostream>
#include <ctime>
using namespace std;

void coinToss(int times);

int main()
{
srand(time(0));
    int times;
    cout << "How many times would you like to toss the coin?" << endl;
    cin >> times;

coinToss(times);

return 0;
}

void coinToss(int times)
{
    int toss = 0, count = 0;
    for(int i = 0; i < times;i++)
    {
        toss = rand()%2;

        if(toss == 1)//Detects if coin is heads.
        {
            cout << "H";
        }
        if(toss == 0)//Detects if coin is tails.
        {
        cout << "T";
        }

        else //I had to include this for the program to run, further explanation below the code.
        {
        cout << "Ya done goofed."; 
        }

        count++; //Counts to ten
        if(count == 10) //Skips to the next line if the coin has been tossed ten times.
        {
            cout << endl;
            count = 0;
        }
    }

}

有一次,我用“cout << toss;”替换了正面或反面。并且返回的唯一数字是 1 和 0。我不明白如果我只得到两个数字,我正在检查其中一些数字不会被我的 if 语句捕获。

为了完成任务,我将第二个 if 语句更改为 else 语句,一切看起来都很好,但我真的很想了解这里发生了什么。

4

7 回答 7

2

好吧,rand()%2 只会产生两个数字:1 和 0,这似乎符合您的任务,因为硬币是布尔数字生成器,不是吗?:) 因此,这似乎可以完成您正在寻找的工作:

#include <iostream>
#include <ctime>
using namespace std;

void coinToss(int times);

int main()
{
srand(time(0));
    int times;
    cout << "How many times would you like to toss the coin?" << endl;
    cin >> times;

coinToss(times);

return 0;
}

void coinToss(int times)
{
    int toss = 0, Count = 0;

    for(int i = 0; i < times;i++)
    {
        toss = rand() % 2;

        // Choose:
        cout << ((toss) ? "H" : "T"); // if you want a character
        // or
        cout << toss;                 // if you want the number

        Count++; //Counts to ten
        if(Count == 10) //Skips to the next line if the coin has been tossed ten times.
        {
            cout << endl;
            Count = 0;
        }
    }
}
于 2014-10-07T09:52:37.183 回答
2

您的代码会发生什么情况:

结果是 1 吗?然后打印 H。继续。结果是 0 吗?然后打印 T。否则,如果不为 0,则打印“Ya done goofed.”。

您需要将您的if陈述联系在一起:

if (toss == 1) {
    cout << "H";
} else if (toss == 0) {
    cout << "T";
} else {
    cout << "Ya done goofed.";
}

您不会再掉入这种else情况下,并且可以将其移除。

作为旁注,关于您的整体程序结构:您的coinToss函数不应该做所有事情。您的代码应该更加拆分:返回 H 或 T 的函数,根据用户请求调用此函数 X 次并格式化输出的函数将是一个好的开始。

另一个小提示:count可以删除您的变量,允许您每 10 次翻转添加一个新行。i % 10会给你相同的结果:每十个增量,i % 10将等于 0。

于 2014-10-07T09:49:30.787 回答
2

您可能正在正确打印输出,然后在最后一行没有写换行符的情况下终止,并且您的 shell 提示清除回左边距并覆盖您的输出(清除该行的其余部分以启动)。如果您的投掷次数少于 10 次,则您唯一的输出行可能会丢失,否则它将是最后一行。

std::cout << '\n';尝试在 s之前添加一个额外main return的。

(另外,你可以说std::cout << "HT"[rand() % 2];, 或std::cout << (rand() % 2 ? 'H' : 'T');去掉ifs ,但这没什么大不了的......在这个阶段你最清楚的)

于 2014-10-07T09:39:22.150 回答
0

您还可以使用开关:

 switch( rand() % 2 )
 {
  case 0:
     cout << "T";
     break;

  case 1:
     cout << "H";
     break;

  default:
      cout << "oops you goofed!;
}
// continue within for loop

如果您在案例 1 之后“忘记”休息,您将再次得到“哎呀,你搞砸了!” 每次抛头后的消息。

于 2014-10-07T10:12:07.597 回答
0
    if(toss == 1)//Detects if coin is heads.
    {
        cout << "H";
    }
    else if(toss == 0)//Detects if coin is tails.
    {
    cout << "T";
    }

您需要使用 else-if 语句。你也不需要在后面使用 else,toss==0因为 rand()%2 要么是 0 要么是 1。没有第三个选项。

于 2014-10-07T09:35:02.317 回答
0

我不认为这有什么问题。好吧,我看不到...如果我添加一些调试,那么我会看到我认为您所期望的...

#include <iostream> 
#include <ctime> 
using namespace std;

void coinToss(int times);

int main() { 
  srand(time(0)); 
  int times; 

  cout << "How many times would you like to toss the coin?" << endl; 
  cin >> times;

  coinToss(times);

  return 0; 
}

void coinToss(int times) { 
  int toss = 0, count = 0; 

  for(int i = 0; i < times;i++) { 
      toss = rand() % 2;

      cout << "Toss: " << toss << endl;

      if(toss == 1)//Detects if coin is heads. 
      { 
          cout << "H (" <<  toss << ")" << endl; 
      } 
      if(toss == 0)//Detects if coin is tails. 
      { 
          cout << "T (" <<  toss << ")" << endl; 
      }

      count++; //Counts to ten 
      if(count == 10) //Skips to the next line if the coin has been tossed ten times. 
      { 
          //cout << endl; count = 0; 
      } 
  }
}

并编译它

g++ coin_toss.cc

并运行它

./a.out 
How many times would you like to toss the coin?
4
Toss: 1
H (1)
Toss: 0
T (0)
Toss: 0
T (0)
Toss: 0
T (0)

那么这正是我所期望的还是我错过了什么?

您不需要“if else if”语句。

于 2014-10-07T10:09:39.293 回答
0

rand() 返回一个介于 0 和 RAND_MAX 之间的伪随机整数。而且, rand() % 2 将是 0 或 1。所以,会有:

if(toss == 1)//Detects if head
{
  cout << "H";
}
else // tail
{
   cout << "T";
}
于 2014-10-07T09:41:41.880 回答