How do I make it display the number of people in one of the levels instead of it showing the grades in each level?

Viewed 39

So here in my program I want it to display the number of students in each level (for example if two grades are below 50, "Number at Level R: 2". The issue I am having is that it displays the grades that are in each level (for example "Number at Level 1: 55".) instead of it saying how many grades are within that level.

import java.util.*;
import java.text.*;
import java.math.*;
public class Marks {
    public static void main(String args[]) {
        Scanner in = new Scanner(System.in);
        DecimalFormat format = new DecimalFormat(".0");
        format.setRoundingMode(RoundingMode.HALF_UP);
        // Teachers can choose how many grades they want to enter
        System.out.print("How many student grades would you like to enter:");
        int x = in.nextInt();
        int [] grades = new int[x];
        System.out.print("Enter student marks:\n");
            for (int i = 0; i < x; i++) {
            grades[i] = in.nextInt();
            }
            bubbleSort(grades);
            System.out.println("Sorted grades: "+Arrays.toString(grades));
            classAverage(grades);
            System.out.println("Class average: "+format.format(classAverage(grades))+"%");
            classMax(grades);
            System.out.println("Maximum mark: "+classMax(grades)+"%");
            classMin(grades);
            System.out.println("Minimum mark: "+classMin(grades)+"%");
            // To get the grade range.
            int range = classMax(grades) - classMin(grades);
            System.out.println("Range of marks: "+range+"%");
            classLevel(grades);
    } // Method for finding the class average
      private static double classAverage(int [] grades) {
          int sum = 0;
          for (int g : grades) sum +=g;
          double average = ((double)sum) / grades.length;
          return (average);
      } // Method for finding the highest grade
      private static int classMax(int [] grades) {
          int max = Arrays.stream(grades).max().getAsInt();
          return max;
      } // Method for finding the lowest grade
      private static int classMin(int [] grades) {
          int min = Arrays.stream(grades).min().getAsInt();
          return min;
      } // Method for arranging the grades into levels
      private static void classLevel(int [] grades) {
          for(int i : grades) {
              if(i < 50) {
              System.out.println("Number at Level R: "+i);    
         }  else if((i >= 50)&&(i < 60)) {
              System.out.println("Number at Level 1: "+i);
         }   else if((i >= 60)&&(i <70)) {
                 System.out.println("Number at Level 2: "+i);
         }  else if((i >= 70)&&(i<80)) {
             System.out.println("Number at Level 3: "+i); 
         } else {
              System.out.println("Number at Level 4: "+i);
         }
          }
      } 
        // Method for sorting the grades
        private static void bubbleSort(int[] n) {
        boolean flag;
        do {
            flag = false;
            for (int i = 0; i < n.length - 1; i++) {
                if (n[i] > n[i + 1]) {
                    int temp = n[i];
                    n[i] = n[i + 1];
                    n[i + 1] = temp;
                    flag = true;
                }
            }
        } while (flag);
        }
}
2 Answers

Just use a variable to count the amount in each range. Then print at the end.

private static void classLevel(int [] grades) {
          int levelR = 0;
          int level1 = 0;
          int level2 = 0;
          int level3 = 0;
          int level4 = 0;
          for(int i : grades) {
              if(i < 50) {
              levelR++;    
         }  else if((i >= 50)&&(i < 60)) {
              level1++;
         }   else if((i >= 60)&&(i <70)) {
              level2++;
         }  else if((i >= 70)&&(i<80)) {
             level3++; 
         }  else {
              level4++;
         }
            System.out.println("Number at Level R: "+ levelR);
            System.out.println("Number at Level 1: "+ level1);
            System.out.println("Number at level 2: "+ level2);
            System.out.println("Number at level 3: "+ level3);
            System.out.println("Number at Level 4: "+ level4);
          }


      }

The main reason why it's displaying Number at Level 1: 55, for example, is because when you are making the for loop:

for(int i : grades) {
    //stuff
}

You are iterating over each of the grades (which I assume are between 0 and 100). In other words, "i" represents a certain grade in grades. So when you do

if(i < 50) {
    System.out.println("Number at Level R: "+i);    
}

You are printing the actual grade, not how many of that grade there are. To fix this, I would suggest you create a counter for each grade category and based on the grade, increment each counter accordingly. The following should go inside the classLevel method:

int rLevel = 0;
int levelOne = 0;
int levelTwo = 0;
int levelThree = 0;
int levelFour = 0;
for(int i : grades) {
    if(i < 50) 
        rLevel++;    
    else if((i >= 50)&&(i < 60)) 
        levelOne++;
    else if((i >= 60)&&(i <70)) 
        levelTwo++;
    else if((i >= 70)&&(i<80)) 
        levelThree++; 
    else 
        levelFour++;
}
System.out.println("Number at Level R: "+ rLevel);
System.out.println("Number at Level 1: "+ levelOne);
System.out.println("Number at level 2: "+ levelTwo);
System.out.println("Number at level 3: "+ levelThree);
System.out.println("Number at Level 4: "+ levelFour);
Related