为什么我的if语句不能始终如一?

时间:2014-10-07 09:30:04

标签: c++ if-statement coin-flipping

我为我的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;
        }
    }

}

有一次,我用&#34; cout&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;簸;&#34;并且返回的唯一数字是1和0.我不明白如果我只获得两个数字,我检查其中一些数字是不是被我的if语句捕获

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

7 个答案:

答案 0 :(得分:2)

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

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

(另外,您可以说std::cout << "HT"[rand() % 2];std::cout << (rand() % 2 ? 'H' : 'T');并取消if,但这没什么大不了的......现阶段对您来说最清楚的是什么?< / p>

答案 1 :(得分:2)

您的代码会发生什么:

结果是1吗?然后打印H.继续。结果是0吗?然后打印T. Else,如果它不是0,则打印&#34; Ya完成了傻瓜。&#34;。

您需要将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会给你相同的结果:每增加10个,i % 10将等于0.

答案 2 :(得分: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;
        }
    }
}

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

rand()返回0到RAND_MAX范围内的伪随机整数。并且,rand()%2将为0或1.因此,会有:

if(toss == 1)//Detects if head
{
  cout << "H";
}
else // tail
{
   cout << "T";
}

答案 5 :(得分: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”声明。

答案 6 :(得分:0)

您也可以使用开关:

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

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

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

如果你在案例1之后“忘记”休息,你将再次得到“哎呀!”每次头球投球后都会留言。