Урок 34. Логический тип данных. Boolean

  Юрий Ворон  | 

    | 

  Обновлено 17 Апр 2017  | 

 11750

 ǀ   26 

В реальной жизни, перед нами очень часто возникают вопросы, на которые можно ответить однозначно: «да» или «нет». «Яблоко – это фрукт?». Да. «Вам нравится спаржа?». Нет.

Рассмотрим утверждение: «Яблоко – это фрукт». Является ли это правдой? Очевидно, что так. Или как насчет: «Я люблю спаржу». Абсолютная ложь (тьфу!).

Подобные предложения, которые имеют только два возможных исхода: да/правда или нет/ложь, настолько распространены, что многие языки программирования добавили специальный тип для работы с ними. Он называется логический тип данных (boolean).

Логические переменные

Логические переменные — это переменные, весь диапазон которых состоит только из двух возможный значений: true (1) и false (0).



Объявить их можно с помощью ключевого слова bool.

Инициализировать переменную или присвоить ей значение «правда» или «ложь» можно с помощью ключевых слов true или false.

Так же, как используя унарный оператор минус (-) мы можем сделать число отрицательным, так и с помощью логического оператора НЕ (!) мы можем поменять местами логические значения с true на false, или, наоборот, с false на true.

На самом деле логические значения не сохраняются в логических переменных «true» или «false». Вместо этого, они хранятся в виде целых чисел: true (истина) — это целое число 1, а false (ложь) – целое число 0. Аналогично, в коде, они не рассматриваются как значения «истина» или «ложь». Они рассматриваются как числа: 0 или 1.

Следовательно, если мы попытаемся вывести логические значение, std::cout покажет нам только 0 или 1:

Результат:

1
0
0
1

Если вы хотите, чтобы std::cout выводил «true» или «false» вместо цифр – используйте std::boolalpha:

Результат:

1
0
true
false

Использование boolean в ветвлении if

Очень часто логические переменные применяются в стейтментах if. Ветвление if, как правило, имеет следующий вид:

if (expression) statement1;

или

if (expression) statement1;
else statement2;

Expression (выражение), которое в дужках, еще называется условие (condition) или условное выражение (conditional expression).

В обоих случаях, условия проверяются. Если их результат — ненулевое значение, тогда выполняется statement1. И наоборот, если результат — нулевое значение, тогда выполняется statement2.

Помните, что true — это 1 (ненулевое значение), а false – 0 (нулевое значение).



Теперь в коде:

Результат:

the condition is true

Рассмотрим детальнее. Во-первых, мы начинаем с условия if. Выражение «true» оценивается как 1 (ненулевое значение), значит, выполняться будет инструкция под if (statement1).

Следующая программа работает так же:

Результат:

b is false

Здесь уже, при проверке условия, переменная b имеет значение false. false вычисляется как 0. Следовательно, первый стейтмент под if (который true) не выполняется, зато выполняется стейтмент под else (который false).

Пример сложнее

Оператор равенства (==) позволяет проверить два числа на их равенство между собой. Оператор == возвращает true, если операнды равны и false, если такими не являются.

Результат:

Enter an integer: 4
The value is non-zero

Давайте разберемся, как это работает. Во-первых, пользователь вводит целочисленное значение. Далее, с помощью оператора == мы проверяем, равно ли введенное значение значению 0. В этом примере, 4 не равно 0, поэтому оператор == определяет условие как false. Это приводит к выполнению части else, где указано вывести на экран текст “The value is non-zero”.

Логические возвращаемые значения

Логические значения часто используются в качестве возвращаемых в функциях, которые проверяют, истинно ли что-то или нет. Имена таких функций, зачастую, начинаются со слов is (например, isEqual) или has (например, hasCommonDivisor).

Рассмотрим следующий пример:

Результат:

Enter an integer: 5
Enter another integer: 5
5 and 5 are equal

Как это работает? Во-первых, мы вводим целочисленные значения переменных х и у. Далее проверяется условие, что приводит к вызову функции isEqual(5, 5). Внутри этой функции, сравнение чисел (5 == 5) приводит к возвращаемому значению true (так как 5 равно 5). True возвращается обратно в caller. Так как условие истинно, то выполняется часть под if (statement1), выводя текст «5 and 5 are equal».

К логическим значениям нужно немного привыкнуть, но как только вы это сделаете, то сами удивитесь, насколько они удобны и просты.

Нелогические условия

Во всех примерах выше, в наших условиях были либо логические значения (true или false), либо логические переменные, либо функции, которые возвращают логическое значение. А что произойдет, если наше условие не будет вычисляться к логическому значению?

Вы уже знаете ответ. Если результатом условия будет ненулевое значение, тогда выполняться будет statement1.

