![](/img/trans.png)
[英]How do I get my Hangman Java file to read a random word in from a .txt file?
[英]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);
怎么了
您不是在計算所有數字的總和。 grade
是您剛剛閱讀的值。 不是總和。 (總結意味着您需要累計成績!)
您假設項目數為8:
如果文件不包含8個項目,則不正確。
在計算和輸出運行平均值時 (如當前所做的那樣),應除以到目前為止讀取的元素數。
提示:算一下。
這個問題更加微妙。
由於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.