Как я могу использовать переключатель () оператор для преобразования от числового до буквенной оценки?

Так как по крайней мере два из других ответов вставляются от этот сайт , Вы могли бы также хотеть считать остальную часть описания там... :-)

7
задан 9 revs, 5 users 79% 8 October 2009 в 02:16
поделиться

12 ответов

Хорошо, я предполагаю, что вы введете числовую оценку от 0 до 100, а буквенные оценки, которые вы хотите, идут как "90-100: A; 80-89: B; .. .; 60-69: D; 0-59: F ".

Если это не так, ваш первый урок программирования, который вы должны усвоить: самая важная часть кодирования - это четкое написание спецификаций и требований.

Сказав это, существуют умные и глупые подходы.

  • Тупой подход:

    • Используйте переключатель на «входе», как вы это делаете сейчас.

    • Поскольку предполагается, что все значения 90, 91 ... 100 должны обрабатываться одинаково, поместите их все как отдельные случаи переключения , но выполнять работу только в последнем (известном как провал; см. SwitchDemo2 на этой странице, чтобы узнать, как это работает )

    • Для последнего значения (скажем, 90, если вы начинаете со 100 и опускаетесь), оператор switch будет letterGrade = "A"; сломать;

    • как только вы достигнете случая 89, вы повторяете ту же логику, что и для случая от 100 до 90

    • Lather, Rinse, Repeat, до 60

    • Обрабатывайте F как случай по умолчанию.

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

  • Более элегантное решение ( вставить соответствующее Цитата из "Звездных войн" здесь )

    • Что вы видите общего между каждым #, соответствующим букве "A"?

    Верно, это тот факт, что, кроме 100, все они начинаются с 2-х частей. с 9.

    Итак, чтобы обработать их все в одном операторе case, не было бы замечательно включить какое-то значение, которое дает вам "9" со случаями 10, 9, 8, 7, 6 и сопоставлением по умолчанию с F.

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

6
ответ дан 6 December 2019 в 23:10
поделиться

Я прокомментировал это как можно более подробно. Надеюсь, вы сможете следовать за мной. Поскольку это не вопрос домашнего задания, у меня нет проблем с опубликованием решения. Иногда вам просто нужно увидеть код, чтобы «понять», и вот он. Если у вас есть вопросы по поводу того, что я написал, оставьте комментарий, и я уточню ответ.

public static String getGrade(int numberGrade) {
    // There are two parts of the number grade that you really 
    // care about. The first is the quotient after division 
    // by 10. The second is the remainder after division by 
    // 10. The quotient will tell you where it is an A, B, C
    // D, or F. The remainder will tell you whether it should 
    // have a +, -, or nothing following the letter.
    // 
    // Let's take the grade 73 as an example. The quotient would 
    // be 7, with a remainder of 3. Because it has a quotient of 
    // 7, you know it's a C. Because of the 3, you know it should 
    // have a minus sign (-) after it.
    //
    // Once you know the pattern, you can pretty easily apply 
    // a switch statement to it and produce a letter grade.

    // Variables for the quotient and remainder, described above
    int quotient = numberGrade / 10;
    int remainder = numberGrade % 10;

    // This will hold the final letter grade
    String letterGrade;

    switch (quotient) {
        case 10:
            // The student got a 100%, so just return A+
            return "A+";
        case 9:
            // 90-99 is an A
            letterGrade = "A"; break;
        case 8:
            // 80-89 is a B
            letterGrade = "B"; break;
        case 7:
            // 70-79 is a C
            letterGrade = "C"; break;
        case 6:
            // 60-69 is a D
            letterGrade = "D"; break;
        default:
            // Anything 59 or below is an F
            return "F";
    }

    switch (remainder) {
        // For example, 70-73 are C-
        case 0: case 1: case 2: case 3:
            letterGrade += "-"; break;
        // Likewise, 77-79 are C+
        case 7: case 8: case 9:
            letterGrade += "+"; break;
        // Everything else just falls through, no + or - needed
    }

    // You are left with a letter grade consisting of 
    // an A, B, C, D or F, and a plus or minus where 
    // it is appropriate.
    return letterGrade;
}

А вот действительно простая демонстрация этого метода:

for (int i = 100; i >= 0; i--) {
    System.out.println(i + " = " + getGrade(i));
}

Он напечатает следующее:

100 = A+
 99 = A+
 98 = A+
 97 = A+
 96 = A
 95 = A
 94 = A
 93 = A-
 92 = A-
 91 = A-
 90 = A-
 89 = B+
 88 = B+
 87 = B+
 86 = B
3
ответ дан 6 December 2019 в 23:10
поделиться

Оператор switch не принимает условных значений, т. Е. Не ищет ответа истина или ложь , например inputGrade> = 70; , вместо этого он ищет, равен ли элемент n в переключателе ( n ) x из case x : .

Кроме того, варианты переключения оканчиваются двоеточием (: ), а не полу.

См. эту ссылку для общего объяснения оператора переключения с конкретным примером Java.

1
ответ дан 6 December 2019 в 23:10
поделиться

Вот еще одна подсказка, как это сделать.

Что произойдет, если вы разделите оценку на 10 целым числом?

1
ответ дан 6 December 2019 в 23:10
поделиться

Операторы Switch работают только со значениями, соответствующими заданным случаям (вместе со значением по умолчанию). Единственный способ записать это с помощью оператора switch - иметь случай для каждой возможной оценки.

Это можно сделать так:

switch (score)
{
    case 0:
    case 1:
    ...
    case 80:
    case 81:         
    ...
    case 89:
      return "B";
    case 90:
    ...
    case 100:
      return "A";
      break;
}

ИЛИ

Вы можете сократить его до списка из 11 возможных случаев, разделив сначала на 10.

В результате вы получите:

switch (score / 10)
{
    case 0:
    case 1:
    case 2:
    case 3:
    case 4:
       return "F";
    case 5:
       return "E";
    case 6:
       return "D";
    case 7:
       return "C";
    case 8:
       return "B";
    case 9:
    case 10:
       return "A";
}

Или что-то подобное (конечно, это предполагает, что у вас есть оценки, соответствующие 50+ = E, 90+ = A и так далее).

1
ответ дан 6 December 2019 в 23:10
поделиться

Вот отправная точка: символ «A» как целое число имеет значение 65. Как вы думаете, что произойдет, если преобразовать значение 66 в символ?

0
ответ дан 6 December 2019 в 23:10
поделиться

внесите это исправление

  double grade; // i think you mispelled it inputGrade

и

   case 1: grade = 90; // inputGrade >= 90 is an expression and is not valid
       break;
0
ответ дан 6 December 2019 в 23:10
поделиться

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

0
ответ дан 6 December 2019 в 23:10
поделиться

Во-первых, если ваша функция должна принимать оценку как целое число и возвращать буквенную оценку, почему она имеет возвращаемый тип double ?

After Имея дело с этим, вот подсказка:

Оценка может варьироваться от 0 до 100, так что это 101 случай, который нужно обработать в вашем операторе switch. Так что при желании вы можете выписать все 101 случай. Но можете ли вы придумать способ уменьшить количество случаев? (большой совет: все границы оценок кратны 10)

0
ответ дан 6 December 2019 в 23:10
поделиться

Я не вижу нигде в вашем коде, где бы вы вернули письмо.

Вы можете написать его по-английски, немного, и посмотреть, что вам не хватает.

Например: Пользователь вводит числовую оценку Цифровая оценка конвертируется в буквенную. Распечатайте числовую и буквенную оценку.

Затем запишите основную сложную часть, часть 2. Возможные оценки ... Возможные диапазоны ввода ... Вернуть оценку письма

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

Представьте, что вы объясняете секунду -grader, как это сделать, должны быть очень простые инструкции.

0
ответ дан 6 December 2019 в 23:10
поделиться

Мне было скучно, и я придумал это. Я знаю, что он также не использует операторов switch, но anywho:

    private string GetGrade(int grade)
    {
        return ((char)((int)(Math.Max((Math.Min(10 - (grade / 10) + 64, 69)), 65))))
               .ToString().Replace("E", "F");
    }

Я просто хотел посмотреть, смогу ли я сделать это, используя коды символов. Возможно, есть и более короткий путь, ну да ладно :) Ой, извините, это C #.

0
ответ дан 6 December 2019 в 23:10
поделиться

Как насчет этого:

static int[]     SCORES =
    { 90, 80, 70, 60, 0 };  

static String[]  GRADES =
    { "A", "B", "C", "D", "F" };  

String letterGrade(int pct)
{
    for (int i = 0;  i < SCORES.length;  i++)
        if (pct >= SCORES[i])
            return GRADES[i];
}

Предполагается, что pct положительный. Он использует единственный оператор if , поэтому я не уверен, можно ли это квалифицировать как допустимое решение или нет.

-1
ответ дан 6 December 2019 в 23:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: