Syazwani_21
Syazwani_21

Reputation: 21

How to use same conditional statement for different variables in java?

My program suppose to get mark from user for each subject using this conditional statement. And the output is the subject's grade and the total GPA for four subjects.

I want to use this conditional statement for other four variable (subjectA,subjectB,subjectC,subjectD) replacing "discrete". And I want to access them for output. Is there any way to shorten the code instead of writing the same conditional statement for each variable ?

if (discrete>=90 && discrete <=100)
      {discreteGrade= "A+" ;
        discreteGPA=4.00;}
 else if (discrete>=80 && discrete <=89)
  {discreteGrade= "A" ;
   discreteGPA=4.00;}
     else if (discrete>=75 && discrete <=79)
     {discreteGrade= "A-" ;
     discreteGPA=3.67;}
       else if (discrete>=70 && discrete <=74)
        {discreteGrade= "B+" ;
         discreteGPA=3.33;}
           else if (discrete>=65 && discrete <=69)
          {discreteGrade= "B" ;
           discreteGPA=3.00;}
               else if (discrete>=60 && discrete <=64)
               {discreteGrade= "B-" ;
                discreteGPA=2.67;}
                  else if (discrete>=55 && discrete <=59)
                 {discreteGrade= "C+" ;
                  discreteGPA=2.33;}
                     else if (discrete>=50 && discrete <=54)
                     {discreteGrade= "C" ;
                     discreteGPA=2.00;}
                         else if (discrete>=45 && discrete <=49)
                        {discreteGrade= "C-" ;
                         discreteGPA=1.67;}
                             else if (discrete>=40 && discrete <=44)
                            {discreteGrade= "D+" ;
                            discreteGPA=1.33;}
                                  else if (discrete>=35 && discrete <=39)
                                    {discreteGrade= "D" ;
                                 discreteGPA=1.00;}
                                       else
                                {discreteGrade= "F" ;
                                   discreteGPA=0.00;}

Upvotes: 2

Views: 162

Answers (6)

Everyone
Everyone

Reputation: 23

Here's an answer if i understood:

        if (discrete>=90 && discrete <=100)
          {discreteGrade= "A+" ;
            discreteGPA=4.00;}
     else if (discrete>=80 && discrete <=89)
      {discreteGrade= "A" ;
       discreteGPA=4.00;}
         else if (discrete>=75 && discrete <=79)
         {discreteGrade= "A-" ;
         discreteGPA=3.67;}
           else if (discrete>=70 && discrete <=74)
            {discreteGrade= "B+" ;
             discreteGPA=3.33;}
               else if (discrete>=65 && discrete <=69)
              {discreteGrade= "B" ;
               discreteGPA=3.00;}
                   else if (discrete>=60 && discrete <=64)
                   {discreteGrade= "B-" ;
                    discreteGPA=2.67;}
                      else if (discrete>=55 && discrete <=59)
                     {discreteGrade= "C+" ;
                      discreteGPA=2.33;}
            else if (discrete>=45 && discrete <=49)
                            {discreteGrade= "C-" ;
                             discreteGPA=1.67;}
                                 else if (discrete>=40 && discrete <=44)
                                {discreteGrade= "D+" ;
                                discreteGPA=1.33;}
                                      else if (discrete>=35 && discrete <=39)
                                        {discreteGrade= "D" ;
      

or simpler:

    if (discrete < 35) {
    discreteGrade = "F";
    discreteGPA = 0.00;
} else if (discrete < 40) {
    discreteGrade = "D";
    discreteGPA = 1.00;
} else if (discrete < 45) {
    discreteGrade = "D+";
    discreteGPA = 1.33;
} else if (discrete < 50) {
    discreteGrade = "C-";
    discreteGPA = 1.67;
} else if (discrete < 55) {
    discreteGrade = "C";
    discreteGPA = 2.00;
} else if (discrete < 60) {
    discreteGrade = "C+";
    discreteGPA = 2.33;
} else if (discrete < 65) {
    discreteGrade = "B-";
    discreteGPA = 2.67;
} else if (discrete < 70) {
    discreteGrade = "B";
    discreteGPA = 3.00;
} else if (discrete < 75) {
    discreteGrade = "B+";
    discreteGPA = 3.33;
} else if (discrete < 80) {
    discreteGrade = "A-";
    discreteGPA = 3.67;
} else if (discrete < 90) {
    discreteGrade= "A";
    discreteGPA = 4.00;
} else {
    discreteGrade = "A+";
    discreteGPA = 4.00;
}

maybe this works better, and someone might have already sent this as his more beter and simpler.

Upvotes: 1

Petre Popescu
Petre Popescu

Reputation: 2002

So, I would try to avoid such IF-ELSE statements. They are really hard to understand, write and extend. Here is a better solution.

public class Grade {
    private double min;
    private double gpa;
    private String mark;
    public Grade(double min, double gpa, String mark) {
        this.min = min;
        this.gpa = gpa;
        this.mark = mark;
    }
}

This stores the minimum discrete needed to obtain it, the GPA and the string representation (A+, A, A-, etc.)

Now, we have a Grader class that calculates the grade. Sorry if my English is not on par and the naming are not correct, but I hope you get the point.

public class Grader {
    private List<Grade> grades = Arrays.asList(new Grade(90, 4.00, "A+"),
            new Grade(80, 4.00, "A"),
            new Grade(75, 3.67, "A-"));
    public Grade getGrade(double discrete) {
        Iterator<Grade> iterator = grades.listIterator();
        Grade grade = iterator.next();
        while (grade.getMin() > discrete) {
            grade = iterator.next();
        }

        return grade;
    }
}

Some improvements can be done here (for example, negative or invalid marks received, but this is just a proof of concept). What it does, it iterates the list of possible grades until it gets to the correct one. Just make sure you add all the possible grades in the list. I only added the first three.

Now, the class Grader does not care for what subject it receives the grade. You can call it multiple times like this:

Grader grader = new Grader();
Grade forSubjectA = grader.grade(discreteForA);
Grade forSubjectB = grader.grade(discreteForB);
...

Upvotes: 3

Mohamed Anees A
Mohamed Anees A

Reputation: 4601

This is the closest I could make for the question. Not just four subjects, I have made it as an array of subject marks so that it is flexible for multiple subjects.

This is not a complete answer, but an idea for you to build on.

public class S06 {
  public static void main(String[] args) {
    Student s = new Student(89.5, 90.0, 45.0, 99.5); // Marks of 4 subjects
    List<Grade> studentGrade = s.getGradesForMarks(); // Grades of 4 subjects
    System.out.println(studentGrade);
  }
}

class Student {

  private Double[] marks;

  public Student(Double... marks) {
    this.marks = marks;
  }

  public List<Grade> getGradesForMarks() {
    return Arrays.stream(marks).map(this::getGradeForMark).collect(Collectors.toList());
  }

  private Grade getGradeForMark(double mark) {
    return Arrays.stream(Grade.values())
        .filter(g -> mark > g.minMarks && mark <= g.maxMarks) //Your conditions go here!
        .findFirst()
        .orElseThrow(() -> new RuntimeException("Unable to grade mark , " + mark));
  }

  enum Grade {
    GRADE_A_PLUS("A+", 4.00, 100, 91),
    GRADE_A("A", 4.00, 90, 81),
    GRADE_A_MINUS("A-", 3.69, 80, 71),
    OTHERS("O", 3.00, 70, 0);

    String discreteGrade;
    Double discreteGPA;
    Double maxMarks; 
    Double minMarks;

    Grade(String discreteGrade, double discreteGPA, double maxMarks, double minMarks) {
      this.discreteGrade = discreteGrade;
      this.discreteGPA = discreteGPA;
      this.maxMarks = maxMarks;
      this.minMarks = minMarks;
    }
  }
}

Hope the variable names are self explanatory.

Upvotes: 1

user14437744
user14437744

Reputation:

Since I can't comment you can also try a switch case and you want to put && but you might not need the || part because your if statement is already declaring the next step like

if(discrete>89 )// it don't matter  if it is greater then 100 because it is still going to be an a+
{
   discreteGrade= "A+";
   discreteGPA=4.00;
}else if(discreet > 79)
{
  // your code here because it will catch the the fact that it is already
  // < 90 because the first if statement says it is already greater than 89.
}

Upvotes: 1

AP11
AP11

Reputation: 617

I mean, I would start from the lowest grade, so you can cut some of the conditions.

if (discrete < 35) {
    discreteGrade = "F";
    discreteGPA = 0.00;
} else if (discrete < 40) {
    discreteGrade = "D";
    discreteGPA = 1.00;
} else if (discrete < 45) {
    discreteGrade = "D+";
    discreteGPA = 1.33;
} else if (discrete < 50) {
    discreteGrade = "C-";
    discreteGPA = 1.67;
} else if (discrete < 55) {
    discreteGrade = "C";
    discreteGPA = 2.00;
} else if (discrete < 60) {
    discreteGrade = "C+";
    discreteGPA = 2.33;
} else if (discrete < 65) {
    discreteGrade = "B-";
    discreteGPA = 2.67;
} else if (discrete < 70) {
    discreteGrade = "B";
    discreteGPA = 3.00;
} else if (discrete < 75) {
    discreteGrade = "B+";
    discreteGPA = 3.33;
} else if (discrete < 80) {
    discreteGrade = "A-";
    discreteGPA = 3.67;
} else if (discrete < 90) {
    discreteGrade= "A";
    discreteGPA = 4.00;
} else {
    discreteGrade = "A+";
    discreteGPA = 4.00;
}

Upvotes: 1

Gerard H. Pille
Gerard H. Pille

Reputation: 2578

discrete is read from the commandline 1st parameter

        int[] discrvals = {90,80,75,70,65,60,55,50,45,40,35};
        String[] discrgrades = {
                  "A+","A","A-","B+","B","B-","C+","C","C-","D+", "D","F"};
        double[] discrgpas = {
           4.0,4.0,3.67,3.33,3.0,2.67,2.33,2.00,1.67,1.33,1.0, 0.0};

        int discrete = Integer.parseInt(args[0]);
        int i;
        for(i = 0; i<discrvals.length; i++){
          if (discrete > discrvals[i] ) {
             break;
          }
        }
        System.out.println( discrgrades[i] + "/" + discrgpas[i] );

Upvotes: 1

Related Questions