Я пытаюсь сделать журнал оценок, который включает в себя пять заданий для X количества учеников и дает итоговую оценку для каждого ученика. Программа успешно зацикливается в соответствии с количеством введенных студентов и правильно компилируется. Однако мне нужно вычислить средние значения каждого задания для всего класса. Я пытаюсь добиться этого с помощью массивов, но отчаянно застрял.
int numStudents = Integer.parseInt(JOptionPane.showInputDialog(null,"Enter number of students: "));
String[] examOneGrade = new String[numStudents];
String[] examTwoGrade = new String[numStudents];
String[] examFinalGrade = new String[numStudents];
String[] projectGrade = new String[numStudents];
String[] homeworkGrade = new String[numStudents];
// loops depending on number of students in the class
for (int i = 0; i < numStudents; i++) {
String name = JOptionPane.showInputDialog(null, "Enter Student Name: ");
JOptionPane.showMessageDialog(null, "Enter Grades for " + name,
" ", JOptionPane.PLAIN_MESSAGE);
examOneGrade[i] = JOptionPane.showInputDialog(null, "Enter Exam 1 Grade: ");
examTwoGrade[i] = JOptionPane.showInputDialog(null, "Enter Exam 2 Grade: ");
examFinalGrade[i] = JOptionPane.showInputDialog(null, "Enter Final Exam Grade: ");
projectGrade[i] = JOptionPane.showInputDialog(null, "Enter Project Grade: ");
homeworkGrade[i] = JOptionPane.showInputDialog(null, "Enter Homework Grade: ");
// converts strings to floats
float exam1 = Float.parseFloat(examOneGrade[i]);
float exam2 = Float.parseFloat(examTwoGrade[i]);
float finalExam = Float.parseFloat(examFinalGrade[i]);
float project = Float.parseFloat(projectGrade[i]);
float homework = Float.parseFloat(homeworkGrade[i]);
// weights
float number1 = exam1 * .10f;
float number2 = exam2 * .10f;
float number3 = finalExam * .30f;
float number4 = project * .30f;
float number5 = homework * .20f;
// calculates student final grade
float grade = number1 + number2 + number3 + number4 + number5;
JOptionPane.showMessageDialog(null, "Final Grade: " + grade,
" " + name, JOptionPane.PLAIN_MESSAGE);
}
Я не прошу дать ответ, я просто отчаянно хочу знать, на правильном ли я пути и где мне следует искать. Эта точная тема кажется несуществующей.
Моя попытка низкокачественного метода:
public int getMinimum(List<Student> studentList) {
float lowGrade = getExamOneGrade[0];
for(Student student : studentList) {
if (student.getExamOneGrade() < lowGrade) {
lowGrade = getExamOneGrade;
}
}
return lowGrade;
}




Ну, в принципе, в вашем подходе нет ничего плохого. Но вам следует пойти еще дальше и поместить всю информацию и вычисления, касающиеся одного ученика, в объект. Например.
Обратите внимание, что это всего лишь краткий пример. Вы должны пройти его самостоятельно.
public class Student {
private String name;
private float examOneGrade;
private float examTwoGrade;
private float examFinalGrade;
private float projectGrade;
private float homeworkGrade;
// getters and setters
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public float getExamOneGrade(){
return examOneGrade;
}
public void setExamOneGrade(float examOneGrade) {
this.examOneGrade = examOneGrade;
}
// and so on ...
// weight computation goes here
public float getExamOneWeight() {
return examOneGrade * .10f;
}
public float getExamTwoWeight() {
return examOneGrade * .10f;
}
// ...
public float getFinalGrade {
return getExamOneWeight() +
getExamTwoWeight() +
// ...
getHomeworkWeight();
}
}
Тогда в вашем коде
int numStudents = Integer.parseInt(JOptionPane.showInputDialog(null,
"Enter number of students: "));
List<Student> studentList = new ArrayList<Student>();
// loops depending on number of students in the class
for (int i = 0; i < numStudents; i++) {
Student student = new Student();
student.setName(JOptionPane.showInputDialog(null, "Enter Student Name: "));
JOptionPane.showMessageDialog(null, "Enter Grades for " + student.getName(),
" ", JOptionPane.PLAIN_MESSAGE);
student.setExamOneGrade(Float.parseFloat(JOptionPane.showInputDialog(null, "Enter Exam 1 Grade: ")));
student.setExamTwoGrade(Float.parseFloat(JOptionPane.showInputDialog(null, "Enter Exam 2 Grade: ")));
// and so on ..
// now add the student to the ArrayList
studentList.add(student);
JOptionPane.showMessageDialog(null, "Final Grade: " + student.getFinalGrade(),
" " + student.getName(), JOptionPane.PLAIN_MESSAGE);
}
РЕДАКТИРОВАТЬ II:
// show the averages here
JOptionPane.showMessageDialog(null, "Avg Grade Of Exam One: " + getAverageGradeOfExamOne(studentList), JOptionPane.PLAIN_MESSAGE);
JOptionPane.showMessageDialog(null, "Avg Grade Of Exam Two: " + getAverageGradeOfExamTwo(studentList), JOptionPane.PLAIN_MESSAGE);
// ...
Используя этот список студентов, вы теперь можете вычислять все, что захотите, и все это хорошо структурировано и простое в использовании.
например
private float getAverageGradeOfExamOne(List<Student> studentList) {
float sum;
for(Student student : studentList){
sum += student.getExamOneGrade();
}
return sum/studentList.size();
}
Обновлено:
Используя этот метод выше в вашем «исходном классе» в основном методе, о котором мы говорим, вы можете распечатать результат следующим образом:
JOptionPane.showMessageDialog(null, "Avg Grade Of Exam One: " + getAverageGradeOfExamOne(studentList), JOptionPane.PLAIN_MESSAGE);
Если это не сработает, я полагаю, что ваш «основной метод» - статический. Затем измените getAverageGradeOfExamOne () на статический, например
private static float getAverageGradeOfExamOne(List<Student> studentList) {
float sum;
for(Student student : studentList){
sum += student.getExamOneGrade();
}
return sum/studentList.size();
}
Одно из этих объявлений методов должно помочь вам решить все вопросы.
Пожалуйста, не обращайте внимания на этот глупый вопрос. Но на самом деле возникает вопрос, идет ли последний бит для установки среднего значения в исходном классе или классе учеников? И если он идет в студенческий класс, как мне его вызвать?
Когда я добавляю среднее значение к классу Student, я получаю сообщение об ошибке для studentList.
«Нет глупых вопросов, только глупые ответы». ;) Класс Student нужно поместить в отдельный Java-файл. Пока этот файл находится в том же пакете, что и ваш исходный класс, оператор импорта не требуется. Вы могли бы определить класс Student как внутренний класс, но я бы не рекомендовал его! Это делает ваш код сложным и нечитаемым, чем больше методов вы реализуете в Student - средний метод должен быть помещен в исходный класс, поскольку этот класс обладает списком студентов, которые вы хотите перебирать.
Большое спасибо за подробные объяснения. Я знаю, что мне, вероятно, не хватает чего-то простого, но когда я пытаюсь добавить средний метод к исходному классу, я все равно получаю ошибку для studentList (не могу найти символ). Я предполагаю, что это связано с тем, что список массивов находится внутри статического метода, но я не уверен, как связать их, не будучи в одних и тех же скобках.
Извини, это моя вина. Я отредактировал свой пост. Просто передайте studentList в качестве параметра при вызове метода.
Блестяще! Как обычно, я пробовал что-то подобное, но ошибся. Хотя вы и так слишком великодушны, у меня есть еще один вопрос, пожалуйста. При попытке распечатать результат (мне все равно, находится он в JOptionPane или нет) я получаю массу ошибок. Я так понимаю, это должно быть напечатано иначе, чем другими методами?
Я сделал еще одно редактирование. Пожалуйста, взгляните на ответ.
Вы действительно прекрасны. Прошу прощения за то, что прошу от вас так многого, но я действительно многому научился. Я даже не беспокоюсь об этой последней детали, так как я в восторге от результатов. Но если бы я задала еще один крошечный вопрос (подробнее для справок в будущем), как бы мне заставить его печатать только среднее значение в конце, а не после каждого студента (я предполагаю, что может быть еще один цикл?)? А если серьезно, вы так здорово помогли.
Ваше предположение верно. Вы должны вызвать getAverageGradeOfExamOne () вне вашего «цикла for». Но другой цикл не нужен. Цикл происходит внутри getAverageGradeOfExamOne (). Просто вызовите метод и передайте studentList. Я снова отредактировал свой пост. Пожалуйста, взгляните на EDIT II.
Огромное спасибо. Я больше не буду просить у вас. Ты святой!
Не говори об этом. ;)
У меня не будет возможности поработать с этой информацией до сегодняшнего дня, но она выглядит великолепно. Большое спасибо за то, что нашли время мне помочь. Я попытался сделать что-то подобное, но чего-то не хватало, это действительно имеет большой смысл. Но я не был уверен, должна ли часть объекта быть построена в том же классе или другом?