C Переключение Уставов - PullRequest
1 голос
/ 07 июня 2011

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

Ответы [ 3 ]

3 голосов
/ 07 июня 2011

Под gcc вы можете сделать это :

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

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

3 голосов
/ 07 июня 2011

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

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

2 голосов
/ 07 июня 2011

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

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

Ниже приведен простой пример, который использует поиск по таблице для сопоставления оценок с оценками. Вы также можете создать закрытую математическую формулу, которая сопоставляет оценки с оценками, и просто вычислять оценку непосредственно из оценки, а не просматривать ее через таблицу. например 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...