Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.27;
Скачать: CL | DM;

Вниз

Польская инверсная запись   Найти похожие ветки 

 
den303 ©   (2005-11-02 17:24) [0]

Не подскажете ли, где найти рабочий код или часть кода, парсирующий арифметическое выражение в польскую инверсную запись. Срочно надо написать, а времени нету :o(


 
han_malign ©   (2005-11-02 18:02) [1]

Простенький курсовичок, на 1-2 часа работы и 10-20 строк кода, никто за тебя писать не будет...


 
Den303 ©   (2005-11-02 19:18) [2]

Спасибо большое.
Я и не сомневаюсь, что писать никто не будет, я спросил, есть ли готовый код/части кода. Штука довольно популярная, в ВУЗах задают, но поиск ничего не дал. Вдруг у кого завалялся?


 
Fay ©   (2005-11-02 20:19) [3]

Что это за ВУЗ такой? Имени Яндекса Гуглевича?


 
Kolan ©   (2005-11-02 20:39) [4]

Удалено модератором
Примечание: Личная переписка


 
wicked ©   (2005-11-02 22:32) [5]

ищи алгоритм Дийкстры (или Дейкстры, по разному пишут) - это его алгоритм....


 
xray   (2005-11-02 22:35) [6]

На сайте им. Кюри-Склодовской есть.


 
wicked ©   (2005-11-02 22:37) [7]

например, здесь есть:
http://algolist.manual.ru/syntax/revpn.php


 
DrPass ©   (2005-11-02 22:38) [8]


> wicked ©   (02.11.05 22:32) [5]

Мне казалось, что под алгоритмом Дейкстры в первую очередь подразумевают алгоритм поиска кратчайшего пути в графе


 
Kerk ©   (2005-11-02 22:39) [9]

Калькулятор. Демонстрирует преобразование выражения в обратную польскую запись (постфиксная форма) и вычисление его значения.

http://kladovka.net.ru/index.cgi?pid=list&rid=28


 
wicked ©   (2005-11-02 22:40) [10]

> DrPass ©   (02.11.05 22:38) [8]
а Дийкстра мужик шустрый был - успел засветиться в разных областях.... ;)
про графы знаю, но перевод инфиксной записи в постфиксную с помощью стека - тоже его....


 
Kerk ©   (2005-11-02 22:42) [11]

Den303 ©   (02.11.05 19:18) [2]
но поиск ничего не дал.


Врешь

http://www.yandex.ru/yandsearch?text=%EE%E1%F0%E0%F2%ED%E0%FF+%EF%EE%EB%FC%F1%EA%E0%FF+%E7%E0%EF%E8%F1%FC+Delphi&stype=w ww


 
DrPass ©   (2005-11-02 22:48) [12]


> wicked ©   (02.11.05 22:40) [10]

И правда... Ай, молодца :)


 
den303 ©   (2005-11-02 23:02) [13]


> [3] Fay ©   (02.11.05 20:19)

Самарский Аэрокосмический Универ.


> [4] Kolan ©   (02.11.05 20:39)

Большое спасибо, разбираюсь :o)


> [9] Kerk ©   (02.11.05 22:39)

Угу, тоже спасибо


> [11] Kerk ©   (02.11.05 22:42)

Да-а... Я что-то недосмотрел, запрс другой составил... Ну уж и соврать нельзя! :o)

Всем спасибо, обрабатываю данные


 
den303 ©   (2005-11-03 00:25) [14]

Тема закрыта
Спасибо всем отвечающим, код нашёл и немного переправил/отредактировал.
Выкладываю готовый код, вдруг кому понадобится (чтобы поиском не мучался :o))

type
 OperList=array of widestring;

var
 Stack:OperList;   //Stack
 AResult:OperList; //Tmp for result

implementation

function Prior(AOper:widestring):integer;
begin
{Приоритет операции:
 NOT - 8
 унарный "-" - 7
 "*", "/" - 6
 "+", "-" - 5
 ">", "<", "=",
 "<>", ">=",
 "<=" - 4
 "AND" - 3
 "OR" - 2
 "(", ")" - 1
 }
 AOper:=trim(AOper);
 result:=-1;
 if AOper="NOT" then Result:=8;
 if (AOper="*") or (AOper="/") then Result:=6;
 if (AOper="+") or (AOper="-") then Result:=5;
 if (AOper=">") or (AOper="<") or (AOper="<>") or (AOper=">=")
 or (AOper="<=") or (AOper="=") then Result:=4;
 if AOper="AND" then Result:= 3;
 if AOper="OR" then Result:=2;
 if (AOper="(") or (AOper=")") then Result:=1;
end;

