更新:非常感谢您的所有投入!我发现我的低返回全0,因为java初始化所有整数0所以我把它改为int lowScore [] = new int [] {100,100,100,100,100}。 findAvg的问题在于我在main中创建了一个学生数组[40],但该文件只包含15个学生,这就是为什么我不能使用a.length来查找平均值。我添加了代码来计算行数。
我正在编写关于阅读学生证的txt文件及其5个测验分数的作业。作业要求阅读最多40名学生的分数,并计算每个测验的高,低和平均值。
示例输出:
Stud Quiz1 Quiz2 Quiz3 Quiz4 Quiz5
1234 90 100 90 98 80
1243 92 92 90 98 70
高分:92 100 90 98 80
低分:90 92 90 98 70
平均得分:91 96 90 98 75
我创建了4个类:用于ID和分数的学生类,用于计算高,低和平均的统计类,用于读取文件函数的util类,以及用于main的驱动程序类。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.StringTokenizer;
class Student {
private int SID;
private int scores[] = new int[5];
public int getSID() {
return SID;
}
public void setSID(int sID) {
SID = sID;
}
public int getScores(int index) {
return scores[index];
}
public void setScores(int[] scores) {
this.scores = scores;
}
public void printSID() {
System.out.println(SID);
}
public void printScores() {
for (int x : scores) {
System.out.println(x);
}
}
}
class Statistics {
private final int[] lowscores = new int[5];
private final int[] highscores = new int[5];
private final float[] avgscores = new float[5];
public void findlow(Student[] a) {
for (Student stu : a) {
for (int i = 0; i < 5; i++) {
lowscores[i] = Math.min(lowscores[i], stu.getScores(i));
}
}
}
public void findhigh(Student[] a) {
for (Student stu : a) {
for (int i = 0; i < 5; i++) {
highscores[i] = Math.max(highscores[i], stu.getScores(i));
}
}
}
public void findavg(Student[] a) {
int[] sum = new int[5];
for (Student stu : a) {
for (int i = 0; i < 5; i++) {
sum[i] += stu.getScores(i);
avgscores[i] = sum[i] / a.length;
}
}
}
public void printLow() {
for (int x : lowscores) {
System.out.println("Low Score " + x);
}
}
public void printHigh() {
for (int x : highscores) {
System.out.println("High Score " + x);
}
}
public void printAvg() {
for (float x : avgscores) {
System.out.println("Average " + x);
}
}
}
class Util {
static Student[] readFile(String filename, Student[] stu) {
try {
FileReader file = new FileReader(filename);
BufferedReader buff = new BufferedReader(file);
int count = 0;
boolean eof = false;
while (!eof) {
String line = buff.readLine();
if (line == null)
break;
else {
System.out.println(line);
if (count > 0) {
StringTokenizer st = new StringTokenizer(line);
for (int i = 0; i < stu.length; i++) {
stu[i] = new Student();
}
stu[count - 1].setSID(Integer.parseInt(st.nextToken()));
int scores[] = new int[5];
int scoreCount = 0;
while (st.hasMoreTokens()) {
scores[scoreCount] = Integer.parseInt(st.nextToken());
scoreCount++;
stu[count - 1].setScores(scores);
}
}
}
count++;
}
buff.close();
} catch (IOException e) {
System.out.println("Error -- " + e.toString());
}
return stu;
}
}
public class Driver{
public static void main(String[] args) {
Student lab4[] = new Student[40];
lab4 = Util.readFile("C:\\lab4.txt", lab4);
Statistics statlab4 = new Statistics();
statlab4.findlow(lab4);
statlab4.findhigh(lab4);
statlab4.findavg(lab4);
statlab4.printLow();
statlab4.printHigh();
statlab4.printAvg();
}
}
该程序读取输入文件lab4.txt,其中包括1行标题和15行学生记录。程序运行但不能正确计算高低和平均值。我知道我对平均值的计算可能是错误的;但我不知道为什么高低不起作用。
请帮帮我。谢谢!
答案 0 :(得分:1)
对于查找平均值,每次迭代不应除以a.length
。
public void findavg(Student []a) {
int []sum = new int [5];
for(Student stu: a) {
for(int i=0; i<5; i++) {
sum[i] += stu.getScores(i);
}
}
for(int i=0; i<5; i++) {
avgscores[i] = sum[i] / a.length;
}
}
最小和最大似乎很好。
答案 1 :(得分:0)
既然您已经提到Statistics
类是必需的,那么我已经对您的问题采取了另一个措施。我看到,当你计算高点和低点时,第一个循环是学生。相反,为适当的数组创建第一个循环,如下所示:
public void findLow(Student[] a) {
for (int i = 0; i < 5; i++)
for (Student stu : a)
lowScores[i] = Math.min(stu.getScore(i), lowScores[i]);
}
这样做的是:
for each low score you want to find:
for each student that took the quiz:
if this student's score is lower, set that as the lowest
将相同的逻辑应用于findHigh
方法。
对于您的findAvg
方法,如前所述,不要在每次迭代中进行划分:
public void findAvg(Student[] a) {
for (int i = 0; i < 5; i++) {
for (Student s : a) {
avgScores[i] += s.getScore(i);
}
avgScores[i] /= a.length;
}
}
答案 2 :(得分:0)
不打算为你重写你的代码,只是问一些问题,因为我觉得有些人对你的目的感到有些困惑:
findAvg方法的目的是找到特定测试的所有学生标记的平均值吗?或者找到学生所有考试的平均分数?
如果后者是你的目标,那么在Student类的方法中移动Statistics类(如其他一些答案所做的那样)会起作用,但是如果你想要前者,我不介意将它们分开。
如果您正在尝试找到一组学生的最高分,那么我会将它们全部放入Array或ArrayList中,然后尝试升序排序(或同时执行这两项)。
public float avgCalculate(Student [] a, int testnumber){
float sum = 0.0f;
for (Student s: a){
sum = sum + s.getScores[testnumber];
}
float average = (sum / a.length);
return average;
}
代码完全未经测试,因此请确保其正常工作并回复我。它应该计算一组学生(a)在特定考试(考试编号)上的平均分数。希望您可以推断其余代码(您可能需要稍微修改其他类等)。对于高点和低点,请考虑使用Arrays.sort()库方法。