równanie matematyczne, a konwersja Strina na Double

0

Witam mam pytanie czy jest możliwość zeby dany String np, "4+5*2" był traktowany jako double i od razu obliczany ,wiem że Double.parseDouble(String) zwraca wyjątek NumberFormatException
??

0

Z uzyciem standardowych bibliotek Javy - chyba nie. Ale na pewno sa gdzies do sciagniecia biblioteki do takich rzeczy ;]

0

Niedawno robiłem parser arytmetyczny, działający na wyrażeniach regularnych. Myślę, że powinieneś zrobić to w podobny sposób. Klasę, która potrafi obliczać takie wyrażenia pisze się naprawdę szybko. Jak będziesz miał problem to podrzucę Ci fragment kodu.

Można to też zrobić bez znajomości wyrażeń regularnych w zwykłym switchu.

0
El Wray napisał(a)

Niedawno robiłem parser arytmetyczny, działający na wyrażeniach regularnych. Myślę, że powinieneś zrobić to w podobny sposób. Klasę, która potrafi obliczać takie wyrażenia pisze się naprawdę szybko. Jak będziesz miał problem to podrzucę Ci fragment kodu.

Można to też zrobić bez znajomości wyrażeń regularnych w zwykłym switchu.

Jak możesz to podrzuć ten kod. Co do switcha to tak sposób dobry jak każdy inny tyle że problem pojawia się wtedy gdy w równaniu używam nawiasów i potęg

0

Aż takiego rozbudowanego z nawiasami to nie robiłem. Generalnie mój pomysł polegał na rozdzieleniu linii wejściowej na operatory i operandy. Kiedy mam tablicę operatorów i tablicę operandów spokojnie można wykonywać działania, uważając tylko, żeby nic się nie przesunęło. Trzeba też pomyśleć nad klasą, która zadba o konwersję operatorów, np.: "++" =="+"
"--" == "-" itp. Przynajmniej ja mam to tak zrobione. Co prawda definiowałem tylko podstawowe działania, ale z potęgą nie powinno być żadnego problemu. Z nawiasami też chyba nie, bo można to zrobić tak, że kiedy pojawiają się nawiasy trzeba po prostu obliczyć wyrażenie w nawiasach, umieścić wynik w operandach i usunąć nawiasy z tablicy operatorów. Na pierwszy rzut oka nie wydaje się to trudne, ale podczas pisania wychodzą problemy.

Kod do rozdzielania operatorów i operandów:

String parsujOperand = "[\\+\\*/-]";	//wyrażenie regularne parsujące liczby + - * /
String parsujOper  = "[^\\+\\*/-]";	//wyrażenie regularne parsujące operatory

liniaWej = liniaWej.replaceAll("\\s", ""); //opuść wszystkie białe znaki
String[] tabOperator = liniaWej.split(parsujOper);
String[] tabOperand = liniaWej.split(parsujOperand);

Dalej działania wykonuję w ten sposób, że pobieram operator z tablicy operatorów i dwie liczby z tablicy operandów i wykonuję działanie, którego wynik zamieszczam w jakiejś pamięci (zmiennej). Trzeba zadbać o to, żeby liczb było o jedną więcej niż operatorów, czyli np. jeśli ktoś poda ciąg: "-5+4*1" to tablica operatorów wygląda tak: {-, +, *}, a tablica operandów tak: {0, 5, 4, 1}.

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