Основи програмування на С ++ для початківців

Оператор switch в C

оператор switch, switch c++, switch в с++, оператор множественного выбора, свич с++, основы программированияУ цій статті ми трохи змінимо формат вивчення теми. В начале рассмотрим пример с оператором switch(свич), в котором будет много комментариев о том, что происходит в коде. А вся теория будет располагаться ниже.

Роботу оператора множинного виборуswitch в C ++ ми розглянемо в рішенні такого завдання: Допустим, у користувача є нумерований список станцій метро Барселони. Необходимо написать код, в котором будет реализован диалог с пользователем, а именно предложено ввести номер станции метро. После ввода номера станции, надо показать на экран её название и время в пути. Если же станции с таким номером нет, повідомити про це і запропонувати ввести номер знову. Приступим:

До строки 13 – всё понятно: объявление необходимых переменных, вывод вопроса на экран, и вход в цикл do while. В рядку 14 ми отримали значенняanswer, которое ввёл пользователь. Далее смотрите, как интересно работает switch() : в круглых скобках передаём ему answer (рядок 16) і біля кожного словаcase  записуємо можливі значенняanswer, які може ввести користувач (1, 2, 3 …).

після кожного case ви бачите оператор : , он обязателен. За ним следуют команды, которые должны быть выполнены, если значениеcase співпаде зі значенням answer. операторbreak  в кінці кожного блоку case  так само є обов'язковим. Он показывает компилятору, что если этот case був виконаний, то надо выйти из switch().  Тобто фактично, когда выполняется switch () починається перебір і пошук необхідного case.

Еслиanswer  равно 1, сработает case 1 і на екран буде показано те, що в ньому прописано до ключового словаbreak, а все остальные case, будут проигнорированы. Если answer равно 2 – виконається тількиcase 2 і відбудеться вихід з switch(). А что если ни одно значение блоков case не збіжиться, с тем значением, что принял switch() (в нашем случае answer)? Для цього передбачений блокdefault. До него доходит дело, как раз тогда, когда ни один case не відпрацьовані і, соответственно, не відпрацьовані жоденbreak  цих блоків.

У нашому прикладі, он сработает если значение, которое введет пользователь, будет <1 или >5. Тогда пользователь увидит на экране сообщение о том, что станции метро с таким номером нет и необходимо повторить ввод.

В цикле, ми постійно перевіряємо значенняanswer, которое введено пользователем. Делаем это с помощью if . Якщо значення знаходиться в рамках відповідного нам діапазону (от 1 до 5 ), то управляющей переменной var буде присвоєно значення 0. В этом случае, пользователю больше не будет предложено ввести новое значение.

Вот как работает эта программа:

оператор switch, switch c++, switch в с++, оператор множественного выбора, свич с++

 Что следует запомнить:

  • синтаксис:

оператор switch, switch c++, switch в с++, оператор множественного выбора, свич с++

    • блокdefault  можна розташувати в будь-якому місці блокуswitch()  Наприклад між першим і другим case . Его код в любом случае выполнится только тогда, якщо не знайдеться потрібного значення в блоках case. Але, советую вам располагать его именно в конце, как делают большинство программистов. Это такое негласное правило.
    • в нижнем блоке switch(), будь тоdefault или case, оператор break  можна не вказувати. Так сделано в нашем примере. Но следует помнить, что во всех остальных break обов'язковий!
    • default  не є обов'язковим. Его в switch()  може і не бути зовсім. В таком случае, если ни одно значение блоков case  не збіжиться з тим, что принял switch() , программа просто перейдет на следующую строку кода, расположенную под switch()
  • иногда блоки case  перевіряють символьні, а не числовые значения. Тогда эти символы необходимо брать в одинарные кавычки –  справа "б": ,  випадок 'G': ,  випадок '+’ і т.д.

У кого есть желание – посмотрите видео-урок по теме.

Остались вопросы – задавайте их в комментариях. Обязательно всем отвечу.   Вивчайте основи програмування разом з нами! Більше прикладів з використаннямswitch  в C ++ розглянуто в статті Завдання:  Оператор switch в C .

