Урок 10. Case в C++

Уроки для начинающих   16 января 2013  Автор статьи:  
geekbrains.ru/

В данном уроке мы продолжим тему условий, и рассмотрим оператор case, который позволяет быстрее писать и исполнять код. Он применяется, когда вам нужно проверить некоторый диапазон значений, например:

int month;
if(month == 1) cout << "Январь"; if(month == 2) cout << "Февраль"; if(month == 3) cout << "Март"; if(month == 4) cout << "Апрель"; if(month == 5) cout << "Май"; if(month == 6) cout << "Июнь"; if(month == 7) cout << "Июль"; if(month == 8) cout << "Август"; if(month == 9) cout << "Сентябрь"; if(month == 10) cout << "Октябрь"; if(month == 11) cout << "Ноябрь"; if(month == 12) cout << "Декабрь";

Тогда проще воспользоваться оператором switch - case:

switch (month)
{
case 1:
cout<<"Январь" break; case 2: cout<<"Февраль" break; case 3: cout<<"Март" break; case 4: cout<<"Апрель" break; case 5: cout<<"Май" break; case 6: cout<<"Июнь" break; case 7: cout<<"Июль" break; case 8: cout<<"Август" break; case 9: cout<<"Сентябрь" break; case 10: cout<<"Октябрь" break; case 11: cout<<"Ноябрь" break; case 12: cout<<"Декабрь" break; default: cout<<"Месяца с таким номером не существует"; break; }

Как вы могли видеть из примера выше, оператор case умеет проверять объекты только на равенство (==). Кроме того, если значение не попало в контролируемый вами диапазон, то в этом случае тоже можно произвести какие - нибудь действия, например вывести сообщение об ошибке.
Таким образом оператор switch - case имеет следующую сигнатуру:

switch (переменная)
{
case значение1:
операторы1;
case значение2:
операторы2;
default:
операторы 3;
}

Где переменная, это имя переменной значения которой мы хотим проверить, значение - это значение, на которое мы хотим проверить, а операторы это последовательность операторов, которую необходимо выполнить в этом случае.
Оператор break используется для того, чтобы после того, как условие выполнилось, не выполнились остальные операторы, например:

