如何修复try块,以便从txt文件获取平均值?

时间:2019-05-06 04:58:05

标签: java file exception file-io io

所以我试图从普通的.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 while循环之外和try块之前的

,因为我认为它应该在逻辑上这样工作,但是即使我在while循环中声明了它,也遇到了“等级无法解析为变量”的错误,所以我不知道有什么解决办法吗?

感谢您的帮助,谢谢!

5 个答案:

答案 0 :(得分:2)

让我们看看。

  

我尝试将[code]放置在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;

答案 1 :(得分:0)

考虑文件可以具有任意数量的记录,最好对它们进行计数而不是将其硬编码为8。确保整数求和不会溢出,否则请使用BigInteger。将两个整数相除会得出整数结果,您必须将其强制转换为float或double。

要进行更改,请声明countLines以计算文件中的记录,并声明sumOfGrades以保存成绩的总和。文件扫描完成后,声明变量average并使用带有类型大小写的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

答案 2 :(得分:0)

  

所以我不知道解决办法是什么

我不会告诉您解决方法。更重要的是,了解答案是错误的……以便您可以从错误中学习。

所以让我们退后一步。

计算一组数字的平均值的公式为:

  

平均值=集合中所有数字/项目总数的总和。

(如果没有,您应该在中学数学上学到的!)

现在让我们将其与您在代码中所做的比较:

    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个问题,则应该能够弄清楚如何解决它们,并使程序正常工作。

答案 3 :(得分:-1)

需要许多更改。以下是所得的try块。您可以找到内嵌评论

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

答案 4 :(得分:-1)

我认为您正在尝试将每个值除以不适当的计数,而是需要找到所有元素的总和,然后将其除以计数,您的代码应进行如下更改:

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
    }

希望这会有所帮助,并尝试为上述逻辑包含算术异常捕获子句。