2013-08-01 5 views
0

Мне нужно написать программу, которая просит пользователя вводить целые числа, но они должны быть положительными. Я уверен, что мне нужно использовать цикл, и не думаю, что мне разрешено использовать Math.abs().Получить пользовательский ввод положительных целых чисел в java

То, что я написал сейчас, выглядит довольно грязным. Вот код:

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

.... 


    } 
} 

Я в основном просто сделать отдельный, а петли для каждого целого, чтобы проверить, если число является положительным, потому что, когда я использую одну петлю я не могу заставить его работать правильно. Есть ли способ использовать один цикл, который будет работать, но выглядит намного опрятно?

+1

Можете ли вы хранить ints в массиве? –

+0

Пользователю необходимо ввести произвольное число целых чисел? Или вы знаете, сколько раньше времени? – Kon

ответ

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, что бы это ни было, доступно для этого метода.

Кроме того, вам следует лучше применять максимальное количество попыток, так как вы можете перейти в бесконечный цикл, если пользователь продолжает вводить отрицательные числа.

0

Вы можете обернуть время цикла внутри для цикла и положить целые числа в массиве:

int[] nums = new int[] {-1, -1, -1}; 
for (int i = 0; i < 3; i++) { 
    while(nums[i] <= 0) 
    nums[i] = TextIO.getInt(); 
} 
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 ... просто создать целочисленный массив и хранить все значения там. Если вы не знаете, сколько номеров вы хотели бы сохранить, я предлагаю вам использовать реализацию List, например ArrayList.

Надеюсь, это поможет.

+0

перерыв из-за времени грязный ??? Ты серьезно? –

+0

Это мое личное мнение. Это допустимо, однако мне не нравится этот подход. –

+0

Использование флага вместо перерыва с момента может быть улучшением, если вы назвали его чем-то, кроме «флага» ... – ajb

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

} 

Надеется, что это помогает

** Этот код не был протестирован

0

Вот решение с одним, а петлей и не используя массива (это может быть сделано). Но вы можете видеть, что это не соответствует ожиданиям. Такая реализация всегда неэффективна и обескуражена. Поэтому лучше использовать массив или отдельный метод, как и другие, предлагает.

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++; 
     } 
    } 
Смежные вопросы