Как я могу использовать оператор switch внутри метода, чтобы метод мог возвращать значение char, полученное оператором switch внутри него? - PullRequest
0 голосов
/ 07 февраля 2019

Предполагается, что этот метод рассчитывает среднее значение полученных баллов и возвращает оценку соответственно.Как передать оценку от switch () в calc (), чтобы он мог вернуть правильную оценку?

public char calculate(){

    int count=0;
    int total = 0;
     for (int x: testScores){
             total = total + x;
             count++;
     }  

     int grade = total/count;

        switch(grade){
                case (1): if (grade>=90) return 'O';
                break;
                case(2): if (grade>=80 && grade<90) return 'E';
                break;
                case (3): if (grade>=70 && grade<80) return 'A';
                break;
                case (4): if (grade>=55 && grade<70) return 'P';
                break;
                case (5): if (grade>=40 && grade<55) return 'D';
                break;
                case (6): if (grade<40) return 'E';
                break;
            }
            return //what should i return here??

    }

Я знаю, как это сделать без switch (), но я думаю, что это может бытьсделал так же.Скажите, пожалуйста, что мне не хватает?

Ответы [ 4 ]

0 голосов
/ 08 февраля 2019

В вашем переключателе вы переходите к различным частям, проверяя, является ли grade 1, 2, 3 и т. Д. Но затем вы сравниваете его со значениями в диапазоне от 0 до 100?Это никогда не сработает.

Но вам вообще не нужен переключатель, вы можете просто использовать серию if утверждений

public char calculate(){

  int count=0;
  int total = 0;
  for (int x: testScores){
    total = total + x;
    count++;
  }  

  int grade = total/count; //what if count is 0?

  if (grade>=90) return 'O';
  if (grade>=80) return 'E';
  if (grade>=70) return 'A';
  if (grade>=55) return 'P';
  if (grade>=40) return 'D';
  return 'E';
}

И убедиться, что дело дошло до случаякогда count равно 0, я не сделал этого здесь, потому что я не знаю, каким должен быть результат.

0 голосов
/ 07 февраля 2019

Если вы переключите ваше последнее case на default вместо действительного значения, это устранит необходимость возвращать что-либо после оператора switch.

В более широком смысле, ваш ifзаявления внутри каждого case являются подозрительными.Как можно grade == 1 и grade >= 90?Единственный, который может сработать, это случай 6, так как 6 также <40. Вы пытаетесь использовать 1-6 в качестве логической метки, но на самом деле JVM сравнивает значение <code>grade с этими числамирешить, какой случай выполнить.

Я думаю, что есть более простой способ выразить эту логику.Похоже, что grade будет их числовой оценкой (то есть между 0 и 100, хотя в теории это также может быть отрицательным), поэтому я бы отбросил оператор switch и просто использовал бы if / else:

  if (grade >= 90) {
     return 'O';
  } else if (grade >= 80 && grade < 90) {
     return 'E';
  } else if (grade >= 70 && grade < 80) {
     return 'A';
  } else if (grade >= 55 && grade < 70) {
     return 'P';
  } else if (grade >= 40 && grade < 55) {
     return 'D';
  } else {
     return 'E';
  }

Обратите внимание, что последнее утверждение просто else без каких-либо условий.Это заставляет его работать, как в случае default в выражении switch: он будет отлавливать любое значение, которое не соответствует другим критериям.

0 голосов
/ 08 февраля 2019

Относительно вашего вопроса:

  • последний возврат не требуется, просто завершите switch предложением default и верните значение по умолчанию.
  • нет необходимостииспользуйте break stetements, так как вы используете return для каждого случая

Кроме того, если вы ограничиваете себя использованием только switch, то это один из более простых способов достижения вашей цели:

char calculate(int[] scores) {
  double averageScore = Arrays.stream(scores).average().getAsDouble();
  int nearestMultipleOfFive = 5 * ((int) averageScore / 5);
  switch (nearestMultipleOfFive) {
    case 100:
    case 95: 
    case 90: return 'O';
    case 85:
    case 80: return 'E';
    case 75: 
    case 70: return 'A';
    case 65: 
    case 60:
    case 55: return 'P';
    case 50: 
    case 45:
    case 40: return 'D';
    default: return 'E';
  }
}
0 голосов
/ 07 февраля 2019

Поскольку вы покрыли все случаи с помощью оператора switch, и вы сразу же вернулись для каждого из них, вы ничего не должны делать там, вы никогда не достигнете этой части кода.В коде, который у вас в данный момент есть, оператор break также бесполезен, потому что он никогда не будет достигнут ни в одном из случаев, потому что он снова ожидается оператором возврата.

Вы можете немного изменить свой кодесли вы хотите вернуть значение один раз в конце, сохраняя результат регистра переключателя в ранее определенной переменной и возвращая его в конце.

...