Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

5 Stron V   1 2 3 > »   
Reply to this topicStart new topic
> [php] etapowe rozwiązywanie działań
1010
post 3.10.2006, 20:24:56
Post #1





Grupa: Zarejestrowani
Postów: 749
Pomógł: 37
Dołączył: 3.10.2006

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


Witam!
Potrzebuje napisać skrypt który będzie rozwiązywał działania i będzie przedstawiał etapy jego rozwiązania, np.
Podaje mu działanie:
6*4*(2/5+34-2*2)/2
a on wykonuje na nim operacje i zwraca mi takie coś:
6*4*(0,4+34-4)/2=
=6*4*34,4/2=
=24*34,4/2=
=24*17,2=
=417,6

Zdaję sobie z tego sprawę że to nie będzie proste zadanie, wiec prosze was o pomoc...

Jak się za taki skrypt zabrać?
Co proponujecie?

Ten post edytował 1010 3.10.2006, 20:25:38


--------------------
Go to the top of the page
+Quote Post
gszesiek
post 3.10.2006, 21:17:25
Post #2





Grupa: Zarejestrowani
Postów: 152
Pomógł: 1
Dołączył: 17.09.2006

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


nie jestem specjalistą od algorytmów, ale może podaj mu kolejność wykonywania zadań, niech po każdej czynności pokazuje wyniki

ponieważ nie znam dodatkowych funkcji to raczej zrobiłbym to w ten sposób:
traktował każdy znak osobno (może w tabelę)
no i if-owanie:
jeśli cyfra koło cyfry to liczba
jeśli nawias to szuka jego końca
jeśli jakiś znak to porównuje go z innymi czy ma być pierwszy czy później (znaki możesz kolejno ustawić w tablicy)
.....
(kurcze dużo zabawy :|, jak znajdziesz coś mądrego, albo wymyślisz, to podziel się tym)
powodzenia

Ten post edytował gszesiek 3.10.2006, 21:28:05


--------------------
Go to the top of the page
+Quote Post
1010
post 3.10.2006, 21:21:05
Post #3





Grupa: Zarejestrowani
Postów: 749
Pomógł: 37
Dołączył: 3.10.2006

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


hmm tylko jak mu ją podać... to wszystko chyba nie będzie takie proste...


--------------------
Go to the top of the page
+Quote Post
Gnomik
post 3.10.2006, 21:32:54
Post #4





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 10.09.2005
Skąd: Sosnowiec

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


Widzę to jako funkcję rekurencyjną, rozbijającą całość na coraz mniejsze elementy. Zawierałaby w sobie priorytet wykonywania działań i poczynając od nawiasów, kończąc na dodawaniu: wywoływałaby siebie dla coraz mniejszych elementów składowych całego wyrażenia. Na moje oko sprowadza się to do wyrażeń PEARowskich i operacji na łańcuchach.

Pozdrawiam,
Gnomik
Go to the top of the page
+Quote Post
1010
post 3.10.2006, 21:36:25
Post #5





Grupa: Zarejestrowani
Postów: 749
Pomógł: 37
Dołączył: 3.10.2006

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


Więc jak od strony teoretycznej proponujecie to wykonać? Jakoś tak dokładniej... ?


--------------------
Go to the top of the page
+Quote Post
Prph
post 3.10.2006, 21:36:27
Post #6





Grupa: Zarejestrowani
Postów: 338
Pomógł: 2
Dołączył: 4.03.2006
Skąd: Łódź

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


Takimi rzeczami zajmuje sie informatyka teoretyczna winksmiley.jpg A podobne schematy naleza do dzialan automatow. Tak - ja tez tyle zrozumialem po wykladach.

Nie dam sobie reki uciac, ale w PHP5. Zaawansowane programowanie z Helionu byl fragment o jakiejs bibliotece do automatow skonczonych. Nie mam jej przy sobie, ale moze w ktos z forumowiczow skojarzy.

Tak, czy inaczej - bez gotowych algorytmow, to nie jest proste.

Adrian.
Go to the top of the page
+Quote Post
1010
post 3.10.2006, 21:40:32
Post #7





Grupa: Zarejestrowani
Postów: 749
Pomógł: 37
Dołączył: 3.10.2006

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


