У цій статті ми трохи змінимо формат вивчення теми. В начале рассмотрим пример с оператором switch(свич), в котором будет много комментариев о том, что происходит в коде. А вся теория будет располагаться ниже.
Роботу оператора множинного виборуswitch в C ++ ми розглянемо в рішенні такого завдання: Допустим, у користувача є нумерований список станцій метро Барселони. Необходимо написать код, в котором будет реализован диалог с пользователем, а именно предложено ввести номер станции метро. После ввода номера станции, надо показать на экран её название и время в пути. Если же станции с таким номером нет, повідомити про це і запропонувати ввести номер знову. Приступим:
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 43 44 45 46 47 48 49 50 51 | #include <iostream> using namespace std; int main() { setlocale(LC_ALL, "rus"); int answer = 0; // будет хранить выбор пользователя bool var = true; // управляющая переменная цикла do while cout << "Введите номер станции метро, для расчета времени в пути (от 1 до 5): "; do{ cin >> answer; // ввод значения switch (answer) // switch принимает переменную answer и ищет подходящий case { case 1: // если answer равно 1, на экран выйдут сообщения этого case cout << "Станция метро Trinitat Nova: "; cout << "Время в пути - 15 мин." << endl; break; // выход из switch. иначе будет переход case(2) и т.д. case 2: // если answer равно 2 cout << "Станция метро Casa de l’Aigua: "; cout << "Время в пути - 19 мин." << endl; break; case 3: cout << "Станция метро Torre Baro Vallbona: "; cout << "Время в пути - 25 мин." << endl; break; case 4: cout << "Станция метро Ciutat Meridiana: "; cout << "Время в пути - 30 мин." << endl; break; case 5: cout << "Станция метро Can Cuias: "; cout << "Время в пути - 38 мин." << endl; break; default: // если ни один case не сработал, сработает default cout << "Станции под номером " << answer << " нет! "; cout << "Сделайте правильный выбор (от 1 до 5): "; } // если введено правильное значение (от 1 до 5) // default не сработает и выполнится блок if // переменная var примет значение false // и цикл do while не повторится if (answer >= 1 && answer <= 5) var = false; } while (var); //цикл повторится, пока var не изменит значение на false return 0; } |
До строки 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. В этом случае, пользователю больше не будет предложено ввести новое значение.
Вот как работает эта программа:
Что следует запомнить:
- синтаксис:
- блокdefault можна розташувати в будь-якому місці блокуswitch() Наприклад між першим і другим case . Его код в любом случае выполнится только тогда, якщо не знайдеться потрібного значення в блоках case. Але, советую вам располагать его именно в конце, как делают большинство программистов. Это такое негласное правило.
- в нижнем блоке switch(), будь тоdefault или case, оператор break можна не вказувати. Так сделано в нашем примере. Но следует помнить, что во всех остальных break обов'язковий!
- default не є обов'язковим. Его в switch() може і не бути зовсім. В таком случае, если ни одно значение блоков case не збіжиться з тим, что принял switch() , программа просто перейдет на следующую строку кода, расположенную под switch()
- иногда блоки case перевіряють символьні, а не числовые значения. Тогда эти символы необходимо брать в одинарные кавычки – справа "б": , випадок 'G': , випадок '+’ і т.д.
У кого есть желание – посмотрите видео-урок по теме.
Остались вопросы – задавайте их в комментариях. Обязательно всем отвечу. Вивчайте основи програмування разом з нами! Більше прикладів з використаннямswitch в C ++ розглянуто в статті Завдання: Оператор switch в C .
Дякую! Корисна стаття, особливо для таких чайників, як я! Ще раз дякую!!!
Чи не працює моя програма, хоча все роблю по Вашій статті. Напевно в свіч можна змінні оголошувати. Чому і закріплено це стандартному?
Володимир, але в нашій програмі не оголошуються змінні в тілі switch. Вони оголошені на початку головної функції і введення значення з клавіатури знаходиться до switch
А так змінну створити можна, АЛЕ ПИТАННЯ, навіщо вона потрібна, якщо її область видимості закінчиться при виході з тіла switch. І ще один важливий момент – створити її вийде тільки під самим нижнім блоком case або default (так як порушувати синтаксис не можна) і тільки в тому випадку, якщо він (цей нижній блок) нічого очікувати утримувати break.
все одно не бачу сенсу оголошувати в світче змінні, пробував, перед дефолтом працює, але сенсу не бачу… не можу зрозуміти технічне застосування, а тому цю ідею вважаю марною! змінна все ж повинна оголошуватися до оператора свитч!
Спробуйте ввести число, що виходить за межі integer.
Як від цього позбутися?
Максим, можна конкретніше питання? Не зовсім зрозуміло. Наведіть Ваш код.
Да, навіть якщо скопіпастіть код і ввести # станції '111111111’ або будь-яке інше значення, перевищує int - програма буде нескінченно виводити Станції під номером … нет!
Сделайте правильный выбор (от 1 до 5)
А ще після логін у Вас через ВК аватарке всіх користувачів відображаються, як моя. Сподіваюся це тільки я так бачу)
Позбутися наприклад так:
do{
cin >> answer; // ввод значения
cin.clear();
... Тут остальной код
} while (var); //цикл повторится, пока var не изменит значение на false
system("pause");
Фішка в тому, що потрібно очищати вхідний буффер, якщо вже такі переповнення допускаються.
Щиро Дякую!
з цифрами це працює, а як бути з буквами або символами? щоб виключити випадкове натискання. а то теж виводить нескінченно станції під номером … немає і т.д.
заміни
cin >> answer; // ввод значения
з
do
{
cout < < "Введите номер станции метро, для расчета времени в пути (от 1 до 5): "; cin.clear(); cin.sync(); cin >> answer;
} while (cin.fail());
Відколи break в switch обов'язковий став?
Оператор break в альтернативі (гілці) switch використовується практично завжди. У мовах C / C ++ оператор switch “прохідний”: після відпрацювання необхідної альтернативи, без виходу break, почне відпрацьовуватися наступна, потім наступна і т.д.
У деяких мовах (йти, например) оператор switch “не прохідний”, і там вихід з альтернативи (гілки switch) відбувається без break.
А на питання “з яких це пір?” відповідь однозначна: “завжди“.
відповідь однозначна – ніколи break ні обов'язковим ні в С, ні в С ++.
щодо “практично завжди”… скажімо, потрібно мені обробити y / n з клавіатури. Я напишу:
case “і”:
case “Y”:
case “D”:
case “д”:
так();
break;
І те ж саме для No. Таке використання є стандартним і досить частим.
Шкода що так пізно але не легше зробити просто goto на місці default ?
Оператора goto слід всіляко уникати, за винятком дуже і дуже рідкісних випадків … на початкових етапах, в найближчі роки, ці випадки вам не буде досить ніколи. Використання goto вважається поганим стилем.
Альтернатива default є стандартною альтернативою оператора switch, її використання вважається хорошою практикою.
> Федір Одинцов
Без break всі гілки switch будуть виконуватися одна за одною, аж до останнього default. Це явно не той, для чого записується switch. Тому практично завжди кожна гілка switch повинна закінчуватися break.
У тих рідкісних випадках, коли передбачається виконати кілька послідовних гілок, break може не використовуватися.
У статті для новачків написано:
” Оператор break в кінці кожного блоку case так само є обов'язковим.” і “Но следует помнить, що у всіх інших break обов'язковий!”. Ні про яке “практично завжди” мова не йде. У новачка створюється враження, що break потрібен завжди, а не тільки в даному випадку. Де в статті написано то, що ти пишеш в своєму коментарі?