Klajdi Murati Ответов: 7

Как выполнить сравнение неравенств в C с помощью оператора switch case?


У меня есть это задание, чтобы построить программу на языке Си с помощью оператора switch, который считывает значение, и если значение больше 50, он отображает "вы прошли". Если он больше 0 и меньше 50, то отображается "вы не прошли". А если он меньше 0, то отображается "недопустимо".
В каждой статье, которую я читал на эту тему, ответы были использовать If / Else. Я знаю, как построить его с помощью if/else, проблема в том, что я должен использовать оператор switch case.


Что я уже пробовал:

#include <stdio.h>

int main() {
    int x=0;
    printf("Enter your score:\n");
    scanf("%i",&x);
    switch(x)
    {
        case (x>=50):
            printf("You passed");
            break;
        case 0:
        case (x>0 && x<50):
            printf("You didn't pass");
            break;
        case (x<0):
            printf("Not valid");
            break;
    }
    getch();
    return 0;
}

CPallini

Как уже говорилось, проблема очень сложная. Вы уверены, что сообщили точные требования? Какие библиотеки и функции вы можете использовать?

Richard MacCutchan

Операторы Case могут принимать только постоянные значения, поэтому сначала вам нужно перевести числа во что-то вроде -1, 0, +1. Но так как для этого требуется if высказывания, это скорее поражает объект упражнения. Мне было бы интересно посмотреть на решение вашего профессора.

Richard MacCutchan

Решение 6 Альберта Ольгина - это ответ.

7 Ответов

Рейтинг:
51

Midi_Mick

Аналогично решению Джона, но с использованием вашего требования switch заявление. Он разбивает баллы на 3 возможных значения и Выполняет переключение на основе этих значений.

int x=0;
printf("Enter your score:\n");
scanf("%i",&x);
switch (x >= 0 ? (x >= 50 ? 1 : 0) : -1) {
    case 0:
        printf("You didn't pass");
        break;
    case 1:
        printf("You passed");
        break;
    default:
        printf("Not Valid");
        break;
}


Klajdi Murati

Большое спасибо. Это было фактическое решение, которое я искал. :D

#realJSOP

Мое решение очень похоже на взлом Kobiashi-Maru-оно имело то преимущество, что никогда не было опробовано раньше. :)

Albert Holguin

Хотя это соответствует требованиям ОП, это, конечно, некрасиво.... Никогда не используйте это в реальном производственном коде.

Рейтинг:
39

Albert Holguin

Назовите меня предвзятым, но мне больше нравится мое решение... :)

#include <stdio.h>
 
int main() {
    unsigned x=0;
    printf("Enter your score:\n");
    scanf("%u",&x);

    /*let's use math instead*/
    int val = x/50;
    switch(val)
    {
        case 0:
            printf("You didn't pass.");
            break;
        case 1:
        case 2:
            printf("You passed.");
            break;
        default:
            printf("Not valid");
            break;
    }
    getch();
    return 0;
}


Richard MacCutchan

Я считаю, что это на самом деле правильный ответ. Предполагая (что наиболее вероятно), что оценка находится в диапазоне [1..100].

Albert Holguin

Ну, это также объясняет и негативы (вы получите "недействительный" для негативов, так как результат val будет огромным). Однако он также допускает значения до 149, что, по-моему, было бы правильно, учитывая, что "дополнительный кредит" обычно может повысить оценку чуть выше 100.

Midi_Mick

Я действительно думал об этом, но тогда это означает, что все, что больше 100, является действительным до 149 и недействительным, если больше этого, что мне не понравилось, поэтому я выбросил его. Это также неверно в том смысле, что баллы между -1 и -49 также возвращают 0, а не -1, поэтому выглядят как неудача, а не недействительность.

Albert Holguin

От -1 до -49 не возвращают 0, если вы используете unsigned int, и да, 100-149 также действительны, но я подумал, что это приемлемо, учитывая требования OP.

Рейтинг:
22

#realJSOP

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

int x = 0;
string status = "";
status = (status == "" && x >= 50)          ? "You passed" : status;
status = (status == "" && x >= 0 && x < 50) ? "You failed" : status;
status = (status == "" && x < 0)            ? "Not valid"  : status;


Приведенный выше код был написан на C#, но он должен довольно легко переводиться на C. Приведенный выше код был протестирован с "x", установленным в -1, 0, 30 и 51


Рейтинг:
2

Patrice T

То switch заявление не делается для этого использования.
Естественное использование switch оператор должен соответствовать определенным значениям.
Пример: у вас есть меню с буквой для каждого варианта.

switch (MenuOption) {
    case 'a': // first option
        // do something
        break;
    case 'b': // second option
        // do something
        break;
    default:
        // option unknown
]

Для вашего задания, if заявление более подходит:
if (x>=50) {
    printf("You passed");
}
else if (x>0) {
    printf("You didn't pass");
}
else {
    printf("Not valid");
}


Вот ссылки на справочники книг по С и с++ авторов этих языков. Обратите внимание, что C является предком C++, поэтому знание C всегда полезно с C++.
Язык программирования Си - Википедия, свободная энциклопедия[^]
https://hassanolity.files.wordpress.com/2013/11/the_c_programming_language_2.pdf[^]
http://www.ime.usp.br/~ПФ/Керниган-Ритчи/с-Программирование-электронные книги.формат PDF[^]

Язык Программирования C++ [^]


Рейтинг:
2

CPallini

(Обратите внимание: я согласен с другими в использовании правильной конструкции, а именно if цепь).

#include <stdio.h>

int main() 
{
  int x=0;
  printf("Enter your score:\n");
  scanf("%i",&x);

  switch ( ((unsigned int)x) >> (sizeof(int) * 8 -1))
  {
  case 0:
    switch(x/50)
    {
    case 0:
      printf("you din't passed.\n");
      break;
    default:
      printf("well done.\n");
      break;
    }
    break;
  default:
    printf("invalid score.\n");
    break;
  }
  getchar();
  return 0;
}


Рейтинг:
18

Richard MacCutchan

Это лучшее, что я мог придумать:

switch (score > 50) // switch statement is not a recommended to use expressions
{
case TRUE:
    printf("You passed\n");
    break;
case FALSE:
    if (score > 0)
        printf("You failed\n");
    else
        printf("Bad score\n");
    break;
}


Рейтинг:
0

Peter Leow

Всегда используйте правильные инструменты для работы. Правильный инструмент здесь-если-еще. Период.