Cytat
Tak, czy inaczej - bez gotowych algorytmow, to nie jest proste.

To akurat wiem... ale nie znaczy to że nie możliwe...

Krok po kroku powoli napewno da rade to zrobić...


--------------------
Go to the top of the page
+Quote Post
s_w_ir
post 3.10.2006, 21:40:48
Post #8





Grupa: Zarejestrowani
Postów: 315
Pomógł: 1
Dołączył: 6.08.2003
Skąd: Kielce

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


Na początku kilka pytań:
Czy to na pewno ma być w php(ważne!)?
Jak będzą wprowadzane działanie(<input ...>)?
Ile działań ma być obsługiwanych?
Jeśli jakieś inne niż 4 podstawowe to trzeba określić konwencje dla nich.

Ogólnie do zrobienia, ale trzeba wiedzieć te pare rzeczy.

Ten post edytował s_w_ir 3.10.2006, 21:41:21
Go to the top of the page
+Quote Post
1010
post 3.10.2006, 21:44:22
Post #9





Grupa: Zarejestrowani
Postów: 749
Pomógł: 37
Dołączył: 3.10.2006

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


Cytat(s_w_ir @ 3.10.2006, 22:40:48 ) *
Na początku kilka pytań:
Czy to na pewno ma być w php(ważne!)?
Jak będzą wprowadzane działanie(<input ...>)?
Ile działań ma być obsługiwanych?
Jeśli jakieś inne niż 4 podstawowe to trzeba określić konwencje dla nich.

Ogólnie do zrobienia, ale trzeba wiedzieć te pare rzeczy.


1. Tak, ma to być w php
2. Działania będą wprowadzane poprzez <imput type=text> albo jakiś textarea ale to już chyba nie ma większego znaczenia
3. Poza tymi podstawowymi myslałem jeszcze nad pierwiastkami 2 i 3 stopnia, z tym że nie wiem jak je oznaczać w działaniu.


--------------------
Go to the top of the page
+Quote Post
Gnomik
post 3.10.2006, 21:51:26
Post #10





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 10.09.2005
Skąd: Sosnowiec

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


Bardzo uproszczony algorytm:

1. Wykryj obecnosc nawiasu (zawsze nadrzędnego w stosunku do reszty)
2. Jeśli stwierdzono w tej czesci obecnosc dodawania (+/-), rozdziel na lewą i prawą stronę
3. Sprawdź mnożenie i dzielenie - rozbij na lewą i prawą stronę

Oczywiście jeśli którykolwiek z tych punktów jest prawdziwy, wróć do punktu 1 i powtórz kroki dla wyciętego fragmentu.
Go to the top of the page
+Quote Post
s_w_ir
post 3.10.2006, 22:01:45
Post #11





Grupa: Zarejestrowani
Postów: 315
Pomógł: 1
Dołączył: 6.08.2003
Skąd: Kielce

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


Hmm no to dalej jedziemy teorią, plan algorytmu:
0.Możemy potraktować wszystko jako string o ile php się nie uprze i tego za szybko nie wyliczy.
1.Szukamy wyrażenia ograniczenego nawiasami, uwzględniając wielkrotne nawiasy.
Jeśli się udało, to w odnaleziony ciągu powtarzamy 1 pkt do czasu gdy nie będzi już wyrażeń w nawiasach. 2.Operujemy na otrzymanym ciągu wykoując dziłania wedle priorytetów(pierwiastek, mnożenie/dzielenie,dodawanie/odejmowanie), wyświetlając po każdym wykonanym priorytecie wynik działania, czyli jeśli mamy np.: (8*5*6) to od razu otrzymamy z tego 240.
2 pkt powtarzamy aż do czasu gdy zostnie nam z danego nawiasu tylko jedna liczba(wynik).

Co do samego algorytmu to 1pkt regexpy, 2pkt regexpy smile.gif

Można się też bawić w stosy, czyli tak jak to naprawde jest liczone, tyle że wtedy możemy stracić możliwość wypisywania pośrednich wyników działań, a przynajmniej będzie trudniej.

Ten post edytował s_w_ir 3.10.2006, 22:03:37
Go to the top of the page
+Quote Post
1010
post 3.10.2006, 22:06:03
Post #12





