Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Operacje logiczne na stringach
Forum PHP.pl > Forum > PHP
d4ng
Witajcie chciałbym się dowiedzieć w jaki sposób mogę wykonać działanie na stringach.

  1. $wynik = "5 + 2 - 3";
  2. echo $wynik; // wypisze nam 5 + 2 - 3 a chciałbym żeby pokazało się 4 czyli wynik działania
Turson
  1. $wynik = 5 + 2 - 3;
  2. echo $wynik;
Crozin
1. To są operacje arytmetyczne, nie logiczne.
2. Będziesz musiał zaprząc do tego albo jakiś parser/kompilator wyrażeń matematycznych albo mając na uwadze wszystkie potencjalne luki bezpieczeństwa skorzystać z evala by zadanie to zrzucić na parser PHP.
d4ng
na początku bardzo dziękuje za odpowiedź, jeżeli chodzi o bezpieczeństwo itp to jest to nie istotne. Może napisze co mam i co chce osiągnąć... mam tablice o zawartości:

  1. 5, +, 2, -, 3 , // wprowadzane liczby i znaki są losowe może być np 6, 3, - , 2, *, 4, +, 4 czyli 63 - 2 * 4 +4


całość sprowadziłem do stringu i usunałem separatory. Chciałbym aby teraz to co jest w stringu było działaniem... Ogółem kod mam napisać w innym języku programowania AS 3.0 ale php jest dla mnie bardziej zrozumiałem i później będę w stanie na podstawie manuala itp zrobic to dla AS 3.0 smile.gif

Może da się to też inaczej ugryźć zamiast podawać do tablicy tablica.push("6"); to może tablica.push(6); chyba wtedy wartość będzie liczbą a nie stringiem? niestety to nie działa w przypadku operatorów czyli tablica.push("+");
Wazniak96
Tak na szybkiego gdybyś nie mógł skorzystać z odpowiednika eval... dokończ sobie i rozpatrz przypadek liczb dwucyfrowych wink.gif

  1. <?php
  2.  
  3. $tab = array(5, "+", 2, "-", 3);
  4.  
  5. function oblicz($tab)
  6. {
  7. $sum = $tab[0];
  8. for($i = 1; $i < count($tab); $i = $i + 2)
  9. {
  10. if($tab[$i] == '+')
  11. $sum += $tab[$i+1];
  12. else if($tab[$i] == '-')
  13. $sum -= $tab[$i+1];
  14. //itd...
  15. }
  16. return $sum;
  17. }
  18.  
  19. echo oblicz($tab);
  20.  
vermis
Zapomiałeś o jednym szczególe, mianowicie kolejności wykonywania działań. Autor wspominał również o mnożeniu.
d4ng
wydaje mi się że zadanie jest w dosyć prosty sposób trudne... do tablizy można wprowadzić cyfry od 0-9 i podstawowe operatory + , - , / , x oraz np kropkę która ma tworzyć z dwóch elementów tablicy liczbę dziesiętną np 0 , . , 9 czyli 0.9 bądź 2 , . , 8 czyli 2.8 Ogółem to rodzaj kalkulatora z użyciem tablicy... Jeżeli macie inny pomysł na napisanie takiego kalkulatora w oparciu o tablice (wymóg) to jestem otwary, niniejszy pomysł na rozwiązanie jest mojego autorstwa i nie musi być dobry...
PrinceOfPersia
albo nieelegancki (ale prosty w zakodzeniu) eval, albo robisz sobie drzewko operacji, a potem przechodzisz przez to drzewko.
http://pl.wikipedia.org/wiki/Drzewo_(informatyka)

Kiedyś dla jaj zrobiłem kalkulator w Pythonie, to zrobiłem to w ten sposób, że każdy węzeł mógł być albo liczbą, albo znakiem operacji (np. plusem, minusem). Jeśli węzeł był plusem/minusem etc. to miał dwoje dzieci. Np.
2 + 4 * 6
rozpisywałem na:

Kod
      + (plus)
    /    \
   /      \
  2        * (razy)
          /    \
         /      \
        4       6

i potem przechodząc przez drzewo ( http://pl.wikipedia.org/wiki/Przechodzenie_drzewa ) ewaluowałem kolejne elementy, sprawdzając jaki jest symbol operacji w rodzicu (np. razy) i jakie są operandy (4 oraz 6), potem zliczałem i podmieniałem (zamiast węzła "razy" wsadzałem w drzewo wynik cząstkowy "24"), miałem coraz prostsze drzewo, a na końcu całe drzewo zostało bez gałęzi, zostawał sam wynik.

Coś takiego mi się udało wtedy wymyśleć, możliwe że można to też inaczej zrobić od strony algorytmu.
matix
Zadanie jest banalne:

http://edu.i-lo.tarnow.pl/inf/alg/001_search/0102.php

I po problemie.
com
chyba jedynym sensownym rozwiązaniem jest użycie http://pl.wikipedia.org/wiki/Odwrotna_notacja_polska
http://edu.i-lo.tarnow.pl/inf/utils/010_2010/0410.php
d4ng
Cytat(matix @ 24.01.2014, 17:49:50 ) *
Zadanie jest banalne:

http://edu.i-lo.tarnow.pl/inf/alg/001_search/0102.php

I po problemie.



Ciekawe rozwiązanie ale czuję że nie bardzo mi się sprawdzi ponieważ z ciągu np 3, 4, 5, +, 6, -, 3 wyłapuje liczby i znaki jeżeli natrafi na znak to pobiera ze stosu 2 ostatnie cyfry i wykonuje na nich operacje z wykrytym znakiem... A mój skrypt będzie musiał działac troche inaczej...

  1. $wynik = array(3, 4, 5, +, 6, -, 3 );
  2.  
  3. zamianaNaString($wynik); // $wynik = "345 + 6 - 3"
  4.  
  5. function kalkulator($wynik){
  6. // coś co rozłoży string i wykona oblioczenia
  7. }
  8. kalkulator(); // zwraca $wynik = 348;


to ma być klasyczny kalkulator, który pracuje na wprowadzonych wartościach. Jeżeli ktoś ma na to jakis pomysł to będe bardzo wdzieczny wink.gif
com
no to musisz zamieniać te pobrane wartości zgodnie z zasadza ONP smile.gif

Cytat
pobiera ze stosu 2 ostatnie cyfry

Nie może tak być bo jak podam 1,2,3,+,6,7,5,4,-,3 to Ci tak nie zadziała..
d4ng
hmm a jak moge zrobic taki licznik:


mam string

  1. $wynik = 234 + 23 - 5
  2.  
  3. i teraz licznik patrzy czy pierwszy znak to cyfra? tak (2) zapisuje do zmiennej $a i leci dalej... Czy kolejny znak to cyfra? tak (3) dopisuje do zmiennej $a (mamy już 23) leci dalej... Czy kolejny znak to cyfra? tak (4) dopisuje do zmiennej $a (234) leci dalej... Czy kolejny znak to cyfra? nie (+), Czy znowy pierwszy znak to cyfra? tak (2) zapisuje do zmiennej $b i leci dalej... Czy kolejny znak to cyfra? tak (3) dopisuje do zmiennej $b (mamy już 23) i leci tak aż do kolejnego znaku jak natrafi na jakiś to wtedy wykonuje działanie na zmiennej $a i $b z wykrytym po drodze znakiem. Wynik tego działania trafia do $a i licznik jedzie dalej


poza tym jak dopisywać a nie dodawać cyfry tak żaby były liczną a nie stringiem.. :/ Myśle że taki licznik będzie bardzo bliski kalkulatora, bo np. jezeli zrobimy działanie 2 +2 + 2 to na wyświetlaczu zobaczym kolejno 2 + 2 i jak klikniemy znowu + to pokaże nam 4 czyli wynik z poprzedniego działania

Ps. Com postaram się jakoś wgryźć w to ONP zakładam że na jego podstawie pisze sie 99% kalkulatorów? smile.gif
com
ONP to jest tylko sposób zapisu żeby nie trzeba było stosować () itd bo dzięki niemu zachowana jest kolejność wykonywania działa, a to jak to zaimplementujesz dalej to już zależy od Ciebie wink.gif
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.