我为我的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语句,一切看起来都很好,但我真的很想了解这里发生了什么。
答案 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之后“忘记”休息,你将再次得到“哎呀!”每次头球投球后都会留言。