Форум: "Потрепаться";
Текущий архив: 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.014 c