Grupa: Zarejestrowani
Postów: 749
Pomógł: 37
Dołączył: 3.10.2006

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


odnosnie tych nawiasów...
Kiedy już znajde że jest nawias... zapisuje sobie jego zawartosc do jakiejs zmiennej i w niej szukam dalej nawiasow.. itd? jak nazywac te zmienne, co robic ze zmienna gdzie mam cale rownanie, wstawiac jakies "X" czy coś?


--------------------
Go to the top of the page
+Quote Post
Gnomik
post 3.10.2006, 22:09:19
Post #13





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 10.09.2005
Skąd: Sosnowiec

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


Tutaj chyba z pomocą przyjdą wyrażenia PEAR'a. Ten temat jest dla mnie niestety jeszcze troszkę śliski, ale polecam się z nim zapoznać - bo chyba to będzie rozwiązaniem problemu z nawiasami. Nie ma sensu lecieć znak po znaku sprawdzając czy to jest nawias czy nie, jak można generalnie zwrócić wszystko co jest pomiędzy znakami ( ... ), [ ... ] czy jakichś innych (zupełnie jak w templatesach).
Go to the top of the page
+Quote Post
s_w_ir
post 3.10.2006, 22:13:03
Post #14





Grupa: Zarejestrowani
Postów: 315
Pomógł: 1
Dołączył: 6.08.2003
Skąd: Kielce

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


Cytat
Kiedy już znajde że jest nawias... zapisuje sobie jego zawartosc do jakiejs zmiennej i w niej szukam dalej nawiasow.. itd?

Rekurencja Panie, rekurencja smile.gif Miejmy nadzije że obejdzie się bez ładowania tego w zmienne, ale jak coś mamy tablice(t[1],t[2]...)
Cytat
co robic ze zmienna gdzie mam cale rownanie, wstawiac jakies "X" czy coś?

Można by oznaczyć X fragment na którym aktualnie pracujemy żeby potem łatwo wstawić tam ostatni wyliczony fragment działania. Można też zapisywać pozycje od lewej początka i końca miejsca na którym operujemy.

