Преобразование IF-операторов в Switch-оператор

У меня есть серия IF-операторов, и я хотел бы преобразовать в оператор Switch, но мне не удается вставить оценку в поле константы1 переключателя.

Я знаю, что Switch работает так:

switch ( expression ) {   //in my case:      switch (score) {
  case constant1:
    statement
      break;
  case constant2:
    statement
  default:
    statement
      break;

Теперь я попытался поставить <= 60 в поле константы1, но, конечно, это не сработало.

Это серия операторов IF, которые я хочу преобразовать в Switch.

if (score <= 60) {
    printf("F");
}
if (score <= 70 && score > 60) {
    printf("D");
}
if (score <= 80 && score > 70) {
    printf("C");
}
if (score <= 90 && score > 80) {
    printf("B");
}
if (score <= 100 && score > 90) {
    printf("A");
}

Спасибо всем!


person scugn1zz0    schedule 17.03.2017    source источник
comment
Ну, на самом деле вы не можете этого сделать (разумным образом), но вы можете упростить свою цепочку if, используя else if (и удалив условия &&)   -  person UnholySheep    schedule 17.03.2017
comment
Связанный stackoverflow.com/questions/20972297/   -  person msc    schedule 17.03.2017


Ответы (6)


Оператор switch принимает константы, а не условия. Например, вы не можете сказать >= const, поэтому вам нужно изменить стратегию.

Например, в вашем случае вы можете включить первую цифру вашего двузначного счета, вычтя из нее 1:

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

Случаи 0..4 используют сквозной механизм C для операторов switch, все печатают "D".

Приведенный выше код предполагает, что вы проверили диапазон оценки от 1 до 100 включительно.

person Sergey Kalinichenko    schedule 17.03.2017
comment
Хотя это не слишком чисто, это довольно умно и изобретательно, и мне это нравится. Однако я не думаю, что такой код следует писать вне образовательных программ. Это просто вызовет путаницу. - person neoaggelos; 17.03.2017
comment
@neoaggelos Абсолютно! Ясно, что цель этого вопроса состоит в том, чтобы изучить другую технику как часть учебного процесса: все вопросы, которые я видел о преобразовании числовых оценок в американские буквенные оценки, неизбежно исходили от студентов, изучающих язык. Вне образовательной среды написание умного кода часто является плохой идеей: цепочку «если-то-иначе» гораздо легче читать. - person Sergey Kalinichenko; 17.03.2017

Правильный синтаксис — case *constant*, поэтому вы никогда не сможете написать case < 60.

Что вы можете сделать, так это поместить несколько команд case друг под другом, например:

case 40:
case 41:
case 42:
case 43:
    // do stuff
break;

Это будет «делать что-то», если оператор switch равен 40, 41, 42 или 43. Однако могу ли я предположить, что, если у вас нет веских причин для преобразования ваших операторов if в операторы switch, вы не должны в этом особый случай.

person neoaggelos    schedule 17.03.2017

switch проверяет только равенство. Поэтому в вашем случае лучше подходит конструкция if-else.

Тем не менее, если вы хотите использовать оператор switch, вы должны сделать это следующим образом:

switch (score) 
{
  case 0:
  case 1:
  case 2:
  ... // all cases up to 58
  case 59:
  case 60:
    printf("F");
    break;
  case 61:
  ...
}

Не очень красиво и очень утомительно.

person muXXmit2X    schedule 17.03.2017

Как упоминалось в комментарии, вы не можете сделать это так, поскольку в операторе switch вы можете иметь только выражение 1.

Используйте оператор if-else следующим образом:

if (score <= 60) {
    printf("F");
} else if (score <= 70) {
    printf("D");
} else if (score <= 80) {
    printf("C");
}
//More statements

С включенными расширениями GCC для коммутатора вы можете использовать это так:

switch (score) {
    case 0...60:
        break;
    case 61...70:
        break;
    //..More cases with range
}
person tilz0R    schedule 17.03.2017

Вы можете использовать if или switch, а можете просто:

 printf("%c", 70 - ((score - 60) > 0 ? (score - 41) / 10 : 0));

Текущий пример на ideone.com

P.S. Конечно, подобное можно использовать в операторе switch, чтобы иметь ровно пять case.

person lapk    schedule 17.03.2017

Небольшое отступление. Вы можете попробовать следовать псевдо. Это коротко и просто.

char cGrade = 9-(score/10)+65;
if( cGrade > 68 )
{
    cGrade = 70; // for 'F'
}
else if( cGrade < 65 )
{
    cGrade = 65; // for 'A'
}
person TuneFanta    schedule 17.03.2017