switch в C++ для начинающих

Пришло время познакомиться и изучить новый материал. Зачем нужен switch в C++, как его использовать? Для новичков это не самое приятное в изучении, но и далеко не самое сложное. switch представляет собой некоторое усовершенствование действия по условию if. Используется switch абсолютно для тех же целей, что и if. Различие между этими двумя операторами только в том, что первый работает со множеством значений.

  • switch — это быстрый if при множестве альтернатив в выборе
  • switch упрощет обработку выбора из большого списка

В какой-то момент времени у начинающего программиста в коде начинает появляться слишком много условий. Например, захотелось вам запрограммировать каждый символ клавиаутуры на определённое поведение, вы пишете код, отдалённо напоминающий листинг #1

Такой код гораздо выгоднее писать в другом виде:

Выгоднее по нескольким причинам. switch быстрее if…else, а ещё switch разбавляет код, насыщенный условиями, т. е. читаемость улучшается.
Если конструкция сравнений достаточно сложная, то при использовании одного только if…else очень легко запутаться, тут нам и приходит на помощь switch
Минимальная программа, в которой использован switch:

Переходим к разбору листинга #3.
Объявлена только одна переменная a, которая хранит целое число int.
В тексте кода указывается, что поведение работающей программы будет определяться значением a.

  • switch (a)

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

  • При сравнении на символ, нужно символ заключать в одинарные кавычки, иначе сравнение будет с числом
Сравнение на число
Сравнение на символ

case 1: Поведение1; break;
case 2: Поведение2; break;
case 3: Поведение3; break;
case '1': Поведение1; break;
case '2': Поведение2; break;
case '3': Поведение3; break;

В отличие от многих языков программирования, в C++ определяемые оператором switch поведения нужно заканчивать оператором break. Синтаксис языка не требует обязательности, но без break оператор множественного выбора switch подобен автомобилю без тормозов: выполняться будут все ниженаписанные поведения либо до окончания тела switch, либо до первого встреченного break.


Блок, определяющий все поведения для программы, заворачивается в фигурные скобки, хотя в случае единственного поведения, фигурные скобки можно не писать:

На самом деле эта суперминимальная программа никакого премущества перед if не имеет, но зато вы видите, что сиё дозволено в C++. Нестественно и неправильно использовать switch для определения одного поведения программы, потому что этот switch является оператором множественного выбора, он как множественный if, только при наличии множества работает быстрее, и глазу приятнее. А если вы смотрели тему об if или знаете о проблеме висячего else, то прекрасно должны понимать, что фигурные скобки лучше всегда писать, чем не писать.
  • switch анализирует входящую переменную на равенство с указываемыми значениями

После определения нами анализируемой переменной сама анализируемая переменная отдаётся в switch вовнутрь круглых скобок, а после этого всё, что имеет отношение к анализу switch, оборачивается фигурными скобками. Непосредственно сами поведения в фигурные скобки можно не оборачивать.

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

Начинаем подводить итоги.

  • Варианты работы программы могут зависеть от условий, условия можно описывать с помощью оператора ветвления if или его формы if…else и c помощью оператора switch
  • switch используется при сравнении одной какой-то переменной со множеством каких-то конкретных значений
  • Неразумно использовать switch для неравенств. Т. е. при проверках на вхождения в диапазоны следует использовать if или if…else.

  • В switch каждое конкретное значение, сравниваемое с переменной ушедшей в круглые скобки switch, указывается рядом с ключевым словом case
  • Внутри switch все разделяемые поведения программы разграничиваются оператором break
Пример одной из простейших программ, в которой используется switch

Варианты поведения программы зависят от вводимого с клавиатуры пользователем значения, сохраняемого в a
Если пользователь ввёл 1, то на экран выводится: "Bil wibran perviy wariant".
Если пользователь ввёл 2, то на экран выводится: "Bil wibran wtoroi wariant".
Если пользователь ввёл 3, то на экран выводится: "Bil wibran tretiy wariant".
На тот случай, если выбранное пользователем значение не вошло во множество сравниваемых значений, существует оператор default. Этот оператор обозначает все оставшиеся значения

Такой код достаточно удобно читать, и надеюсь вы, как и я, сумели разобраться с этим не самым простым в C++ для начинающих, но очень удобным способом. В последующих статьях я его буду применять, так что разобраться с принципом построения вам наверняка стоит.
Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

