Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Operacje logiczne na stringach
d4ng
post 23.01.2014, 20:51:35
Post #1





Grupa: Zarejestrowani
Postów: 191
Pomógł: 4
Dołączył: 7.03.2010

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


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 13)
Turson
post 23.01.2014, 21:06:18
Post #2





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


  1. $wynik = 5 + 2 - 3;
  2. echo $wynik;
Go to the top of the page
+Quote Post
Crozin
post 23.01.2014, 21:27:55
Post #3





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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.
Go to the top of the page
+Quote Post
d4ng
post 23.01.2014, 23:25:29
Post #4





Grupa: Zarejestrowani
Postów: 191
Pomógł: 4
Dołączył: 7.03.2010

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


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("+");

Ten post edytował d4ng 23.01.2014, 23:45:14
Go to the top of the page
+Quote Post
Wazniak96
post 24.01.2014, 00:34:23
Post #5





Grupa: Zarejestrowani
Postów: 550
Pomógł: 75
Dołączył: 5.06.2012
Skąd: Lębork

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


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.  
Go to the top of the page
+Quote Post
vermis
post 24.01.2014, 00:41:45
Post #6





Grupa: Zarejestrowani
Postów: 279
Pomógł: 56
Dołączył: 3.06.2010
Skąd: Tarnowskie Góry

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


Zapomiałeś o jednym szczególe, mianowicie kolejności wykonywania działań. Autor wspominał również o mnożeniu.


--------------------
Go to the top of the page
+Quote Post
d4ng
post 24.01.2014, 08:02:53
Post #7





Grupa: Zarejestrowani
Postów: 191
Pomógł: 4
Dołączył: 7.03.2010

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


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...
Go to the top of the page
+Quote Post
PrinceOfPersia
post 24.01.2014, 16:01:31
Post #8





Grupa: Zarejestrowani
Postów: 717
Pomógł: 120
Dołączył: 18.04.2009

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


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.

Ten post edytował PrinceOfPersia 24.01.2014, 16:03:36


--------------------
Go to the top of the page
+Quote Post
matix
post 24.01.2014, 17:49:50
Post #9





Grupa: Zarejestrowani
Postów: 278
Pomógł: 10
Dołączył: 13.02.2007
Skąd: Rybnik

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


Zadanie jest banalne:

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

I po problemie.


--------------------
Nawet, jeżeli nie jesteś zainteresowany usługami IT ani outsourcingiem, a Twoją pasją jest programowanie - zobacz naszą stronę. Piszemy dużo fajnych use-caseów, jak podchodzimy do tematu programowania dla naszych klientów. A tak na co dzień tworzymy budujemy mvp oraz tworzymy platformę b2b.
Go to the top of the page
+Quote Post
com
post 24.01.2014, 18:31:37
Post #10





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


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
Go to the top of the page
+Quote Post
d4ng
post 25.01.2014, 16:34:28
Post #11





Grupa: Zarejestrowani
Postów: 191
Pomógł: 4
Dołączył: 7.03.2010

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


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

Ten post edytował d4ng 25.01.2014, 16:41:43
Go to the top of the page
+Quote Post
com
post 25.01.2014, 16:43:29
Post #12





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


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

Ten post edytował com 25.01.2014, 16:43:47
Go to the top of the page
+Quote Post
d4ng
post 25.01.2014, 16:53:06
Post #13





Grupa: Zarejestrowani
Postów: 191
Pomógł: 4
Dołączył: 7.03.2010

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


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

Ten post edytował d4ng 25.01.2014, 17:01:49
Go to the top of the page
+Quote Post
com
post 25.01.2014, 17:45:46
Post #14





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


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
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: 24.07.2025 - 21:53