Как мне исправить мой блок try, чтобы получить среднее значение из моего текстового файла? - PullRequest
1 голос
/ 06 мая 2019

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

Mary 60
Tom 70
Jack 80
John 90
Sue 100
Bob 95
Gary 85
Emily 75

У меня есть часть чтения вниз, но что-то не такс помощью моего цикла while или моего блока try

Это мой желаемый вывод: The average is 81.0

Это мой фактический вывод:

The average is 7.0 The average is 8.0 The average is 10.0 The average is 11.0 The average is 12.0 The average is 11.0 The average is 10.0 The average is 9.0

Кто-нибудь может найти ошибку в моей логике?

public class Average {//begin class

public static void main(String[] args) {//begin main
    // TODO Auto-generated method stub

    try {//begin try
        File datafile = new File("C:\\Users\\jglez\\Documents\\Data.txt");
        Scanner inputFile = new Scanner(datafile);
        while(inputFile.hasNext()) {
            String name = inputFile.next();
            int grade = inputFile.nextInt();
            double average = grade/8;

            System.out.println("The average is " + average);
        }//end while

    }//end try
    catch(Exception e) {//begin catch
        System.out.println("FileNotFoundException caught");
    }//end catch

}//end main
    }//end class

Я пытался поместить

double average = grade/8; System.out.println("The average is " + average);

вне моего цикла try и перед моим блоком try, потому что я думаю, что это должно работать логически, но яполучить сообщение об ошибке «оценка не может быть преобразована в переменную», хотя я объявил ее в цикле while, так что я не знаю, что за исправление?

Я благодарен за любую помощь, спасибо!

Ответы [ 5 ]

2 голосов
/ 06 мая 2019

Посмотрим.

Я попытался поместить [код] вне цикла try while и перед блоком try, потому что я думаю, что он должен работать логически, но я получаю ошибку: оценка не можетбыть преобразованным в переменную ", хотя я объявил это в своем цикле while, поэтому я не знаю, что за исправление?

Ну, grade объявляется в цикле while, поэтому gradeсуществуют только в этом блоке.Объясняя, почему вы не можете получить к нему доступ снаружи.


Ваша математика неверна

double average = grade/8

В Java int / int всегда даст вам int, так что вы будетепотерять десятичное значение.Вы можете исправить это с помощью grade / 8.0, поскольку int / double дает double.

double average = grade / 8.0

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

  • Сумма каждые grade в переменной
  • Подсчет числа grade

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

 int sum = 0, count = 0;

 Scanner inputFile = new Scanner(datafile);
 while(inputFile.hasNext()) {
      String name = inputFile.next();
      int grade = inputFile.nextInt();
      sum = sum + grade;
      count++;
 }//end while

 double average = 1.0 * sum / count;
0 голосов
/ 06 мая 2019

так что я не знаю, что за исправление?

Я не собираюсь рассказывать вам исправление.Более важно, чтобы вы поняли, в чем ваш ответ неправильный ... чтобы вы могли учиться на своих ошибках.

Итак, давайте вернемся назад.

Формула для вычисления среднего значения набораиз чисел:

среднее значение = общая сумма всех чисел / количества предметов в наборе.

(Вы должны были изучить это в математике средней школы, еслине раньше!)

Теперь давайте сравним это с тем, что вы делаете в своем коде:

    int grade = inputFile.nextInt();
    double average = grade/8;
    System.out.println("The average is " + average);

Что с этим не так?

Проблема № 1:

Вы не вычисляете сумму всех чисел.grade - это значение, которое вы только что прочитали.Не сумма.(Суммирование означает, что вам нужно сложить оценки!)

Задача № 2:

Вы предполагаете, что количество предметов равно 8:

  • Если файл не содержит 8 элементов, это не так.

  • Когда вы вычисляете и выводите скользящее среднее (как вы делаете в настоящее время), вы должны делиться на количество прочитанных элементов до сих пор .

Подсказка: подсчитайте их.

Задача № 3:

Эта проблема немного сложнее.

Поскольку grade - целое число, 8 - целое число, grade / 8 - целочисленное деление.Это означает, что результат урезан.Например, 60 / 8 дает вам 7 ... не 7.5.

Если вы хотите получить точный результат с плавающей запятой, вам нужен один из операндов оператора /, чтобы быть плавающимстоимость балла.Например,

  int sum = 60;
  int count = 8;
  double average = sum / count;            // INCORRECT answer - `7.0`
  double average = ((double) sum) / count; // CORRECT answer   - `7.5`

Если вы понимаете 3 проблемы, описанные выше, вы сможете выяснить, как их решить, и заставить вашу программу работать.

0 голосов
/ 06 мая 2019

Учитывая, что файлы могут иметь любое количество записей, лучше считать их, чем жестко кодировать как 8. Убедитесь, что целочисленное суммирование не переполняется, в противном случае используйте BigInteger. Деление двух целочисленных значений приведет к результату int, вы должны привести его к типу float или double.

Изменения, которые необходимо внести, объявите countLines для подсчета записей в файле и sumOfGrades для суммирования оценок. После завершения сканирования файла объявите среднее значение переменной и вычислите его, используя sumOfGrades/countLines с типом ввода, чтобы получить результат.

try {//begin try
            File datafile = new File("C:\\Users\\jglez\\Documents\\Data.txt");
            Scanner inputFile = new Scanner(datafile);
            int sumOfGrades = 0;
            int countLines = 0; // to calculate number of lines file has.
            while(inputFile.hasNext()) {
                String name = inputFile.next();
                int grade = inputFile.nextInt();
                sumOfGrades += grade;
                ++countLines;
            }//end while
            double average = (double) sumOfGrades/countLines;
            System.out.println("The average is " + average);
        }//end try
        catch(Exception e) {//begin catch
            System.out.println("FileNotFoundException caught");
            e.printStackTrace();
        }//end catch
0 голосов
/ 06 мая 2019

Я думаю, что вы пытаетесь разделить каждое значение с количеством, которое не подходит, вместо этого вам нужно найти сумму всех элементов и разделить ее на количество, и ваш код должен изменить что-то, как показано ниже:

public class Average {//begin class

public static void main(String[] args) {//begin main
    // TODO Auto-generated method stub

    try {//begin try
        double sum=0.0,grade =0.0;
        File datafile = new File("C:\\Users\\jglez\\Documents\\Data.txt");
        Scanner inputFile = new Scanner(datafile);
        while(inputFile.hasNext()) {
            String name = inputFile.next();
            grade = inputFile.nextInt();
            sum = sum+grade;


        }//end while
        System.out.println("The average is " + sum/8.0);
    }//end try
    catch(Exception e) {//begin catch
        System.out.println("FileNotFoundException caught");
    }//end catch

}//end main
    }

Надеюсь, что это полезно, и попробуйте включить условие арифметического исключения для вышеуказанной логики.

0 голосов
/ 06 мая 2019

Требуется много изменений. Ниже приведен приведенный блок try. Вы можете найти комментарии inline

try {//begin try
        File datafile = new File("C:\\Users\\jglez\\Documents\\Data.txt");
        Scanner inputFile = new Scanner(datafile);
        double average=0; //Intializing average outside
        while(inputFile.hasNext()) {
            String name = inputFile.next();
            double grade = inputFile.nextDouble(); //Changed datatype to double
            average = average +  grade/8.0; //changed your average calculation


        }
        System.out.println("The average is " + average); //Printing average outside
...