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

时间:2015-07-28 04:10:14

标签: java arrays class io readfile

更新:非常感谢您的所有投入!我发现我的低返回全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行学生记录。程序运行但不能正确计算高低和平均值。我知道我对平均值的计算可能是错误的;但我不知道为什么高低不起作用。

请帮帮我。谢谢!

3 个答案:

答案 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()库方法。