2

コイン投げをシミュレートするプログラムを作成しようとしています。コインが初めて表を裏返したときに、プログラムを終了させたい。while ループの最初のステートメントは、コインを 1 回裏返します。次に、投げたばかりのコインが表であったかどうかを示す if ステートメントがあります。プログラムを終了します。しかし、私のプログラムは思い通りに動作しません。時々

私の質問は、while ループで 1 サイクルごとにコインを 1 回または 2 回投げているかということです。コインは while ループで 1 回裏返され、次に if 条件で 2 回裏返されますか? テストしましたが、毎回異なるエラーで異なる結果が得られ、その理由がわかりません。

私のプログラムでやろうとしていることに対して 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()に実行されるため、行println(flipCoin());で 1 回、 で 1 回実行されif (flipCoin() == "heads")ます。2 つの呼び出しの結果は同じではない可能性があります。結果を保存してから、結果を使用する必要があります。

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

また、文字列で == を使用すると (ほとんどの状況で) 常に false になることにも注意してください。これは==、内容が等しいかどうかではなく、文字通り同じオブジェクトであるかどうかを が尋ねるためです (2 枚の紙に「hi」が書かれている可能性がありますが、同じ紙ではありません)。2 つの文字列の内容.equalsを比較します (つまり、同じ単語を言っている場合)。

私は変更を可能な限りあなたのコードに近づけましたが、次の可能な改善を検討することをお勧めします:

  • break;正当な使用法を持つことができますが、通常は不要です。次の方法で回避できます。

    String result=flipCoin();
    while (result.equals("heads")==false){
        System.out.println(result);
        result=flipCoin();
    
    }
    
  • 識別子として文字列を使用することも適切ですが、使用できるさまざまな大文字化 (ヘッド、ヘッド、ヘッド) をすべて考慮してください。列挙型の方が適切な選択かもしれません。

于 2013-06-19T11:23:12.760 に答える