Состояния C Switch

#c

#c

Вопрос:

Небольшой вопрос, я пишу программу для написания оценок, используя только инструкции switch. С помощью операторов if я могу легко использовать <, или > для обозначения определенного диапазона. Если пользователь вводит число, такое как 93, мне пришлось бы перечислить все случаи из 99-90, что слишком избыточно. Я уже написал программу, и она отлично работает, но я хочу уйти от плохого кода. Есть ли более разумный способ написать это без перечисления нескольких случаев? Надеюсь, это имеет смысл…

Комментарии:

1. Что не так с if утверждениями?

2. разделите оценку на десять, например: 73/10 = 7 (целочисленная арифметика)

3. Используете ли вы значение по умолчанию: case в конструкции switch …case? Пожалуйста, приведите мне пример того, что именно делает ваш код…

4. ответ Джима может сработать, но switch это действительно неправильный подход к вашей проблеме.

5. У меня было задание, которое я выполнял некоторое время назад, которое включало использование операторов if, но мне было интересно посмотреть, есть ли способ использовать switch вместо этого. Проблема заключалась в том, что, поступая таким образом, вы ограничиваете себя написанием каждой отдельной возможности, что нелепо. Просто хотел провести хорошее обсуждение этой проблемы. Спасибо за информацию, ребята!

Ответ №1:

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

Если вам нужно охватить диапазоны — используйте if .

Комментарии:

1. Это именно то, что я обнаружил. Просто не имело смысла перечислять все возможные случаи от 0-100. Я просто хотел бы, чтобы вы могли использовать операторы <, > в операторах switch, чтобы охватить полный диапазон.

Ответ №2:

В gcc разделе вы можете сделать это:

 switch (value)
{
   case 1...3:
      //Do Something
      break;
   case 4...6:
      //Do Something
      break;
   default:
      //Do the Default
      break;
}
  

но код (очевидно) не переносим для других компиляторов C.

Ответ №3:

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

Если вы хотите немного обобщить и избежать нескольких операторов if / else с жестко закодированными условиями, вы могли бы создать map . т. Е. вы, по сути, сопоставляете набор целых чисел с набором оценок.

Ниже приведен простой пример, в котором используется поиск по таблице для сопоставления баллов с оценками. Вы также могли бы создать замкнутую математическую формулу, которая сопоставляет оценки с оценками, и просто вычислять оценку непосредственно из оценки, вместо того, чтобы искать ее через таблицу. например, f (x) = floor (2 * (x-50) / 20) сопоставил бы оценки из [0,100] в целочисленные оценки в диапазоне [0,5]

 typedef struct
{
    int rangeLow;
    char grade;
} RangeToGradeMap;

RangeToGradeMap[] scoreToGradeMapping =
{
    { 90, 'A' }
    { 85, 'B' },
    { 70, 'C' },
    { 60, 'D' },
    { 0,  'F' },
};

char GradeLookup(int score)
{
    size_t N = sizeof(scoreToGradeMapping)/sizeof(RangeToGradeMap);

    for (size_t i = 0; i < N;   i)
    {
        if (score >= scoreToGradeMapping[i].rangeLow)
        {
            return scoreToGradeMapping[i].grade;
        }
    }

    // If we got here, there was an error - we didn't find the range

    return '?';
}

int main(int argc, char** argv)
{
    char grade = GradeLookup(87);

    return 0;
}
  

Комментарии:

1. Ну, очевидно, что он / она действительно хочет! (И на самом деле, было бы неплохо иметь возможность переключать диапазоны.) Вы имеете в виду, «вы не можете»…

2. Возвращение к этому через два года действительно имеет значение. Отличная работа, теперь я могу придумать что-то очень похожее и реализовать свое собственное решение 🙂