Вычисление Java GPA (как установить неограниченные массивы?) - PullRequest
3 голосов
/ 25 декабря 2011

По сути, моя проблема в том, что я не уверен, как установить неограниченные входные массивы от пользователя .. На данный момент, расчет идет хорошо, только если пользователь вводит 6 предметов точно, но не если введенный предмет меньше или больше 6 .. Каким-то образом я хочу, чтобы ввод был неограниченным ..

Это то, что я имею до сих пор:

ГЛАВНЫЙ КЛАСС

import javax.swing.*;

public class CGPAMain extends JFrame
{
  public static void main(String[] args)
  {
    JFrame frame = new JFrame("GPA Calculation");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    MainPage panel = new MainPage();
    frame.getContentPane().add(panel);

    frame.pack();
    frame.setVisible(true);
  }
}

ДРУГОЙ КЛАСС

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;

    public class MainPage extends JPanel
    {
        //declare GUI elements
        private JLabel subjectLabel, cHoursLabel, gradeLabel;       
        private JTextField subject, cHours;
        private JButton addSubjectButton, calcGPAButton, clearAllButton;
        private JTextArea tArea;
        private JComboBox grade;

        //declare array to store and collect user input value
        String[] subjectArray = new String[6];                  
        String[] gradeArray = new String[6];
        int[] cHoursArray = new int[6];
        double[] gradeValue = { 4.00, 3.67, 3.33, 3.00, 2.67, 2.33, 2.00, 1.67, 1.33, 1.00, 0.00 };
        String[] gradeLetter= { "A",  "A-", "B+", "B",  "B-", "C+", "C",  "D",  "D-", "E",  "F"};                  


        public MainPage()
        {   
            setLayout (null);
            setPreferredSize (new Dimension(500, 500));
            setBackground (Color.orange); 

            //Properties of GUI elements
            subjectLabel = new JLabel ("Subject Name: ");                       
            subject = new JTextField (33);
            subject.addActionListener (new TempListener());

            gradeLabel = new JLabel ("Grade: ");
            grade = new JComboBox (gradeLetter); 
            grade.addActionListener (new TempListener());

            cHoursLabel = new JLabel ("Credit Hours: ");
            cHours = new JTextField (1);
            cHours.addActionListener (new TempListener());

            addSubjectButton = new JButton("Add Another Subject");
            addSubjectButton.addActionListener(new TempListener());
            calcGPAButton = new JButton("Calculate GPA");
            calcGPAButton.addActionListener(new TempListener());
            clearAllButton = new JButton("Clear All");
            clearAllButton.addActionListener(new TempListener());

            tArea = new JTextArea(5, 5);                
            tArea.setEditable(false);     

            add (subjectLabel);
            add (subject);
            add (gradeLabel);
            add (grade);
            add (cHoursLabel);
            add (cHours);
            add (addSubjectButton);
            add (calcGPAButton);
            add (clearAllButton);
            add (tArea);

            //Position of GUI elements
            subjectLabel.setBounds      (20, 20, 150, 20);              
            subject.setBounds           (120, 20, 350, 20);
            gradeLabel.setBounds        (20, 50, 50, 20);
            grade.setBounds             (120, 50, 50, 20);
            cHoursLabel.setBounds       (20, 80, 100, 20);
            cHours.setBounds            (120, 80, 50, 20);
            addSubjectButton.setBounds  (20, 120, 200, 30);
            calcGPAButton.setBounds     (300, 440, 175, 30);
            clearAllButton.setBounds    (20, 440, 120, 30);
            tArea.setBounds             (20, 170, 450, 250); 
        }


        private class TempListener implements ActionListener
        {
          //---------------------------------------------------------------------------
          //  Performs the conversion when the enter key is pressed in the text field.
          //---------------------------------------------------------------------------
            double tCrPoints = 0.00, tCrHours = 0.00, tGPA = 0.00;  
            String status; 

            public void actionPerformed(ActionEvent event)
            {
                if (event.getSource() == addSubjectButton)                   
                {
                    for (int i=0; i<6; i++)
                    {
                        subjectArray[i] = subject.getText();
                        gradeArray[i] = (String) grade.getSelectedItem();
                        cHoursArray[i] = Integer.parseInt(cHours.getText()); 
                    }

                    tArea.append (subject.getText() + "\t\t\t" + 
                                  grade.getSelectedItem() + "\t"  + 
                                  cHours.getText() + "\n"); 
                    subject.setText("");
                    cHours.setText(""); 
                }


                if (event.getSource() == calcGPAButton)   
                {
                    for (int i=0 ; i<gradeArray.length; i++)
                    {
                        for (int j=0; j<gradeLetter.length; j++)
                        {
                            if(gradeArray[i].equals(gradeLetter[j]))
                            {
                                tCrHours += cHoursArray[i]; 
                                tCrPoints += gradeValue[j] * cHoursArray[i];
                            }
                        }
                    }

                    tGPA = tCrPoints/tCrHours;

                    if (tGPA >= 2)
                        status = ("Pass");
                    else
                        status = ("Fail"); 

                    //Output for text area 
                    tArea.setText("Total Credit Points : " + tCrPoints + "\n" +
                                  "Total Credit Hours : " + tCrHours + "\n\n" + 
                                  "Grade Point Average (GPA) : " + tGPA + "\n" +
                                  "Status : " + status); 
                } 


                if (event.getSource() == clearAllButton)  
                {
                    tArea.setText("");
                    cHours.setText("");
                    grade.setSelectedIndex(0);
                    tCrHours = 0.00;
                    tCrPoints = 0.00;
                }


           }





        }
    }

