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

  Юрий  | 

    | 

  Обновл. 30 Мар 2019  | 

 19388

 ǀ   34 

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

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

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

Переменные логического типа данных

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

Для объявления логической переменной используется ключевое слово bool:

Инициализировать логическую переменную или выполнить операцию присваивания можно с помощью ключевых слов true или false:

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

На самом деле, логические значения не сохраняются как «true» или «false». Они обрабатываются в виде целых чисел: вместо true — единица, вместо false — ноль.

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

Результат выполнения программы выше:

1
0
0
1

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

Результат выполнения программы выше:

1
0
true
false

Использование логического типа данных в ветвлениях if


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

if (выражение) стейтмент1;

либо так:

if (выражение) стейтмент1;
else стейтмент2;

(выражение) ещё называется «условием», либо «условным выражением».

В обоих случаях, если результатом условия является ненулевое значение, то выполняется стейтмент1. Если же результатом условия является нулевое значение, то выполняется стейтмент2.

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

Теперь рассмотрим пример в коде:

Результат:

The condition is true!

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

Следующая программа работает аналогично:

Результат:

b is false!

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

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

Результат выполнения программы выше:

Enter an integer: 4
The value is non-zero

Давайте разберёмся, что и как здесь работает. Во-первых, мы просим пользователя ввести целое число. После этого, с помощью оператора ==, мы проверяем, является ли пользовательское число нулевым. В примере выше 4 не равно 0, поэтому оператор == определяет условие как false. Следовательно, выполняется стейтмент2 (тот, который под 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). Внутри этой функции наши 2 числа сравниваются между собой (5 == 5), что приводит к возврату значения true (так как 5 = 5). Значение true возвращается обратно в caller. Так как условие истинно, то выполняется стейтмент1, который выводит 5 and 5 are equal.

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

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

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

То результатом будет hi, так как 4 является ненулевым значением.

Тест


Что такое простое число? Правильно! Это целое положительное число больше единицы, которое делится без остатка либо на себя, либо на единицу. Напишите программу, которая просит пользователя ввести простое целое число. Если пользователь ввёл одно из следующих чисел: 2, 3, 5 или 7 — программа должна вывести The digit is prime. В противном случае, The digit is not prime.

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

Ответ

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

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

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

  1. Аватар Denis:

  2. Аватар Владимир:

    Сделал вариант через три функции.

  3. Аватар Айзек:

    Блин, а я всё размышлял, как не проходя циклов решить это задание
    Оказалось, что нужно внимательно читать ТЗ 😀

  4. Аватар Лёха:

  5. Аватар Вячеслав:

    так будет правильно, у меня работает?

    1. Аватар Tosha:

      Не-а, тут в условиях используется присваивание(=) вместо сравнения(==), благодаря чему любое число, отличное от нуля будет воспринято, как true в первом же выражении

  6. Аватар Вячеслав:

    Юрий, доброго времени суток. У меня стоит MVS 2017 community,как с нее можно скопировать код, чтобы отправить? Заранее спасибо.

    1. Юрий Юрий:

      Привет. Просто Ctrl+C и Ctrl+V — дальше я уже самостоятельно редактирую код, чтобы было так красиво, как в статьях 🙂

  7. Аватар Виктор:

    Мой вариант:

  8. Аватар katerinkaj:

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

  9. Аватар subj:

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

  10. Аватар Алексей:

  11. Аватар Максим:

  12. Аватар Коля:

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

  13. Аватар artem:

  14. Аватар Андрей:

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

    1. Юрий Юрий:

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

      1. Аватар Роман:

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

        1. Юрий Юрий:

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

  15. Аватар Кирилл:

  16. Аватар aleksandr:

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

    1. Юрий Юрий:

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

  17. Аватар Андрей:

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

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

  18. Аватар Александр:

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

    1. Юрий Юрий:

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

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

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

  19. Аватар Андрей:

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

    1. Юрий Юрий:

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

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

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

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

      1. Аватар Андрей:

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

        1. Юрий Юрий:

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

        2. Аватар Михаил:

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

        3. Юрий Юрий:

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

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

        4. Аватар Роман:

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

  20. Аватар Артем:

    как вариант

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

    1. Юрий Юрий:

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

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

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