Бывают случаи, когда у нас есть необходимость сделать проверку на что-то и исходя из результата сделать определённое действие. Например, калькулятор.
Если нажали «+«, значит сложить, нажали «—«, значит вычесть и тому подобное.
Можно организовать такую логику через оператор выбора if()..else
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 |
#include <iostream> int main() { setlocale(LC_ALL, "Russian"); float a, b; //переменная для первого и второго числа float result_ab; //переменная, в которую записываем результат вычисления char znak[2]; //выделяем под переменную, в которой будет символ знака, две ячейки памяти, //так как символы используют память не совсем так как числа std::cout << "Введите первое число: "; std::cin >> a; //пользователь вводит первое число std::cout << "\nВведите второе число: "; std::cin >> b; //пользователь вводит второе число std::cout << "Какое действие между числами? (+ - / *)\t"; std::cin >> znak; //просим пользователя выбрать действие для двух чисел if (*znak == '+') { //если +, то складываем числа result_ab = a + b; } else { if (*znak == '-') { //если -, то вычитаем числа result_ab = a - b; } else { if (*znak == '*') { //если *, то умножаем числа result_ab = a*b; } else { if (*znak == '/') { //если /, то делим числа result_ab = a / b; } } } } std::cout << "\n\nРезультат вычисления: " << result_ab << std::endl; //выводим на экран результат вычисления system("pause"); return 0; } |
Думаю Вы заметили, что перед переменной znak стоит звёздочка, зачем она?
Это не умножение, это указатель. Сейчас не задавайтесь глубоко вопросом что же такое указатель, о нём Вы узнаете подробно чуть позже. В C++ работа с символьными переменными непростая задача. Например, двойные и одинарные кавычки — это разные вещи. Чтобы эффективно и корректно извлечь из памяти компьютера наши символы, в данном случае, нужен указатель. Сейчас это просто необходимая вещица, не более того.
Данная конструкция уже выглядит громоздко, хотя у нас всего четыре варианта для действий, а если будет десять вариантов? А если двадцать пять? Это будет кошмарная конструкция!
По этой причине был придуман оператор выбора Switch, где каждый вариант действий помещается в контейнер case. Данный оператор значительно упрощает жизнь программистов.
Рассмотрим всё тот же пример с калькулятором, но с использованием Switch.
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 |
#include <iostream> int main() { setlocale(LC_ALL, "Russian"); float a, b; //переменная для первого и второго числа float result_ab; //переменная, в которую записываем результат вычисления char znak[2]; //выделяем под переменную, в которой будет символ знака, две ячейки памяти, //так как символы используют память не совсем так как числа std::cout << "Введите первое число: "; std::cin >> a; //пользователь вводит первое число std::cout << "\nВведите второе число: "; std::cin >> b; //пользователь вводит второе число std::cout << "Какое действие между числами? (+ - / *)\t"; std::cin >> znak; //просим пользователя выбрать действие для двух чисел switch (*znak){ case '+': result_ab = a + b; std::cout << "\n\nРезультат вычисления: " << result_ab << std::endl; break; //если в znak лежит , то складываем числа case '-': result_ab = a - b; std::cout << "\n\nРезультат вычисления: " << result_ab << std::endl; break; //если в znak лежит -, то вычитаем числа case '*': result_ab = a * b; std::cout << "\n\nРезультат вычисления: " << result_ab << std::endl; break; //если в znak лежит *, то умножаем числа case '/': result_ab = a / b; std::cout << "\n\nРезультат вычисления: " << result_ab << std::endl; break; //если в znak лежит /, то делим числа default: std::cout << "\nОшибочка произошла со знаком...\n\n"; break; //альтернативное условие, если ни одно из выше представленных не выполнилось } system("pause"); return 0; } |
В круглых скобках после Switch указываем переменную, из которой мы должны строить наши условия.
В case указываем с чем проверяем нашу переменную, указанную в Switch.
break нужно указать в конце контейнера case за тем, чтобы у нас не пошла проверка дальше. Сейчас у нас такой принцип работы алгоритма: если символ равен ‘+‘, то складываем, если не равна смотрим равна ли переменная символу ‘—‘, если не равна смотрим равна ли переменная знаку ‘*‘, да, равна, значит умножаем числа и завершаем проверку.
Если break не делать, то проверка будет идти до самого конца наших case‘ов, а этого нам не надо, зачем просить компьютер сравнивать то, что мы заведомо знаем не верно?
Default() необходим для того, чтобы сделать какое-то действие, если ни одно условие в контейнерах case не выполнилось
Конструкция получается куда более понятной и красивой. Принцип работы алгоритма аналогичен примеру с if()..else.
В контейнер case можно писать всё что угодно и сравнивать с чем угодно.
Таким нехитрым образом мы познакомились с Оператор выбора Switch().