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

Оператор 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. Федя, я статтю цю, не писав … і навіть толком не читав. Але сказане в ній про те, що break в гілках вибору практично майже завжди обов'язково, на початкових етапах вивчення дуже корисно.

    вони, Федя, хто за професією пише багато тисяч промислового програмного коду (як я), на відміну від degeneratov, які пишуть тільки коментарі у форумах (як ти) знають, що пропуск break в switch там де він потрібен – причина важких помилок, які знаходяться тільки багатогодинний налагодженням.

    1. 1. «Чукча не читач - чукча письменник!»
      2. “і навіть толком не читав”
      Мені нема чого додати до мого попереднього повідомлення.

    2. Тобто все, хто за професією не супер крутий прогерія з математичним мегаінтеллектом і досвідом розробки рулонів коду – дегенерат?
      тоді ви – однобоко розвинений ботан з претензією.

      як noviček, я особисто розумію, що я не в Окфорд або Кембриджі, що б мене вчили “ідеально” і дуже вдячний Федору за його працю!

  2. Чому мій код не повторюється при введенні неправильного значення?

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

      1. Код відображається некорекктно в деяких місцях. А так помилок за версією мого компілятора помилок немає. Але while НЕ дейвствует з якихось причин. Я і просив допомогти мені зрозуміти по яким. А чи не писати порожні коментарі.

    2. #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.

  3. Ще одну помилку у Вас знайшов. У вихованні. Виправте і повертайтеся.

    1. Який ви уважний… Так слухайте ж)
      Ви все життя помилки шукаєте. Вас просять допомогти, а ви шукаєте помилки? Якщо вже ви так зарозумілі, то уточніть помилки, які ви у мене в коді знайшли. Хоча весь код – ошибка, сайт відобразив його не так, як він у мене в IDE написаний.

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

  4. Нет, не придумав. За коментарями видно. код компілюється. Просто програма ігнор команду while, от і все. Виходячи з Ваших слів, Ви не можете допомогти мені з моєю проблемою, а значить, пишете коментарі не по темі. Не можете – не треба!

    1. той код, що Ви зуміли привести, НЕ скомпілюється, а іншого коду ми не бачимо, Ви ж не показуєте. але Ви, все ж, хочете, щоб ми телепатично дізналися, який саме код зберігається на Вашому комп'ютері і допомогли вирішити проблему.
      Я припускаю, що while не працює, тому що значення умови (вар == правда) != вірно, але змінна var не визначена і не присвоюється ніде і навіщо вона потрібна, відомо тільки Вам. Але це лише припущення, т.к. в умови може міститися всі, що завгодно, Ви ж не знаєте, що існують pastebin-сервіси, НЕ korežaŝie.

      1. Зніс куди подалі весь код з 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;
        }
        }

  5. Доброго дня!
    Спасибі величезне за статтю, але все таки вважаю своїм обов'язком зазначити один нюанс, звичайно не хочу узагальнювати, але все таки: часто російськомовні люди наводячи приклад програми, приводять його з не російським змістом – у мене виникає нормальне питання: що заважає, наприклад привести станції метро Москви, або ж залізничні станції Іркутської області, і, звичайно ж, російською мовою?
    “Привіт Світ!”.
    Моє питання не вимагає обов'язкового відповіді, і може розглядатися, всього лише, як думка, яка має право на існування.
    Громадянин світу…

    1. Тому що це класика. Перша програма на мові С була “Привіт Світ!”.
      Ще одна причина – перші програми запускаються в консолі, а там зазвичай немає російської мови без додаткових налаштувань.
      Ну, і без англійської мови немає програміста.

      1. Да, звично бачити першою програмою саме ту про яку пишете ви. Проблеми з російськими кодуваннями вирішені практично у всіх, хто сам є носієм мови і, соответственно, користується ПК, будь то linux, або Windows. Що ви думаєте з цього приводу зрозуміло. спасибі за відповідь.

    2. Крім того, що вже відповіли: уявлення російськомовних (або кітайскоязичних) рядків в C / C ++ залежить від операційної системи (Windows, Linux і т.д.), від використовуваного кодування (CP-866, CP-1251, UTF-8,, UTF-16 і т.д.). Тому робота з російськомовними рядками в C / C ++ набагато складніше, ніж з латинським шрифтом, і вимагає достатнього професіоналізму.

      P.S. Тому на початковому етапі освоєння не грав і не ризикуйте з російськомовними рядками.

      1. Возможно, звичайно, це так і є. Але тим не менш, жодного разу не стикався з цими проблемами, у всякому разі – масштаб проблем, все ж, на мою думку, перебільшений. Ваша мотивація мені зрозуміла. спасибі за відповідь!

      2. Чи не “возможно”, а саме так воно і є: для коректної роботи з локалізували текстами (російським, китайським, арабським) вы зобов'язані б використовувати замість типу char тип “широких” символів UNICODE wchar_t, і замість string – wstring, соответственно… Та інші (подібні) функції роботи з рядками, наприклад wcslen() замість STRLEN() (все теж саме, але WCS *() вмесчо вул *()). А це вже зовсім інша техніка.
        І тільки в тих випадках, коли ваші операції не стосуються розбору внутрішнього змісту рядка, ви можете використовувати функції strcp(), strcat() і т.д., хоча при цьому ви роблячи некоректні дії отримуєте коректний результат! Але при цьому добре б мати на увазі і розуміти що при цьому відбувається (воть StrLen() для російськомовних рядків вам завжди буде давати неправильний результат).

  6. в онлайн компіляторі при досягненні числа, що не відповідає умові – відбувається помилка – починається нескінченний цикл писанини “введіть станцію від …. до… “, “станції під номером … нет” і так далі і далі…
    Напевно щось в коді не зовсім вірно!

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

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