Ответы [ 4 ]

3 голосов
/ 25 декабря 2011

Вы проделали хорошую работу, отделив main() от графического интерфейса пользователя и остальной части приложения, но я думаю, вам следовало бы пойти дальше, чтобы отделить графический интерфейс от кода вычисления.

Подумайте над большим вопросом: почему GUI JPanel знает о оценках и GPA? Работа JPanel заключается в том, чтобы знать, как визуализировать элементы графического интерфейса в блоке и направлять входные события в нужный объект виджета.

Я полагаю, что ваш код будет гораздо более удобен в обслуживании и определенно более гибким, если вы разделите код, чтобы управлять оценками из кода для обработки GUI. Всегда будет какая-то грубая грань между указанием графическому интерфейсу обновлять значения в модель по сравнению с тем, как модель опрашивает значения данных из графического интерфейса, но вы можете определить этот интерфейс в соответствии с вашими потребностями. : это может быть GPA объект, который использует рекомендуемые SLaks ArrayList<E> для хранения отдельных Subject объектов, которые знают имя, оценку, даты проведения курса и т. д. (Это может быть просто ( name, grade) кортежи, так как это пока коротко и мило.)

Ваш GPA объект может экспортировать интерфейс: public void addSubject(String className, String grade) и public double getGPA(). Ваш графический интерфейс может вызывать этот интерфейс для добавления новых классов и получения GPA для отображения.

Я понимаю, что это гораздо более радикальное переписывание, чем вы искали. И это даже не сразу решает вашу проблему. Но я полагаю, что код GPA, если смотреть сам по себе, будет выглядеть гораздо проще, чем он в настоящее время скрыт среди кода GUI.

3 голосов
/ 25 декабря 2011

Вы ищете ArrayList<E>

2 голосов
/ 25 декабря 2011

Вы должны посмотреть на ArrayList, Vector или даже LinkedList для нужной вам функциональности. Вот учебник , объясняющий, как использовать ArrayList.

Идея проста: ArrayList позаботится о наращивании внутреннего массива для хранения его элементов, и по мере добавления к нему элементов он будет автоматически увеличиваться для их размещения. Строго говоря, размер не будет неограничен , но максимум 2 ^ 31-1 позиций (при условии, что у вас достаточно памяти) мне должно быть более чем достаточно для большинства практических случаев.

