2011-12-25 32 views
3

基本的に私の問題は、ユーザーから無制限の入力配列を設定する方法がわかりません。 今のところ、ユーザーが6件の件名を入力した場合、正確ではなく、入力された被写体が小さいまたは6以上であれば... どういうわけか、私は入力が無制限であることをしたい。..Java GPA計算(無制限配列の設定方法)

これは私がこれまで持っているものです。

MAIN CLASS

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

他CLASS

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


      } 





     } 
    } 

答えて

2

を探しています。 ArrayListの使い方を説明するtutorialです。 ArrayListは要素を格納するための内部配列を増やして処理し、要素を追加し続けると自動的に拡張し続けます。厳密に言えば、サイズはで無制限ではありませんが、十分なメモリがあると仮定すると最大2^31-1の位置になります。

EDIT:あなたの特定の例

// 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. 
} 
+0

@AisyahNadiah私は私はあなたが詳細を把握しましょうよ、少しのサンプルコードを追加(チュートリアルを見てみましょう!) –

+0

はsubjectArray、gradeArrayとcHoursArrayのために、ユーザからの入力を受信する方法をhm..but ..それは私がArrayListに要素を設定する必要はありません –

+0

配列の 'ArrayList' _instead_を使用する、あなたはコレクションを使用することを学ぶ必要があります –

3

あなたはGUIとアプリケーションの残りの部分からmain()別に良い仕事分割をしましたが、私は、あなたが撮影しているはずだと思いますさらにGUIを計算コードから分割することもできます。

グレードとGPAについてGUI JPanelがなぜ知っているのですか? JPanelの仕事は、ボックス内でGUI要素をレンダリングし、入力イベントを右ウィジェットオブジェクトにルーティングする方法を知ることです。

GUIを処理するコードからグレードを管理するためにコードを分割すると、コードがはるかにメンテナンス可能で、確実に順応性が向上すると思います。 GUIに値を更新してmodelと対話させることと、GUIからデータ値をポーリングすることとの間には、常に曖昧な部分がありますが、あなたのニーズに最もよく合うようにインターフェイスを定義することができます。GPA名前を知っている個々のSubjectオブジェクトを格納するためにSLaks's recommended ArrayList<E>を使用するオブジェクト、グレード、コースが行われた日付など(これは、これまで短いと甘いですので、それはちょうど、(namegrade)タプルかもしれません。)

GPAオブジェクトは、インターフェイスをエクスポートすることができますpublic void addSubject(String className, String grade)public double getGPA()。あなたのGUIは、新しいクラスを追加して表示するためにGPAを取得するために、このインタフェースを呼び出すことができます。

私はこれがあなたが探していたよりもはるかに劇的な書き換えであることを認識しています。そして、あなたの懸念にすぐに対処することさえできません。しかし、GPAコードは、GUIコードの中に埋め込まれているよりもはるかに簡単に操作できるように見えます。

+0

あなたが締め切りを過ぎていて、書き直す時間がない場合私が提案したコード(あるいはそうしたくないコード)は、['ArrayList '](http://docs.oracle.com/javase/7)を使ってコードを書き直す必要があります/docs/api/java/util/ArrayList.html)コレクション、または[Óscar](http://stackoverflow.com/a/8627727/377270)で提案されている別のメカニズムです。 – sarnold

1

あなたのすべての成績を含むためにハッシュマップを使用し、得られた時間と成績を配列リストに含める。あなたが持っているものを簡単に書き直してみましょう。

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