Отсканированный ввод внутри цикла do-while не сбрасывается должным образом на следующей итерации

Моя программа предназначена для сложения всех четных целых чисел от 2 до входного числа от 20 до 60. Логика для этого верна и будет работать, но она должна иметь возможность запускаться снова, если пользователь пожелает, и когда он запускается снова, ввод изменяется только в том случае, если вы вводите новое целое число, большее, чем на предыдущей итерации. Если вы введете один меньший, он просто использует тот же целочисленный ввод, что и раньше. Вот код:

import java.util.Scanner;

public class Practice_7_1
{
   public static void main (String[] args)
   {
      Scanner scan = new Scanner (System.in);
      int input;
      int i = 2;
      int sum = 0;
      int restart;
      do
      {
         System.out.print ("\nEnter a value between 20 and 60: ");
         input = scan.nextInt();

         if (input >= 20 && input <= 60) // checks validity of input
         {
            while (i <= input)
            {
               sum = sum + i;
               i = i + 2;
            }
            System.out.println ("\nSum of even numbers between 2 and " + 
            input + " is: " + sum);
            }
         else 
         {
            System.out.println ("\nInput is not between 20 and 60. ");
         }

         System.out.print ("\nEnter a new value? (1 for yes, any other number
         for no): ");
         restart = scan.nextInt();
      } while (restart == 1);
    }
}

Так, например, если я введу 20 в качестве входных данных, программа выведет:

Сумма четных чисел от 2 до 20 составляет: 110

Введите новое значение? (1 - да, любой другой номер - нет):

а затем ввожу 30 (такой же запуск программы):

Сумма четных чисел от 2 до 30 составляет: 240

Введите новое значение? (1 - да, любой другой номер - нет):

а затем снова пытаюсь ввести 20:

Сумма четных чисел от 2 до 20 составляет: 240

Введите новое значение? (1 - да, любой другой номер - нет):

(Очевидно, должно быть 110, а не 240)

Моя первоначальная мысль заключалась в том, что на самом деле он не сканирует новый ввод на второй итерации, но поскольку он будет работать, если я буду продолжать давать ему более ценные входные данные, я знаю, что это не так.


person Michael Berry    schedule 05.10.2015    source источник
comment
Что произойдет, если вы установите input в ноль в начале цикла?   -  person Nate Barbettini    schedule 06.10.2015
comment
Я пробовал, ничего другого не происходит.   -  person Michael Berry    schedule 06.10.2015


Ответы (1)


Используйте этот код внутри main ()

Scanner scan = new Scanner (System.in);
      int input;
      int i = 2;
      int sum = 0;
      int restart;
      do
      {
         System.out.print ("\nEnter a value between 20 and 60: ");
         input = scan.nextInt();

         if (input >= 20 && input <= 60) // checks validity of input
         {
             i = 2;
             sum = 0;
            while (i <= input)
            {
               sum = sum + i;
               i = i + 2;
            }
            System.out.println ("\nSum of even numbers between 2 and " + 
            input + " is: " + sum);
            }
         else 
         {
            System.out.println ("\nInput is not between 20 and 60. ");
         }

         System.out.print ("\nEnter a new value? (1 for yes, any other number for no): ");
         restart = scan.nextInt();
      } while (restart == 1);
person Community    schedule 06.10.2015
comment
Спасибо! Это сработало! Я снова попытался инициализировать ввод, но только что понял, что это int i, которое нужно сбросить до 2. - person Michael Berry; 06.10.2015
comment
Я предпочитаю использовать циклы for, особенно когда речь идет о вложении. Потому что тогда вам не нужно явно инициализировать счетчики. Поскольку инициализация встроена как часть синтаксиса - person ; 06.10.2015