0

我必须编写一个程序,要求用户输入整数,但它们必须是正数。我很确定我必须使用循环,并且不认为我可以使用 Math.abs()。

我现在写的东西看起来很乱。这是代码:

public class Q1{
    public static void main(String[] args){
        int num1, num2, num3;

        while(true){
            System.out.println("Input first integer.");
            num1 = TextIO.getInt();
            if(num1 > 0)
                break;
            System.out.println("Integer isn't positive. Try again");
        } 

        while(true){
            System.out.println("Input second integer.");
            num2 = TextIO.getInt();
            if(num2 > 0)
                break;
            System.out.println("Integer isn't positive. Try again");
       }

       while(true){
           System.out.println("Input third integer.");
           num3 = TextIO.getInt();
           if(num3 > 0)
               break;
           System.out.println("Integer isn't positive. Try again");
       }

....


   }
}

我基本上只是为每个整数做了单独的 while 循环来测试整数是否为正,因为当我使用一个循环时,我无法让它正常运行。有没有一种方法可以只使用一个仍然可以工作但看起来更整洁的循环?

4

5 回答 5

2

您可以将该循环移动到另一个方法中:

public int readPositiveInt() {
    int num = 0;
    int attempt = 0;
    int maxAttempt = 3;

    // Allow only maxAttempt to enter correct input.
    while(true && attempt < maxAttempt) {
        num = TextIO.getInt();
        if(num > 0)
            break;
        System.out.println("Integer isn't positive. Try again");
        ++attempt;
    } 

    return num;
}

然后在当前有循环的地方调用此方法。

确保TextIO无论它是什么,都可用于此方法。

此外,您应该更好地执行最大尝试次数,因为如果用户继续输入负数,您可能会进入无限循环。

于 2013-08-01T19:50:47.367 回答
0

这是一个带有单个 while 循环且不使用数组的解决方案(可以完成)。但是,你可以看到它并没有达到预期。这样的实现总是效率低下并且不鼓励。所以最好像其他人建议的那样使用数组或单独的方法

int i=0;
while (i < 3) {
        int tmp = 0;
        switch (i) {
        case 0:
            num1 = tmp = TextIO.getInt();
            System.out.println("Input first integer.");
            break;
        case 1:
            num2 = tmp = TextIO.getInt();
            System.out.println("Input second integer.");
            break;
        case 2:
            num3 = tmp = TextIO.getInt();
            System.out.println("Input Third integer.");
            break;
        }

        if (tmp < 0) {
            System.out.println("Integer isn't positive. Try again");
        } else {
            i++;
        }
    }
于 2013-08-01T20:34:42.057 回答
0

您可以将 while 循环包装在 for 循环中,并将整数放入数组中:

int[] nums = new int[] {-1, -1, -1};
for (int i = 0; i < 3; i++) {
  while(nums[i] <= 0)
    nums[i] = TextIO.getInt();
}
于 2013-08-01T19:55:27.370 回答
0

在编程时,您尝试实现 3 个目标:使您的代码具有可读性、直观性和可维护性。

我建议您创建一个可以重用的方法。您的案例中的方法如下所示:

public int readPositiveInt(String message) {
    int num = 0;
    boolean exitLoop = false;

    while(!exitLoop){
        System.out.println(message);
        num = TextIO.getInt();
        if(num > 0) {
            exitLoop = true;
            // I don't like to break from a while(true), I personally find it messy
        }
        else {
            System.out.println("Integer isn't positive. Try again");
        }

    } 

    return num;
}

而不是创建变量,如 num1、num2、num3 ... 只需创建一个 int 数组并将所有值存储在其中。如果您不确定要存储多少个数字,我建议您使用 List 的实现,例如 ArrayList。

我希望这有帮助。

于 2013-08-01T19:58:21.007 回答
0

大概是这样的?

public class Q1{
public static void main(String[] args){

int[] input_integers = new int[3]; //create an array of however many integers you need 

int i = 0; // initiate your counter
while(i<input_integers.length){ // you will loop through until all integers are set
System.out.println("Input integer number "+ (1+i)); // computers count from 0, humans from 1
input_integers[i] = TextIO.getInt();
if(input_integers[i] < 0) // check if it is not positive
System.out.println("Integer isn't positive. Try again");
else { // if it is, increment your counter and get the next integer
i++;
}
} 
 }

 }

希望这可以帮助

** 此代码未经测试

于 2013-08-01T20:01:06.080 回答