Эрик хорошо объяснил, как сделать то, что вы пытаетесь сделать, но позвольте мне уточнить, в чем вы ошиблись.
Структура switch / case сравнивает данную переменную (аргумент switch) с возможными значениями (аргументы case), а затем выполняет код между соответствующим оператором case и следующим оператором break (или, если язык не поддерживает падение -перед следующей записью дела).
То, что вы пытаетесь сделать, - это не сравнить переменную с константными выражениями, а сравнить переменную с условиями. Структура if / elseif, вероятно, будет более понятным способом выразить это:
if (this.yourNumberGrade >= 0.90) {
this.yourLetterGrade = 'A';
} else if (this.yourNumberGrade >= 0.80) {
this.yourLetterGrade = 'B';
} else if (this.yourNumberGrade >= 0.70) {
this.yourLetterGrade = 'C';
} else if (this.yourNumberGrade >= 0.60) {
this.yourLetterGrade = 'D';
} else { // you left the default out, but I assume this will be an F for Failed
this.yourLetterGrade = 'F';
}
Если вы хотите, чтобы он был короче, вы можете попробовать поэкспериментировать с троичным оператором так:
this.yourLetterGrade = (
this.yourNumberGrade >= 0.90 ? 'A' : (
this.yourNumberGrade >= 0.80 ? 'B' : (
this.yourNumberGrade >= 0.70 ? 'C' : (
this.yourNumberGrade >= 0.60 ? 'D' : 'F'
)
)
)
)
Как видите, это стоит ОЧЕНЬ большого количества читабельности, поэтому, если / еще, возможно, самый чистый способ сделать это.
То, что Эрик пытался показать вам, представляет собой такую структуру:
switch (true) { // We compare the boolean constant "true" to the case arguments
case this.yourNumberGrade >= 0.90:
// this is a boolean expression and evaluates either
// to "true" (matches the switch argument) or
// to "false" (does not match the switch argument)
this.yourLetterGrade = 'A';
break;
case this.yourNumberGrade >= 0.80:
this.yourLetterGrade = 'B';
break;
case this.yourNumberGrade >= 0.70:
this.yourLetterGrade = 'C';
break;
case this.yourNumberGrade >= 0.90:
this.yourLetterGrade = 'D';
break;
default:
// This is executed if none of the case arguments evaluate
// to the value of the switch argument.
this.yourLetterGrade = 'F';
// No break needed, because the end of the switch structure follows:
}
Надеюсь, это прояснит для вас. Вы, вероятно, должны уделять больше внимания точной семантике структур, которые вы пытаетесь использовать. Эти структуры очень похожи в большинстве языков.
Для ударов и хихиканья вы могли бы даже сделать это с массивом:
// Our letter grades in ascending order (from bad to good).
String letterGrades[] = {'F','D','C','B','A'};
// Our number grade is in the range [0.0;1.0]. As floating point numbers are
// too precise for indexes, we want to round them down to the cut-off
// (0.9, 0.8, etc) and turn them into integer values we can use as array indices.
int gradeIndex = (int) Math.floor(this.yourNumberGrade*10);
// The lowest cut-off is 0.6, so we can treat everything lower than that the same
gradeindex = gradeindex - 5;
gradeIndex = Math.max(gradeIndex, 0);
// With Math.max we have ensured that no index can be lower than 0, now we need
// to make sure that no index is larger than the largest index in our array
// (which by definition is equal to the array's length (i.e. number of elements)
// minus 1 (because the lowest index is 0, an array of e.g. size 4 has the
// indices 0,1,2,3, but lacks an index 4 -- better get used to it, that's how
// programmers count, too).
gradeIndex = Math.min(gradeIndex, letterGrades.length-1);
// Now that our index is clean and guaranteed to be within range, we can use it
// to look up the letter grade:
this.yourLetterGrade = letterGrades[gradeIndex];
Без комментариев и с несколькими сокращениями, это еще короче:
// Grades are as follows: A: 90%+, B: 80%+, C: 70%+, D: 60%+, F: <60%
String letterGrades[] = {'F','D','C','B','A'};
int gradeIndex = Math.min(
Math.max(0, (int) Math.floor(this.yourNumberGrade*10) - 5),
letterGrades.length-1
);
this.yourLetterGrade = letterGrades[gradeIndex];
Обратите внимание, что это делает, однако, менее ясным, где находятся точные точки отсечения для буквенных оценок, поэтому он нуждается в комментариях. Кроме того, у вас будут проблемы, если по какой-либо причине изменятся пороговые значения (например, A: 85% + или F: <66,6%). Вы все еще можете скорректировать расчет (часть <code>Math.floor(this.yourNumberGrade*10)-5), но это сделает его еще труднее и не поможет, если оценки не просто постепенные. Однако для традиционных систем это быстрый и простой способ сделать это.