Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [klasa]Parser wyrażeń matematycznych
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
shinuexx
Zrobiłem dla własnych potrzeb parser wyrażeń matematycznych (na razie niezbyt skomplikowanych), którym posługuję się w swoim ggbocie. Można deklarować w nim własne zmienne i operować na nich wedle potrzeb. Obsługuje także podstawowe jednoargumentowe (jak na razie) funkcje matematyczne. Są to moje początki w tworzeniu klas, więc proszę o wyrozumiałość. W razie jakiś pytań bądź błędów proszę pisać, będę w miarę możliwości odpisywał.

mexp class

Sposób użycia:
  1. // 1
  2. $t=new mexp("pi^pi");
  3. $r=$t->result();
  4. // 2
  5. $t=new mexp("a+b*c",array("a"=>10,"b"=>2,"c"=>sin(10)));
  6. $r=$t->result();
  7. // 3 blad skladniowy
  8. $t=new mexp("(34-(312+(9*(-1)$)))");
  9. $r=$t->result();

Wynik:
Kod
//1
r=36.462159607208;
//2
r=8.9119577782213;
//3
r=false;
($t->display_error())
(34-(312+(9*(-1)$)))
                |  
SYNTAX ERROR: Invalid operator '$' at position '17'


DODANO:
A za wcześnie się mnie zapisz wcisnęło i po chwili wyedytowałem:)
wookieb
No a gdzie on?
Fifi209
Po 1. Brakuje mi method chaining

Po 2. np. to
  1. private function str2array($str){
  2. $out=array();
  3. for($x=0;$x<strlen($str);$x++)
  4. $out[]=substr($str,$x,1);
  5. return $out;
  6. }


str_split

Cytat
* @return boolean/number $result - wynik wyrażenia, w przypadku niepowodzenia 'false'

Nie, nie ucz się takiego zwracania. Ma zwrócić wynik lub rzucić błędem/wyjątkiem (zależnie od sytuacji)

Cytat
* mexp::count() - obliczenie wartosci wyrazenia w formacie RPN

W php jest funkcja count więc nie używaj tej nazwy.

  1. private function factorial($n){
  2. if($n==0||$n==1)
  3. return 1;
  4. return $n*self::factorial($n-1);
  5. }

Przecież factorial nie jest statyczną metodą.

shinuexx
Ad 1.
Wydaje mi się że mogę dodać tylko do addVar();
Ad 2.
Fakt;P Całkowicie nie zauważyłem tej funkcji:]

A co do błędów. To myślałem nad tym aby zrobić to wyjątkami ale wtedy trochę utrudniłoby to mój zamysł. Mianowicie chciałem aby można to było łatwo zaimplementować gdziekolwiek indziej. To na co zwróciłeś uwagę to błąd składni bądź wynik wyrażenia, co nie wiem czy można nazwać wyjątkiem. Nie miałem tutaj innego pomysłu jak wyświetlić położenie błędu w czytelny dla użytkownika końcowego sposób.

Factorial chciałem aby można było także używać poza obiektem. Wystarczyło by mi tutaj tylko dodanie static do deklaracji??
Fifi209
Cytat(shinuexx @ 10.03.2012, 20:08:53 ) *
Ad 1.
Wydaje mi się że mogę dodać tylko do addVar();

I to miałem na myśli akurat ;d

Cytat(shinuexx @ 10.03.2012, 20:08:53 ) *
Factorial chciałem aby można było także używać poza obiektem. Wystarczyło by mi tutaj tylko dodanie static do deklaracji??

Tak, chyba że chciałbyś używać poza klasą, to wtedy zmieniasz private na public wink.gif

Co do błędów:
Po prostu w klasie zrób sobie miejsce gdzie będziesz trzymał tablicę z błędami, zrób metody do generowania (wpisywania do tablicy) i zwracania błędów (np. zwykły return poprzedniej tablicy, tylko już z przeparsowanym tekstem)
shinuexx
Czy dobrze rozumiem. Metoda zwraca wynik bądź w razie błędu treść błędu generowaną przez inną metodę? Przy okazji wewnątrz obiektu trzymam zmienne/zmienną z nr błędu, pozycją i wartością?
Fifi209
Tak byłoby chyba bardziej odpowiednio wink.gif
shinuexx
Więc, poprawiona wersja klasy
mexp.class.php
Używanie jak poprzednio z tym że metoda mexp::result() zwraca wynik bądź treść błędu.


Dodatkowo dodałem możliwość określenia dokładność z jaką ma być wyświetlony wynik. Standardowo $scale = 4.

Poza tym dzięki za zainteresowanie:)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.