![]() |
![]() ![]() |
![]() |
![]() ![]()
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 -------------------- |
|
|
![]()
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 -------------------- |
|
|
![]()
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...
-------------------- |
|
|
![]()
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 |
|
|
![]()
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... ?
-------------------- |
|
|
![]()
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
![]() 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. |
|
|
![]()
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ć... -------------------- |
|
|
![]()
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 |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 749 Pomógł: 37 Dołączył: 3.10.2006 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. 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. -------------------- |
|
|
![]()
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. |
|
|
![]()
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 ![]() 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 |
|
|
![]()
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ś? -------------------- |
|
|
![]()
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).
|
|
|
![]()
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 ![]() 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 |
|
|
![]()
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ć.
-------------------- |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 10.09.2005 Skąd: Sosnowiec Ostrzeżenie: (0%) ![]() ![]() |
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 |
|
|
![]()
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ś? -------------------- |
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 10.09.2005 Skąd: Sosnowiec Ostrzeżenie: (0%) ![]() ![]() |
Tutaj
![]()
Tak jak pisałem wczesniej - wyrażenia regularne to dla mnie bardzo śliski grunt.
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ś... ![]() Pozdrawiam serdecznie, Gnomik |
|
|
![]()
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. |
|
|
![]()
Post
#20
|
|
![]() Grupa: Zarejestrowani Postów: 749 Pomógł: 37 Dołączył: 3.10.2006 Ostrzeżenie: (0%) ![]() ![]() |
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... -------------------- |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 20.07.2025 - 09:23 |