2

私はJavaプログラミングを始めており、各惑星の衛星数をテストするプログラムを作成しました。これは、惑星が4つしかない短縮版です。

import java.util.Scanner;
import java.util.Random;

public class one {
    public static void main(String args[]){
        //SET VARIABLES
        String zero="Mercury", one="Venus", two="Earth", three="Mars";
        //SET VARIABLES
        for (int x=1; x<=1000; x++){
            System.out.println("Moons");
            Random r = new Random();
            for (int y=1; y<=1; y++){
                int rI = r.nextInt(4);
                if (rI == 0){
                question(zero,0);
                }
                else if (rI == 1){
                question(one, 0);
                }
                else if (rI == 2){
                question(two, 1);
                }
                else if (rI == 3){
                question(three, 2);
                }
            }
        }
    }

    public static void question(String n, int num){
    Scanner input = new Scanner(System.in);
    System.out.print("How many moons does " + n + " have? ");
    int ans = input.nextInt();
    if (ans == num){
        System.out.println("Correct!");
    }
    else if (ans != num){
        System.out.println("Incorrect!");
        question(n, num);
    }
    }
}

「elseif」を何度も書く必要がないようにするにはどうすればよいでしょうか。これは、ステートメントが増えると非常に面倒になります。私は初心者であり、このコードは私の現在の能力の限界についてのものであることを忘れないでください。

4

8 に答える 8

4

次のような配列を使用できます。

String[] planets = { "Mercury", "Venus", "Earth", "Mars" };
int moons[] = { 0, 0, 1, 2 };

と電話:

if (rI >= 0 && rI < planets.length) {
    question(planets[rI], moons[rI]);
}
于 2012-09-01T20:16:52.273 に答える
1

このコードを書くためのより良い方法。読みやすく、更新も非常に簡単です。

import java.util.Scanner;
import java.util.Random;

public class one {
    public static void main(String args[]){
        //SET VARIABLES
        String planets []=new String[4];
        planets[0]="Mercury";
        planets[1]="Venus";
        planets[2]="Earth";
        planets[3]="Mars";
        int moons []=new int[4];
        moons[0]=0;
        moons[1]=0;
        moons[2]=1;
        moons[3]=2;
        //SET VARIABLES
        while(true){
            System.out.println("Moons");
            Random r = new Random();
            int rI = r.nextInt(4);
            question(planets[rI],moons[rI]);
        }
    }

    public static void question(String n, int num){
        Scanner input = new Scanner(System.in);
        System.out.print("How many moons does " + n + " have? ");
        int ans = input.nextInt();
        if (ans == num){
            System.out.println("Correct!");
        }
        else if (ans != num){
            System.out.println("Incorrect!");
            question(n, num);
        }
    }
}
于 2012-09-01T20:19:44.497 に答える
1

ロジックが進化しない限り、switchまたはif-elseを使用できます。それ以外の場合は、オブジェクト指向プログラミングを開始する必要があります。惑星から継承する惑星ごとにクラス「Planet」と別のクラスを作成し、それぞれに惑星固有の情報を追加します。そうすれば、惑星のためにさらにいくつかの質問を追加することを計画するかもしれないとき、あなたは将来のために良いです。

于 2012-09-01T20:20:11.620 に答える
0

まず、そのベクトルを忘れて、惑星とその衛星をPOJO(Plain Old Java Object)にまとめ、それらのオブジェクトを配列に入れます。

class Planet {

    int moons;
    String name;

    Planet(String name, int moons) {
         this.name = name;
         this.moons = moons;
    }

    public String getName() {
        return this.name;
    }

    public getMoons() {
        return this.moons;
    }

    public void question(){
        Scanner input = new Scanner(System.in);
        System.out.print("How many moons does " + this.name + " have? ");
        int ans = input.nextInt();
        if (ans == this.moons){
            System.out.println("Correct!");
        }
        else {
            System.out.println("Incorrect!");
        }
    }
}

public class one {
    public static void main(String args[]){
        //SET VARIABLES
        List<Planet> planets = new ArrayList<Planets>();
        Planet earth = new Planet("Earth", 1);
        // put other planets
        //SET VARIABLES
        for (int x=1; x<=1000; x++) {
            System.out.println("Moons");
            Random r = new Random();
            int rI = r.nextInt(planets.size());
            Planet p = planets.get(rI);
            p.question();
        }
    }
}
于 2012-09-01T20:35:26.557 に答える
0

ここでは、配列よりも列挙型を優先します。この列挙型チュートリアル(特に惑星の例;)を参照してください。月の数に別のフィールド(質量と半径のように)を追加します。

于 2012-09-01T20:36:41.613 に答える
0

switchJavaのステートメントを見てください。これは、厄介なif-elseif-elseif-elseif-elseブロックを克服するのに役立つように設計されています。

switch(rI){
    case 2: question(two, 1);
            break;
    case 3: question(three, 2);
            break;
    default: doSomethingClever(...);
}

採用できるクリーンアップは他にもいくつかありますが、そのスイッチブロックを配置することで、最初のコメントに対処できます。幸運を。

于 2012-09-01T20:16:15.977 に答える
0

長いラダーswitchの代わりに使ってみることができます。if-else

詳細については、 Javaのドキュメントswitchをお読みください

あなたの場合、それは次のようなものである可能性があります。

switch (rI) {
    case 0:
        question(zero, 0);
        break;
    case 1:
        question(one, 0);
        break;
    case 2:
        question(two, 1);
        break;
    case 3:
        question(three, 2);
        break;
    default:
        break;
}
于 2012-09-01T20:16:25.177 に答える
0

switch次のキーワードを使用できます。

switch (rI) {
    case 0:
        question(zero, 0);
        break;
    case 1:
        question(one, 0);
        break;
    case 2:
        question(two, 1);
        break;
    case 3:
        question(three, 2);
        break;
    default:
        // do something
}

default一致するものが見つからない場合、以下のコードが実行されます。

配列を使用することもできます:

String[] planets = new String[]{"Mercury", "Venus", "Earth", "Mars"};
int[] nums = new int[]{0, 0, 1, 2};
...
// in the loop:
question(planets[rI], nums[rI]);

もちろん、問題に取り組む方法は他にもありますが、これらを学んでいる人にとっては、うまくいくべきだと思います。ただし、(Javaを深く理解した後で)調べたいと思うかもしれないことの1つは、MapPythonの辞書によく似たの概念です。惑星(文字列)をそれが持っている衛星の数(int)にマップするマップを維持することができます。

于 2012-09-01T20:16:32.687 に答える