Входы JOptionPane в массив для среднего

Я пытаюсь сделать журнал оценок, который включает в себя пять заданий для 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;
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
279
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ну, в принципе, в вашем подходе нет ничего плохого. Но вам следует пойти еще дальше и поместить всю информацию и вычисления, касающиеся одного ученика, в объект. Например.

Обратите внимание, что это всего лишь краткий пример. Вы должны пройти его самостоятельно.

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

Одно из этих объявлений методов должно помочь вам решить все вопросы.

У меня не будет возможности поработать с этой информацией до сегодняшнего дня, но она выглядит великолепно. Большое спасибо за то, что нашли время мне помочь. Я попытался сделать что-то подобное, но чего-то не хватало, это действительно имеет большой смысл. Но я не был уверен, должна ли часть объекта быть построена в том же классе или другом?

Taylor 23.04.2018 19:44

Пожалуйста, не обращайте внимания на этот глупый вопрос. Но на самом деле возникает вопрос, идет ли последний бит для установки среднего значения в исходном классе или классе учеников? И если он идет в студенческий класс, как мне его вызвать?

Taylor 23.04.2018 21:48

Когда я добавляю среднее значение к классу Student, я получаю сообщение об ошибке для studentList.

Taylor 23.04.2018 21:58

«Нет глупых вопросов, только глупые ответы». ;) Класс Student нужно поместить в отдельный Java-файл. Пока этот файл находится в том же пакете, что и ваш исходный класс, оператор импорта не требуется. Вы могли бы определить класс Student как внутренний класс, но я бы не рекомендовал его! Это делает ваш код сложным и нечитаемым, чем больше методов вы реализуете в Student - средний метод должен быть помещен в исходный класс, поскольку этот класс обладает списком студентов, которые вы хотите перебирать.

Lynx 242 23.04.2018 22:13

Большое спасибо за подробные объяснения. Я знаю, что мне, вероятно, не хватает чего-то простого, но когда я пытаюсь добавить средний метод к исходному классу, я все равно получаю ошибку для studentList (не могу найти символ). Я предполагаю, что это связано с тем, что список массивов находится внутри статического метода, но я не уверен, как связать их, не будучи в одних и тех же скобках.

Taylor 23.04.2018 22:21

Извини, это моя вина. Я отредактировал свой пост. Просто передайте studentList в качестве параметра при вызове метода.

Lynx 242 23.04.2018 22:25

Блестяще! Как обычно, я пробовал что-то подобное, но ошибся. Хотя вы и так слишком великодушны, у меня есть еще один вопрос, пожалуйста. При попытке распечатать результат (мне все равно, находится он в JOptionPane или нет) я получаю массу ошибок. Я так понимаю, это должно быть напечатано иначе, чем другими методами?

Taylor 23.04.2018 22:31

Я сделал еще одно редактирование. Пожалуйста, взгляните на ответ.

Lynx 242 23.04.2018 22:43

Вы действительно прекрасны. Прошу прощения за то, что прошу от вас так многого, но я действительно многому научился. Я даже не беспокоюсь об этой последней детали, так как я в восторге от результатов. Но если бы я задала еще один крошечный вопрос (подробнее для справок в будущем), как бы мне заставить его печатать только среднее значение в конце, а не после каждого студента (я предполагаю, что может быть еще один цикл?)? А если серьезно, вы так здорово помогли.

Taylor 23.04.2018 22:48

Ваше предположение верно. Вы должны вызвать getAverageGradeOfExamOne () вне вашего «цикла for». Но другой цикл не нужен. Цикл происходит внутри getAverageGradeOfExamOne (). Просто вызовите метод и передайте studentList. Я снова отредактировал свой пост. Пожалуйста, взгляните на EDIT II.

Lynx 242 23.04.2018 22:56

Огромное спасибо. Я больше не буду просить у вас. Ты святой!

Taylor 23.04.2018 22:59

Не говори об этом. ;)

Lynx 242 23.04.2018 23:00

Другие вопросы по теме