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

  Юрий  | 

  |

  Обновл. 11 Сен 2021  | 

 229566

 ǀ   95 

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

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

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

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

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

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

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

Тест


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

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

Ответ

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

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

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

  1. Vladimir:

    Дошёл до этого этого места( С++ урок 34) и на задании запнулся. Через год решил заново дошёл до этого места и снова застрял. В этот раз не выдержал и залез в ответ. Оказалось , что можно несколько условий подряд писать, еще и у людей вложенные друг в друга условия. Про это в уроке вообще ни слова нет. Получается что решать задачу нужно нужно здесь и сейчас, а знания получать позже , или на стороне.

    1. Вадим:

      В уроке №25, Программа Калькулятор

      https://ravesli.com/urok-25-razrabotka-vashih-pervyh-programm/

  2. Taras Polishuk:

    Я сделал это задание так. Хотя если создать массив из простых чисел, а потом проверять входит ли наше число в этот массив или нет — было бы элегантнее.

  3. Владимир:

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

  4. Сашуня:

    Были использованы знания тоько с предыдущих уроков.

  5. Pest0n:

    Попробовал поработать с массивом, получилось как-то так, вроде работает

  6. |Oleg|:

    Эхх, думал изобрести велосипед и заодно сократить к-во строчек кода, а получилось с одной стороны — что у математиков сотни лет как всё придумано (малая теорема Ферма, тест Миллера-Рабина, теорема об остатках), с другой — авторское решение, по сути, совпадает с моим, только записано проще, без лишних проверок и делений.

    По-хорошему, здесь нужен цикл c отсечением чётных делителей(кроме 2) и тех, что заканчиваются на 0 или 5, + у которых сумма цифр делится на 3 и т.д. Или делать как Эратосфен со своим решетом… Или создать счётчик делителей и выходить из цикла, как только их станет 2 — был выше такой красивый вариант. Или вспомнить теорию чисел и искать лишь от 2 до √n. Короче, много подводных камней для того, кто хочет пойти простым путём. Но здорово, ребята, что меня на этой страничке навели на раздумия. (Ага, над задачей, которую никто не задавал и которая на данном этапе не нужна ;-))

  7. WinglessFantasy:

    Что-то такое)

  8. Jenia:

    Вот такое решение мне пришло на ум:

  9. Артём:

    Хочу добавить ещё одно если после if идёт стейтмент однострочный, то квадратные скобочки можно не ставить(Это для ленивых людей)

    Пример:

  10. Андрей:

    Немного усовершенствовал. Теперь можно выбирать получить список всех простых чисел до указанного предела или по числу определить простое оно или нет.

    1. Татьяна:

      Если ввести отрицательное число, то оно определиться как простое. И если ввести ноль, то оно тоже попадет в простые числа.

  11. Денис:

    Так сделал:

  12. Владимир:

    Тоже удалось маленько накодить)) Только я ещё добавил условие диапазона вводимых значений и цикличность через do while, вроде работает))

  13. Logik:

    "О боже так можно было что ли!!!"— сказал я, когда сделал рабочую программу и посмотрел ответ.=)

    Вот мой код:

  14. Nick:

    Хм, решил, что зачем находить несколько чисел, почему бы не найти все?)

  15. Игорь:

  16. Диана:

    1. ruslan:

      у вас число 9 ошибочно относится под множество простых чисел

  17. nZver:

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

  18. Mari:

    Вроде работает. Ничего, кроме этого самоучителя не изучал, только работу множественных условий пришлось подсмотреть. А цикл в универе по Экселю проходили, решил тоже впихнуть. Правда иногда ошибки вылазили «Требуется объявление» прямо перед return, не понимаю, с чем связано. Но сейчас ошибок вроде нет.

  19. Сергей:

  20. Владимир:

    Неумело, конечно, особенно учитывая другие ответы тут, но с нынешними знаниями — как-то так.

    1. Алексей:

      число 11, 13, 17 и др — простые числа, а у вас программа выдаст что они не простые

  21. Томас:

    Так получилось

  22. ОЛЕГ:

    Написал этот вариант используя самый минимум приемов кодирования.

  23. Андрей:

    а я вот так сделал

  24. Данил:

    А как вам такое решение?

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

    До этого сайта читал очередной учебник по C++. И там и тут не следующий момент:
    Допустим имеем условие:

    Что само по себе уже мало похоже на условие, потому что — а где тут условие то? Тем не менее подобное есть в примере:

    Ну ок, допустим я ничего не понимаю просто, условие норм. Тогда возникает следующий вопрос, что выполнится/не выполнится при таком условии.
    Опытным путем выяснил что при

    Печатаются обе строчки
    При if (false) только вторая.
    Внимание, вопросы! Означает ли условие true, что следующая строка выполнится в любом случае? Почему условие выполняет только одну строку? Как оно опеределяет предел, сколько строк выполнять? Означает ли что условие false пропустит следующую строку? Ну и опять же, как оно понимает сколько строк пропустить?

    Пока условно вынужден считать что оно просто так "работает".

    1. Фото аватара Дмитрий Бушуев:

      Всё дело в том, что ваш код эквивалентен нижеследующему коду:

      В таких случая стандарт C++ разрешает опускать фигурные скобки. Исходя из этого, мы получаем:

      >>Означает ли условие true, что следующая строка выполнится в любом случае?
      Да.

      >>Означает ли что условие false пропустит следующую строку?
      Да.

      >>Почему условие выполняет только одну строку?
      см. начало моего ответа.

      >>Как оно понимает сколько строк пропустить?
      см. начало моего ответа.

      🙂

      1. Santa-Claus_16:

        Спасибо, теперь понятно. А можно ли добавить фигурные скобки чтобы выполнить более одной строки? На сколько это будет корректно?

        1. Фото аватара Дмитрий Бушуев:

          Конечно можно (скорее даже "нужно"), т.к. это — требование самого стандарта C++. Расставляя фигурные скобки подобным образом, вы как бы говорите, что выделенный блок кода теперь относится к условию if(…). Например:

          В вышеприведенном фрагменте блок кода в фигурных скобках теперь связан с условием if(…). В результате вы получите вывод 4 строк текста (String1, … , String4) от if(…), после чего будет выведена строка (которая уже сама по себе) с текстом "String5".

          Если же заменить условие if(true) на if(false), то будет выведена только строка "String5", т.к. в таком случае связанный с if(false) блок выполняться не будет, а строка String5, как уже было сказано выше, сама по себе и от if(…) никак не зависит. 🙂

  26. Евгений:

    А у меня получилось вот так, у вас правда лучше)

  27. Дмитрий:

    проверяет натуральное число ввел пользователь или нет.

  28. aaa:

    Для конкретной задачи:

    Для все чисел:

    Но я точно не уверен =))

  29. Elaiten:

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

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

  31. Onium:

    Так тоже работает.

  32. Onium:

    Так программа сверяет число по всей ветке поочередно, что дольше. Зато сам и вроде всё правильно и без ошибок считает.

  33. Богдан:

    Немного заигрался и написал это. Были ниже некоторые более компактные варианты, но с некоторыми проблемами (ломаются если ввести число <=0).

  34. Sagynysh:

    Тут я не поняла. Откуда компилятор знает, что b = false? То есть что имеется ввиду под оператором if(b) ? Возможно туповатый вопрос 🙂 Но моя башка что-то не понимает. Хэлп гайс

    1. Богдан:

      Вы же в первой строчке присвоили значение false

  35. Андрей:

    Я перечитал 4 раза этот урок,но так и не понял,зачем мы создавали переменную bool,я понял про if else,но момент с написанием bool и функции int main мне не понятен.
    Спасибо заранее.ц

  36. Константин:

    1. ХейЛонг:

      Весьма интересный вариант, я даже свой тестовый код для проверки сделал. Для начала нужно понять, зачем в твоей функции isEqual нужны два параметра, когда применяется только один. Потом, логическое сложение (2+3+5+7) сразу вернёт единицу, поэтому твоя программа ответит digit is prime только при введённом х==1.

  37. cybersatori:

    подумал, как быть с … 11, 13, 17, 19, 23, 29, 31, 37 и т.д. что бы уж до конца корректно.

    собрал такой код, но при значении 111 пишет тоже прайм — хотя вроде как нет, подумаю ещё — но пример я так понял игровой на буль синтаксис, он впрочем у меня тоже с другой стороны.

    1. cybersatori:

      Вообщем предлагается использовать алгоритм решето Эратосфена, но это уже другая тема, а так интересно спасибо что натолкнули на размышления)

  38. Valentin:

    Хотелось бы узнать это правильный ответ или я совсем не так понял задачу. И как далеко я от истины. Спасибо

    1. Nikita:

      Не совсем понятно что делает ваша функция . Она в идеале должна проверять число . Если число делится на цело только на 1 и на саму себя , тогда это простое число. Вот это условие должно быть в функции.

      1. Nikita:

        Хотя легче сказать чем сделать.
        Лично я вижу решение по такому алгоритму:
        Функция принимает введённое число — х. Далее, в итеративном цикле, это число , начинает делится на все Числа по порядку от 2 и до х-1. Если ни на одно число Z которое находится в этом диапазоне (1< Z <х) наш х не поделился нацело, значит число простое.

        1. Алексей:

          Проходить стоит даже не до x-1, а до x/2.
          На числа, которые больше половины нашего числа, оно не поделится нацело

  39. Максим:

  40. Проггер:

    Можно ли писать условие if через запятую(у меня скоспилировалось и все работает)???

  41. Юрий:

  42. Михалыч:

    таким кодом меньше писать. а работает также.

  43. Анастасия:

  44. Алексей:

    Немного по-другому сделал.

    Тупил конечно, но тут вовсе ничего сложного.

  45. Nikita:

    А с циклом нельзя?

  46. Vladislav:

    Объясните мне — Нахрена использовать "std::cout/cin", если у Вас подключена библиотека?

    1. Роман:

      Это необходимо использовать, так как не подключено пространство имён std

  47. Denis:

  48. Владимир:

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

    1. Nikita:

      Нам ведь нужно не четность проверить. А простое ли число

  49. Айзек:

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

  50. Лёха:

  51. Вячеслав:

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

    1. Tosha:

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

  52. Вячеслав:

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

    1. Фото аватара Юрий:

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

  53. Виктор:

    Мой вариант:

  54. katerinkaj:

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

  55. subj:

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

  56. Алексей:

  57. Максим:

  58. Коля:

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

  59. artem:

  60. Андрей:

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

    1. Фото аватара Юрий:

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

      1. Роман:

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

        1. Фото аватара Юрий:

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

  61. Кирилл:

  62. aleksandr:

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

    1. Фото аватара Юрий:

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

  63. Андрей:

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

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

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

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

    1. Фото аватара Юрий:

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

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

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

  65. Андрей:

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

    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, ""); для вывода любых символов например вот

  66. Артем:

    как вариант

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

    1. Фото аватара Юрий:

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

Добавить комментарий для Максим Отменить ответ

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