gpt4 book ai didi

如果从 rand() 接收到值,则 C/Else 与 Else 中的投币程序

转载 作者:太空宇宙 更新时间:2023-11-04 03:13:27 25 4
gpt4 key购买 nike

我编写了这个简单的程序来模拟抛硬币。它似乎工作正常,但是当“else”替换为“else if”时,程序不会产生预期的结果。

“Else”涵盖了第一个“IF”条件不满足且程序执行正常时的所有可能情况。当我尝试使用“else if (flip())”而不是“else”时,并非所有结果都显示出来。我希望从下面开始,只要函数“flip()”不返回 0,它就会返回 1,因此“else if (flip())”条件变为真,并且“heads”计数增加。但实际上发生了什么——“正面”计数至少减少了两倍(与使用“else”相比),即“else if (flip())”没有捕获所有返回值,当 flip() 返回 0 以外的任何值时.我明白,这里真的不需要使用“else if”,但如果有人能解释一下,为什么在这种情况下“else if”不会产生相同的结果,我将不胜感激。我错过了什么?非常感谢。

int flip ( void);

int main()
{
srand(time(NULL));
int tails = 0, heads = 0;
for ( int i = 1; i <= 100; i++){ // 100 tosses

if ( flip() == 0){
tails++; // increase tails count
printf("Tails ");
}
else{ // else if ( flip () ) - replacement for "else"
heads++; // increase heads count
printf("Heads ");
}

if ( i % 10 == 0){
printf("\n");
}
}
printf("\n\nTotal count is:\n%d for Heads\n%d for Tails\n", heads, tails);

return 0;
}

int flip ( void )
{
return rand()%2;
}

最佳答案

本质上,if语句的if (flip() == 0)分支和else if (flip())分支都会执行 flip() 分开。这意味着程序出现意外行为的那些边缘情况是由两个分支返回不同的数字引起的。

但是,如果您坚持要添加另一个分支,或者对于可能遇到同样问题的任何其他人,我能想到的最简单的解决方案是:

将返回值存储到变量中

只需在 for 循环的开头定义一个变量来保存该迭代的 flip() 结果并针对该结果进行测试就足以满足您想要完成的任务。

具体来说,我会在循环开始前声明变量(int result;),并在每次循环迭代开始时重新定义,以便每次都重新调用函数. (result = flip(); 在有问题的 if 语句之前)

另一个解决方案是:

使用 switch 语句

Switch 语句有点像修改过的 if/else 语句,除了它们在一个事物上测试许多不同的情况,例如

switch ( flip() ) // test against the result of flip()
{
// if it happens to be zero
case 0:
tails++;
printf("Tails ");
break;
// the break statement tells the program to stop this case
// if it happens to be one
case 1:
heads++;
printf("Heads ");
break;
}

虽然如果您决定放弃可变路由,它可能看起来过于复杂,但我认为实用程序 switch 语句可以添加到您的程序中,这非常值得。 (特别是如果有很多 if 分支)

TLDR: flip() 被调用了两次,请参阅标题下的解决方案和上面的解释。

关于如果从 rand() 接收到值,则 C/Else 与 Else 中的投币程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54161338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com