Nie bawiłbym się w nawiasy [ i ( a tylko w ( gdyż łatwiej zapisać działanie,a róznorodnymi nawiasami ograniczmy się do np. 3 zagłębień.

Ten post edytował s_w_ir 3.10.2006, 22:15:55
Go to the top of the page
+Quote Post
1010
post 3.10.2006, 22:13:27
Post #15





Grupa: Zarejestrowani
Postów: 749
Pomógł: 37
Dołączył: 3.10.2006

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


Tak czy siak coś z tym wyciągnietym nawiasem trzeba zrobić.


--------------------
Go to the top of the page
+Quote Post
Gnomik
post 3.10.2006, 22:33:05
Post #16





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 10.09.2005
Skąd: Sosnowiec

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


  1. <?php
  2. function rekmat($wyrazenie)
  3. {
  4. if(/*wyrazenie PEARa*/) rekmat(/*wyrazenie PEARa*/);
  5. else
  6. {
  7. if(strpos($wyrazenie, '-')!=0)
  8. {
  9. $strony = explode('-', $wyrazenie);
  10. rekmat($strony[0]);
  11. rekmat($strony[1]);
  12. }
  13. elseif(strpos($wyrazenie, '+')!=0)
  14. {
  15. $strony = explode('+', $wyrazenie);
  16. rekmat($strony[0]);
  17. rekmat($strony[1]);
  18. }
  19. else
  20. {
  21. if(strpos($wyrazenie, '/')!=0)
  22. {
  23. $strony = explode('/', $wyrazenie);
  24. rekmat($strony[0]);
  25. rekmat($strony[1]);
  26. }
  27. elseif(strpos($wyrazenie, '*')!=0)
  28. {
  29. $strony = explode('*', $wyrazenie);
  30. rekmat($strony[0]);
  31. rekmat($strony[1]);
  32. }
  33. }
  34. }
  35. }
  36.  
  37. ?>


To jest mniej więcej (bardziej mniej niż więcej) zapis zagłębiania sie w wyrażenie. Nie zawiera przeliczeń ani wyświetlania, ale to już kosmetyka...

W przypadku gdy bierzemy pod uwagę nawiasy [ ( {, stosowanie PEARa ma sens... Jeśli zostajemy przy samych ( to nie widze innego wyjścia niż krok po kroku sprawdzanie który ) zamyka nasz pierwszy (. To tez nie problem w sumie.

Pozdrawiam,
Gnomik
Go to the top of the page
+Quote Post
1010
post 4.10.2006, 14:00:40
Post #17





Grupa: Zarejestrowani
Postów: 749
Pomógł: 37
Dołączył: 3.10.2006

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


ooo.. Dzięki bardzo za kod... Dziś po południu przeanalizuje go sobie... no i będę pracował dalej... potem przejdziemy do działań i predstawiania tego ładnie...

Pozdrawiam

Przeanalizowałem sobie tak ten kod... i musze zapytać
Gdzie tu jest jakis fragment uwzględniający jakieś nawiasy albo coś?


--------------------
Go to the top of the page
+Quote Post
Gnomik
post 4.10.2006, 14:38:35
Post #18





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 10.09.2005
Skąd: Sosnowiec

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


Tutaj worriedsmiley.gif :
  1. <?php
  2. if( /*wyrazenie PEARa*/ ) rekmat( /*wyrazenie PEARa*/ );
  3. ?>

Tak jak pisałem wczesniej - wyrażenia regularne to dla mnie bardzo śliski grunt.

  1. <?php
  2. if(preg_match("/(.*)", $wyrazenie)!=0) {  // a najlepiej ==1 
  3. $nawiasy = preg_split("/(.*)", $wyrazenie);
  4. rekmat($nawiasy[0]);
  5. }
  6. ?>

Tyle tylko że " /\(.*\) " niestety nie bierze pod uwagę wielu ewentualności, np. preg_split dla (4*5)-(5/2) zwróci 4*5)-(5-2 (oczywiście po odchudzeniu go z pierwszego i ostatniego znaku czyli ( ) )

Nad tym trzeba by pomyśleć. No i warunki lepiej powstawiać w tym kodzie (chyba sam if a nie elseif lepiej się sprawdzi...). Narazie jestem w pracy i nic nie mogę tutaj zrobić, ale jak wróce do domu to spróbuję napisac pełny kod tego czegoś... smile.gif

Pozdrawiam serdecznie,
Gnomik
Go to the top of the page
+Quote Post
eai
post 4.10.2006, 15:31:23
Post #19





Grupa: Zarejestrowani
Postów: 367
Pomógł: 10
Dołączył: 20.05.2005

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


Jeśli działania będą proste czyli tylko znaki + - * / [ () ]
to można zrobić to etapowo. Bez wyrażeń regularnych się nie obejdzie.

1. Na początek jeśli występują nawiasy () [] liczysz ich ilość otwarte/zamkniete zeby sie wszystko zgadzalo
2. Potem wbierasz nawiasy w których nie ma innych nawiasów i wykonujesz działania mnożenia, dzielenia, i tyle przepisujesz reszte
3. Jeśli w nawiasie wszystko wymnozyles a sa jeszcze znaki + - to wykonujesz działania i przepisujesz reszte
4. Opuszczasz nawiasy gdzie nie ma juz znakow matematycznych
5. Wykonujesz dzialania teraz znowu mnozenia przepisujesz
6. Wykonujesz + -
i masz wynik

Teoretycznie tak to by wygladalo. I zaminiaj przecinki na kropki.

Trudne to nie jest, raczej czasochłonne przy robieniu funkcji parsującej.
Go to the top of the page
+Quote Post
1010
post 4.10.2006, 15:36:32
Post #20





Grupa: Zarejestrowani
Postów: 749
Pomógł: 37
Dołączył: 3.10.2006

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


Cytat(eai @ 4.10.2006, 16:31:23 ) *
3. Jeśli w nawiasie wszystko wymnozyles a sa jeszcze znaki + - to wykonujesz działania i przepisujesz reszte

A co jeśli wynikiem jest liczba ujemna?
Trzeba ją zapisywać wtedy cały czas w nawiasie i zaczynają sie małe problemy...


--------------------
Go to the top of the page
+Quote Post

5 Stron V   1 2 3 > » 
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: 20.07.2025 - 09:23