Вопрос № 180302: Дорогие эксперты! Помогите разработать модуль, способный находить значение формулы(представленной в нормальной форме) на данной интерпретации, и разработать на его основе программу, способную считывать формулу логики высказываний в одной из норма...
Вопрос № 180302:
Дорогие эксперты! Помогите разработать модуль, способный находить значение формулы(представленной в нормальной форме) на данной интерпретации, и разработать на его основе программу, способную считывать формулу логики высказываний в одной из нормальных форм(по выбору пользователя) и находить её значение.
Отвечает lamed (Профессор) :
Здравствуйте, Юдин Евгений Сергеевич! Код в приложении. ABC
Программа обрабатывает строки не более, чем с 10-ю переменными. Переменные обозначаются строчными буквами латинского алфавита. Используется обратная польская запись. Обозначения: дизъюнкция + конъюнкция * отрицание ~
При разработке использованы примеры Брайана Кернигана & Денниса Ритчи, Кловиса Тондо & Скотта Гимпела, а также идеи Эллиота Мендельсона.
Код:
program main; const MAXVAL=100; TotalRows = 1024; type TBit = 0..1;
var MaxLetter: integer; MaxRow : integer; letters : array[char] of integer; cond : array[1..TotalRows, 1..26] of TBit;<
br> var vals : array[1..MAXVAL] of TBit; sp : integer; ctype : char; variable: array['a'..'z'] of TBit;
function bit(x: word; n: integer): TBit; begin bit := (x shr n ) and 1; end;
procedure CreateTable(s: string); var len : integer; used: set of char; i,j : integer; num : word; c : char; begin len := length(s); used := [];
for c:= 'a' to 'z' do letters[c] := 0;
for i:= 1 to len do if (s[i] in ['a'..'z']) then used := used+[s[i]];
MaxLetter:= 0; for c:= 'a' to 'z' do if (c in used) then begin inc(MaxLetter); letters[c] := MaxLetter; end;
MaxRow := 1 shl MaxLetter; num:= 0; for j:= 1 to MaxRow do begin for i:= 1 to MaxLetter do cond[j, i]:= 1-bit(num, i-1); in
c(num); end; end;
procedure push(f: TBit); begin if (sp<=MAXVAL) then begin vals[sp]:=f; sp := sp+1; end else writeln('error stack full'); end; { push }
function pop: TBit; begin if (sp>1) then begin dec(sp); pop := vals[sp]; end else begin writeln('error stack empty'); pop := 0; end; end; { pop }
function getop(var s:
string): char; var i: integer; begin i:= 1; while (s[i]=' ') do inc(i); getop := s[i]; delete(s,1,i); end; { getop }
procedure CalcBool(s: string; var b: TBit; var code: integer); begin s:= trim(s); if (s<>'') then begin repeat ctype := getop(s); case ctype of '0','1': push(ord(ctype)-ord('0'));
'+': push(pop() or pop()); '*': push(pop() and pop()); '~': push(1-pop()); else begin if ctype in ['a'..'z'] then push(variable[ctype]) else begin writeln('error: unknown command ', s); code:=1; halt; end;
end; end; until s=''; b:= pop(); code := 0; end else code:= -1; end; { process }
var s : string; i, j : integer; c : char; code : integer; F : TBit; begin write('Ваша строка '); readln(s);
CreateTable(s); sp := 1; for j:= 1 to MaxRow do for c:= 'a' to 'z' do begin if
letters[c]>0 then variable[c]:= cond[j,letters[c]]; CalcBool(s, F, code); cond[j, MaxLetter+1]:=F; end;
// Печать результата write(' ':3); for c:= 'a' to 'z' do if letters[c]>0 then write(c:3); writeln('F=':4, s);
for j:= 1 to MaxRow do begin write(j: 3); for i:= 1 to MaxLetter+1 do write(cond[j,i]: 3); writeln; end; end.
Примеры работы
Код:
Ваша строка c c ~ + c F=c c ~ + 1 1 1 2 0 1 Ваша строка a b * a b ~ * + a b F=a b * a b ~ * + 1 1 1 1 2 0 1 0 3 1 0 1 4 0 0 0
Недостатки. 1. Не модуль 2. Не самая лучшая реализация 3.
Нет перевода из инфиксной в постфиксную нотацию 4. Мало "гонял" последний вариант
Достоинства: работает (кажется :) Вопросы в мини-форум или на пейджер. Удачи!
Ответ отправил: lamed (Профессор)
Ответ отправлен: 21.10.2010, 21:53
Номер ответа: 263586
Оценка ответа: 5 Комментарий к оценке: Отлично проделана работа!
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 263586
на номер 1151 (Россия) |
Еще номера »
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.