Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.019 c
1-1130705369
ArchValentin
2005-10-30 23:49
2005.11.27
Прозрачный TEdit


2-1131269307
Максим
2005-11-06 12:28
2005.11.27
Существование файла


2-1131828265
zxc
2005-11-12 23:44
2005.11.27
как рисовать на Tpanel?


14-1130476574
JohnKorsh
2005-10-28 09:16
2005.11.27
Как работать с RxTrayIcon?


14-1131377741
DiamondShark
2005-11-07 18:35
2005.11.27
Net 2.0 и все-все-все





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский