У цій статті ми трохи змінимо формат вивчення теми. В начале рассмотрим пример с оператором 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 .
Федя, я статтю цю, не писав … і навіть толком не читав. Але сказане в ній про те, що break в гілках вибору практично майже завжди обов'язково, на початкових етапах вивчення дуже корисно.
вони, Федя, хто за професією пише багато тисяч промислового програмного коду (як я), на відміну від degeneratov, які пишуть тільки коментарі у форумах (як ти) знають, що пропуск break в switch там де він потрібен – причина важких помилок, які знаходяться тільки багатогодинний налагодженням.
1. «Чукча не читач - чукча письменник!»
2. “і навіть толком не читав”
Мені нема чого додати до мого попереднього повідомлення.
Тобто все, хто за професією не супер крутий прогерія з математичним мегаінтеллектом і досвідом розробки рулонів коду – дегенерат?
тоді ви – однобоко розвинений ботан з претензією.
як noviček, я особисто розумію, що я не в Окфорд або Кембриджі, що б мене вчили “ідеально” і дуже вдячний Федору за його працю!
Чому мій код не повторюється при введенні неправильного значення?
А як повинен повторюватися код? Я в цьому лістингу швидким поглядом знайшов 6 помилок, через які він не скомпілюється. може, спочатку його хоча б запустити, а вже потім помилки шукати?
Код відображається некорекктно в деяких місцях. А так помилок за версією мого компілятора помилок немає. Але while НЕ дейвствует з якихось причин. Я і просив допомогти мені зрозуміти по яким. А чи не писати порожні коментарі.
#include
using namespace std;
int main()
{
setlocale(LC_ALL, “rus”);
INT firstNumber = 0;
INT = друге число 0;
INT композицію = firstNumber * друге число;
BOOL а = вірно;
do {
cout << "Введите первый множитель: " <> firstNumber;
cout << "Введите второй множитель: " <> друге число;
cout << "Введите решение: " <> склад;
if (Композиція == firstNumber * друге число)
{
cout << "Верно!" << endl;
а = помилково;
}
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 не визначена і не присвоюється ніде і навіщо вона потрібна, відомо тільки Вам. Але це лише припущення, т.к. в умови може міститися всі, що завгодно, Ви ж не знаєте, що існують pastebin-сервіси, НЕ korežaŝie.
Зніс куди подалі весь код з while. Нет, тут провина не var, адже на моєму комп'ютері (ви смішно це помітили), немає var… Навіть якщо замість var поставити певну trueOrFalse, як і є у мене в IDE, то код не працює.
Спробую вписати код без тегів
#include
using namespace std;
int main()
{
setlocale(LC_ALL, “rus”);
INT firstNumber = 0;
INT = друге число 0;
INT = композиція 0;
cout <> firstNumber;
cout <> друге число;
cout <> склад;
if (Композиція == firstNumber * друге число)
{
cout << "Правильный ответ. Ви за літо не всі забули!";
}
else
cout << "Неправильный ответ. Тепер ви знаєте, чим зайнятися… Попробуйте еще раз! До речі, правильну відповідь – " << firstNumber * друге число << endl;
}
}
Тим не менш рівні nekorekktno.
Pastebin
Доброго дня!
Спасибі величезне за статтю, але все таки вважаю своїм обов'язком зазначити один нюанс, звичайно не хочу узагальнювати, але все таки: часто російськомовні люди наводячи приклад програми, приводять його з не російським змістом – у мене виникає нормальне питання: що заважає, наприклад привести станції метро Москви, або ж залізничні станції Іркутської області, і, звичайно ж, російською мовою?
“Привіт Світ!”.
Моє питання не вимагає обов'язкового відповіді, і може розглядатися, всього лише, як думка, яка має право на існування.
Громадянин світу…
Тому що це класика. Перша програма на мові С була “Привіт Світ!”.
Ще одна причина – перші програми запускаються в консолі, а там зазвичай немає російської мови без додаткових налаштувань.
Ну, і без англійської мови немає програміста.
Да, звично бачити першою програмою саме ту про яку пишете ви. Проблеми з російськими кодуваннями вирішені практично у всіх, хто сам є носієм мови і, соответственно, користується ПК, будь то 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 *() вмесчо вул *()). А це вже зовсім інша техніка.
І тільки в тих випадках, коли ваші операції не стосуються розбору внутрішнього змісту рядка, ви можете використовувати функції strcp(), strcat() і т.д., хоча при цьому ви роблячи некоректні дії отримуєте коректний результат! Але при цьому добре б мати на увазі і розуміти що при цьому відбувається (воть StrLen() для російськомовних рядків вам завжди буде давати неправильний результат).
в онлайн компіляторі при досягненні числа, що не відповідає умові – відбувається помилка – починається нескінченний цикл писанини “введіть станцію від …. до… “, “станції під номером … нет” і так далі і далі…
Напевно щось в коді не зовсім вірно!
Люди добрі а навіщо в першому прикладі, навіщо потрібен цикл??