Java 阅读学生记录并计算每个测验的高低和平均值

Java read student records and calculate high low and average for each quiz

更新:非常感谢您的投入!我发现我的低 returns 全部为 0 因为 java 初始化所有整数 0 所以我将它更改为 int lowScore [] = new int [] {100, 100, 100, 100, 100}。 findAvg 的问题在于,在 main 中我创建了一个学生 [40] 数组,但该文件仅包含 15 个学生,这就是为什么我不能使用 a.length 来查找平均值的原因。我添加了代码来计算行数。

我正在做一项关于阅读学生 ID 的 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 个 classes:学生 class 用于 ID 和分数,统计 class 用于计算高、低和平均值,util class 用于读取file 函数,driver class 为主。

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行header和15行学生记录。该程序运行但未正确计算高低和平均值。我知道我对平均值的计算可能是错误的;但是不知道为什么high和low不行

请帮助我。谢谢!

对于求平均值,您不应在每次迭代时都除以 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;
    }
}

最小值和最大值似乎没问题。

既然你提到了 Statistics class 是必需的,我又对你的问题进行了一次破解。我看到当你计算高点和低点时,第一个循环是学生。相反,为适当的数组创建第一个循环,如下所示:

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;
    }
}

不会为您重写代码,只是想问一些问题,因为我认为有些人对您的目的仍然有些困惑:

findAvg 方法的目的是计算所有学生在特定测试中的平均分吗?或者找出学生所有考试的平均分?

如果后者是您的目标,则将 Statistics class 移动到 Student class 的方法中(如其他一些答案所做的那样)会起作用,但我不介意保留如果您要前者,它们会分开。

如果您要找出一组学生的最高分,那么我会将他们全部放入数组或数组列表中,然后尝试升序排序(或同时进行)。

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) 在特定测试(测试编号)中的平均分数。希望您可以推断其余代码(您可能需要稍微修改其他 classes 等)。对于高点和低点,请考虑使用 Arrays.sort() 库方法。