РЕДАКТИРОВАТЬ:

Для вашего конкретного примера:

// create an ArrayList
ArrayList<Double> gradeValue = new ArrayList<Double>();

// add elements to the ArrayList
gradeValue.add(4.00);
gradeValue.add(3.67); // etc.

// iterating over the ArrayList
for (int i = 0; i < gradeValue.size(); i++) {
    double value = gradeValue.get(i);
    // etc.
}
1 голос
/ 28 декабря 2011

Используйте хэш-карту, чтобы содержать все ваши оценки, и используйте списки массивов, чтобы указать ваш час и полученную оценку.Вот быстрое переписывание того, что у вас есть.

public class MainPage extends JPanel {

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

private JLabel subjectLabel, cHoursLabel, gradeLabel;      
private JTextField subject, cHours;
private JButton addSubjectButton, calcGPAButton, clearAllButton;
private JTextArea tArea;
private JComboBox grade;

List<String> gradeArray = new ArrayList<String>();
List<Integer> cHoursArray = new ArrayList<Integer>();
Map<String, Double> grades = new HashMap<String, Double>();

public MainPage() {
    this.populateGrades();

    setLayout(null);
    setPreferredSize (new Dimension(500, 500));
    setBackground (Color.orange);

    subjectLabel = new JLabel ("Subject Name: ");
    subject = new JTextField (33);
    subject.addActionListener (new TempListener());

    gradeLabel = new JLabel ("Grade: ");
    grade = new JComboBox (grades.keySet().toArray()); 
    grade.addActionListener (new TempListener());

    // ... THE REST OF YOU CODE ... //
}

private void populateGrades() {
    grades.put("A", 4.00);
    grades.put("A-", 3.67);
    grades.put("B+", 3.67);
    grades.put("B", 3.67);
    grades.put("B-", 3.67);
    grades.put("C+", 3.67);
    grades.put("C", 3.67);
    grades.put("D", 3.67);
    grades.put("D-", 3.67);
    grades.put("E", 3.67);
    grades.put("F", 3.67);
}

private class TempListener implements ActionListener {
    double tCrPoints = 0.00, tCrHours = 0.00, tGPA = 0.00;
    String status;

    public void actionPerformed(ActionEvent event) {
        if (event.getSource() == addSubjectButton) {
            // Not sure what you are trying to do here, you are basically setting the 3 arrays identical
            // subject.getText() = 1 ==> subjectArray[1,1,1,1,1,1]
            // Do not see the point of this at all
            /* for (int i=0; i<6; i++) {
                subjectArray[i] = subject.getText();
                gradeArray[i] = (String) grade.getSelectedItem();
                cHoursArray[i] = Integer.parseInt(cHours.getText());
            } */

            gradeArray.add(grade.getSelectedItem().toString());
            cHoursArray.add(Integer.parseInt(cHours.getText()));

            tArea.append (subject.getText() + "\t\t\t" + grade.getSelectedItem() + "\t"  + cHours.getText() + "\n");
            subject.setText("");
            cHours.setText("");
        }

        if (event.getSource() == calcGPAButton) {
            for (String grade : gradeArray) {
                tCrPoints += grades.get(grade);
            }

            for (Integer hour : cHoursArray) {
                tCrHours += hour;
            }

            tGPA = tCrPoints/tCrHours;

            if (tGPA >= 2) {
                status = ("Pass");
            } else {
                status = ("Fail");
            }

            tArea.setText("Total Credit Points : " + tCrPoints + "\n" +
                        "Total Credit Hours : " + tCrHours + "\n\n" +
                        "Grade Point Average (GPA) : " + tGPA + "\n" +
                        "Status : " + status);
        }

        if (event.getSource() == clearAllButton) {
            tArea.setText("");
            cHours.setText("");
            grade.setSelectedIndex(0);
            tCrHours = 0.00;
            tCrPoints = 0.00;
        }
    }
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...