В реальной жизни перед нами очень часто возникают вопросы, на которые можно ответить однозначно: «Да» или «Нет». Яблоко является фруктом? Да! Вам нравится спаржа? Нет!
Рассмотрим утверждение: «Яблоко — это фрукт». Является ли это правдой? Да! Яблоко действительно является фруктом. Или как насчет: «Я люблю спаржу». Абсолютная ложь (тьфу!).
Подобные стейтменты, которые имеют только два возможных исхода — да/правда или нет/ложь, настолько распространены, что многие языки программирования добавили специальный тип для работы с ними — логический тип данных. В языке С++ это логический тип данных bool (от англ. «boolean»).
Переменные логического типа данных
Логические переменные — это переменные, диапазон которых состоит только из двух возможных значений: true
(1
) и false
(0
).
Для объявления логической переменной используется ключевое слово bool:
1 |
bool b; |
Инициализировать логическую переменную или выполнить операцию присваивания можно с помощью ключевых слов true
или false
:
1 2 3 4 |
bool b1 = true; // копирующая инициализация bool b2(false); // прямая инициализация bool b3 { true }; // uniform-инициализация (C++11) b3 = false; // операция присваивания |
Аналогично работе унарного оператора минус (-
), с помощью которого мы можем сделать число отрицательным, с помощью логического оператора НЕ (!
) мы можем изменить true
на false
и наоборот (false
на true
):
1 2 |
bool b1 = !true; // значение b1 - false bool b2(!false); // значение b2 - true |
На самом деле, логические значения не сохраняются как true
или false
. Они обрабатываются в виде целых чисел: вместо true
— единица, вместо false
— ноль.
Следовательно, если мы попытаемся вывести логические значения с помощью std::cout, то увидим либо 0
, либо 1
:
1 2 3 4 5 6 7 8 9 10 11 12 |
#include <iostream> int main() { std::cout << true << std::endl; // вместо true единица std::cout << !true << std::endl; // вместо !true ноль bool b(false); std::cout << b << std::endl; // b - false (0) std::cout << !b << std::endl; // !b - true (1) return 0; } |
Результат выполнения программы:
1
0
0
1
Если вы хотите, чтобы std::cout выводил true
или false
(вместо целых чисел), то тогда используйте манипулятор форматирования std::boolalpha:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <iostream> int main() { std::cout << true << std::endl; std::cout << false << std::endl; std::cout << std::boolalpha; // выводим логические значения как "true" или "false" std::cout << true << std::endl; std::cout << false << std::endl; return 0; } |
Результат выполнения программы:
Использование логического типа данных в ветвлениях if
Очень часто логические переменные используются в ветвлениях if. Ветвление if выглядит следующим образом:
if (выражение) стейтмент1;
Либо:
if (выражение) стейтмент1;
else стейтмент2;
(выражение)
еще называется «условием», либо «условным выражением».
В обоих случаях, если результатом условия является ненулевое значение, то выполняется стейтмент1
. Если же результатом условия является нулевое значение, то выполняется стейтмент2
.
Помните, что true
— это 1
(ненулевое значение), а false
— это 0
(нулевое значение).
Теперь рассмотрим пример в коде:
1 2 3 4 |
if (true) // true - это условие std::cout << "The condition is true!" << std::endl; else std::cout << "The condition is false!" << std::endl; |
Результат:
The condition is true!
Что здесь делается? Во-первых, мы начинаем с условия if, которым является логическое значение true
, т.е. 1
(ненулевое значение), что означает, что выполняться будет стейтмент1
.
Следующая программа работает аналогично:
1 2 3 4 5 |
bool b(false); if (b) std::cout << "b is true!" << std::endl; else std::cout << "b is false!" << std::endl; |
Результат:
b is false!
Здесь, при проверке условия, переменная b
имеет значение false
. false
— это 0
. Следовательно, первый стейтмент под if (который true
) пропускается, а второй, который под else (false
) — выполняется.
А теперь рассмотрим пример посложнее. Оператор равенства (==
) используется для сравнения двух чисел (являются ли они равными). Оператор ==
возвращает true
, если операнды равны и false
, если таковыми не являются:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#include <iostream> int main() { std::cout << "Enter an integer: "; int x; std::cin >> x; if (x == 0) std::cout << "The value is zero" << std::endl; else std::cout << "The value is non-zero" << std::endl; return 0; } |
Результат выполнения программы:
Enter an integer: 4
The value is non-zero
Давайте разберемся, что и как здесь работает. Во-первых, мы просим пользователя ввести целое число. После этого, с помощью оператора ==
, мы проверяем, является ли пользовательское число нулевым. В вышеприведенном примере 4
не равно 0
, поэтому оператор ==
определяет условие как false
. Следовательно, выполняется стейтмент2
(тот, который под else), где мы выводим The value is non-zero
.
Возвращаемые значения логического типа данных
Логические значения часто используются в качестве возвращаемых значений в функциях. Названия таких функций очень часто начинаются со слов is
(например, isEqual
) или has
(например, hasCommonDivisor
).
Рассмотрим следующий пример:
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 |
#include <iostream> // Возвращаем true, если x и y равны, в противном случае - возвращаем false bool isEqual(int x, int y) { return (x == y); // оператор == возвращает true, если x равно y, в противном случае - false } int main() { std::cout << "Enter an integer: "; int x; std::cin >> x; std::cout << "Enter another integer: "; int y; std::cin >> y; if (isEqual(x, y)) std::cout << x << " and " << y << " are equal" << std::endl; else std::cout << x << " and " << y << " are not equal" << std::endl; return 0; } |
Результат выполнения программы:
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
.
Поэтому, если попробовать сделать что-то вроде следующего:
1 2 3 4 |
if (4) std::cout << "hi"; else std::cout << "bye"; |
То результатом будет hi
, так как 4
является ненулевым значением.
Тест
Что такое простое число? Правильно! Это целое положительное число больше единицы, которое делится без остатка либо на себя, либо на единицу. Напишите программу, которая просит пользователя ввести простое целое число, меньшее 10. Если пользователь ввел одно из следующих чисел: 2, 3, 5 или 7 — программа должна вывести The digit is prime
, в противном случае — The digit is not prime
.
Подсказка: Используйте ветвление if для сравнения чисел и логические значения для отслеживания того, является ли пользовательское число простым или нет.
Ответ
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 |
#include <iostream> bool isPrime(int x) { if (x == 2) return true; if (x == 3) return true; if (x == 5) return true; if (x == 7) return true; return false; } int main() { std::cout << "Enter a single digit integer: "; int x; std::cin >> x; bool prime = isPrime(x); if (prime) std::cout << "The digit is prime" << std::endl; else std::cout << "The digit is not prime" << std::endl; return 0; } |
Дошёл до этого этого места( С++ урок 34) и на задании запнулся. Через год решил заново дошёл до этого места и снова застрял. В этот раз не выдержал и залез в ответ. Оказалось , что можно несколько условий подряд писать, еще и у людей вложенные друг в друга условия. Про это в уроке вообще ни слова нет. Получается что решать задачу нужно нужно здесь и сейчас, а знания получать позже , или на стороне.
В уроке №25, Программа Калькулятор
https://ravesli.com/urok-25-razrabotka-vashih-pervyh-programm/
Я сделал это задание так. Хотя если создать массив из простых чисел, а потом проверять входит ли наше число в этот массив или нет — было бы элегантнее.
Получилась вот такая простенькая функция, которая проверит любое введенное число является ли оно простым или нет.
Были использованы знания тоько с предыдущих уроков.
Попробовал поработать с массивом, получилось как-то так, вроде работает
Эхх, думал изобрести велосипед и заодно сократить к-во строчек кода, а получилось с одной стороны — что у математиков сотни лет как всё придумано (малая теорема Ферма, тест Миллера-Рабина, теорема об остатках), с другой — авторское решение, по сути, совпадает с моим, только записано проще, без лишних проверок и делений.
По-хорошему, здесь нужен цикл c отсечением чётных делителей(кроме 2) и тех, что заканчиваются на 0 или 5, + у которых сумма цифр делится на 3 и т.д. Или делать как Эратосфен со своим решетом… Или создать счётчик делителей и выходить из цикла, как только их станет 2 — был выше такой красивый вариант. Или вспомнить теорию чисел и искать лишь от 2 до √n. Короче, много подводных камней для того, кто хочет пойти простым путём. Но здорово, ребята, что меня на этой страничке навели на раздумия. (Ага, над задачей, которую никто не задавал и которая на данном этапе не нужна ;-))
Что-то такое)
Вот такое решение мне пришло на ум:
Хочу добавить ещё одно если после if идёт стейтмент однострочный, то квадратные скобочки можно не ставить(Это для ленивых людей)
Пример:
Немного усовершенствовал. Теперь можно выбирать получить список всех простых чисел до указанного предела или по числу определить простое оно или нет.
Если ввести отрицательное число, то оно определиться как простое. И если ввести ноль, то оно тоже попадет в простые числа.
Так сделал:
Тоже удалось маленько накодить)) Только я ещё добавил условие диапазона вводимых значений и цикличность через do while, вроде работает))
"О боже так можно было что ли!!!"— сказал я, когда сделал рабочую программу и посмотрел ответ.=)
Вот мой код:
Хм, решил, что зачем находить несколько чисел, почему бы не найти все?)
у вас число 9 ошибочно относится под множество простых чисел
Критика функции определения натурального числа приветствуется (не нравится, что пришлось отдельным условием обрабатывать результат для двойки, может кто-нибудь увидит более "красивое" решение)
Вроде работает. Ничего, кроме этого самоучителя не изучал, только работу множественных условий пришлось подсмотреть. А цикл в универе по Экселю проходили, решил тоже впихнуть. Правда иногда ошибки вылазили «Требуется объявление» прямо перед return, не понимаю, с чем связано. Но сейчас ошибок вроде нет.
Неумело, конечно, особенно учитывая другие ответы тут, но с нынешними знаниями — как-то так.
число 11, 13, 17 и др — простые числа, а у вас программа выдаст что они не простые
Так получилось
Написал этот вариант используя самый минимум приемов кодирования.
а я вот так сделал
А как вам такое решение?
До этого сайта читал очередной учебник по C++. И там и тут не следующий момент:
Допустим имеем условие:
Что само по себе уже мало похоже на условие, потому что — а где тут условие то? Тем не менее подобное есть в примере:
Ну ок, допустим я ничего не понимаю просто, условие норм. Тогда возникает следующий вопрос, что выполнится/не выполнится при таком условии.
Опытным путем выяснил что при
Печатаются обе строчки
При if (false) только вторая.
Внимание, вопросы! Означает ли условие true, что следующая строка выполнится в любом случае? Почему условие выполняет только одну строку? Как оно опеределяет предел, сколько строк выполнять? Означает ли что условие false пропустит следующую строку? Ну и опять же, как оно понимает сколько строк пропустить?
Пока условно вынужден считать что оно просто так "работает".
Всё дело в том, что ваш код эквивалентен нижеследующему коду:
В таких случая стандарт C++ разрешает опускать фигурные скобки. Исходя из этого, мы получаем:
>>Означает ли условие true, что следующая строка выполнится в любом случае?
Да.
>>Означает ли что условие false пропустит следующую строку?
Да.
>>Почему условие выполняет только одну строку?
см. начало моего ответа.
>>Как оно понимает сколько строк пропустить?
см. начало моего ответа.
🙂
Спасибо, теперь понятно. А можно ли добавить фигурные скобки чтобы выполнить более одной строки? На сколько это будет корректно?
Конечно можно (скорее даже "нужно"), т.к. это — требование самого стандарта C++. Расставляя фигурные скобки подобным образом, вы как бы говорите, что выделенный блок кода теперь относится к условию if(…). Например:
В вышеприведенном фрагменте блок кода в фигурных скобках теперь связан с условием if(…). В результате вы получите вывод 4 строк текста (String1, … , String4) от if(…), после чего будет выведена строка (которая уже сама по себе) с текстом "String5".
Если же заменить условие if(true) на if(false), то будет выведена только строка "String5", т.к. в таком случае связанный с if(false) блок выполняться не будет, а строка String5, как уже было сказано выше, сама по себе и от if(…) никак не зависит. 🙂
А у меня получилось вот так, у вас правда лучше)
проверяет натуральное число ввел пользователь или нет.
Для конкретной задачи:
Для все чисел:
Но я точно не уверен =))
Программа которая будет проверять четное число или нет, если вы ввели отрицательное число или вместо числа букву, то программа выдаст ошибку и закроется:
Так тоже работает.
Так программа сверяет число по всей ветке поочередно, что дольше. Зато сам и вроде всё правильно и без ошибок считает.
Немного заигрался и написал это. Были ниже некоторые более компактные варианты, но с некоторыми проблемами (ломаются если ввести число <=0).
Тут я не поняла. Откуда компилятор знает, что b = false? То есть что имеется ввиду под оператором if(b) ? Возможно туповатый вопрос 🙂 Но моя башка что-то не понимает. Хэлп гайс
Вы же в первой строчке присвоили значение false
Я перечитал 4 раза этот урок,но так и не понял,зачем мы создавали переменную bool,я понял про if else,но момент с написанием bool и функции int main мне не понятен.
Спасибо заранее.ц
Весьма интересный вариант, я даже свой тестовый код для проверки сделал. Для начала нужно понять, зачем в твоей функции isEqual нужны два параметра, когда применяется только один. Потом, логическое сложение (2+3+5+7) сразу вернёт единицу, поэтому твоя программа ответит digit is prime только при введённом х==1.
подумал, как быть с … 11, 13, 17, 19, 23, 29, 31, 37 и т.д. что бы уж до конца корректно.
собрал такой код, но при значении 111 пишет тоже прайм — хотя вроде как нет, подумаю ещё — но пример я так понял игровой на буль синтаксис, он впрочем у меня тоже с другой стороны.
Вообщем предлагается использовать алгоритм решето Эратосфена, но это уже другая тема, а так интересно спасибо что натолкнули на размышления)
Хотелось бы узнать это правильный ответ или я совсем не так понял задачу. И как далеко я от истины. Спасибо
Не совсем понятно что делает ваша функция . Она в идеале должна проверять число . Если число делится на цело только на 1 и на саму себя , тогда это простое число. Вот это условие должно быть в функции.
Хотя легче сказать чем сделать.
Лично я вижу решение по такому алгоритму:
Функция принимает введённое число — х. Далее, в итеративном цикле, это число , начинает делится на все Числа по порядку от 2 и до х-1. Если ни на одно число Z которое находится в этом диапазоне (1< Z <х) наш х не поделился нацело, значит число простое.
Проходить стоит даже не до x-1, а до x/2.
На числа, которые больше половины нашего числа, оно не поделится нацело
Можно ли писать условие if через запятую(у меня скоспилировалось и все работает)???
таким кодом меньше писать. а работает также.
Немного по-другому сделал.
Тупил конечно, но тут вовсе ничего сложного.
А с циклом нельзя?
Объясните мне — Нахрена использовать "std::cout/cin", если у Вас подключена библиотека?
Это необходимо использовать, так как не подключено пространство имён std
Сделал вариант через три функции.
Нам ведь нужно не четность проверить. А простое ли число
Блин, а я всё размышлял, как не проходя циклов решить это задание
Оказалось, что нужно внимательно читать ТЗ 😀
так будет правильно, у меня работает?
Не-а, тут в условиях используется присваивание(=) вместо сравнения(==), благодаря чему любое число, отличное от нуля будет воспринято, как true в первом же выражении
Юрий, доброго времени суток. У меня стоит MVS 2017 community,как с нее можно скопировать код, чтобы отправить? Заранее спасибо.
Привет. Просто Ctrl+C и Ctrl+V — дальше я уже самостоятельно редактирую код, чтобы было так красиво, как в статьях 🙂
Мой вариант:
Единственно смущает, что простых чисел куда больше, чем эти 3 числа. Так что задачка и ее решение не совсем корректны. Как написать формулу для всех простых чисел так сразу не дотумкала, решила на этом не зацикливаться и не тратить время. Наверняка как-то в цикле можно это условие описать…
Сделал не правильно, но работает.
я правильно написал?
Спасибо за статьи!
Добавлю свое решение
Привет, пожалуйста 🙂
помогите пожалуйста как в комментариях так красиво код выкладывать со строчками? если что у меня IDE dev c++
Это стили, которые прописываются на моей стороне (стороне админа), а не на вашей. Вы вставляете свой код как есть, дальше я его редактирую.
А так грамотно ?
Как вариант, может быть.
При подключении Windows.h, надо в консоли (командной строке) установить по умолчанию шрифт Lucida Console.
У меня кстати и ввод и вывод работают.
Автору спасибо!!!
А может быть лучше вот так?
Нет, так не лучше. Во-первых, в функции main() — параметры не объявляются. Во-вторых, вы ведь просто переместили код функции в main(), если работать по такой логике, то зачем вообще придумали функции, если весь код можно разместить в main-е?
Код выносится в функции, чтобы его можно было повторно легко использовать и легко поддерживать (модифицировать).
Да, всё будет работать и так в main-е, это задание не большое — кода мало, но мы ведь учимся писать код правильно, не так ли? И здесь лучше использовать отдельную функцию.
У меня вопрос, нашел в инете способ вывода русских букв в консоль. Он нормальный или есть какие-то подводные камни.
Еще пишут можно сохранять файл в другой кодировке, но я не понял какой файл, срр ? и как это сделать…
Для корректного отображения кириллицы в консольном окне — добавьте заголовочный файл:
и пропишите следующую строчку кода в main:
Либо, если вы еще планируете вводить данные на кириллице, тогда подключите заголовочный файл:
и пропишите в main:
Спасибо, setlocale(LC_CTYPE, «rus»); работает.
Но с #include
почему-то не пошло…
В настройках стоит Windows 1251…
С include ошибка выбивает?
SetConsoleCP(1251) и SetConsoleOutputCP(1251) не работают у меня на MVS Community 2017: ввод и вывод на кириллице все равно обрастает крокозябликами
Попробуйте запустить у себя вот этот код:
У меня здесь всё заработало.
ещё работает просто setlocale(0, ""); для вывода любых символов например вот
как вариант
Спасибо за статьи! Очень доходчиво и читабельно.
Да, так тоже можно 🙂