Algorytm kolejności wykonywania działań

0

Witam. Potrzebuję metody, która przyjmie działanie, np: 2(4*-2-5^2) i obliczy je zgodnie z kolejnością wykonywania działań. Próbowałem już kilka razy, ale nie udało mi się nic wymyślić. Macie jakieś pomysły?

0

Podpowiedź: odwrotna notacja polska. Poszukaj w google jak działają kalkulatory oparte o ONP.

Pozdrawiam.

0

W ostateczności może się przydać. Zależy mi jednak na tym, żeby algorytm mógł podać tok rozumowania, tzn. dla działania 2+2*2 najpierw wykonał mnożenie i napisał w konsoli 2+4, a następnie dodał i podał wynik 6. Na początek zależy mi na wykonywaniu działań +, -, *, /, ^ oraz nawiasy. Krótko mówiąc - coś jak poolicz.pl. Ten algorytm jest mi potrzebny do kolejnej wersji programu EqualMath (www.xprogs.110mb.com).

0

No kolega przecież już napisał: Odwrotna Notacja Polska.

0

Kiedyś cus podobnego robiłem: http://www.2shared.com/file/2717776/a2a82ac8/rpnevaluator.html

Ps. Zawiera (chyba) nieudolne próby dokumentacji i zastosowania OOP ;p Jak by co to ostrzegałem!

0

Sznurek - sprawdzę. SebaZ - ONP nie pozwoli mi na wyświetlanie toku rozumowania w trakcie wykonywania obliczeń.

0

Jak nie? A ONP to w pętli wrzucanie na stos, po zdejmowaniu wyswietlasz co liczy i tyle

0

Popieram SebaZ, który popiera mnie :).

Cały trick z ONP polega na tym, że przez stos uzyskujesz kolejność wykonywania operacji. Oczywiście nie dostaniesz explicite całego działania z wynikami pośrednimi ALE... Ale przecież możesz stworzyć metodę, która wykona pojedyncze działanie zdejmując operator ze stosu a potem algorytmem odwrotnym do zapisywania stosu w ONP odtworzy resztę zapisu matematycznego. Poskutkuje to tym, że po każdym operatorze wartość wykonanej operacji będziesz miał obliczoną a resztę działania przepiszesz / wypiszesz czytając stos.

HTH

0

Jeżeli chcesz zapisywać wyrażenia w sposób infiksowy(np. "2*(4*-2-5^2)") i mieć kolejność działań, to najłatwiej użyć metody zejść rekurencyjnych.
http://en.wikipedia.org/wiki/Recursive_descent_parser (jest dobry przykład w C, który wprawdzie nic nie liczy, ale sprawdza poprawność wyrażenia)
http://www.engr.mun.ca/~theo/JavaCC-Tutorial/javacc-tutorial.pdf

Alternatywą(trudniejszą, ale dającą więcej możliwości(nie tylko wyrażenia, ale i cały język programowania)) jest któryś generator parserów http://catalog.compilertools.net/java.html

(ONP to w ogóle co innego, bo służy do obliczania czegoś takiego: "2 2 2 * +" i jest dobre do zabaw w podstawówce)

0

@previous poster,

ONP to sposób reprezentacji działania, dzięki której nie ma wątpliwości w jakiej kolejności powinny być wykonane poszczególne operacje.

Algorytm przejścia z działania zapisanego w postaci matematycznej do ONP (i w drugą stronę) jest prosty jak drut i dlatego nadaje się tutaj idealnie. Dość powiedzieć, że spory procent kalkulatorów korzysta z tego zapisu do obliczania wartości wyrażeń.

Zatem moja rada - wróć do podstawówki i naucz się tam raz jeszcze o co w ONP chodzi.

Pozdrawiam,

0

@__krzysiek85: Nie za bardzo potrafię to rozkminić (cóż, nie mam jeszcze dużego doświadczenia). Czy mógłbyś wstawić na forum kod prostej klasy, która pobiera działanie z konsoli i wypisuje jego wynik? Z resztą już sobie poradzę.

0

http://www.gamedev.pl/tutorials.php?x=category&id=32 Co prawda w C++, ale możesz się wzorować i/lub przepisać na Javę.

0

Niestety. Nie znam C++ na tyle dobrze żeby to skumać...

0

Nie musisz znać C++ żeby skumać - ważne czy rozumiesz czym jest programowanie. Większość poleceń jest taka sama, różni się może wielkością liter

0

nic nie umiem dzisiaj mialam kartkowke i dostalam 2 !!! jestem beznadziejna !! ;-( :-( :-[

1 użytkowników online, w tym zalogowanych: 0, gości: 1