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() 库方法。
更新:非常感谢您的投入!我发现我的低 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() 库方法。