2014-02-19 3 views
0

Я создал этот код, чтобы получить неограниченные значения целых чисел, сохранить их и вычислить среднее значение. Он также делает это в квадратном формате. Моя проблема заключается в том, что я создал ее так, чтобы цикл while останавливался только при вводе числа 0. Тем не менее, я только помещаю его в качестве замены, так как это единственный способ проверить остальную часть кода, чтобы убедиться, что все это работает.While Loop not integer

Что я действительно хочу сделать, цикл while продолжается до тех пор, пока пользователь не предоставит ввод, который не является целым числом. Ive пробовал все, используя hasNextint() или nextint и так далее, что я могу сделать?

import java.io.*; 
import java.util.*; 

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

    Scanner TextIO = new Scanner(System.in); 
    int inputNumber;  // One of the integers input by the user. 
    int sum;    // The sum of all the integers. 
    int count;   // The number of integers that have been entered. 
    double mean;   // The mean value of the integers, rounded to 2 decimal places. 
    int squarein;  // Value of squared number. 
    int sumsquare;  // The sum of the squares of all the integers. 
    double meansquare; // The mean value of the squares of integers, rounded to 2 decimal places. 

    /* Initialize the summation and counting variables. */ 
    sum = 0; 
    count = 0; 
    sumsquare = 0; 
    meansquare = 0; 

    /* Read and process the user's input. */ 
    System.out.println("Enter your first positive integer: "); 
    inputNumber = TextIO.nextInt(); 

    while (inputNumber != 0) { 
     sum += inputNumber; // Add inputNumber to running sum. 
     squarein = inputNumber; // 
     sumsquare = squarein * squarein; //square inputs 
     count++;    // Count the input by adding 1 to count. 
     System.out.println("Enter your next positive integer, or 0 to end: "); 
     inputNumber = TextIO.nextInt(); 
    } 

    /* Display the result. */ 
    if (count == 0) { 
     System.out.println("You didn't enter any data!"); 
    } else { 
     mean = ((double)sum)/count; 
     meansquare = ((double)sumsquare)/count; 

     TextIO.nextInt(); 

     System.out.println("Numbers entered: " + count + "\n"); 
     System.out.println("Sum: " + sum + "\n"); 
     System.out.println("Mean: " + mean + "\n"); 
     System.out.println("Sum Squares: " + sumsquare + "\n"); 
     System.out.println("Mean Square: " + meansquare + "\n"); 
    } 
    } // end main() 
} // end class InputStats 
+0

Вы слышали о цикле 'do ... while'? – BitNinja

+0

Да, у меня есть lol. – David

ответ

0

Вы должны читать значения в виде строки, а затем преобразовать их в целые числа с Integer.parseInt (строка);

Таким образом, вы можете использовать следующую функцию, чтобы проверить, если они целые

public static boolean isInteger(String s) { 
    try { 
     Integer.parseInt(s); 
    } catch(NumberFormatException e) { 
     return false; 
    } 
    // only got here if we didn't return false 
    return true; 
} 

Ваша программа будет выглядеть следующим образом:

import java.io.*; 
import java.util.*; 

public class InputStats { 
    // *** I added this to help your while loop *** 
    public static boolean isInteger(String s) { 
     // check if a string is an integer, eg "10" is 10 but "w" is not an int 
     try { 
      Integer.parseInt(s); 
     } catch(NumberFormatException e) { 
      return false; 
     } 
     return true; 
    } 

    public static void main(String[] args) { 
     Scanner TextIO = new Scanner(System.in); 

     // *** I added this to store the input as a string first *** 
     String input;  // The original string inputted by the user 

     int inputNumber;  
     int sum;    
     int count;   
     double mean;   
     int squarein;   
     int sumsquare;  
     double meansquare; 

     sum = 0; 
     count = 0; 
     sumsquare = 0; 
     meansquare = 0; 

     System.out.println("Enter your first positive integer: "); 

     // *** I changed this to .nextLine(); to get a string *** 
     input = TextIO.nextLine(); 

     // *** I made this while it's an integer so it stops when it's a string *** 
     while (isInteger(input)) { 
      inputNumber = Integer.parseInt(input); 
      sum += inputNumber; 
      squarein = inputNumber; 
      sumsquare = squarein * squarein; 
      count++;    
      System.out.println("Enter your next positive integer, or a non integer to end: "); 

      // *** I changed this to .nextLine(); to get a string *** 
      input = TextIO.nextLine(); 
     } 

     if (count == 0) { 
      System.out.println("You didn't enter any data!"); 
     } 
     else { 
      mean = ((double)sum)/count; 
      meansquare = ((double)sumsquare)/count; 

      // *** I removed this because it was no longer needed *** TextIO.nextInt(); 

      System.out.println("Numbers entered: " + count + "\n"); 
      System.out.println("Sum: " + sum + "\n"); 
      System.out.println("Mean: " + mean + "\n"); 
      System.out.println("Sum Squares: " + sumsquare + "\n"); 
      System.out.println("Mean Square: " + meansquare + "\n"); 
     } 

    } // end main() 

} // end class InputStats 
+0

Прекрасно работает! Спасибо! – David

+0

@ Давид Рад это слышать! –

0

hasNextInt() должен работать

while(TextIO.hasNextInt()) { 
    inputNumber = TextIO.nextInt(); 
    sum += inputNumber; 
    squarein = inputNumber; 
    sumsquare = squarein*squarein; 
    count++; 
    System.out.println("Enter your next positive integer: "); 
} 

Другое дело, почему вы называете TextIO.nextInt() перед вашим System.outs? Это не кажется необходимым и может вызвать ошибку.

+0

Это все еще работало нормально, но ваше право, это не казалось необходимым, поэтому я изменил его. То, что вы написали здесь, работает, однако, когда я ввожу буквенно-цифровой символ или символ, он приходит с ошибкой, а не выходит из цикла while. – David

0

Использовать флаг boolean. Сначала установите значение false, и когда пользователь ввел значение, установите значение true.

boolean userInputted = false; 

while (!userInputted) { 
. 
. 
. 
// if user has inputted 
    userInputted = true; 
} 
0

Вы можете иметь пользовательского ввода одной строки текст с номерами, разделенными запятыми, и используйте .split(",") для разделения на массив строк, затем проведите через этот массив по .length и примените .trim() к каждой строке, чтобы удалить конечное пространство, затем используйте Integer.parseInt(strarray[i]), чтобы получить rt строки к целым числам. И, очевидно, все это делается в try...catch, если пользователь вводит плохо отформатированные данные.

0

Что вам нужно - это способ узнать, является ли то, что вводит пользователь, число или что-то еще. Попробуйте что-нибудь подобное.

//Function to parse the input from provided scanner, and return null 
    //if input is not a number 
    public static Integer parsedInputFrom(Scanner sc){ 
     String input= sc.next(); 
     Integer inputNumber=null; 
     try{ 
       inputNumber = Integer.parseInt(input); 
     } catch (NumberFormatException n){ 
      return null; 
     } 
     return inputNumber; 
    }