2

我正在尝试编写一个模拟掷硬币的程序。硬币第一次翻转正面时,我希望程序退出。我的 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();
}
4

3 回答 3

5

每次调用flipCoin()该方法时都会运行一次,因此它在 line 上运行一次,println(flipCoin());if (flipCoin() == "heads"). 两次调用的结果可能不一样,应该先存储结果再使用结果,所以:

    while (true){
        String result=flipCoin();
        System.out.println(result);
        if (result.equals("heads")){
            break;
        }   
    }

另请注意,将 == 与字符串一起使用(在大多数情况下)总是会给出 false;这是因为==询问它们是否实际上是同一个对象,而不是它们的内容是否相等(两张纸上都可以写有“hi”,但它们不是同一张纸)。.equals比较两个字符串的内容(即如果他们说相同的词)。

我已使我的修改尽可能接近您的代码,但您可能需要考虑以下可能的改进:

  • break;可以有合法用途,但通常是不必要的,您可以通过以下方式避免它:

    String result=flipCoin();
    while (result.equals("heads")==false){
        System.out.println(result);
        result=flipCoin();
    
    }
    
  • 使用字符串作为标识符再次占有一席之地,但考虑到您可以使用的所有不同大写形式(heads、Heads、HEADS),枚举可能是更好的选择。

于 2013-06-19T11:23:12.760 回答
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)
}
于 2013-06-19T11:25:03.817 回答
3

我不喜欢不必要break的 s 并且不要将 String 与 == 进行比较

String result = null;
do {
    result = flipCoin()
    println(result);
} while (!"tails".equals(result));

我建议为“heads”和“tails”引入字符串常量

于 2013-06-19T11:31:22.227 回答