Search code examples
arrayssortingwhile-loopcontainersjtextpane

Averaging Grades: getting 0's instead of user input


My code is nearly perfect...i think. I need to take test scores entered by the user (up to a maximum of 50 scores) and then when the user enters -1 it will display all the scores they entered sorted from lowest to highest and then at the bottom of the list it should say "Average is __". Unfortunately when I run it I get a huge list of 0's and I can't figure out where I went wrong. If anyone has any ideas I would appreciate it

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

public class AverageGrades extends JFrame
{
//construct conponents
static JLabel title = new JLabel("Average of Grades");
static JTextPane textPane = new JTextPane();
static int numberOfGrades = 0;
static int total = 0;
static DecimalFormat twoDigits = new DecimalFormat ("##0.00");

//set array
static int[] grades = new int[50];

//create content pane
public Container createContentPane()
{
    //create JTextPane and center panel
    JPanel northPanel = new JPanel();
    northPanel.setLayout(new FlowLayout());
    northPanel.add(title);

    JPanel centerPanel = new JPanel();
    textPane = addTextToPane();
    JScrollPane scrollPane = new JScrollPane(textPane);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        scrollPane.setPreferredSize(new Dimension(500,200));
    centerPanel.add(scrollPane);

    //create Container and set attributes
    Container c = getContentPane();
        c.setLayout(new BorderLayout(10,10));
        c.add(northPanel,BorderLayout.NORTH);
        c.add(centerPanel,BorderLayout.CENTER);

    return c;
}

//method to add new text to JTextPane
public static JTextPane addTextToPane()
{
    Document doc = textPane.getDocument();
    try
    {
        // clear previous text
        doc.remove(0,doc.getLength());

        //insert title
        doc.insertString(0,"Grades\n",textPane.getStyle("large"));

        //insert grades and calculate average
        for(int j=0; j<grades.length; j++)
        {
            doc.insertString(doc.getLength(), grades[j] + "\n", textPane.getStyle("large"));
        }
    }
    catch(BadLocationException ble)
    {
        System.err.println("Couldn't insert text");
    }

    return textPane;
}

//method to sort array
public void grades(int grdArray[])
{
    //sort int array
    for (int pass = 1; pass<grdArray.length; pass++)
    {
        for (int element = 0; element<grdArray.length -1; element++)
        {
            swap(grades, element, element + 1);

        }
    }
        addTextToPane();

}


//method to swap elements of array
public void swap(int swapArray[], int first, int second)
{
    int hold;
    hold = swapArray[first];
    swapArray[first] = swapArray[second];
    swapArray[second] = hold;
}

//execute method at run time
public static void main(String args[])
{
    JFrame.setDefaultLookAndFeelDecorated(true);
    AverageGrades f = new AverageGrades();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


    //accept first grade
    int integerInput = Integer.parseInt(JOptionPane.showInputDialog(null, "Please enter a grade (0-100) or -1 to calculate the average"));

    //while loop accepts more grades, keeps count, and calulates the total
    int count = 0;
    int[] grades = new int[50];
    int num = 0;
    while (count<50 && num!= -1)
    {
        num = Integer.parseInt(JOptionPane.showInputDialog(null, "Please enter a grade (0-100) or -1 to calculate the average" + (count+1)));
        if(num!=-1)
            grades[count] = num;
        count++;

    }

    //create content pane
    f.setContentPane(f.createContentPane());
    f.setSize(600,375);
    f.setVisible(true);


}

}


