оператор switch не работает - PullRequest
1 голос
/ 29 октября 2009

почему этот оператор java switch постоянно говорит мне, что мои утверждения не являются утверждениями

public void setConstant(float inNumGrade)
{
    this.yourNumberGrade = inNumGrade;

    switch (this.yourLetterGrade)
    {
        case 'A':
            this.yourNumberGrade >= 0.90;
            break;

        case 'B':
            this.yourNumberGrade >= .8;
            break;

        case 'C':
            this.yourNumberGrade >= .7;
            break;

         case 'D':
            this.yourNumberGrade >= .6;// not a statement

         default:

    } // end switch
}

Ответы [ 8 ]

13 голосов
/ 29 октября 2009

Я понимаю, что вы пытаетесь сделать, но я думаю, что вы идете вокруг этого неправильно. То, что вы пытаетесь сделать, это установить «буквенную оценку» на основе переключателя, а не числовой оценки! Я думаю, что вы действительно пытаетесь сделать это:

public void setGrades(float inNumGrade)
{
    this.yourNumberGrade = inNumGrade;

    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
        this.yourLetterGrade= 'F';    
}

Вы не можете включить диапазоны в Java. Если вы хотите сделать это с переключателем, вам нужно будет сделать switch(true), а затем сделать case this.yourNumberGrade>=0.90:

Как я и ожидал, вы неправильно понимаете, как работает переключатель. Если вам ДЕЙСТВИТЕЛЬНО нужно сделать это через переключатель (если / else / else, если лучше), вам придется сделать это следующим образом:

public void setGrades(float inNumGrade)
{
    this.yourNumberGrade = inNumGrade;
    switch(true)
    {
        case this.yourNumberGrade >= 0.90:
            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.60:
            this.yourLetterGrade= 'D';
            break;
        default:
            this.yourLetterGrade= 'F';    
            break;
    }//end switch
}
2 голосов
/ 29 октября 2009

Потому что this.yourNumberGrade >= .6; не является действительным утверждением, как говорит вам компилятор. Это будет правильное утверждение:

b = this.yourNumberGrade >= .6;

- или -

this.yourNumberGrade = .6;

Это зависит от того, чего вы пытаетесь достичь.

1 голос
/ 29 октября 2009

Эрик хорошо объяснил, как сделать то, что вы пытаетесь сделать, но позвольте мне уточнить, в чем вы ошиблись.

Структура 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), но это сделает его еще труднее и не поможет, если оценки не просто постепенные. Однако для традиционных систем это быстрый и простой способ сделать это.

1 голос
/ 29 октября 2009

Что именно вы пытаетесь сделать? >= - это сравнение, а НЕ назначение, поэтому вы получаете ошибку ... просто удалите > во всех местах.

0 голосов
/ 02 ноября 2009

Вы должны добавить перерыв; внутри каждого корпуса блока.

switch(this.grade){
     case 'A':
         System.out.println("You got an A");
         break;
    default:
         System.out.println("INVALID GRADE");
         break;}
0 голосов
/ 29 октября 2009

Проблема в том, что вы делаете сравнение, а не присваиваете значение. Возможно, вы могли бы сделать что-то вроде этого:

public void setConstant(float inNumGrade)
{
    this.yourNumberGrade = inNumGrade;

    switch (this.yourLetterGrade)
   {
        case 'A':
            this.yourNumberGrade = 0.90;
            break;

        case 'B':
            this.yourNumberGrade = .8;
            break;

        case 'C':
            this.yourNumberGrade = .7;
            break;

        case 'D':
            this.yourNumberGrade = .6;
        default:

    } // end switch
}

Это фактически присвоит значение «yourNumberGrade». Однако это будет только нижний предел оценки. Возможно, лучше сделать его там, где вы замените «yourNumberGrade» на «yourLetterGrade» и попросите его определить буквенную оценку. на основе оценки номера ...

0 голосов
/ 29 октября 2009

замените "> =" на "=", если это то, чего вы хотите достичь.

0 голосов
/ 29 октября 2009

Вы проводите только сравнение, которое не является действительным утверждением в этом контексте.

Вы, вероятно, хотите выполнить задание

...