49 думки про "Оператор switch в C

  1. Чи не працює моя програма, хоча все роблю по Вашій статті. Напевно в свіч можна змінні оголошувати. Чому і закріплено це стандартному?

    1. Володимир, але в нашій програмі не оголошуються змінні в тілі switch. Вони оголошені на початку головної функції і введення значення з клавіатури знаходиться до switch
      А так змінну створити можна, АЛЕ ПИТАННЯ, навіщо вона потрібна, якщо її область видимості закінчиться при виході з тіла switch. І ще один важливий момент – створити її вийде тільки під самим нижнім блоком case або default (так як порушувати синтаксис не можна) і тільки в тому випадку, якщо він (цей нижній блок) нічого очікувати утримувати break.

      1. все одно не бачу сенсу оголошувати в світче змінні, пробував, перед дефолтом працює, але сенсу не бачу… не можу зрозуміти технічне застосування, а тому цю ідею вважаю марною! змінна все ж повинна оголошуватися до оператора свитч!

  2. Спробуйте ввести число, що виходить за межі integer.
    Як від цього позбутися?

      1. Да, навіть якщо скопіпастіть код і ввести # станції '111111111’ або будь-яке інше значення, перевищує int - програма буде нескінченно виводити Станції під номером … нет!
        Сделайте правильный выбор (от 1 до 5)

  3. А ще після логін у Вас через ВК аватарке всіх користувачів відображаються, як моя. Сподіваюся це тільки я так бачу)

  4. Позбутися наприклад так:

    do{
    cin >> answer; // ввод значения
    cin.clear();

    ... Тут остальной код

    } while (var); //цикл повторится, пока var не изменит значение на false
    system("pause");

    Фішка в тому, що потрібно очищати вхідний буффер, якщо вже такі переповнення допускаються.

    1. з цифрами це працює, а як бути з буквами або символами? щоб виключити випадкове натискання. а то теж виводить нескінченно станції під номером … немає і т.д.

      1. заміни
        cin >> answer; // ввод значения
        з
        do
        {
        cout < < "Введите номер станции метро, для расчета времени в пути (от 1 до 5): "; cin.clear(); cin.sync(); cin >> answer;
        } while (cin.fail());

    1. Оператор break в альтернативі (гілці) switch використовується практично завжди. У мовах C / C ++ оператор switch “прохідний”: після відпрацювання необхідної альтернативи, без виходу break, почне відпрацьовуватися наступна, потім наступна і т.д.

      У деяких мовах (йти, например) оператор switch “не прохідний”, і там вихід з альтернативи (гілки switch) відбувається без break.

      А на питання “з яких це пір?” відповідь однозначна: “завжди“.

      1. відповідь однозначна – ніколи break ні обов'язковим ні в С, ні в С ++.
        щодо “практично завжди”… скажімо, потрібно мені обробити y / n з клавіатури. Я напишу:
        case “і”:
        case “Y”:
        case “D”:
        case “д”:
        так();
        break;
        І те ж саме для No. Таке використання є стандартним і досить частим.

    1. Оператора goto слід всіляко уникати, за винятком дуже і дуже рідкісних випадків … на початкових етапах, в найближчі роки, ці випадки вам не буде досить ніколи. Використання goto вважається поганим стилем.

      Альтернатива default є стандартною альтернативою оператора switch, її використання вважається хорошою практикою.

  5. > Федір Одинцов

    Без break всі гілки switch будуть виконуватися одна за одною, аж до останнього default. Це явно не той, для чого записується switch. Тому практично завжди кожна гілка switch повинна закінчуватися break.
    У тих рідкісних випадках, коли передбачається виконати кілька послідовних гілок, break може не використовуватися.

    1. У статті для новачків написано:
      ” Оператор break в кінці кожного блоку case так само є обов'язковим.” і “Но следует помнить, що у всіх інших break обов'язковий!”. Ні про яке “практично завжди” мова не йде. У новачка створюється враження, що break потрібен завжди, а не тільки в даному випадку. Де в статті написано то, що ти пишеш в своєму коментарі?

залишити коментар

Ваша електронна адреса не буде опублікований. Обов'язкові поля позначені * *