所以我试图从普通的.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);
,因为我认为它应该在逻辑上这样工作,但是即使我在while循环中声明了它,也遇到了“等级无法解析为变量”的错误,所以我不知道有什么解决办法吗?
感谢您的帮助,谢谢!
答案 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);
这有什么问题?
您没有计算所有数字的总和。 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个问题,则应该能够弄清楚如何解决它们,并使程序正常工作。
答案 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
}
希望这会有所帮助,并尝试为上述逻辑包含算术异常捕获子句。