procedure AddToStack(AOper:widestring);
begin
 {Добавление элемента в стек}
 SetLength(Stack,High(Stack)+2);
 Stack[High(Stack)]:=AOper;
end;

procedure AddToResult(AOper:widestring);
begin
 SetLength(AResult,High(AResult)+2);
 AResult[High(AResult)]:=AOper;
end;

function ConvertToRPN(AStr:OperList):OperList;
var
 i,k:integer;
begin
 {Конвертирование строку в Обратную Польскую Нотацию
 Возвращает - массив
 Алгоритм:
 а) если стек пуст, то опеpация из входной стpоки пеpеписывается в стек;
 б) опеpация выталкивает из стека все опеpации с большим или pавным
 пpиоpитетом в выходную стpоку;
 в) если очеpедной символ из исходной стpоки есть откpывающая скобка,
 то он пpоталкивается в стек;
 г) закpывающая кpуглая скобка выталкивает все опеpации из стека до
 ближайшей откpывающей скобки, сами скобки в выходную стpоку не
 пеpеписываются, а уничтожают дpуг дpуга.
 }
 Result:=nil;
 AResult:=nil;
 i:=0;
 while i<=High(AStr) do begin
   if Prior(AStr[i])=-1 then AddToResult(AStr[i])//Значит просто переменная
   else begin//Операции
     if High(Stack)=-1 then AddToStack(AStr[i]){a}
     else begin
       if AStr[i]="(" then AddToStack(AStr[i]){в}
       else begin
         if AStr[i]=")" then begin{г}
           k:=High(Stack);
           while (k>=0) and (Stack[k]<>"(") do begin
             AddToResult(Stack[k]);
             SetLength(Stack, High(Stack)); //Удаляем элемент из стека
             k:= k-1;
           end;
           //Удаляем открывающуюся скобку
           SetLength(Stack,High(Stack)); //Удаляем элемент из стека
         end
         else begin
           k:=High(Stack);
           while (k>=0) and (Prior(Stack[k])>=Prior(AStr[i])) do begin{б}
             AddToResult(Stack[k]);
             SetLength(Stack,high(Stack)); //Удаляем элемент из стека
             k:=k-1;
           end;
           AddToStack(AStr[i]); //Если не скобка просто добавляем в стек
         end;
       end;
     end;
   end;
   i:=i+1;
 end;
 //Сбрасываем все оставшееся из стека
 for i:=high(Stack) downto 0 do
   AddToResult(Stack[i]);
result:=AResult;
end;

{***использование***}
procedure TMainForm.BuildMenuClick(Sender: TObject);
var
 s,s1:widestring;
 tmp,rtmp:OperList;
 i:integer;
begin
 if check then begin
   s:=SourceEdit.Text;  //получение формулы из эдита
   Stack:=nil;
   AResult:=nil;
   tmp:=nil;
   rtmp:=nil;
   for i:=0 to Length(S) do begin
     SetLength(tmp,high(tmp)+2);
     tmp[high(tmp)]:=S[i];
   end;
   rtmp:=ConvertToRPN(tmp);
   s1:="";
   for i:=1 to High(rtmp) do
     s1:=s1+rtmp[i];
   FinalEdit.Text:=s1;  //заплнение эдита парсированной формулой
 end;
end;


 
NORDmen ©   (2005-11-03 00:37) [15]

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

вот до чего нельзя дойти самому - так это использование польской записи для символьного упрошения выражений, диффиренцирования и интегрирования.
в любом случае геморроя хватит :)
ищу в инете довольно давно подобное, безрезультатно :(
это довольно сложные алгоритмы, нет смысла каждому биться над ними, они должны быть freeware, но... нельзя отыскать. tparser нужно долго дорабатывать.


 
den303 ©   (2005-11-04 11:33) [16]


> [15] NORDmen ©   (03.11.05 00:37)

Полностью согласен! Разработать можно, но всё упирается во время. Неохота за достаточно небольшую сумму денег ещё и код 2 дня отлаживать, и алгоритмами голову забивать :o) А насчёт нужности данного алгоритма - в ВУЗах требуют частенько, правда как обычно, сдал - и забыл :o))



Страницы: 1 вся ветка

Текущий архив: 2005.11.27;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.025 c
2-1131828265
zxc
2005-11-12 23:44
2005.11.27
как рисовать на Tpanel?


14-1130934487
Del_programmer
2005-11-02 15:28
2005.11.27
МОБИЛЫ


14-1131453530
Priest
2005-11-08 15:38
2005.11.27
Подскажите интернет магазин


5-1112861007
TForm
2005-04-07 12:03
2005.11.27
Наследование свойств другого класса


4-1127657412
Ландграф Павел
2005-09-25 18:10
2005.11.27
Реакция окна программы на taskbar