Урок 10. Case в C++

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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 имеет следующую сигнатуру:

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

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

1
2
3
4
5
6
7
8
9
10
11
12
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 уроков за год!

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

    • http://cybern.ru/ lordrp

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

  • r04

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

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

    • http://cybern.ru/ lordrp

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

      • http://pro-prof.com/ r04

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

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

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

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

        • http://cybern.ru/ lordrp

          Чет я не оценил оператор 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;
    }

    • http://cybern.ru/ lordrp

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

      • 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 ==========

        • http://cybern.ru/ lordrp

          Я чет в полудреме тогда читал код. Твои ошибки:
          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++