Почему мои заявления if не работают последовательно?

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

0

Решение

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

Результат 1? Затем напечатайте H. Продолжайте. Результат 0? Затем выведите T. Else, если это не 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.

2

Другие решения

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

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

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

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;
}
}
}
2

    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 потому что rand ()% 2 будет либо 0, либо 1. Третьего варианта нет.

0

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

if(toss == 1)//Detects if head
{
cout << "H";
}
else // tail
{
cout << "T";
}
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)

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

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

0

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

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

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

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

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

0