2014-10-07 2 views
0

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

} 

В один момент я заменил голову или хвосты «соиЬ < < жеребьевки;» и только возвращаемые числа были 1 и 0. Я не понимаю, как, если я получаю только два числа, которые я проверяю, некоторые из них не попадают в мои операторы if.

Чтобы выполнить это задание, я изменил второе выражение if в выражении else, и все кажется персиковым, но я бы очень хотел понять, что здесь происходит.

+3

'if (toss == 0)' ==> 'else if (toss == 0)' – WhozCraig

+3

'else' применяются только к' if (toss == 0) ', поэтому, когда' toss == 1 '... – Jarod42

+0

вам нужно использовать вложенный, если .. – lakesh

ответ

2

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

Является ли результат 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.

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. Третий вариант отсутствует.

2

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

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

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

0

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

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

' Count' может быть вычислен с помощью 'i% 10'. –

+0

Да, и вы сохраняете переменную, но я просто не хочу слишком сильно менять свой код :). – Xarylem

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 if if if.

+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 вы снова получите «упс вы goofed!» сообщение после каждого броска головы.

Смежные вопросы