Почему мои операторы if не работают постоянно?

Я делаю программу подбрасывания монеты для своего класса 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, и все кажется приятным, но мне бы очень хотелось понять, что здесь происходит.


person user3427139    schedule 07.10.2014    source источник
comment
else применяется только к if (toss == 0), поэтому, когда _3 _...   -  person Jarod42    schedule 07.10.2014
comment
вам нужно использовать вложенные if ..   -  person lakesh    schedule 07.10.2014


Ответы (7)


Что происходит с вашим кодом:

Результат 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.

person Marc Plano-Lesay    schedule 07.10.2014

Вы, вероятно, распечатываете вывод правильно, а затем завершаете работу без записи новой строки в последней строке, и ваша оболочка предлагает очистить обратно до левого поля и перезаписать вывод (очищая остальную часть строки для загрузки). Если у вас меньше 10 бросков, ваша единственная строка вывода может оказаться потерянной, иначе это будет последняя строка.

Попробуйте добавить дополнительный std::cout << '\n'; перед main returns.

(Отдельно вы можете сказать std::cout << "HT"[rand() % 2]; или std::cout << (rand() % 2 ? 'H' : 'T'); и покончить с ifs, но в этом нет ничего страшного ... все, что для вас наиболее ясно на данном этапе)

person Tony Delroy    schedule 07.10.2014

Ну, 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;
        }
    }
}
person Xarylem    schedule 07.10.2014
comment
Count можно вычислить с i % 10. - person Marc Plano-Lesay; 07.10.2014
comment
Да, и вы сохраняете переменную, но я просто не хотел слишком сильно менять его код :). - person Xarylem; 07.10.2014

    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. Третьего варианта нет.

person lakesh    schedule 07.10.2014

rand () возвращает псевдослучайное целое число в диапазоне от 0 до RAND_MAX. И rand ()% 2 будет 0 или 1. Итак, будет:

if(toss == 1)//Detects if head
{
  cout << "H";
}
else // tail
{
   cout << "T";
}
person Dr. Debasish Jana    schedule 07.10.2014

Я не думаю, что в этом что-то плохое. Ну, не то, чтобы я мог видеть ... Если я добавлю немного отладки, тогда я увижу то, что, как я думаю, вы ожидаете ...

#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)

Тогда это именно то, что я ожидаю, или я что-то упускаю?

Вы не нуждаетесь в выражении «если еще, если».

person RandiiRedneck    schedule 07.10.2014
comment
Вам это не нужно. Но с одним проще читать и понимать. - person Marc Plano-Lesay; 07.10.2014

Вы также можете использовать переключатель:

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

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

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

Если вы «забыли» перерыв после случая 1, вы снова получите «ой, вы дурачились!» сообщение после каждого подбрасывания головы.

person CashCow    schedule 07.10.2014