簡體   English   中英

如何修復try塊,以便從txt文件獲取平均值?

[英]How do I fix my try block so I get the average from my txt file?

所以我試圖從普通的.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循環中聲明了它,也收到錯誤“等級無法解析為變量”,所以我沒有知道解決辦法嗎?

感謝您的幫助,謝謝!

讓我們看看。

我嘗試將[code]放在try while循環之外和try塊之前,因為我認為它應該在邏輯上這樣工作,但是即使我在while循環中聲明了“等級無法解析為變量”,我仍然收到錯誤消息,所以我不知道解決辦法是什么?

好吧, grade是在while循環中聲明的,因此grade僅存在於該塊中。 解釋為什么您無法在外部訪問它。


你的數學錯了

double average = grade/8

在java中, int / int始終會給您一個int ,因此您將丟失十進制值。 您可以使用8. 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;

考慮到文件可以有任意數量的記錄,因此最好將它們計數而不是將其硬編碼為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

所以我不知道解決辦法是什么?

我不會告訴您解決方法。 更重要的是,您要了解答案是錯誤的……以便您可以從錯誤中學習。

因此,讓我們退后一步。

計算一組數字的平均值的公式為:

平均值=集合中所有數字的總和/項目數。

(如果沒有,您應該在中學數學中學到的!)

現在,讓我們將此與您在代碼中所做的比較:

    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個問題,則應該能夠弄清楚如何解決它們,並使程序正常運行。

需要進行許多更改。 以下是所得的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

我認為您正在嘗試將每個值除以不適當的計數,相反,您需要找到所有元素的總和,然后將其除以計數,您的代碼應進行如下更改:

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
    }

希望這會有所幫助,並嘗試為上述邏輯包括算術異常捕獲子句。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM