Как сделать таблицу истинности в си шарп

Добавил пользователь Alex
Обновлено: 04.10.2024

Блог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.

Для понимания вышесказанного, разберите следующие примеры:

Пример программы, использующей поразрядные операторы:

Результат:
2131

Операторы сдвига

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

При сдвиге вправо все двоичные разряды в указываемом значении сдвигаются на одну позицию вправо. Если вправо сдвигается целое значение без знака, то старший разряд сбрасывается в нуль. А если вправо сдвигается целое значение со знаком, то разряд знака сохраняется.

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

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

2132

Результат:

Рассмотрим далее достаточно замысловатый тернарный (тройной) оператор, заимствованный еще из языка С, или точнее — из Алгола 60.

& Логическое “И” (всегда обрабатываются оба операнда)
&& Логическое “И” (вычисляет второй операнд, если необходимо)
| Логическое “Или” (всегда обрабатываются оба операнда)
|| Логическое “Или” (вычисляет второй операнд, если необходимо)
! Логическое “Не”
^ Логическое исключающее “Или”

Оператор &

Оператор & вычисляет логическое “И” для двух операндов. При этом вычисляет оба операнда независимо от результата вычисления первого операнда.

Для целочисленных переменных оператор & вычисляет побитовое логическое “И”.

Оператор &&

Оператор && вычисляет логическое “И” для двух операндов. При этом второй операнд вычисляется только в том случае, если первый операнд равен True .

Оператор |

Оператор | вычисляет логическое “Или” для двух операндов. При этом вычисляет оба операнда независимо от результата вычисления первого операнда.

Для целочисленных переменных оператор | вычисляет побитовое логическое “Или”.

Оператор ||

Оператор || вычисляет логическое “Или” для двух операндов. При этом второй операнд вычисляется только в том случае, если первый операнд равен False .

Оператор !

Унарный оператор ! производит логическое отрицание для своего операнда. Если операнд равен True , результатом вычисления операнда ! будет False и наоборот. Пример:

Оператор ^

Оператор ^ вычисляет логическое исключающее или для своих операндов.

Для целочисленных переменных оператор ^ вычисляет побитовое логическое исключающее “Или”.

Читайте также: