我正在尝试编写一个模拟翻转硬币的程序。硬币第一次翻转我希望程序退出。我的while循环中的第一个语句翻转了一次硬币。然后我有一个if语句,说明我刚刚翻转的硬币是否退出程序。但我的计划并没有按照我想要的方式运作。有时候
我的问题是我在while循环中每1个周期翻一次或两次硬币吗?硬币是否在while循环中翻转一次,然后在if条件下第二次翻转?我已经测试了它,但它每次都给出了不同错误的不同结果,我无法弄清楚原因。
if条件对于我在程序中尝试做的是否正确?
import acm.program.*;
import acm.util.*;
public class CoinToss extends ConsoleProgram{
public void run(){
while (true){
println(flipCoin());
if (flipCoin() == "heads"){
break;
}
}
}
public String flipCoin(){
String flip = rgen.nextBoolean() ? "heads" : "tails";
return flip;
}
public RandomGenerator rgen = RandomGenerator.getInstance();
}
答案 0 :(得分:5)
每次拨打flipCoin()
时,该方法都会运行,因此它会在println(flipCoin());
行上运行一次,在if (flipCoin() == "heads")
上运行一次。两个调用的结果可能不一样,您应该存储结果然后使用结果,所以:
while (true){
String result=flipCoin();
System.out.println(result);
if (result.equals("heads")){
break;
}
}
另请注意,使用== with strings(在大多数情况下)总是会给出false;这是因为==
询问它们是否真的是同一个对象,而不是它们的内容是否相等(两张纸都可以写上“hi”,但它们不是同一张纸)。 .equals
比较两个字符串的内容(即如果他们说同一个字)。
我尽可能接近您的代码保留我的修改,但您可能需要考虑以下可能的改进:
break;
可以拥有合法用法但通常是不必要的,您可以通过以下方式避免使用:
String result=flipCoin();
while (result.equals("heads")==false){
System.out.println(result);
result=flipCoin();
}
再次使用字符串作为标识符有其位置,但考虑到您可以使用的所有不同的资本化(head,Heads,HEADS),枚举可能是更好的选择。
答案 1 :(得分:3)
不,这是错的。您的代码目前正在翻转硬币,打印该值,然后翻转另一枚硬币以测试退出。问题在于,如果你连续翻转两个线圈,你不一定总会得到相同的结果。
更好的方法:
for(;;)
if(rgen.nextBoolean()) {
println("heads");
break;
} else
println("tails");
您不需要单独的方法来实际翻转硬币,因为该方法已经存在,称为rgen.nextBoolean()
。让方法返回一个字符串,然后处理字符串,是非常低效的。虽然效率对此无关紧要,但不要养成做这样的事情的坏习惯,否则可能会在以后咬你。
编辑:在回应一些评论时,这是一种更通用的,面向对象的方式:
public enum CoinFlipResult {
HEADS, TAILS;
@Override
public String toString(){
switch(this){
case HEADS: return "heads"; break;
case TAILS: return "tails"; break;
}
} //could have just done `name().toLowerCase()`, but I like this better
}
public CoinFlipResult flipCoin(){
if(rgen.nextBoolean())
return CoinFlipResult.HEADS;
else
return CoinFlipResult.TAILS;
}
@Override
public void run(){
CoinFlipResult flip;
do {
flip = flipCoin();
println(flip);
} while(flip != CoinFlipResult.HEADS)
}
答案 2 :(得分:3)
我不喜欢不必要的break
和不要将字符串与== 进行比较:
String result = null;
do {
result = flipCoin()
println(result);
} while (!"tails".equals(result));
我建议为“head”和“tails”引入String常量