Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на языке Pascal


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

lamed
Статус: Профессор
Рейтинг: 3196
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2516
∙ повысить рейтинг »
Орловский Дмитрий
Статус: Профессор
Рейтинг: 2471
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Pascal (Паскаль)

Номер выпуска:1133
Дата выхода:26.10.2010, 23:00
Администратор рассылки:Boriss (Академик)
Подписчиков / экспертов:190 / 183
Вопросов / ответов:1 / 1

Вопрос № 180302: Дорогие эксперты! Помогите разработать модуль, способный находить значение формулы(представленной в нормальной форме) на данной интерпретации, и разработать на его основе программу, способную считывать формулу логики высказываний в одной из норма...



Вопрос № 180302:

Дорогие эксперты!
Помогите разработать модуль, способный находить значение формулы(представленной в нормальной форме) на данной интерпретации, и разработать на его основе программу, способную считывать формулу логики высказываний в одной из нормальных форм(по выбору пользователя) и находить её значение.

Отправлен: 13.10.2010, 04:55
Вопрос задал: Юдин Евгений Сергеевич (1-й класс)
Всего ответов: 1
Страница вопроса »


Отвечает 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 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFPRO.RU, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.22 от 18.10.2010

    В избранное