Как я могу использовать оператор switch () для преобразования числовых значений в буквенные? - PullRequest
7 голосов
/ 08 октября 2009

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

Он хочет, чтобы пользователь ввел оценку и присвоил ей буквенную оценку. Было бы легко с if заявлениями, но я не могу использовать ЛЮБОЙ! Я должен использовать метод переключения.

Вот мой функциональный класс:

public class Grade {

public double getGrade(int input)
 {
  double inputGrade;
  switch(input)
  {
   case 1: inputGrade >= 90;
       break;
   case 2: inputGrade >= 80;
       break;
   case 3: inputGrade >= 70;
       break;
   default:
       grade = 60;
  }
  return grade;

 }

}

Вот мой тестовый класс:

import java.util.*;
public class TestGrade
{
 public static void main(String[] args)
 {
  Scanner scan = new Scanner(System.in);
  int input = scan.nextInt();
  Grade lGrade = new Grade();
  double finalGrade = lGrade.getGradeSwitch(input);
  System.out.println("Your toll is $" + finalGrade);
 }

}

Я просто недостаточно программировал, чтобы иметь этот аналитический ум. Я пытался завершить его, я просто не нашел способ преобразовать пользовательский ввод (int) в буквенную оценку (строку) без операторов if.

Я знаю, что это неполно, но это настолько далеко, насколько я мог бы сделать, не делая ошибок.

EDIT: WOW! Спасибо, ребята, я не хочу выбирать один правильный ответ, потому что многие из вас помогли мне!

Это то, чем я закончил (это сработало: D)

public String getGrade(int input)
{
    String letterGrade;
    switch(input/10)
    {
        case 9: letterGrade = "A";
                  break;
        case 8: letterGrade = "B";
                  break;
        case 7: letterGrade = "C";
                  break;
        case 6: letterGrade = "D";
        default:
                  letterGrade = "F";
    }
    return letterGrade;

}

Ответы [ 12 ]

6 голосов
/ 08 октября 2009

ОК, я предполагаю, что вы введете числовую оценку 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

    • вспенить, промыть, повторить до 60

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

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

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

    • Что вы видите общего между каждым #, который соответствует «А»?

    Правильно, это тот факт, что, кроме 100, все они являются 2-значными #, начиная с 9.

    Итак, чтобы обработать их все в одном выражении, не было бы замечательно включить какое-либо значение, которое дает вам «9» для всех # между 90 и 99?

    Надеюсь, вы сразу знаете ответ ... подсказка ниже ...

    Да, просто поделите целое на 10!

    Итак, вам нужно, чтобы ваш числовой класс переключился на 10, со случаями 10, 9, 8, 7, 6 и отображением по умолчанию на F.

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

3 голосов
/ 08 октября 2009

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

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
1 голос
/ 08 октября 2009

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

Вы бы сделали это так:

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

OR

Вы можете сократить его до списка из 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 голос
/ 08 октября 2009

Вот еще один намек на то, как это сделать.

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

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

Оператор switch не принимает условные значения, т. Е. Он не ищет ответ true или false, как inputGrade >= 70;, вместо этого он ищет элемент n в switch(n) равно x из casex:.

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

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

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

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

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

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

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

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

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, поэтому я не уверен, квалифицируется ли это как правильное решение или нет.

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

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

После этого, вот подсказка:

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

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

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

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

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

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

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

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

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

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

...