Solution

  • Here's the corrected code which solves your issues.

    There were two major issues, you were using a local array grades instead of your static global array grades. (So remove the declaration from main)

    Secondly, you were never inserting the first value integerInput which caused the first element to be lost.

           import java.awt.*;
        import javax.swing.*;
        import javax.swing.text.*;
        import java.text.DecimalFormat;
    
        class AverageGrades extends JFrame {
            // construct conponents
            static JLabel title = new JLabel("Average of Grades");
            static JTextPane textPane = new JTextPane();
            static int numberOfGrades = 0;
            static int total = 0;
            static DecimalFormat twoDigits = new DecimalFormat("##0.00");
    
            // set array
            static int[] grades = new int[50];
    
            // create content pane
            public Container createContentPane() {
                // create JTextPane and center panel
                JPanel northPanel = new JPanel();
                northPanel.setLayout(new FlowLayout());
                northPanel.add(title);
    
                JPanel centerPanel = new JPanel();
                textPane = addTextToPane();
                JScrollPane scrollPane = new JScrollPane(textPane);
                scrollPane
                        .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
                scrollPane.setPreferredSize(new Dimension(500, 200));
                centerPanel.add(scrollPane);
    
                // create Container and set attributes
                Container c = getContentPane();
                c.setLayout(new BorderLayout(10, 10));
                c.add(northPanel, BorderLayout.NORTH);
                c.add(centerPanel, BorderLayout.CENTER);
    
                return c;
            }
    
            // method to add new text to JTextPane
            public static JTextPane addTextToPane() {
                int counter = 0;
                Document doc = textPane.getDocument();
                try {
                    // clear previous text
                    doc.remove(0, doc.getLength());
    
                    // insert title
                    doc.insertString(0, "Grades\n", textPane.getStyle("large"));
    
    //BREAKING IF NUMBER IS 0, SIGNIFIES THAT ALL ELEMENTS ARE COVERED
    //counter IS USED TO CALCULATE THE TOTAL NUMBER OF ELEMENTS
                    // insert grades and calculate average
                    for (int j = 0; j < grades.length; j++) {
                        if (grades[j] != 0) {
                            doc.insertString(doc.getLength(), grades[j] + "\n",
                                    textPane.getStyle("large"));
                            counter++;
                        } else {
                            break;
                        }
                    }
    
    //THIS LINE INSERTS THE AVERAGE IN THE PANEL
                    doc.insertString(doc.getLength(), "Average is :"
                            + (total / counter) + "\n", textPane.getStyle("large"));
    
                } catch (BadLocationException ble) {
                    System.err.println("Couldn't insert text");
                }
    
                return textPane;
            }
    
    
    //CORRECT THE SORTING FUNCTION
    // THE SORTING SHOULD BE IN REVERSE ORDER FOR YOUR REQUIREMENTS
    
            // method to sort array
            public void grades(int grdArray[]) {
                // sort int array
                for (int pass = 1; pass < grdArray.length; pass++) {
                    for (int element = 0; element < grdArray.length - 1; element++) {
                        swap(grades, element, element + 1);
    
                    }
                }
                addTextToPane();
    
            }
    
    
            // method to swap elements of array
            public void swap(int swapArray[], int first, int second) {
                int hold;
                hold = swapArray[first];
                swapArray[first] = swapArray[second];
                swapArray[second] = hold;
            }
    
            // execute method at run time
            public static void main(String args[]) {
                JFrame.setDefaultLookAndFeelDecorated(true);
                AverageGrades f = new AverageGrades();
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
                // accept first grade
                int integerInput = Integer.parseInt(JOptionPane.showInputDialog(null,
                        "Please enter a grade (0-100) or -1 to calculate the average"));
    
                // while loop accepts more grades, keeps count, and calulates the total
                int count = 0;
                grades[0] = integerInput;
                count++;
                int num = 0;
                while (count < 50 && num != -1) {
                    num = Integer.parseInt(JOptionPane.showInputDialog(null,
                            "Please enter a grade (0-100) or -1 to calculate the average"
                                    + (count + 1)));
    
    //USING TOTAL FIELD TO CALCULATE SUM
                    if (num != -1) {
                        grades[count] = num;
                        total += grades[count];
                    }
    
    
    
                    count++;
    
                }
    
    //CALL THE SORTING FUNCTION AFTER CORRECTING IT
    
                //f.grades(grades);
    
                // create content pane
                f.setContentPane(f.createContentPane());
                f.setSize(600, 375);
                f.setVisible(true);
    
            }
        }