В этой статье мы немного изменим формат изучения темы. В начале рассмотрим пример с оператором 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++.
Федя, я статью эту не писал … и даже толком не читал. Но сказанное в ней о том, что break в ветвях выбора практически почти всегда обязательно, на начальных этапах изучения очень полезно.
Те, Федя, кто по профессии пишет многие тысячи промышленного программного кода (как я), в отличие от дегенератов, которые пишут только комментарии в форумах (как ты) знают, что пропуск break в switch там где он нужен – причина тяжелейших ошибок, которые находятся только многочасовой отладкой.
1. «чукча не читатель — чукча писатель!»
2. “и даже толком не читал”
Мне нечего добавить к моему предыдущему сообщению.
То есть все, кто по профессии не супер крутой прогер с математическим мегаинтеллектом и опытом разработки рулонов кода – дегенерат?
Тогда вы – однобоко развитый ботан с претензией.
Как новичек, я лично понимаю, что я не в окфорде или кембридже, что бы меня учили “идеально” и очень благодарен Федору за его труд!
Почему мой код не повторяется при вводе неправильного значения?
А как должен повторяться код? Я в этом листинге беглым взглядом нашел 6 ошибок, из-за которых он не скомпилируется. Может, сначала его хотя бы запустить, а уже потом ошибки искать?
Код отображается некорекктно в некоторых местах. А так ошибок по версии моего компилятора ошибок нет. Но while не дейвствует по каким-то причинам. Я и просил помочь мне понять по каким. А не писать пустые комментарии.
#include
using namespace std;
int main()
{
setlocale(LC_ALL, “rus”);
int firstNumber = 0;
int secondNumber = 0;
int composition = firstNumber * secondNumber;
bool a = true;
do {
cout << "Введите первый множитель: " <> firstNumber;
cout << "Введите второй множитель: " <> secondNumber;
cout << "Введите решение: " <> composition;
if (composition == firstNumber * secondNumber)
{
cout << "Верно!" << endl;
a = false;
}
else
{
cout << "Неправильный ответ. Попробуйте еще раз." << endl;
}
} while (a); //цикл будет выполнятся пока а == true
system("pause");
return 0;
По порядку:
1. Переменные firstNumber, secondNumber и composition ты обозначил, но где ввод этих переменных пользователем?
2. Второе: Цикл называется do while. У тебя только while присутствует.
Чтобы было понятнее do переводится как "делать что-то", а while как "в то время как".
Выше правильный код с применением цикла do while.
Еще одну ошибку у Вас нашел. В воспитании. Исправьте и возвращайтесь.
Какой вы внимательный… Так внимайте же)
Вы всю жизнь ошибки ищете. Вас просят помочь, а вы ищете ошибки? Если уж вы так высокомерны, то уточните ошибки, которые вы у меня в коде нашли. Хотя весь код – ошибка, сайт отобразил его не так, как он у меня в IDE написан.
Откуда у Вас информация, что я всю жизнь ищу ошибки? Сами придумали?
Нас просят помочь найти ошибку (ведь если что-то не работает или работает не так, в коде ошибка?), но ошибки мы искать не должны? И да, если код не скомпилируется, то логические ошибки в нем искать глупо.
Исходя из Ваших слов, я полагаю, что для доказательства того факта, что я не высокомерен, мне нужно просто не уточнять найденные мной ошибки. Хорошо, я не стану.
Нет, не придумал. По комментариям видно. Код компилируется. Просто программа игнорит команду while, вот и все. Исходя из Ваших слов, Вы не можете помочь мне с моей проблемой, а значит, пишете комментарии не по теме. Не можете – не надо!
Тот код, что Вы сумели привести, не скомпилируется, а другого кода мы не видим, Вы же не показываете. Но Вы, все же, хотите, чтобы мы телепатически узнали, какой именно код хранится на Вашем компьютере и помогли решить проблему.
Я предполагаю, что while не работает, потому что значение условия (var == true) != true, но переменная var не определена и не присваивается нигде и зачем она нужна, ведомо только Вам. Но это лишь предположение, т.к. в условии может содержаться все, что угодно, Вы ведь не знаете, что существуют pastebin-сервисы, не корежащие код.
Снес куда подальше весь код с while. Нет, здесь вина не var, ведь на моем компьютере (вы смешно это заметили), нет var… Даже если вместо var поставить определенную trueOrFalse, как и есть у меня в IDE, то код не работает.
Попробую вписать код без тегов
#include
using namespace std;
int main()
{
setlocale(LC_ALL, “rus”);
int firstNumber = 0;
int secondNumber = 0;
int composition = 0;
cout <> firstNumber;
cout <> secondNumber;
cout <> composition;
if (composition == firstNumber * secondNumber)
{
cout << "Правильный ответ. Вы за лето не все забыли!";
}
else
cout << "Неправильный ответ. Теперь вы знаете, чем заняться… Попробуйте еще раз! Кстати, правильный ответ – " << firstNumber * secondNumber << endl;
}
}
Все равно некорекктно.
pastebin
Добрый день!
Спасибо огромное за статью, но все таки считаю своим долгом отметить один нюанс, конечно не хочу обобщать, но все таки: зачастую русскоговорящие люди приводя пример программы, приводят его с не русским содержанием – у меня возникает нормальный вопрос: что мешает, например привести станции метро Москвы, или же железнодорожные станции Иркутской области, и, конечно же, на русском языке?
“Hello world!”.
Мой вопрос не требует обязательного ответа, и может рассматриваться, всего лишь, как мысль, которая имеет право на существование.
Гражданин мира…
Потому что это классика. Первая программа на языке С была “Hello world!”.
Еще одна причина – первые программы запускаются в консоли, а там обычно нет русского языка без дополнительных настроек.
Ну, и без английского языка нет программиста.
Да, привычно видеть первой программой именно ту о которой пишете вы. Проблемы с русскими кодировками решены практически у всех, кто сам является носителем языка и, соответственно, пользуется ПК, будь то linux, либо Windows. Ваше мнение по этому поводу понятно. Спасибо за ответ.
Кроме того, что уже ответили: представление русскоязычных (или китайскоязычных) строк в C/C++ зависит от операционной системы (Windows, Linux и т.д.), от используемой кодировки (CP-866, CP-1251, UTF-8, UTF-16 и т.д.). Поэтому работа с русскоязычными строками в C/C++ намного сложнее, чем с латинским шрифтом, и требует достаточного профессионализма.
P.S. Поэтому на начальном этапе освоения не играйтесь и не рискуйте с русскоязычными строками.
Возможно, конечно, это так и есть. Но тем не менее, ни разу не сталкивался с этими проблемами, во всяком случае – масштаб проблем, всё же, по моему мнению, преувеличен. Ваша мотивация мне понятна. Спасибо за ответ!
Не “возможно”, а именно так оно и есть: для корректной работы с локализированными текстами (русским, китайским, арабским) вы обязаны бы использовать вместо типа char тип “широких” символов UNICODE wchar_t, и вместо string – wstring, соответственно… И другие (сходные) функции работы со строками, например wcslen() вместо strlen() (всё то же самое, но wcs*() вмесчо str*()). А это уже совсем другая техника.
И только в тех случаях, когда ваши операции не касаются разбора внутреннего содержания строки, вы можете использовать функции strcp(), strcat() и т.д., хотя при этом вы делая некорректные действия получаете корректный результат! Но при этом хорошо бы иметь в виду и понимать что при этом происходит (вот strlen() для русскоязычных строк вам всегда будет давать неправильный результат).
в онлайн компиляторе при набирании числа не отвечающим условию – происходит ошибка – начинается бесконечный цикл писанины “введите станцию от …. до… “, “станции под номером … нет” и так далее и далее…
Наверное что-то в коде не совсем верно!
Люди добрые а зачем в первом примере, зачем нужен цикл??