int a = 1;
switch (a)
{
case 0:
cout << 0;//не выполнится case 1: cout << 1;//выполнится case 2: cout << 2;//выполнится, потому что до него уже выполнилось условие case 3: cout << 3;//выполнится, потому что до него уже выполнилось условие }

Выведет: 123
Если вас не устраивает такое поведения, то просто добавьте break; в конец каждого case.

  • Гук

    Все бы хорошо, но уроки идут с огромным интервалом.
    10 уроков за год!

    Если можно, давайте их чаще.
    Спасибо!

    • Да, я бы рад писать чаще, но к сожалению я пишу не только в этой рубрике.=)

  • r04

    иногда видел код, когда операторы помещались перед первым case (в этом случае они выполнялись всегда — как будто стоят перед switch), щас такой код не работает в gcc, и в стандарте, вроде бы про это слово есть (я не проверял).

    >> switch (переменная)
    там может быть и константа, кстати 🙂

    • Ну это конечно круто, что можно так писать было, но, если бы на работе я увидел такой код я бы руки оторвал сразу бы=)

      • r04

        про руки согласен )
        кстати в тему, смотрел исходники одной штуковины и регулярно видел там конструкции типа

        do {
        if (…) … break; // case …
        if (…) … break;
        … // default
        } while(false);

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

        ИМХО весьма жизнеспособная конструкция 🙂

        • Чет я не оценил оператор do while(false), а потом из него break…Это же вообще полная жесть… В таком случае либо else надо юзать, либо не обязательно все if-ы пропускать, кароче это не тот способ решения гипотетической задачи о очень многих проверках, который я бы хотел увидеть в своем коде. Ну и если уж кто — то огромный любитель break; и прочих нежелательных конструкций, то тогда вообще можно было через goto сделать.

  • KMC

    Что-то с операторами switch–case не получилось написать работающую программку, пробовал по-разному, скидываю последний вариант подскажите, что не так, заранее спасибо.

    #include
    #include
    using namespace std;
    int main()
    {
    freopen («input.txt»,»r»,stdin);
    freopen («output.txt»,»w»,stdout);
    switch (month)
    {
    cin >> month;
    case 1:
    cout<<"Январь"
    break;
    case 2:
    cout<<"Февраль"
    break;
    case 3:
    cout<<"Март"
    break;
    case 4:
    cout<<"Апрель"
    break;
    case 5:
    cout<<"Май"
    break;
    case 6:
    cout<<"Июнь"
    break;
    case 7:
    cout<<"Июль"
    break;
    case 8:
    cout<<"Август"
    break;
    case 9:
    cout<<"Сентябрь"
    break;
    case 10:
    cout<<"Октябрь"
    break;
    case 11:
    cout<<"Ноябрь"
    break;
    case 12:
    cout<<"Декабрь"
    break;
    default:
    cout<<"Месяца с таким номером не существует";
    break;
    }
    return 0;
    }

    • А какую ошибку выдает компилятор?

      • KMC

        Выдает сообщение о следующих ошибках:

        1>—— Build started: Project: Урок 10-1, Configuration: Debug Win32 ——
        1>Build started 15.09.2013 21:08:27.
        1>InitializeBuildStatus:
        1> Touching «DebugУрок 10-1.unsuccessfulbuild».
        1>ClCompile:
        1> Урок 10-1.cpp
        1>c:documents and settingsадминистратормои документыvisual studio 2010projectsурок 10-1урок 10-1урок 10-1.cpp(9): warning C4996: ‘freopen’: This function or variable may be unsafe. Consider using freopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
        1> c:program filesmicrosoft visual studio 10.0vcincludestdio.h(249) : see declaration of ‘freopen’
        1>c:documents and settingsадминистратормои документыvisual studio 2010projectsурок 10-1урок 10-1урок 10-1.cpp(10): warning C4996: ‘freopen’: This function or variable may be unsafe. Consider using freopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
        1> c:program filesmicrosoft visual studio 10.0vcincludestdio.h(249) : see declaration of ‘freopen’
        1>c:documents and settingsадминистратормои документыvisual studio 2010projectsурок 10-1урок 10-1урок 10-1.cpp(11): error C2065: ‘month’ : undeclared identifier
        1>c:documents and settingsадминистратормои документыvisual studio 2010projectsурок 10-1урок 10-1урок 10-1.cpp(11): error C2050: switch expression not integral
        1>c:documents and settingsадминистратормои документыvisual studio 2010projectsурок 10-1урок 10-1урок 10-1.cpp(13): error C2065: ‘month’ : undeclared identifier
        1>c:documents and settingsадминистратормои документыvisual studio 2010projectsурок 10-1урок 10-1урок 10-1.cpp(16): error C2143: syntax error : missing ‘;’ before ‘break’
        1>c:documents and settingsадминистратормои документыvisual studio 2010projectsурок 10-1урок 10-1урок 10-1.cpp(17): error C2143: syntax error : missing ‘;’ before ‘case’
        1>c:documents and settingsадминистратормои документыvisual studio 2010projectsурок 10-1урок 10-1урок 10-1.cpp(19): error C2143: syntax error : missing ‘;’ before ‘break’
        1>c:documents and settingsадминистратормои документыvisual studio 2010projectsурок 10-1урок 10-1урок 10-1.cpp(20): error C2143: syntax error : missing ‘;’ before ‘case’
        1>c:documents and settingsадминистратормои документыvisual studio 2010projectsурок 10-1урок 10-1урок 10-1.cpp(22): error C2143: syntax error : missing ‘;’ before ‘break’
        1>c:documents and settingsадминистратормои документыvisual studio 2010projectsурок 10-1урок 10-1урок 10-1.cpp(23): error C2143: syntax error : missing ‘;’ before ‘case’
        1>c:documents and settingsадминистратормои документыvisual studio 2010projectsурок 10-1урок 10-1урок 10-1.cpp(25): error C2143: syntax error : missing ‘;’ before ‘break’
        1>c:documents and settingsадминистратормои документыvisual studio 2010projectsурок 10-1урок 10-1урок 10-1.cpp(26): error C2143: syntax error : missing ‘;’ before ‘case’
        1>c:documents and settingsадминистратормои документыvisual studio 2010projectsурок 10-1урок 10-1урок 10-1.cpp(28): error C2143: syntax error : missing ‘;’ before ‘break’
        1>c:documents and settingsадминистратормои документыvisual studio 2010projectsурок 10-1урок 10-1урок 10-1.cpp(29): error C2143: syntax error : missing ‘;’ before ‘case’
        1>c:documents and settingsадминистратормои документыvisual studio 2010projectsурок 10-1урок 10-1урок 10-1.cpp(31): error C2143: syntax error : missing ‘;’ before ‘break’
        1>c:documents and settingsадминистратормои документыvisual studio 2010projectsурок 10-1урок 10-1урок 10-1.cpp(34): error C2143: syntax error : missing ‘;’ before ‘break’
        1>c:documents and settingsадминистратормои документыvisual studio 2010projectsурок 10-1урок 10-1урок 10-1.cpp(35): error C2143: syntax error : missing ‘;’ before ‘case’
        1>c:documents and settingsадминистратормои документыvisual studio 2010projectsурок 10-1урок 10-1урок 10-1.cpp(37): error C2143: syntax error : missing ‘;’ before ‘break’
        1>c:documents and settingsадминистратормои документыvisual studio 2010projectsурок 10-1урок 10-1урок 10-1.cpp(38): error C2143: syntax error : missing ‘;’ before ‘case’
        1>c:documents and settingsадминистратормои документыvisual studio 2010projectsурок 10-1урок 10-1урок 10-1.cpp(40): error C2143: syntax error : missing ‘;’ before ‘break’
        1>c:documents and settingsадминистратормои документыvisual studio 2010projectsурок 10-1урок 10-1урок 10-1.cpp(41): error C2143: syntax error : missing ‘;’ before ‘case’
        1>c:documents and settingsадминистратормои документыvisual studio 2010projectsурок 10-1урок 10-1урок 10-1.cpp(43): error C2143: syntax error : missing ‘;’ before ‘break’
        1>c:documents and settingsадминистратормои документыvisual studio 2010projectsурок 10-1урок 10-1урок 10-1.cpp(44): error C2143: syntax error : missing ‘;’ before ‘case’
        1>c:documents and settingsадминистратормои документыvisual studio 2010projectsурок 10-1урок 10-1урок 10-1.cpp(46): error C2143: syntax error : missing ‘;’ before ‘break’
        1>c:documents and settingsадминистратормои документыvisual studio 2010projectsурок 10-1урок 10-1урок 10-1.cpp(47): error C2143: syntax error : missing ‘;’ before ‘case’
        1>c:documents and settingsадминистратормои документыvisual studio 2010projectsурок 10-1урок 10-1урок 10-1.cpp(49): error C2143: syntax error : missing ‘;’ before ‘break’
        1>c:documents and settingsадминистратормои документыvisual studio 2010projectsурок 10-1урок 10-1урок 10-1.cpp(50): error C2143: syntax error : missing ‘;’ before ‘default’
        1>
        1>Build FAILED.
        1>
        1>Time Elapsed 00:00:00.78
        ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

        • Я чет в полудреме тогда читал код. Твои ошибки:
          1)Не объявил переменную month до использования (я в уроке имел в виду, что она уже объявлена)
          2)Внутри switch нельзя вставлять команды отличные от case, т.е считывать месяц нужно до свича (cin >> month;)
          3)Ты мне сейчас показываешь вывод, а лучше показывать именно ошибки. Окошечко вывода содержит различную информацию о проекте, такую как время построения, путь до программы, предупреждения и прочее, окошечко же ошибок позволяет сосредоточиться только на них. Найти окошко с ошибками можно нажав кнопку вид в верхнем горизонтальном меню.

          • KMC

            Спасибо, ошибки исправил, программа работает. Вот рабочий
            код для таких программистов как я 🙂

            #include

            #include

            using namespace
            std;

            int main()

            {

            freopen («input.txt»,»r»,stdin);

            freopen («output.txt»,»w»,stdout);

            int month;

            cin >> month;

            switch (month)

            {

            case 1:

            cout<<"Январь";

            break;

            case 2:

            cout<<"Февраль";

            break;

            case 3:

            cout<<"Март";

            break;

            case 4:

            cout<<"Апрель";

            break;

            case 5:

            cout<<"Май";

            break;

            case 6:

            cout<<"Июнь";

            break;

            case 7:

            cout<<"Июль";

            break;

            case 8:

            cout<<"Август";

            break;

            case 9:

            cout<<"Сентябрь";

            break;

            case 10:

            cout<<"Октябрь";

            break;

            case 11:

            cout<<"Ноябрь";

            break;

            case 12:

            cout<<"Декабрь";

            break;

            default:

            cout<<"Месяца с таким номером не существует";

            break;

            }

            return 0;

            }

  • releyshic

    Во-первых. Внизу страницы Нет ссылки на следующий урок
    Во-вторых. В скобках должно быть не «переменная», а «выражение»
    В-третьих. Если будут ОператорЫ, тогда будут {},

  • Никита

    Сжатый урок, мало что понятно. Все в общих чертах: Вот к примеру урок с ресурса: http://easy-code.ru/lesson/switch-case-cpp

Научиться программировать

  • на Delphi

  • на Java

  • на C++

geekbrains.ru/
geekbrains.ru/