Avoid/Eliminate Duplicate Code
I am trying to avoid duplicate code. How can I get this program to calculate one set of credit hours / letter grades, prompt the user (y/n) for more class info, keep calculating and then display the results when the user indicates they have no more class info to input. The first program is my most current attempt but I see myself having to duplicate the code with slight modifications to account fro the additional user data. If you look down below the first one you will see the mess I made before, but at least that one gives the desired results.
Code:
import javax.swing.*;
public class StudentGPA {
static String userInput, letterGrade, anotherClass;
static int creditHours;
static double totalCreditHours, gradeScore, gradePoints, totalGradePoints, gradePointAverage;
public static void main (String[] args) {
userInput = JOptionPane.showInputDialog("Enter credit hours for the class.");
creditHours = Integer.parseInt(userInput);
validateUserInput(userInput);
totalCreditHours = creditHours;
letterGrade = JOptionPane.showInputDialog("Enter letter grade for the class.");
letterGrade = letterGrade.toUpperCase();
validateLetterGrade(letterGrade);
calculateGradeScore(letterGrade);
gradePoints = creditHours * gradeScore;
totalGradePoints = gradePoints;
gradePointAverage = totalGradePoints / totalCreditHours;
anotherClass = JOptionPane.showInputDialog("Do you have more classes to input?");
anotherClass = anotherClass.toUpperCase();
validateAnotherClass(anotherClass);
displayGPA();
System.exit(0);
}
public static double calculateGradeScore(String letterGrade){
if (letterGrade.equals("A"))
gradeScore = 4.0;
else
if (letterGrade.equals("B"))
gradeScore = 3.0;
else
if (letterGrade.equals("C"))
gradeScore = 2.0;
else
if (letterGrade.equals("D"))
gradeScore = 1.0;
else
if (letterGrade.equals("F"))
gradeScore = 0.0;
return gradeScore;
}
public static void validateUserInput (String userInput) {
while (creditHours<1 || creditHours>6) {
JOptionPane.showMessageDialog(null,
"Credit hours must be between 1 & 6.");
userInput = JOptionPane.showInputDialog("Enter credit hours for the class.");
creditHours = Integer.parseInt(userInput);
}
}
public static void validateLetterGrade (String letterGrade) {
while (!letterGrade.equals("A") && !letterGrade.equals("B")
&& !letterGrade.equals("C") && !letterGrade.equals("D")
&& !letterGrade.equals("F")){
JOptionPane.showMessageDialog(null,
"You entered an invalid letter grade.");
letterGrade = JOptionPane.showInputDialog("Enter letter grade for the class.");
letterGrade = letterGrade.toUpperCase();
}
}
public static void validateAnotherClass (String anotherClass){
while (!anotherClass.equals("Y") && !letterGrade.equals("N")){
JOptionPane.showMessageDialog(null,
"Please enter y or n.");
anotherClass = JOptionPane.showInputDialog("Do you have more classes to input?");
anotherClass = anotherClass.toUpperCase();
}
}
public static void displayGPA() {
JOptionPane.showMessageDialog(null, "GPA = "+totalGradePoints+"/"+totalCreditHours+" = "+gradePointAverage);
}
}
Code:
import javax.swing.*;
public class StudentGPA {
//declare variables
static String userInput, letterGrade, anotherClass;
static int creditHours;
static double totalCreditHours, gradeScore, gradePoints, totalGradePoints, gradePointAverage;
//start main method
public static void main (String[] args) {
//get credit hours
userInput = JOptionPane.showInputDialog("Enter credit hours for the class.");
creditHours = Integer.parseInt(userInput);
//validate credit hours
validateUserInput(userInput);
totalCreditHours = creditHours;
//get letter grade
letterGrade = JOptionPane.showInputDialog("Enter letter grade for the class.");
letterGrade = letterGrade.toUpperCase();
//validate letter grade
validateLetterGrade(letterGrade);
calculateGradeScore(letterGrade);
gradePoints = creditHours * gradeScore;
totalGradePoints = gradePoints;
//prompt user for another class
anotherClass = JOptionPane.showInputDialog("Do you have other class information?");
anotherClass = anotherClass.toUpperCase();
while (anotherClass.equals("Y")) {
//get next class credit hours
userInput = JOptionPane.showInputDialog("Enter credit hours for the next class.");
creditHours = Integer.parseInt(userInput);
//validate next class credit hours
while (creditHours<0 || creditHours>6) {
//display error message
JOptionPane.showMessageDialog(null,
"Credit hours must be between 1 & 6.");
userInput = JOptionPane.showInputDialog("Enter credit hours for the next class.");
creditHours = Integer.parseInt(userInput);
}
totalCreditHours += creditHours;
//get letter grade for next class
letterGrade = JOptionPane.showInputDialog("Enter letter grade for the next class.");
letterGrade = letterGrade.toUpperCase();
//validate letter grade
while (!letterGrade.equals("A") && !letterGrade.equals("B")
&& !letterGrade.equals("C") && !letterGrade.equals("D")
&& !letterGrade.equals("F")){
//display error
JOptionPane.showMessageDialog(null,
"You entered an invalid letter grade.");
letterGrade = JOptionPane.showInputDialog("Enter letter grade for the next class.");
letterGrade = letterGrade.toUpperCase();
}
calculateGradeScore(letterGrade);
//more claculations
gradePoints = creditHours * gradeScore;
totalGradePoints += gradePoints;
//more classes
anotherClass = JOptionPane.showInputDialog("Do you have other class information?");
anotherClass = anotherClass.toUpperCase();
}
gradePointAverage = totalGradePoints / totalCreditHours;
displayGPA();
System.exit(0);
}
//letter grade calculations method
public static double calculateGradeScore(String letterGrade){
if (letterGrade.equals("A"))
gradeScore = 4.0;
else
if (letterGrade.equals("B"))
gradeScore = 3.0;
else
if (letterGrade.equals("C"))
gradeScore = 2.0;
else
if (letterGrade.equals("D"))
gradeScore = 1.0;
else
if (letterGrade.equals("F"))
gradeScore = 0.0;
return gradeScore;
}
public static void validateUserInput (String userInput) {
while (creditHours<0 || creditHours>6) {
//display error message
JOptionPane.showMessageDialog(null,
"Credit hours must be between 1 & 6.");
userInput = JOptionPane.showInputDialog("Enter credit hours for the class.");
creditHours = Integer.parseInt(userInput);
}
}
public static void validateLetterGrade (String letterGrade) {
while (!letterGrade.equals("A") && !letterGrade.equals("B")
&& !letterGrade.equals("C") && !letterGrade.equals("D")
&& !letterGrade.equals("F")){
//display error message
JOptionPane.showMessageDialog(null,
"You entered an invalid letter grade.");
letterGrade = JOptionPane.showInputDialog("Enter letter grade for the class.");
letterGrade = letterGrade.toUpperCase();
}
}
public static void validateAnotherClass (String anotherClass){
}
//display results method
public static void displayGPA() {
JOptionPane.showMessageDialog(null, "GPA = "+totalGradePoints+"/"
+totalCreditHours+" = "+gradePointAverage);
}
}