Поэтому, если сделать что-то вроде этого:

То результатом будет «hi», так как 4 — ненулевое значение.

Ввод логических значений

Рассмотрим следующую программу:

Результат:

Enter a boolean value: true
You entered: 119

Подождите-ка? А что это за чепуха такая?

Оказывается, что std::cin принимает только два числа в качестве логических переменных: 0 и 1 (не true и не false). Все другие значения вызовут сбой std::cin. Так как мы ввели «true», в std::cin произошел сбой и переменная b оказалась без своего значения. Следовательно, std::cout выведет любой мусор, который находился в то время внутри переменной b.

Тест

1) Простое число – это натуральное число, больше 1, которое делится только на себя или на 1. Напишите программу, которая просит пользователя ввести простое целое число. Если пользователь ввел одно из этих: 2, 3, 5 или 7 — программа должна вывести текст “The digit is prime”. В противном случае, “The digit is not prime”.

Подсказка: Используйте ветвление if для сравнения чисел, которые ввел пользователь и тех, которые нужно было ввести. Используйте логические значения в качестве отслеживания, является ли введенное число простым или нет.

Ответ

Чтобы увидеть результат, нажмите на ссылку.

Ответ 1

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (93 оценок, среднее: 4,81 из 5)
Загрузка...

Комментариев: 26

  1. Виктор:

    Мой вариант:

  2. katerinkaj:

    Единственно смущает, что простых чисел куда больше, чем эти 3 числа. Так что задачка и ее решение не совсем корректны. Как написать формулу для всех простых чисел так сразу не дотумкала, решила на этом не зацикливаться и не тратить время. Наверняка как-то в цикле можно это условие описать…

  3. subj:

    Сделал не правильно, но работает.

  4. Алексей:

  5. Максим:

  6. Коля:

    я правильно написал?

  7. artem:

  8. Андрей:

    Спасибо за статьи!
    Добавлю свое решение

    1. Li4ik Li4ik:

      Привет, пожалуйста 🙂

      1. Роман:

        помогите пожалуйста как в комментариях так красиво код выкладывать со строчками? если что у меня IDE dev c++

        1. Юрий Юрий:

          Это стили, которые прописываются на моей стороне (стороне админа), а не на вашей. Вы вставляете свой код как есть, дальше я его редактирую.

  9. Кирилл:

  10. aleksandr:

    А так грамотно ?

    1. Li4ik Li4ik:

      Как вариант, может быть.

  11. Андрей:

    При подключении Windows.h, надо в консоли (командной строке) установить по умолчанию шрифт Lucida Console.

    У меня кстати и ввод и вывод работают.
    Автору спасибо!!!

  12. Александр:

    А может быть лучше вот так?

    1. Li4ik Li4ik:

      Нет, так не лучше. Во-первых, в функции main() — параметры не объявляются. Во-вторых, вы ведь просто переместили код функции в main(), если работать по такой логике, то зачем вообще придумали функции, если весь код можно разместить в main-е?

      Код выносится в функции, чтобы его можно было повторно легко использовать и легко поддерживать (модифицировать).

      Да, всё будет работать и так в main-е, это задание не большое — кода мало, но мы ведь учимся писать код правильно, не так ли? И здесь лучше использовать отдельную функцию.

  13. Андрей:

    У меня вопрос, нашел в инете способ вывода русских букв в консоль. Он нормальный или есть какие-то подводные камни.
    Еще пишут можно сохранять файл в другой кодировке, но я не понял какой файл, срр ? и как это сделать…

    1. Li4ik Li4ik:

      Для корректного отображения кириллицы в консольном окне — добавьте заголовочный файл:

      и пропишите следующую строчку кода в main:

      Либо, если вы еще планируете вводить данные на кириллице, тогда подключите заголовочный файл:

      и пропишите в main:

      1. Андрей:

        Спасибо, setlocale(LC_CTYPE, «rus»); работает.
        Но с #include
        почему-то не пошло…
        В настройках стоит Windows 1251…

        1. Li4ik Li4ik:

          С include ошибка выбивает?

        2. Михаил:

          SetConsoleCP(1251) и SetConsoleOutputCP(1251) не работают у меня на MVS Community 2017: ввод и вывод на кириллице все равно обрастает крокозябликами

        3. Li4ik Li4ik:

          Попробуйте запустить у себя вот этот код:

          У меня здесь всё заработало.

        4. Роман:

          ещё работает просто setlocale(0, ""); для вывода любых символов например вот

  14. Артем:

    как вариант

    Спасибо за статьи! Очень доходчиво и читабельно.

    1. Li4ik Li4ik:

      Да, так тоже можно 🙂

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *