Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] etapowe rozwiązywanie działań
Forum PHP.pl > Forum > PHP
Stron: 1, 2
mike
~cicik kozaków Cu u nas dostatek.
Skoro wiesz to wal śmiało tongue.gif
W końcu gdyby było tak jak mówisz to trzeba byłoby zamknąć to forum, przecież każdy wie wszystko, łącznie z Tobą.
No chyba że nie jesteś programistą.

Jak nie wiesz to nie nabijaj głupich postów, bo nic nie wnosisz swoją wypowiedzią.
cicik
Cytat(mike_mech @ 6.10.2006, 14:43:23 ) *
Jak nie wiesz to nie nabijaj głupich postów, bo nic nie wnosisz swoją wypowiedzią.


Chciałem tylko koledze dać do zrozumienia, że kilka postów wcześniej w tym wątku własnoręcznie opisałem jak rozwiązać jego problem.
1010
Ok... Myślę że sobie poradzę. Teraz jednak skupiam się nad tym pierwszym algorytmem...

I mam do was pierwsze pytanie...

jak mam w zmiennej $wyrazenie takie cos:
  1. <?php
  2. $wyrazenie = "4+6*7+(43+5)";
  3. ?>

to jak mam zrobić żeby zrobic z tego tablice, kazdy element osobno?
mike
Cytat(1010 @ 6.10.2006, 17:38:35 ) *
  1. <?php
  2. $wyrazenie = "4+6*7+(43+5)";
  3. ?>

to jak mam zrobić żeby zrobic z tego tablice, kazdy element osobno?

Może daj coś w tym stylu:
  1. <?php
  2.  
  3. //  4+6*7+(43+5)
  4.  
  5. $arrStatement = array(
  6. '+' => array(
  7. 4,
  8. '*' => array(
  9. 6, 7
  10. ),
  11. '+' => array(
  12. 43, 5
  13. )
  14. )
  15.  )
  16.  
  17. ?>


Wtedy możesz to bardzo latwo policzyć dzieki rekurencji, zbierając poszczególne wyniki od końca do góry.
1010
Ale mi chodziło o to żeby ostrzymaną zmianną zamienić na tablice a nie te działanie co podałem... W zmiennej może być każde inne działanie...
1010
nie rozumiem...

weź pod uwagę że jeden element to nie jest zawsze jeden znak...
gszesiek
to pobieraj kolejne elementy i if'uj smile.gif
if ( $a - cyfra ) {
pobierz $b
if ( $b - cyfra ) {
pobierz $c // tu raczej zapętlić
}
połącz jako całość i zapisz w pomocniczej tabeli jako jeden element
}
else {
zapisz w pomocniczej tabeli jako jeden element
}
(nie żeby to było łatwe, szybkie i .... )

-----------------------------------------------
chcesz mieć każdy element osobno w tablicy
w przybliżeniu to kod winksmiley.jpg
Kod
1. sprawdzasz z ilu znaków składa się zmienna $dlug
for ( $i = 0; $<=$dlug; $i ++) {
    if ( $wyrazenie[$i] - cyfra ) {
        while ( $wyrazenie[$i] - cyfra ) {
            $pomoc .= $wyrazenie[$i]
            $i ++;
        }
        $n_wyrazenie[] = $pomoc;
    }
    else {
        $n_wyrazenie[] = $wyrazenie[$i]
    }
}
1010
Nie rozumiem...
mike
Cytat(1010 @ 6.10.2006, 17:56:01 ) *
Ale mi chodziło o to żeby ostrzymaną zmianną zamienić na tablice a nie te działanie co podałem... W zmiennej może być każde inne działanie...

No ok, rozumiem.
Ty podałes przykład to i ja podałem przykład jak miałoby to wyglądać.

Cytat(1010 @ 6.10.2006, 18:06:11 ) *
weź pod uwagę że jeden element to nie jest zawsze jeden znak...

Każde działanie jest zawsze operacją na dwóch argumentach więc nie ma żadnej róznicy.
A żeby wyłuskać elementy musisz przeparsować wyrażenie, czyli przecztać znk po znaku i zlozyć z tego tablicę.
1010
Ok już rozumiem....
A jak się nazywała funkcja która ze zmiennej tworzy tablice (każdy znak - osobny element)?
gszesiek
string możesz traktować jak tablicę
echo $wyrażenie[1];
1010
Stworzyłem funkcje któa tworzy tablice $wejscie.

Oto ona:
  1. <?php
  2. $ilosc_znakow = strlen($wyrazenie);
  3.  
  4.  function typ($co)
  5.  {
  6. if(preg_match("/[0-9]/", $co)==true || $co=='.')
  7. {
  8.  $typ = "cyfra";
  9. }
  10. else
  11. {
  12.  $typ = "x";
  13. }
  14. return $typ;
  15.  }
  16.  
  17.  for ($i=0; $i<$ilosc_znakow; $i++)
  18.  {
  19. $do_tablicy = "";
  20. if(typ($wyrazenie[$i])=='cyfra')
  21. {
  22.  while(typ($wyrazenie[$i])=='cyfra')
  23.  {
  24. $do_tablicy .= $wyrazenie[$i];
  25. $i++;
  26.  }
  27.  $wejscie[] = $do_tablicy;
  28.  if (typ($wyrazenie[$i])!='cyfra')
  29.  {
  30. $wejscie[] = $wyrazenie[$i];
  31.  }
  32. }
  33. else
  34. {
  35.  $wejscie[] = $wyrazenie[$i];
  36. }
  37.  }
  38. ?>


Co myślicie o niej? Co można w niej przerobić/uprościć/zoptymalizować?



I mam jeszcze jedno pytanie... Jak z tablicy wyciąc jedne element? Tzn mam np tablice
  1. <?php
  2. $cos = array("a", "b", "c");
  3. ?>

czyli mamy tak:
  1. <?php
  2. $cos[0] //a
  3. $cos[1] //b
  4. $cos[2] //c
  5. ?>

i chce wyciac element np b tak zebym mial:
  1. <?php
  2. $cos[0] //a
  3. $cos[1] //c
  4. ?>

Z góry dzięki za odpowiedź
Turgon
unsetujesz $cos[1] tylko pamietaj ! Licznik sie przesuwa...
1010
Ok. Jeden konwerter mam już gotowy. Nie wklejam narazie kodu żeby nie robić syfu na forum.

Teraz będę się zabierał za odwrotny knwerter... Jak będę miał jakieś pytania to oczywiście napisze...

Dziękuje już wam bardzo za pomoc...
gszesiek
a kiedy będzier rozwiązywał problem z przecinkiem np: 1+2,5 ?
może wstaw do tej funkcji
1010
Już mam ten problem rozwiązany. Funkcją str_replace zamieniam wszystkie przecinki na kropki, i traktuje je normalnie jako cyfry...

Właśnie skończyłem pisać drugi konwerter... Na jednym moim przykładzie działa bardzo dobrze... Niestety nie wiem skąd mógłbym wziąć więcej przykładów żebym mógł sprawdzić moje konwertery dokładnie... tak aby później nie było przykrych niespodzianek.



Ma ktoś funkcję która wykona potęgowanie liczby a do potęgi b?

Mam funkcję która wykonuję odwrotną notację polską (aż do wyniku). I teraz jak z tego skryptu zrobić żeby w tablicy $etap jako każdy element był jeden etap rozwiązania działania w onp?

Oto kon funkcji
  1. <?
  2. function onp($wyjscie)
  3. {
  4.  $ile = count($wyjscie);
  5.  
  6.  for($i=0; $i<$ile; $i++)
  7.  {
  8. if (preg_match("/[0-9]+/", $wyjscie[$i])==true)
  9. {
  10.  //jezeli liczba zapisujemy do stosu...
  11.  $stos[] = $wyjscie[$i];
  12. }
  13. else
  14. {
  15.  //jezeli operator to wykonujemy dzialanie na dwoch ostatnich elementach stosu
  16.  $ile_stos = count($stos);
  17.  $ile_stos--;
  18.  
  19.  $ile_stos2 = $ile_stos-1;
  20.  
  21.  $element1 = $stos[$ile_stos2];
  22.  $element2 = $stos[$ile_stos];
  23.  
  24.  unset($stos[$ile_stos]);
  25.  unset($stos[$ile_stos2]);
  26.  
  27.  $stos = array_merge($stos);
  28.  
  29.  if ($wyjscie[$i]=="+")
  30.  {
  31. $element = $element1+$element2;
  32.  }
  33.  elseif($wyjscie[$i]=="-")
  34.  {
  35. $element = $element1-$element2;
  36.  }
  37.  elseif($wyjscie[$i]=="*")
  38.  {
  39. $element = $element1*$element2;
  40.  }
  41.  elseif($wyjscie[$i]=="/")
  42.  {
  43. $element = $element1/$element2;
  44.  }
  45.  elseif($wyjscie[$i]=="^")
  46.  {
  47. //tu nalezy zastosowac funkcje potegi...
  48.  }
  49.  $stos[] = $element;
  50. }
  51.  }
  52.  return $stos;
  53. }
  54. ?>
cadavre
  1. <?php
  2. function augmentation($liczba,$wykladnik) {
  3. if ($wykladnik<0) {
  4. $liczba = 1/$liczba;
  5. $wykladnik = 0 - $wykladnik;
  6. }
  7. if ($wykladnik==0) {
  8. return (int)1;
  9. }
  10. $wynikowa = $liczba;
  11. for ($i=1;$wykladnik>$i;$i++) {
  12. $wynikowa = $wynikowa * $liczba;
  13. }
  14. return $wynikowa;
  15. }
  16. ?>


Gdy już napiszesz gotową funkcje, podzielisz się nią? winksmiley.jpg

A tak BTW to:
  1. <?php
  2. pow($x,$y)
  3. ?>
1010
o jakaą funkcje ci chodzi?

Kto ma jeszcze pomysł kal z tymi etapami zrobic?
cadavre
%? biggrin.gif

Tą, którą piszesz - do etapowego rozwiązywania zadań.
1010
Jak skończe to zobaczymy... O ile skończe...

Trzeba by cały ten skrypt zrobić "idioto odporny". Czyli żeby spawdzał na wszystkie możliwe kombinacje czy sprypt jest prawidłowy... i teraz tak...
Co trzeba sprawdzić?



Chciałbym do algorytmu dołożyć możliwość wstawiania pierwiastków. I mam kilka pytań.
Jak użytkownik miałby wpisywać pierwiastki?
Jak liczyć pierwiastki?
mike
2^2 - dwa do potęgi drugiej
2^(1/2) - pierwiastek drugiego stopnia z dwóch
1010
A jak proponujesz wpisywanie pierwiastkow dla uzytkownikow? Tak żeby mieli prościej?
mike
Cytat(1010 @ 8.10.2006, 20:04:25 ) *
A jak proponujesz wpisywanie pierwiastkow dla uzytkownikow?
Cytat(mike_mech @ 8.10.2006, 19:23:24 ) *
2^(1/2) - pierwiastek drugiego stopnia z dwóch



Cytat(1010 @ 8.10.2006, 20:04:25 ) *
Tak żeby mieli prościej?
Pierwiastek to nic innego jak potęga więc to chyba najprostszy sposób.
1010
okej... tak to zrobie...

Jakie rzeczy musze sprawdzać przy tym czy użytkownik wpisal wyrazenie dobrze?
Objasniajcie najlepiej zaraz jak to zrobic

Ja wymyśliłem narazie to:
- sprawdzać czy użytkownik nie wpisał litery. Pobieramy każdy znak z osobna, jeżeli litera to wyrzucamy ją ze stringu, to samo robimy z enterami wprowadzonymi w textarea, znakami "=".
- wyrazeniem regularnym szukam czesgoś w stylu ...2(3434... i w miejsce przed nawias wstawiam znak "*"...

To narazie wszystko co przyszło mi do głowy. A wy macie jeszcze jakies propozycje...

----------------------------------------------------------------------------------------
Po edycji: 14 października 2006
----------------------------------------------------------------------------------------

Mam problem... Gdy w kalkulator mój wpisze wyrażenie takie:
4^-2 to sie wszystko sypie (w tej onp)
i zwraca mi takie cos:

^4-2=
=0-2=
=-2

Jak takiemu czemuś zaradzić?

dodam że wpisując 4^(-2) tez nie dziala i zwraca cos takiego:
()^(4-2)=
=^2=
=0

Kalkulator jest już dostępny pod www.policz.net więc możecie zobaczyć sami...

Co na to poradzić? Z góry dzięki za pomoc...
cicik
Cytat(1010 @ 14.10.2006, 21:42:13 ) *
Mam problem... Gdy w kalkulator mój wpisze wyrażenie takie:
4^-2 to sie wszystko sypie (w tej onp)
i zwraca mi takie cos:

^4-2=
=0-2=
=-2

Jak takiemu czemuś zaradzić?


Twój problem polega na tym, ze - jest jednoczesnie operatorem dwu i jednoargumentowym.
Zamien 4^-2 na 4^(0-2) i w ten sposob - bedzie tylko dwuragumentowy co rozwiazuje Twoj problem. Po takiej konwersji bedzie juz liczyl dobrze.

Generalnie musisz zamieniac -x na (0-x) - koniecznie pamietaj o nawiasach bo operatory jednoargumentowe maja wiekszy priorytet niz dwuargumentowe wiec po konwersji musi to byc zachowane.
1010
Rozwiązanie działania: 4^(0-2)
()^(4-2)=
=^2=
=0

chyba nie...
cicik
Cytat(1010 @ 14.10.2006, 22:12:16 ) *
chyba nie...


No to cos popsules.
Po przekonwertowaniu do ONP 4 ^ (0 - 2) = 4 0 2 - ^

4 0 2 - ^ = 4 -2 ^ = 1/16
1010
Yyy bo z tego co zauważyłem sypie się też przy
Rozwiązanie działania: 4*(-2)
()*(4-2)=
=*2=
=0
i problem jest chyba w tym ze jak ma juz w nawiasie sama ujemna liczbe to dalej minus bierze jako operator a nie zalicza tego razem z liczba jako liczbę ujemna... czyli negacje...
cicik
Cytat(1010 @ 14.10.2006, 22:23:33 ) *
i problem jest chyba w tym ze jak ma juz w nawiasie sama ujemna liczbe to dalej minus bierze jako operator a nie zalicza tego razem z liczba jako liczbę ujemna... czyli negacje...


to popraw :-)
1010
tylko jak to poprawic?
cicik
Cytat(1010 @ 14.10.2006, 22:26:36 ) *
tylko jak to poprawic?


Zrob sobie klase Stos.
Klase abstrakcyjna ElementStosu.
Niech dziedzicza po niej dwie klasy - Operator i Argument
Klasa stros niech ma dwie metody:
public function poloz(ElementStosu $element) oraz
public function zdejmij();
W trn sposob bedziesz mogl na stos klasc liczby ujemne.
1010
Zastanawiam się dlaczego takie coś działa:
Cytat
Rozwiązanie działania: 2*(2-4)
2*(2-4)=
=2*-2=
=-4

a takie cos nie:
Cytat
Rozwiązanie działania: 2*(0-2)
()*(2-2)=
=*0=
=0
cicik
Cytat(1010 @ 14.10.2006, 22:46:21 ) *
Zastanawiam się dlaczego takie coś działa:

a takie cos nie:


Nie wiem - nie wejde do srodka Twojego programu.
1010
Zauważyłem że przy zamianie na onp pomija tak jakby zero... co jest duzym bledem
cicik
Cytat(1010 @ 14.10.2006, 22:52:13 ) *
Zauważyłem że przy zamianie na onp pomija tak jakby zero... co jest duzym bledem


No to popraw, nie musisz chyba na forum pisac o kazdym bledzie :-)
1010
Kiedy zamienia na onp to sprawdza kazdy znak co to jest... i jak liczba to sprawdza czy nastepna to tez liczba... i teraz problem ze jak do zmiennej dopisze zero to on to uznaje jako nic... jak zrobic zeby zero poprostu bylo zerem?

--------------------------------------------------------------------------------

Sorka że takie głupie pytanie... Już to rozwiązałem... teraz musze zaraz na początku wszystkie nawiasy typu (-2) zamieniać na (0-2)...

Jak się domyślam potrzebne będzie do tego wyrażenie regularne... Niestety z wyrażeń regularnych nie jestem za dobry...
Jakie to by musiałobyć wyrażenie?
cicik
Cytat(1010 @ 14.10.2006, 23:11:07 ) *
Jak się domyślam potrzebne będzie do tego wyrażenie regularne... Niestety z wyrażeń regularnych nie jestem za dobry...
Jakie to by musiałobyć wyrażenie?


Jak zrobisz to wyrazeniem regularnym to ci skrypt zwolni.
I tak przejezdzasz calego stringa znak po znaku. Wiec jesli natrafisz na - przed ktorym nie ma cyfry to dodajesz na stos 0 jako pierwszy argument minusa.
1010
Ok już działa. Dzięki...

dodam jeszcze ze musialem skorzystac z funkcji do wykonania ujemnych poteg... bez problemu gotowa znalazlem w manualu (pierwszy komentarz przy funkcji pow()winksmiley.jpg

  1. <?php
  2. function newpow($base, $power)
  3. {
  4.  if ($power < 0) {
  5. $npower = $power - $power - $power;
  6. return 1 / pow($base, $npower);
  7.  }
  8.  else
  9.  {
  10.  return pow($base, $power);
  11. }
  12. }
  13. ?>

Pozdrawiam
cicik
Cytat(1010 @ 15.10.2006, 18:21:05 ) *
$npower = $power - $power - $power;


buahahah
Przepraszam za ten brak zwiazku z tematem ale jakos nie moglem...
Ta linijka kodu jest rodem z asemblera Maszyny W (kojarzy ktos?).
Tak sie tam zamienialo na liczbe przeciwna.
1010
I co to ma do rzeczy?
cicik
Cytat(1010 @ 15.10.2006, 19:45:10 ) *
I co to ma do rzeczy?


hmm:

  1. <?php
  2. $npower = -$power;
  3. ?>
1010
Nom, z tym że jaka to różnica... biggrin.gif Skopiowałem gotowy przykład więc nie widze powodu go zmieniać...

Ale zmienie... tak w sumie jest bardziej czytelnie...

Pozdro

a jak na początku wyrzucić wszystkie odstępy?
Aztech
Pewnie będzie zjebka od modów za oftop ale co tam biggrin.gif
<<offtop mode begin>>
Człowieku - pomyśl, przeanalizuj, przedebuguj a nie wpisujesz se tutaj wszystkie swoje przemyślenia, jak masz ciągoty do pisania to se bloga załóż i tam smaruj każdą myśl.
Od siebie poradzę Ci pewną sprawdzoną metodę:
- ołówek
- kartka
- diagram UML
- pomyślunek
- narysowanie klas
- a na samym szarym końcu implementacja
Amen
<<offtop mode end>>
cicik
Cytat(1010 @ 15.10.2006, 20:31:31 ) *
Nom, z tym że jaka to różnica... biggrin.gif Skopiowałem gotowy przykład więc nie widze powodu go zmieniać...


Kwestia stylu.
Wszystko co się robi można robić w dobrym albo złym stylu.
Przy każdej rzeczy za którą się człowiek zabiera powinno być obecne MYŚLENIE.
Tak się w sumie zastanawiam czy Twój skrypt powstał tylko z gotowych fragmentów kodu posklejanych do kupy, czy może jednak coś tam napisałeś swojego. Bo momentami zadajesz pytania, które kwalifikują się do rozwiązania w zdrowym rozsądku.

P.S.
Już to kiedyś napisałem i dalej podtrzymuję:
Nie każdy powinien brać się za pisanie programów.
Pewnie też na mnie moderatorzy nakrzyczą ale nie sposób się niezgodzić z Aztechem.

Jeszcze jedna rzecz.
Moi prowadzący mają w zwyczaju podczas testowania programu walić dłońmi o klawiaturę w celu wpisania losowego ciągu znaków. Jak program się zachowa poprawnie to czasem zaliczają :-).

Oto przykład z policz.net

Rozwiązanie działania: fhiudsayt86tqw4 fdsfjdjf
()f()h()i()u()d()s()a()y()t()t()q()w() ()f()d()s()f()j()d()j86f4=
=()f()h()i()u()d()s()a()y()t()t()q()w() ()f()d()s()f()j()dj=
=()f()h()i()u()d()s()a()y()t()t()q()w() ()f()d()s()f()jd=
=()f()h()i()u()d()s()a()y()t()t()q()w() ()f()d()s()fj=
=()f()h()i()u()d()s()a()y()t()t()q()w() ()f()d()sf=
=()f()h()i()u()d()s()a()y()t()t()q()w() ()f()ds=
=()f()h()i()u()d()s()a()y()t()t()q()w() ()fd=
=()f()h()i()u()d()s()a()y()t()t()q()w() f=
=()f()h()i()u()d()s()a()y()t()t()q()w =
=()f()h()i()u()d()s()a()y()t()t()qw=
=()f()h()i()u()d()s()a()y()t()tq=
=()f()h()i()u()d()s()a()y()tt=
=()f()h()i()u()d()s()a()yt=
=()f()h()i()u()d()s()ay=
=()f()h()i()u()d()sa=
=()f()h()i()u()ds=
=()f()h()i()ud=
=()f()h()iu=
=()f()hi=
=()fh=
=f=
=

i drugi, bardziej liczbowy:

Rozwiązanie działania: 4+*8/3^56*(234^
()+()*(()((4*8/3^56)^234)=
=()+()*(()((32/3^56)^234)=
=()+()*(()((32/5.23347633027E+26)^234)=
=()+()*(()(6.11448260784E-26^234)=
=()+()*(()=
=()+*=
=+=
=

Przydałaby Ci się jakaś gramatyka formalna, któa sprawdzałaby czy wpisane wyrażenie jest działaniem.
Pamiętaj, o tym, że jeżeli przy jakimś polu pisze, że należy w nie pisać liczbę to prędzej czy później (zazwyczaj prędzej) znajdzie się ktoś kto wpisze tam literę.
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-2025 Invision Power Services, Inc.