2

我正在开始 Java 编程,并且我编写了一个程序来测试每个行星有多少颗卫星。这是一个只有四个行星的缩短版本。

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);
    }
    }
}

我将如何不必多次写“else if”?随着更多的陈述,这变得非常乏味。请记住,我是一个初学者,这段代码是关于我目前能力的限制。

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 继承的每个行星创建一个类“Planet”和另一个类,并将行星特定信息添加到每个行星。然后,当您计划为行星添加更多问题时,您对未来有好处。

于 2012-09-01T20:20:11.620 回答
0

看一下switchJava中的语句。这旨在帮助克服一个棘手的 if-elseif-elseif-elseif-else 块:

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

您可以使用其他一些清理方法,但是将那个 switch 块放在适当的位置可以解决您的初始评论。祝你好运。

于 2012-09-01T20:16:15.977 回答
0

您可以尝试使用switch而不是长if-else梯。

有关switch阅读java 文档的更多信息

在你的情况下,它可能是这样的:

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)是 a 的概念Map,很像 Python 中的字典。您可以维护一张将行星(字符串)映射到其拥有的卫星数量(int)的地图。

于 2012-09-01T20:16:32.687 回答
0

我会从忘记那个向量开始,将行星和它们的卫星放在一个 POJO(普通旧 Java 对象)中,然后将这些对象放入数组中:

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 回答