В этой статье мы немного изменим формат изучения темы. В начале рассмотрим пример с оператором 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 проверяют символьные, а не числовые значения. Тогда эти символы необходимо брать в одинарные кавычки – case ‘b’: , case ‘G’: , case ‘+’ и т.д.
У кого есть желание – посмотрите видео-урок по теме.
Остались вопросы – задавайте их в комментариях. Обязательно всем отвечу. Изучайте основы программирования вместе с нами! Больше примеров с использованием switch в C++ рассмотрено в статье Задачи: Оператор switch в C++.
#include
#include
using namespace std;
int main()
{
setlocale(LC_ALL, “RU”);
int answer;
cout << "\a \a\a";
cout << " \t Как дела пользователь?" <> answer;
switch (answer)
{
case (“нормально”):
case (“хорошо”) :
case (“Хорошо”) :
case (“Нормально”) :
case (“отлично”) :
case(“Отилично”) :
break;
cout << "Ок тогда начинаем" << endl;
case ("не очень"):
case ( "плохо:пойдет") :
case ("не спрашивай") :
case ( "Не очень" ):
case ("Плохо пойдет" ):
case ( "Не спрашивай") :
cout << "Ок тогда в другой раз заходи" << endl;
break;
default:
cout << "Пожалуйста граматно пиши" << endl;
}
system("pause");
return 0;
}
кто нибудь помогите мне
ты в int хочеш строку запихать?
Этот урок идёт в ветке “Циклы и операторы ветвления” под №3. В этой программе используется операторы do и while которые рассматриваются только в №6. Короче, лучше думаю их поменять местами или что-то такое, я дальше ещё не просматривал, но мне не понятно как в этой программе работают эти операторы.
Помогите пожалуйста, я beginner.
float AddVat(float price, int category)
float total_price=0;
Задача состоит в том чтобы функция вычислила и вернула общую стоимость включая налог (не разрешено использовать scanf, только switch)
Налоги:
1 категория 20%
2- 20%
3-20%
4-15%
5-8%
6-0%
Не понятно каким образом case: вирирует значение переменной int answer = 0 подменяя её
if else логики больше
Зачем здесь do while???
Оно же и без этого работает, а cin можно разместить и за циклом и всё будет так же работать