Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [klasa]Parser wyrażeń matematycznych
shinuexx
post 29.12.2011, 20:44:08
Post #1





Grupa: Zarejestrowani
Postów: 78
Pomógł: 9
Dołączył: 2.02.2011
Skąd: undefined

Ostrzeżenie: (0%)
-----


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:)

Ten post edytował shinuexx 30.12.2011, 19:36:02
Go to the top of the page
+Quote Post
wookieb
post 29.12.2011, 20:53:34
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




No a gdzie on?


--------------------
Go to the top of the page
+Quote Post
Fifi209
post 10.03.2012, 11:15:13
Post #3





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


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ą.



--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
shinuexx
post 10.03.2012, 20:08:53
Post #4





Grupa: Zarejestrowani
Postów: 78
Pomógł: 9
Dołączył: 2.02.2011
Skąd: undefined

Ostrzeżenie: (0%)
-----


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??
Go to the top of the page
+Quote Post
Fifi209
post 11.03.2012, 11:31:56
Post #5





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


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)


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
shinuexx
post 12.03.2012, 00:40:56
Post #6





Grupa: Zarejestrowani
Postów: 78
Pomógł: 9
Dołączył: 2.02.2011
Skąd: undefined

Ostrzeżenie: (0%)
-----


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ą?
Go to the top of the page
+Quote Post
Fifi209
post 12.03.2012, 15:51:58
Post #7





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Tak byłoby chyba bardziej odpowiednio wink.gif


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
shinuexx
post 13.03.2012, 00:04:27
Post #8





Grupa: Zarejestrowani
Postów: 78
Pomógł: 9
Dołączył: 2.02.2011
Skąd: undefined

Ostrzeżenie: (0%)
-----


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:)

Ten post edytował shinuexx 12.03.2012, 23:57:22
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.06.2024 - 11:15