Я делаю программу броска монеты для своего класса с ++, и мы должны сделать функцию, которая подбрасывает монету и распечатывает, если это голова или хвост, и печатает 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, и все кажется превосходным, но мне бы очень хотелось понять, что здесь происходит.
Что происходит с вашим кодом:
Результат 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.
Вы, вероятно, печатаете вывод правильно, затем завершаете работу без записи новой строки в последней строке, и ваша оболочка предлагает очистить обратно до левого поля и перезаписать вывод (очистив оставшуюся часть строки для загрузки). Если у вас меньше 10 бросков, ваша единственная строка вывода может оказаться потерянной, иначе это будет последняя строка.
Попробуйте добавить дополнительный std::cout << '\n';
до main
return
s.
(Отдельно можно сказать std::cout << "HT"[rand() % 2];
, или же std::cout << (rand() % 2 ? 'H' : 'T');
и покончить с if
с, но это не имеет большого значения … что бы ни было для вас на данном этапе)
Что ж, 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;
}
}
}
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. Третьего варианта нет.
rand () возвращает псевдослучайное целое число в диапазоне от 0 до RAND_MAX. И rand ()% 2 будет 0 или 1. Итак, будет:
if(toss == 1)//Detects if head
{
cout << "H";
}
else // tail
{
cout << "T";
}
Я не думаю, что с этим что-то не так. Ну, не то, чтобы я мог видеть … Если я добавлю отладку, я увижу то, что, я думаю, вы ожидаете …
#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)
Тогда это именно то, что я ожидаю, или я что-то упустил?
Вам не нужно утверждение «если еще, если».
Вы также можете использовать переключатель:
switch( rand() % 2 )
{
case 0:
cout << "T";
break;
case 1:
cout << "H";
break;
default:
cout << "oops you goofed!;
}
// continue within for loop
Если бы вы «забыли» перерыв после случая 1, вы снова получили бы «упс! сообщение после каждого броска головы.