33 комментария: switch в C++ для начинающих

  • Anonymous говорит:

    Все понятно и отлично росжовано.Спасибо автору!

  • Sergio говорит:

    У Вас опечатка в последнем примере:

    должно быть:

    Да и собственно в остальных строчках то же самое… 😉

    Автор сайта отвечает:
    Спасибо. исправил.

  • Евгений говорит:

    А если у меня в case нужно задать промежутки чисел (например от 0 к 100), как тогда?
    Вот пример такой задачи (нужно решить за switch):
    Определить агрегатное состояние воды по температуре, что выражается целым числом.

    Автор сайта отвечает:
    немного геморрно. Смысл, надеюсь поймете. Я все не стану делать. Задание ваше простое, но муторное.
    http://otvet.mail.ru/question/83369047

    Спасибо. А по другом совсем не как? Потому, что если так, то проще сделать на if.

    Автор сайта отвечает:
    Честно говоря не знаю. Способов не нашел.
    Пример с водой можно несложно решить и через switch,
    но для работы с диапазоном значений однозначно лучше использовать if
    Ваша задача простая, немного муторная, но достаточно полезна для новичка. Ибо такая задача учит мыслить.

    Вот пример полного решения.

    Я заодно узнал, что вложенные switch использовать не получится 😀

    a = a/abs(a); //маленькая хитрость.
    Что это за хитрость?)

    Автор сайта отвечает:
    Получение знака (плюс или минус). Благодаря этому кусочку если введенное число не вошло в диапазон (0..99 по примеру), то далее а всегда будет или -1 или +1
    Вообще если эту маленькую хитрость использовать, то надо учитывать, что может случится деление на ноль, но в моем примере деления на ноль не будет.
    Вот еще пример (добавлен). Думаю эти нехитрые примеры могут оказаться кому-то полезны.
    Маленькие математические хитрости и switch работает с диапазоном чисел.

  • Максим говорит:

    для case фигурные скобки не обязательны, как и break;(по существу это обычные метки на которые джампится прпограмма при выполнении усоловия кейза) break даёт команду выхода из switch, без неё будут исполняться операторы последовательно.

    например совершенно корректный switch

    switch(a)
    {
    case 1: cout<<«если 1 то выполним код и для 5»;
    case 5: cout<<«выполним код для 5 и закончим switch»; break;
    case 2: cout<«тут код для 2»; break;
    }

    если а будет равна 1 то при выполнении команд вы переходим на метку для 1 в результате код будет выполняться последовательно пока не дойдёт до break т.е. выведется «если 1 то выполним код и для 5 выполним код для 5 и закончим switch»
    для пятёрки у нас будет переход на ссылку case 5 и далее будут операторы выполняться последовательно и выведется только «выполним код для 5 и закончим switch»
    для двойки думаю и так понятно.

  • Umid говорит:

    Можете мне объяснить плз.!
    Как составить программу: если на консоле ввести букву а то должна быть возвращена 1, если ввести b- то 2 ? Вообще как работать с текстом на консоле? Я по-всячески попробовал, но когда введется на консоле текст или буква никакой реакции нет.

  • андре говорит:

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

  • андре говорит:

    программа компютерная диагностики аудио видео радио аппаратуры  в моей задачи я так понял должно  быть считывание бкув и цыфер  алгоритм  массивы  все на ноль а как цвет зделать

    • Axl говорит:

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

  • Эдуард говорит:

    Здравствуйте!

    Ваш сайт очень помог мне в написании программы, где (в зависимости от введённого значения)

    запускаются разные (сторонние) программы. Но внезапно начались проблемы. Программы

    запускаются не в зависимости от того, какое ввёл значение (case 1 или case 3), а просто в

    порядке последовательности: за 1 идёт 2, потом 3 и т.д. (даже если я после case 1 нажал

    case 3, всё равно запустится программа case 2, а потом только (при нажатии любого значения:

    хоть 9, хоть 0) запустится case 3 и т.д. То есть: эти выборочные значения case не работают.

    В чём может быть ошибка? Вот код:

  • Vladimir говорит:

    Эдуард, у тебя должно быть вот так примерно:

  • Vladimir говорит:

    А чтоб выбор был неограниченным а не однократным как у тебя тут, сделай через цикл while

  • Vladimir говорит:

    В помощь автору, недавно перечитывал учебник для начинающих и в голову пришла великолепная идея как в минимум символов (а именно в 1 case уместить промежуток к примеру от 0 до 5000, используя минимум кода), наверно накапливается профессионализм, в общем вот код, понятен до безобразия, все гениальное просто как говорится:

    • admin говорит:

      К сожалению, эта версия плоха.
      Как упражнение для понимания работы с функциями, вполне нормальное начало, а плоха тем, что используется if.

      Для диапазонов всё-таки используют if, а для спортивного интереса решают какие-нибудь задачки, где if и ?: запрещены условием задачи. То, что if засунут вовнутрь функции, не отменяет его наличия.

      А Ваш код более короче выглядит так (я только основные части выделю):

      И вот так:

  • Vladimir говорит:

    Подожди админ, в этой теме идет «обсуждение» оператора выбора switch, я привел пример как в него засунуть диапазон любой размерности, хотя и ты и я нигде в инете такого не нашли. Способ простой и элегантный как облегчить жизнь многим кому нужно в этот switch вставлять диапазоны. Сам помню парился и пытался выкрутится. Вместо спасибо за отличный пример, скажу без скромности он таким и является, ты говориш что он плохой. Хорошо, приведи хороший пример использования диапазона неограниченной размерности в switch за один case.
    В продолжении темы, функцию можно расширить как угодно, вплоть даже до замены статичного 5000 на числа вводимые с клавиатуры.

  • Vladimir говорит:

    Вот пример модернизации функции и расширение возможности switch

    И так какой угодно диапазон можно вставить

    • admin говорит:

      Если Вы ждёте ответа, то я ничем не отвечу. Возможны Вы не увидели текста, где пишется: "switch используется в некоторых конструкциях вместо if."
      Вместо того, чтобы избежать if, Вы его активно используете. Я об этом.
      Примеры выше приведены (сразу перед просьбой), в них тоже есть if, хотя явно и не написан.

  • Vladimir говорит:

    Один большой плюс приведу, может так попасться что в программе неоднократно надо узнавать в какой диапазон входят получаемые данные и соответственно на них реагировать, диапазоны статичные а вот выбор действий на эти диапазоны может разнится(день, ночь, утро, вечер, град, дождь и т.д.). Вот тут то мой пример где «ифы» определяющие принадлежность к диапазону собраны в 1 функцию к которой могут обращаться разные «свитчи», и реагировать уже по заданным в них условиях. Согласитесь что так намного проще чем каждый раз выписывать тонну «ифов».

  • Vladimir говорит:

    Ну вот образно:
    1-функция «температура» определяет  принадлежность получаемых данных  к диапазону, как в примере выше «back_»

    2-функция «солнечно» отправляет данные в функцию «температура» дабы узнать в какой диапазон они входят и чтобы соответственно среагировать(через свитч, набор действий для этой функции уникальный).

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

    3-функция «туман» отправляет данные в функцию «температура» дабы узнать в какой диапазон они входят и чтобы соответственно среагировать(через свитч, набор действий для этой функции уникальный).

    4-и т.д.

    • admin говорит:

      Трудно понять, когда одно к другому логически не вяжется.
      Сами посудите: Зависит ли солнечность от температуры? — нет, дождь от температуры? — нет, туман от температуры? — нет. Наоборот же вполне нормально, температура может зависеть от дождя, тумана, солнечности.

  • Vladimir говорит:

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

  • Vladimir говорит:

    короче, логические связи есть везде и всегда, даже если думаеш что их нет, мы тут не про погоду собрались обсуждать, я тебе гипотетический пример привел

  • Vladimir говорит:

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

  • admin говорит:

    Я через несколько дней напишу небольшой код, сейчас немного занят, но этот код не будет иметь отношение к switch или if как к таковым, он будет иметь отношение к этому нашему разговору.

    • admin говорит:

      Вот Вам код программы "Прогноз погоды", посильный новичкам.
      Я не обладаю знаниями синоптиков и конкретные комбинации для погоды описать не могу, тем не менее, приведу некоторый код, а Вы будьте добры, покажите целесообразность Вашего подхода своим кодом.
      Целесообразность проявится, если Ваш код будет легко читаться и будет гибче показанного.

  • Марина говорит:

    Здравствуйте! Помогите пожалуйста с заданием задали написать программы в программе switch(задание)

    case 1 (д.з №1) и т.д

  • Денис говорит:

    Створіть похідний клас «Записна книга», в якому пов’яжіть дату з деякою визначною подією (день народження друга, проведення консультації по С++ тощо). Створіть масив об’єктів похідного класу для занесення списку подій. Організуйте пошук дати деякої події за її назвою, вивід переліку подій, відсортованих по даті, вивід подій у вказаному місяці. Як це зробити

Добавить комментарий

Ваш e-mail не будет опубликован.

Поиск

 
     

Случайная книга в электронном формате

Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

Демотиватор

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок