Как сделать таблицу истинности в си шарп
БлогNot. C++: построить таблицу истинности для логического выражения
C++: построить таблицу истинности для логического выражения
Сервисы для вычисления таблиц истинности есть онлайн, прежде всего, на Вольфраме или вот здесь хороший js-сервис.
Так что напишем мы, конечно, велосипедик, для тех, кому нужно построение таблицы истинности для произвольного логического выражения именно в исходниках.
Вот как выглядит консольный интерфейс программы, также показан пример ввода выражения и результаты вывода:
Достаточно легко решить задачу с использованием обратной польской записи выражений, но мы хотим, чтобы юзер писал в нормальной инфиксной форме (см. функцию infix_to_suffix ).
Для экономичности разработки, везде для хранения данных применялись контейнеры STL.
Код не должен бояться тавтологий типа A&A&A , но в целом на совершенство не претендует, просто таких исходников в сети почти нет.
Код печатает немного отладочной инфы на тему CNF и DNF.
Также интересны в коде функции cls и pause , пытающиеся быть "универсальными" для Windows- и Unix-платформ.
Запускалось в консоли Visual Studio 2019, но должно работать и в версиях помладше, по крайней мере, с 2010-й.
Bonus. Маленькая прога ниже выводит просто "нули и единицы" для нужного количества разрядов (в примере 4), не самый оптимальный способ, зато без библиотек :)
Условные конструкции могут включать в себя:
Операции сравнения
Оператор проверки на равенство ==
Если операнды эквивалентны, то операция сравнения вернет значение true, если не равны - false.
Оператор проверки на неравенство !=
Если операнды не равны, то операция сравнения вернет значение true, если равны - false.
Оператор меньше
Вернет true, если первый операнд строго больше второго, в противном случае false.
Оператор больше равно >=
Вернет true, если первый операнд больше второго, или значения равны, в ином случае false.
Логические операции
Применяются для оперирования логическим типом данных bool, принимают в качестве аргументов и возвращают булевы значения. Обычно используются для объединения нескольких выражений со сравнением.
Оператор логического отрицания !
Отрицание (логическое не) – унарная операция, которая возвращает true при значении операнда false и false – когда значение на входе true.
Оператор логического сложения
Дизъюнкция (логическое или) – бинарная операция, которая вернет значение true, если один из операндов имеет значение true, в противном случае – false.
- | – полная дизъюнкция, вычисляет оба операнда, даже если первый равен true;
- || – сокращенное логическое сложение, если значение первого операнда true, то второй операнд не вычисляется.
Оператор логического умножения
Конъюнкция (логическое и) – бинарная операция, которая возвращает значение true, если оба операнда равняются true, в ином случае – false.
По аналогии с предыдущей операцией, логическое и поддерживает две формы записи:
- & – полная конъюнкция, вычисляет оба операнда, даже если первый - false;
- && – сокращенное логическое умножение, если первый операнд равен false, то второй - не вычисляется.
Для улучшения производительности выполнения программы, рекомендуется использовать сокращенные формы логических операций “и”(&&) и “или”(||).
Оператор логического сложения по модулю ^
Исключительная дизъюнкция (операция xor) – бинарная операция, которая вернет значение true, если операнды не равны, то есть один из них имеет значение true, а другой - false, в противном случае – false.
Логические операторы с присвоением
Их операндами могут быть:
- переменные и константы булевого типа;
- конструкции сравнения;
- логические выражения.
Логическое или с присвоением |=
Бинарный оператор, который присваивает левому операнду значение его дизъюнкции с правым:
Логическое и с присвоением &=
Бинарный оператор, который присваивает левому операнду значение его конъюнкции с правым:
Логическое исключительное или с присваивание ^=
Бинарный оператор, который присваивает левому операнду результат операции xor левого операнда с правым:
Приоритет выполнения операций
Приоритет | Оператор | Ассоциативность |
---|---|---|
1 | ! | левая* |
2 | , = | -//- |
3 | ==, != | -//- |
4 | & | -//- |
5 | ^ | -//- |
6 | | | -//- |
7 | && | -//- |
8 | || | -//- |
9 | &=, |=, ^= | правая** |
* Левая ассоциативность – операции выполняются слева направо.
** Правая ассоциативность – справа налево.
Как и в случае с арифметическими операциями, приоритет выполнения в сложных условных выражениях можно менять с помощью скобок – “(” и “)”.
Поразрядные операторы воздействуют на отдельные двоичные разряды (биты) своих операндов. Они определены только для целочисленных операндов, поэтому их нельзя применять к данным типа bool, float или double.
Эти операторы называются поразрядными, поскольку они служат для проверки, установки или сдвига двоичных разрядов, составляющих целое значение.
Оператор | Значение |
& | Поразрядное И |
| | Поразрядное ИЛИ |
^ | Поразрядное исключающее ИЛИ |
> | Сдвиг вправо |
~ | Дополнение до 1 (унарный оператор НЕ) |
Поразрядные операторы И, ИЛИ, исключающее ИЛИ и НЕ.
Поразрядные операторы выполняют те же функции, что и их логические аналоги. Но в отличие от логических операторов, поразрядные операторы действуют на уровне отдельных двоичных разрядов.
С точки зрения наиболее распространенного применения поразрядную операцию И можно рассматривать как способ подавления отдельных двоичных разрядов. Это означает, что если какой-нибудь бит в любом из операндов равен 0, то соответствующий бит результата будет сброшен в 0.
Поразрядный оператор ИЛИ может быть использован для установки отдельных двоичных разрядов. Если в 1 установлен какой-нибудь бит в любом из операндов этого оператора, то в 1 будет установлен и соответствующий бит в другом операнде.
Поразрядный оператор Исключающее ИЛИ устанавливает двоичный разряд операнда в том и только в том случае, если двоичные разряды сравниваемых операндов оказываются разными, как в приведенном ниже примере.
Унарный оператор НЕ заменяет в каждом разряде 1 на 0, а 0 на 1.
Для понимания вышесказанного, разберите следующие примеры:
Пример программы, использующей поразрядные операторы:
Результат:
Операторы сдвига
При сдвиге влево все двоичные разряды в указываемом значении сдвигаются на одну позицию влево, а младший разряд сбрасывается в нуль.
При сдвиге вправо все двоичные разряды в указываемом значении сдвигаются на одну позицию вправо. Если вправо сдвигается целое значение без знака, то старший разряд сбрасывается в нуль. А если вправо сдвигается целое значение со знаком, то разряд знака сохраняется.
Напомним, что для представления отрицательных чисел старший разряд целого числа устанавливается в 1.
Так, если сдвигаемое значение является отрицательным, то при каждом сдвиге вправо старший разряд числа устанавливается в 1.
А если сдвигаемое значение является положительным, то при каждом сдвиге вправо старший разряд числа сбрасывается в нуль.
При сдвиге влево и вправо крайние двоичные разряды теряются. Восстановить потерянные при сдвиге двоичные разряды нельзя, поскольку сдвиг в данном случае не является циклическим.
Результат:
Рассмотрим далее достаточно замысловатый тернарный (тройной) оператор, заимствованный еще из языка С, или точнее — из Алгола 60.
& | Логическое “И” (всегда обрабатываются оба операнда) |
&& | Логическое “И” (вычисляет второй операнд, если необходимо) |
| | Логическое “Или” (всегда обрабатываются оба операнда) |
|| | Логическое “Или” (вычисляет второй операнд, если необходимо) |
! | Логическое “Не” |
^ | Логическое исключающее “Или” |
Оператор &
Оператор & вычисляет логическое “И” для двух операндов. При этом вычисляет оба операнда независимо от результата вычисления первого операнда.
Для целочисленных переменных оператор & вычисляет побитовое логическое “И”.
Оператор &&
Оператор && вычисляет логическое “И” для двух операндов. При этом второй операнд вычисляется только в том случае, если первый операнд равен True .
Оператор |
Оператор | вычисляет логическое “Или” для двух операндов. При этом вычисляет оба операнда независимо от результата вычисления первого операнда.
Для целочисленных переменных оператор | вычисляет побитовое логическое “Или”.
Оператор ||
Оператор || вычисляет логическое “Или” для двух операндов. При этом второй операнд вычисляется только в том случае, если первый операнд равен False .
Оператор !
Унарный оператор ! производит логическое отрицание для своего операнда. Если операнд равен True , результатом вычисления операнда ! будет False и наоборот. Пример:
Оператор ^
Оператор ^ вычисляет логическое исключающее или для своих операндов.
Для целочисленных переменных оператор ^ вычисляет побитовое логическое исключающее “Или”.
Читайте также: