Использование польской нотации. Доказать эквивалентность логических формул - 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");
Объяснение кода листинга программы
- Переменные
c
,c1
,c2
инициализируются значением0
. - Программа считывает лексемы из консоли с помощью функции
get_token()
. - Если считанная лексема равна
0
или1
, она добавляется в стекf
. - Если считанная лексема равна
~
, то из стекаf
удаляется последний элемент (или верхний, в терминологии стеков), и если он равен0
, то его значение меняется на1
, иначе на0
. Затем новое значение добавляется обратно в стек. - Если считанная лексема равна
|
или&
, то из стекаf
удаляются два последних элемента (или два верхних элемента), и если хотя бы один из них равен255
, то программа выдает ошибку. Затем выполняется операция по схемеИ
илиИЛИ
соответственно, и результат добавляется обратно в стек. - Если считанная лексема не равна
0
,1
,|
или&
, то программа выдает ошибку. - После окончания цикла, из стека
f
удаляется последний элемент (или верхний), и если он равен255
, или стек пуст, то программа выдает ошибку. - Если стек не пуст, то его последний элемент (или верхний) присваивается переменной
c
. - Если
c
равен255
или стек не пуст, то программа выдает ошибку. - В зависимости от значения
c
, выводится сообщениеtrue
илиfalse
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д