ďťż

Ładny brzuch

Jak zrobić coś takiego żeby program liczył np .coś takiego : 3+x=5*2 i oczywiście to ja wpisuje co po lewej str. a co po prawej stronie.

cifek



no jedyny sposob to parser uwzgledniajacy nawiasy itp

FreeBSD r0x'uje

GG: 2175556
www.cepa.end.pl

FreeBSD cepa.gskgonet.com.pl 5.0-RELEASE FreeBSD 5.0-RELEASE #0: Fri Apr 23 22:28:52 CEST 2004 cepa@cepa.gskgonet.com.pl:/usr/src/sys/i386/compile/JAJKO i386

Na tym przykłądzie widać bardzo dobrze, jak dużo pracy trzeba włożyć w program do rozwiązania pozornie prostego problemu.

Kol. cepa napisał, że potrzebny jest parser, co jest poniekąd błędem. Zgodnie z przyjętą terminologią parserem możemy co najwyżej sprawdzić poprawność zapisu względem określonych regół. Oczywiście niektóre mechanizmy parsingu znajdą zastosowanie w rozwiązaniu problemu, ale trudno mówić o nim w trakcie obliczeń.

Nad rozwiązywaniem takich problemów głowili się już twórcy pierwszych kompilatorów (a dysponowali ogromną wiedzą z zakresu matematyki). Współcześnie problem rozwiązują pakiety w stylu MatLaba.

Jeśli koniecznie musisz sam napisać taki program to metod jest kilka, z tym, że wszystkie dosyć podobne - poszukaj w sieci bo problem jest zbyt rozległy, aby opisywać rozwiązania tutaj. Jednak rada: jeśli skrót ONP nic Ci nie mówi, a stos kojarzy Ci się z paleniem czarownic to o ile nie jesteś baaaaaardzo ambitny: odpuść sobie. ;)

Wy nie wiecie, a ja wiem...
jak rozmawiać trzeba z psem;)

hmm no mozna by to zrobic tak: lecisz do znaku rowna sie i dzielisz dzialania na 2 sekcje, kazda z nich liczysz osobno, jezeli sa zmienne to musisz wymyslic jakis sposob na przetrzymywanie ich odpowiednikow w pamieci. Jak juz masz podzielone dzialanie to zaczynasz od najbardziej wbudowanych nawiasów nie zapominiając o kolejności wykonywania dzialan, kazdy nawias lub dzialanie ladujesz do listy w ktorej bedziesz musial zrobic informacje o wzajemnuch powiazaniach. Mniej wiecej tak to by sie dalo zrobic.

FreeBSD r0x'uje

GG: 2175556
www.cepa.end.pl

FreeBSD cepa.gskgonet.com.pl 5.0-RELEASE FreeBSD 5.0-RELEASE #0: Fri Apr 23 22:28:52 CEST 2004 cepa@cepa.gskgonet.com.pl:/usr/src/sys/i386/compile/JAJKO i386



cepa... zauważ, że twój sposób oparty jest na podejściu "ludzkim". Wszyscy wiemy, że najpierw oblicza się to co w środku, itd. Wszystko jest łatwe ale... jak wykonywać działania w nawiasach zagnieżdżonych, a co z kolejnością działań? Żeby w ogóle to ruszyć trzeba sprowadzić to do postaci beznawiazowej (tzw. Odwrotna Notacja Polska lub jak kto woli Reverse Polish Notation). Tylko, że to wcale nie takie łatwe w przypadku działań zagnieżdżonych. Na prawdę na czuja ciężko to ruszyć, radzę zasięgnąć nieco teorii. Nie widzę sensu odkrywać na nowo Ameryki... sposoby na ten problem zostały opracowane jeszcze przed Twoim narodzeniem.

Wy nie wiecie, a ja wiem...
jak rozmawiać trzeba z psem;)

w sumie masz racje ale mi duzo satysfakcji daje robienie czegos co wprawidzie moze i jest juz wymyslone i proste dla wielu ludzi ale ciagle nowe i nie banalne. Pozatym troche pomyslec i nie jest to straszne zadanie, jezeli caly ciag tzn: dzialanie bedzie zapisane jako lancuch w pamieci to tworzenie list i skakanie po nawiasach nie jest takie znowu skomplikowane, wiem co mowie bo na podobnej działa muj parserek/interpreter do plikow konfiguracyjnych.

FreeBSD r0x'uje

GG: 2175556
www.cepa.end.pl

FreeBSD cepa.gskgonet.com.pl 5.0-RELEASE FreeBSD 5.0-RELEASE #0: Fri Apr 23 22:28:52 CEST 2004 cepa@cepa.gskgonet.com.pl:/usr/src/sys/i386/compile/JAJKO i386

cepa... ależ nikt nie mówi, że to proste! Wręcz przeciwnie!

Przykład... zaminna typu string = "1+2*3"

Bierzesz 1 (sprawa prosta bo cyfra, gdyby była liczba to jest zabawa ze składaniem i obliczaniem rzędu, ale to proste) bierzesz "+" i pobierasz nastepną cyfre po czym sumujesz (pomijamy juz konwersję string->real). Pobierasz natępny znak "*" i sumę tę mnozysz przez 3? Ale okazuje się, że mnożenie trzeba wykonać najpierw, więc wypadało by wcześniej przeszukać całe wyrażenie pod kątem kolejności działań, poprzestawiać odpowiednio liczby względem znaków operacji (wcale nie łatwa sprawa) i zaczynać od początku. To tylko przykład ilustrujący jak dużo pracy trzeba poświęcić na wykonanie tak prostego działania! Przy nawiasach jest jeszcze gorzej. Prawdziwe schody zaczynają się przy liczbach ujemnych (powiedzmy 2*(-5)), gdzie znak nie określa działania lecz precyzuje wartość. Biorąc pod uwagę ilość różnych przypadków, format zapisu i Twój sposób (na chłopski rozum) to najprawdopodobniej skończyłbyś w Microsofcie.:) Zaufaj mi... dawno temu pisałem program, który obliczał skomplikowane wyrażenia podane z klawiatury. Wyrażenia MUSIAŁY być podawane w notacji ONP co znacznie ułatwiało sprawę, ale i tak nie było to banalne (przynajmniej wtedy;) ). Jednak samodzielne napisanie programu konwertującego zwykłe wyrażenie na ONP to prawdziwe wyzwanie...

Kiedyś pisałem program kreślący wykresy równań i miałem ten sam problem co kol. Artur. Po miesiącu myślenia napisałem PRZEOGROMNY kod, który sprawdzał się tylko w mniej niż połowie przypadków! To było prawdziwe monstrum i w pewnym momencie straciłem panowanie nad kodem. Potem stwierdziłem, że łatwiej będzie zdefiniować dużą liczbę gotowych równań (liniowe, kwadratowe, trygonometryczne, itd.) i pozwolić użytkownikowi na dowolną edycję parametrów tych równań.

Cepa: jeśli się bardzo nudzisz i nadal twierdzisz, że to całkiem proste - zapraszam do zabawy. Szkoda, że jesteś dosyć młody, bo jeżeli by Ci się udało, to bym Cię zatrudnił.:)

Wy nie wiecie, a ja wiem...
jak rozmawiać trzeba z psem;)

Cepa: Nie daj sie zniechecic i napisz taki program. Sprawa wcale nie jest az tak bardzo trudna i jak posiedzisz to sobie poradzisz. Na poczatek zaimplementuj sobie klase do obslugi stosu - na pewno ci sie przyda:)

pozdrawiam:)

GG: 4596137

Hehe no ok niech ci bedzie ;), ale nie ma takiej rzeczy ktorej sie napisac nie da :)

FreeBSD r0x'uje

GG: 2175556
www.cepa.end.pl

FreeBSD cepa.gskgonet.com.pl 5.0-RELEASE FreeBSD 5.0-RELEASE #0: Fri Apr 23 22:28:52 CEST 2004 cepa@cepa.gskgonet.com.pl:/usr/src/sys/i386/compile/JAJKO i386

Pobawie sie ale narazie pracuje nad stronka :)
skoncze i pomysle :)

FreeBSD r0x'uje

GG: 2175556
www.cepa.end.pl

FreeBSD cepa.gskgonet.com.pl 5.0-RELEASE FreeBSD 5.0-RELEASE #0: Fri Apr 23 22:28:52 CEST 2004 cepa@cepa.gskgonet.com.pl:/usr/src/sys/i386/compile/JAJKO i386

Jak byście mogli dać mi jakieś wskazówki jak to zrobić(bardziej szczegółowo) to prosze napiszcie cifekpl@o2.pl lub GG 4118474 :lol:

cifek

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •