Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗cpPmLpFl 132 of 390 menu
◀ ▶

Работа с флагами в C++

Сейчас мы научимся работать с флагами. Флаг - это специальная переменная, которая может принимать только два значения: true и false. С помощью флагов можно решать задачи, проверяющие отсутствие чего-либо: к примеру, можно проверить, что в строке нет определенной буквы.

Давайте решим следующую задачу: дана строка "abcde", нужно проверить, есть ли в ней буква 'c'. Если есть - выведем "Y", если нет - выведем "N".

Для начала давайте попробуем вывести "Y". Для этого переберем все символы строки и ифом будем спрашивать, равен ли текущий символ букве 'c'. Если равен - выведем "Y":

std::string str = "abcde"; for (int i = 0; i < str.size(); ++i) { char ch = str[i]; if (ch == 'c') { std::cout << "Y" << "\n"; // выведет Y } }

Но наше решение не очень хорошо: ведь если в строке будет не одна буква 'c', а несколько, то "Y" выведется несколько раз. Давайте запишем эту букву дважды и убедимся в этом:

std::string str = "abccde"; for (int i = 0; i < str.size(); ++i) { char ch = str[i]; if (ch == 'c') { std::cout << "Y" << "\n"; // выведет несколько раз } }

Поправим проблему: завершим цикл с помощью break, если буква уже найдена:

std::string str = "abccde"; for (int i = 0; i < str.size(); ++i) { char ch = str[i]; if (ch == 'c') { std::cout << "Y" << "\n"; // выведет Y break; // завершим цикл } }

Давайте теперь попробуем сделать так, чтобы, если в строке вообще нет буквы 'c', выводилось "N". Распространенным заблуждением будет добавить else к нашему ифу - в этом случае "N" будет выводиться на все символы, не являющиеся буквой 'c':

std::string str = "abcde"; for (int i = 0; i < str.size(); ++i) { char ch = str[i]; if (ch == 'c') { std::cout << "Y" << "\n"; // выведет на букве c } else { std::cout << "N" << "\n"; // выведет на буквах a, b, d и e } }

Итак, идея добавить else - плохая идея, не рабочая. Для решения задач подобного типа (такие задачи встречаются достаточно часто) и используют так называемые флаги.

Как уже упоминалось выше, флаг - это такая переменная, которая может принимать два значения: true или false.

Итак, давайте сделаем переменную flag с таким значением: если она равна true, то в строке есть буква 'c', а если false, то такой буквы нет.

Изначально поставим переменную flag в значение false - то есть будем считать, что буквы 'c' в строке нет:

std::string str = "abcde"; bool flag = false; // считаем, что буквы c в строке нет

Затем запустим цикл с ифом так, как мы делали это раньше. Если цикл обнаружит, что в строке есть буква 'c' - то поставим переменную flag в значение true и выйдем из цикла с помощью break:

std::string str = "abcde"; bool flag = false; // считаем, что буквы c в строке нет for (int i = 0; i < str.size(); ++i) { char ch = str[i]; if (ch == 'c') { flag = true; // буква есть - переопределим переменную flag break; // выйдем из цикла } }

Ответ на вопрос, есть ли в строке буква 'c' или нет, мы можем дать только после цикла. И этот ответ у нас уже есть: после цикла переменная flag могла остаться false или могла сменить свое значение на true, если цикл обнаружил в строке букву 'c':

std::string str = "abcde"; bool flag = false; for (int i = 0; i < str.size(); ++i) { char ch = str[i]; if (ch == 'c') { flag = true; break; } } // тут переменная flag равна или true, или false

Теперь после цикла мы можем сделать иф, который посмотрит на переменную flag и выведет на экран "Y" или "N":

std::string str = "abcde"; bool flag = false; for (int i = 0; i < str.size(); ++i) { char ch = str[i]; if (ch == 'c') { flag = true; break; } } if (flag == true) { std::cout << "Y" << "\n"; // выведет Y } else { std::cout << "N" << "\n"; }

Дана строка:

std::string str = "program";

Проверьте, есть ли в ней буква 'r'. Если есть - выведите "Y", а если нет - выведите "N".

Дана строка:

std::string str = "hello";

Проверьте, есть ли в ней буква 'x'. Если есть - выведите "Y", а если нет - выведите "N".

Напишите код, который будет проверять число на то, простое оно или нет. Простое число делится только на единицу и на само себя, и не делится на другие числа.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить