Witam
W ramach ćwiczeń z javą piszę string calculator.
Funkcja przyjmuje trzy argumenty: cyfra operator cyfra, np dwa plus trzy - i powinna zwrócić 5.
Postanowiłem użyć tablic asocjacyjnych (HashMap) dla cyfr.
Mam natomiast problem z operatorem, tzn jak string plus zamienić na operację - chciałem coś ciekawszego niż case, ale niezbyt trudnego (skomplikowanego) na początek. Jakieś pomysły na rozwiązanie ?
ONP
A co mi da odwrotna notacja ?
np: dwa trzy plus
W moim przypadku chyba jedynie zmienia kolejność argumentów przyjmowanych z linii poleceń. Przez to operator pobieram z trzeciego a nie z drugiego argumentu. Ten program będzie przyjmował tylko trzy argumenty więc nie wiem czy to się przyda. Poza tym głównie chodziło mi o to, że mam już stringa "plus" czy "minus", już po sprawdzeniu czy jest poprawny ... i tu się zaciąłem, jak string plus "zamienić" na operację dodawania jak to jest w przypadku cyfr gdzie mam HashMap <String, Integer> i np dla stringa zero mam parę "zero",0. Mogę tą cyfrę wyciągnąć i używać jako wartości a nie napisu. Szukam właśnie czegoś podobnego do tego dla podstawowych operacji + - * /
Witam
Gdyby ten kalkulator miał być napisany w jakimś języku, w którym istnieje funkcja eval
( np. w
języku PERL ), to nie byłoby problemu. Można byłoby poszczególne wyrażenia ( operacje dodawania, odejmowania, itp. ) zapisać jako łańcuchy w tablicy asocjacyjnej, a tablicę tę indeksować symbolami poszczególnych operatorów. Jeśli chodzi o implementację funkcji eval
w Javie, to proponuję następujące linki :
http://mindprod.com/jgloss/eval.html
http://www.webdeveloper.com/forum/showthread.php?t=94854
http://www.coderanch.com/t/391737/java/java/Equivalent-eval-function-java
Pozdrawiam
JK
Po co pchać do tego eval
? Nie lepiej zrobić tablicę wskaźników na funkcję/delegatów (nie wiem co tam w Javie jest)?
Możesz stworzyć interfejs Operator z metodą eval(a, b), a potem mapę String -> Operator w już oczywisty sposób:
put("+", new Operator(){ eval(a, b) {return a + b;} }
itd., jako że w Javie nie ma referencji do funkcji.
i tu się zaciąłem, jak string plus "zamienić" na operację dodawania
switch (rodzaj_operacji)
{
case dodawanie : return a + b;
case odejmowanie : return a - b;
case mnozenie : return a * b;
case dzielenie : return a / b;
}
czy w jakim tam języku to piszesz.