Использование польской нотации. Доказать эквивалентность логических формул - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Мне нужно доказать эквивалентность логических формул,т е после применения всех операций в первом и втором выражениях,я должен получить одинаковые чиселки и там,и там=) Видимо мне нужно пользоваться двумя стеками и обратной польской записью.Я думаю,что нужно прочитывать стек,находить там первую операцию,вытаскивать две предыдущие логические формулы и производить эту операцию. В моем случае логические операции-это логические "и","или" и "не",а значение логических формул-это 0 и 1. Ну вот,типо написал функции и,или и не,
#include <stdio.h>
 
/*
int and(int a,b,c){//коньюнкция
if (a==1)&&(b==1){
c=1;}
else c=0;
}*/
/*
int or(int a,b,c){//дизъюнкция
if (a==1)   || (b==1){
c=1;}
else c=0;
}*/
/*int not(int a){//отрицание
if a==1{
a=0;}
else a=1;
}*/
и в виду собственной чайникообразности,не знаю что делать дальше. Подскажите пожалуйста=)

Решение задачи: «Использование польской нотации. Доказать эквивалентность логических формул»

textual
Листинг программы
char c,c1,c2;
/*get_token() - из консоли считывает лексему,
возвращает 0-false,1-true,&-and,|-or,~-not,что-то другое-ошибка
(эту функцию написать надо)
*/
while((c=get_token())!=255)
{
if(c==0 || c==1) push(f,c);
else if(c=='~')
{
c1=pop(f);
if(c1==255) ошибка, выходим
if(c1==0) c1=1;
else c1=0;
push(f,c1);
}
else if(c=='|' || c=='&')
{
c1=pop(f);
c2=pop(f);
if(c1==255 || c2==255) ошибка, выходим
char cr;
if(c=='&')
{
if(c1 && c2) cr=1;
else cr=0;
} else {
if(c1 || c2) cr=1;
else cr=0;
}
push(f,cr);
}
}
char c;
c=pop(f);
if(c==255 || f.size!=0) ошибка
printf("ответ:%s",(c==0)?"false\n","true\n");

Объяснение кода листинга программы

  1. Переменные c, c1, c2 инициализируются значением 0.
  2. Программа считывает лексемы из консоли с помощью функции get_token().
  3. Если считанная лексема равна 0 или 1, она добавляется в стек f.
  4. Если считанная лексема равна ~, то из стека f удаляется последний элемент (или верхний, в терминологии стеков), и если он равен 0, то его значение меняется на 1, иначе на 0. Затем новое значение добавляется обратно в стек.
  5. Если считанная лексема равна | или &, то из стека f удаляются два последних элемента (или два верхних элемента), и если хотя бы один из них равен 255, то программа выдает ошибку. Затем выполняется операция по схеме И или ИЛИ соответственно, и результат добавляется обратно в стек.
  6. Если считанная лексема не равна 0, 1, | или &, то программа выдает ошибку.
  7. После окончания цикла, из стека f удаляется последний элемент (или верхний), и если он равен 255, или стек пуст, то программа выдает ошибку.
  8. Если стек не пуст, то его последний элемент (или верхний) присваивается переменной c.
  9. Если c равен 255 или стек не пуст, то программа выдает ошибку.
  10. В зависимости от значения c, выводится сообщение true или false.

ИИ поможет Вам:


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

Оцени полезность:

7   голосов , оценка 3.857 из 5
Похожие ответы