Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

veelck

ONP

Rekomendowane odpowiedzi

dzieli się na małe elementy i te elemnty (tokeny) zamienia na ONP
:scratchhead: Jak ty chcesz zamieniać token na cokolwiek innego? Bez tego zamieniania wyrażenia na notację odwrotną (bo o to ci chyba chodzi) można się obyć. No w każdym razie nie trzeba tego robić jawnie.

 

i to nie jest na pierwsze laborki
No właśnie.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

jeśli chodzi o ONP to istnieje pytanie - czy problem kalkulatora ma być rozwiązany uniwersalnie i wtedy można ją zastosować a wręcz powinno się, czy tylko doraźnie i można to pominąć a całe zagadnienie uprościć. np założyć dopuszczenie tylko 2 poziomów nawiasów i ograniczoną długoć wyrażenia.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
OK, mam teraz takie pytanie - moze masz w takim razie jakis dobry kurs (albo strone z dobrym kursem) do C?? 

szukalem troche po sieci ale wszystko co widzialem jest slabe, albo konczy sie na programie typu obliczanie pola trojkata.

 

bo widze ze z obecnym stanem wiedzy to moge najwyzej isc na spacer... a opisac cala procedure tworzenia np. 'parsera' to mi sie wydaje ze na forum nie jest latwe. co do wskaznikow to mysle ze bede musial sie tego douczyc i tak, zanim ten program oddam, wiec...

Zgadza się, że napisanie na forum jak się pisze parser, to nie jest prosta sprawa. W każdym razie nie krótka.

 

Ja szczerze mówiąc uczyłem się C++ z msdn'a, nie mam żadnej książki, ale to nie jest może najlepszy pomysł. W sieci generalnie nic sensownego nie znajdziesz (poza msdn, ale to nie jest podręcznik, tylko dokumentacja). Najlepiej jednak kupić/pożyczyć książkę. Nie musi nawet być do c/c++. Podstawowe zagadnienia (wskaźniki, listy itd.) będą w książce o każdym języku programowania. Do tego specyfikacja LibC i STL'a (te rzeczy można ściągnąć z sieci).

 

Wracając do twojego programu, to książka do c/c++ nie pomoże ci napisać parsera (po polsku to chyba będzie: analizator składniowy). Takie zagadnienia są opisane porządnie w książkach o pisaniu kompilatorów, ale na to raczej zbyt wcześnie.

 

Żeby zakończyć temat ONP, to twój kumpel miał rację. Najłatwiej by było, gdyby wejście było podane w ONP, ale wygląda na to, że nie może tak być, więc musisz o tym zapomnieć :(

(cZyNo >> chodzi mi o wejście, bo w pewnym momencie analizy zamiany na coś co będzie przynajmniej przypominało ONP się oczywiście nie uniknie)

 

[Edytowane: 16/11/2003 przez KaZet]

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Do poznania składni języka C polecam Język C, napisana przez duet Kernigham Ritchie. Ładnie wyjaśnia podstawy ze wskaźnikami itp.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

KaZet: uważam że wejście danych do kalkulatora powinno być nazwijmy to naturalne. i to na tyle

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
uważam że wejście danych do kalkulatora powinno być nazwijmy to naturalne. i to na tyle
No pewnie, że powinno być, ale sam napisałeś, że to nie jest rzecz na pierwsze (czy jedne z pierwszych) laborek. Cały problem polega właśnie na zamianie jednej notacji na drugą. Gdyby to było z głowy, byłoby dużo łatwiej. Oczywiście taki interface byłby bardzo nienaturalny.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

ok, w takim razie mysle ze to jest dobry moment na EOT

bez sensu dluzej to ciagnac, ja sie niczego nie dowiem, bo zagadnienie nie jest mozliwe do wyjasnienia na forum, a tylko zmarnuje czas sobie i Wam.

dzieki za to, co napisaliscie :)

pozdrawiam

jak bede mial jakies problemy (jak juz troche wiecej bede kumal) to na pewno Was jeszcze pomecze ;)

pozdrawiam

veelck

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeżeli temat jest aktualny, to poniższy link może się przydać:

epaperpress.com/oper/download/oper.pdf

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Co do nauki c/c++ to polecam stronkę www.binboy.org lub mogę wysłać plik z lekcjami (w tym także do programowania pod windows).

Jeżeli chodzi o kalkulator to może zrobić to z rekurencji. Jak ktoś będzie zainteresowany to rozwinę temat ale teraz musze lecieć na koło z automatów i języków :(

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Co do nauki c/c++ to polecam stronkę www.binboy.org lub mogę wysłać plik z lekcjami (w tym także do programowania pod windows).

Jeżeli chodzi o kalkulator to może zrobić to z rekurencji. Jak ktoś będzie zainteresowany to rozwinę temat ale teraz musze lecieć na koło z automatów i języków :(

 

co do pliku z lekcjami to poprosze na maila: veelck@kgb.pl

mozesz rozwinac mysl na temat tego kalkulatora opartego na rekurencji??

 

Ziemianin - dzieki za link - moze sie przydac ;)

btw witam na forum :):group_h:

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Na początek szkic funkcji do obliczania wartości (jak okaże się niezrozumiały mogę dodać kod gotowej funkcji jak go zrobię :yltype: ).

Główna część funkcji opiera się na pętli oraz komendzie switch(), pętla operuje na zmiennej globalnej typu int (np. int i), switch na kolejnych znakach wczytanego wyrażenia.

Gdy w wyrażeniu napotkamy na:

- '+' lub '-' to wykonujemy operację: tmp=+ (lub -)oblicz();

- '*' lub '/' to sprawdzamy jaki jest następny znak, jak liczba to wykonujemy działanie i lecimy dalej w pętli, jeżeli nawias to tmp=* (lub /)oblicz();

- '(' to po prostu tmp=oblicz();

- ')' return(tmp);

- domyślnie(polecenie default) zczytujemy wartość liczby;

Tak to mniej więcej wygląda. Należy zwrócić uwagę na poprawne zwiększanie licznika pętli, przed rozpoczęciem obliczeń należy wyzerować ten licznik. Pętla ma ograniczenie na długość wyrażenia (patrz strlen() ).

W tym szkicu jest problem do rozwiązania, liczby ujemne. Jeżeli pojawią się tak 3+2*(-5) jest OK ale gdy będzie -2+3 lub .../(-5+6) to wyjdą błędy w obliczeniach. Można to obejść każąc wpisywać wszystkie liczby ujemne w nawiasach lub przy odczytaniu '-' dodać warunek na spr. czy to jest działanie czy znak liczby.

Pufffff... to tyle na razie.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeżeli chodzi o - to chyba wystarczy dodać sprawdzenie jaki jest kolejny znak działania i jeżeli + lub - to należy wykonać działanie.

A co z kolejnością operatorów?

Jak to co? Po to właśnie jest rekurencyjne wywoływanie funkcji. w ten sposób jeżeli mamy wyrażenie 2+3*5 to zostanie one obliczone tak:

1)pierwsze wywołanie f. oblicz

2)2+oblicz(), drugie wywołanie funkcji

3)obliczenie wartości 3*5 i zwrócenie wartości 15

4)wracamy do pierwszego wywołania funkcji i obliczamy 2+15, zwracamy wartość 17

 

Jeżeli wywołujemy rekurencyjnie funkcje to pierwsza zostanie zakończona ta która została ostatnia wywołana czyli tworzy się coś w rodzaju kolejki LIFO.

Teraz zrozumiałe?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jest rzeczywiście ok, nie zauważyłem, że jak jest * lub /, to najpierw sprawdzasz, czy następna jest liczba.

 

Btw: Ogólnie to jest jednak nieco zbyt proste rozwiązanie, bo jak dojdzie więcej operatorów (na przykład potęga), to trzeba będzie sprawdzać więcej tokenów w przód. Potrzeba więcej funkcji, jedną się tego nie zrobi (raczej).

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Zamiast zapisywać potęgę ^ można np. p(wykładnik;podstawa) i wtedy łatwiej dodać kolejne działania.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Zamiast zapisywać potęgę ^ można np. p(wykładnik;podstawa) i wtedy łatwiej dodać kolejne działania.
Oczywiście, ale chyba nie o to chodzi. To jest ominięcie a nie rozwiązanie problemu ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Odgrzeję wątek bo wpadłem na inne rozwiązanie kalkulatora. Zamiast pisać własny interpreter działań można się posłużyć tym wbudowanym w kompilator C. Wystarczy zczytać działanie od użytkownika, stworzyć plik ze źródłem, w którym umieszczamy działanie do obliczenia i kompilujemy. Potem wystarczy uruchomić nowy program i mamy wynik.

Tą metodę łatwo wykorzystać pod linuksem bo kompilator C jest wbudowany w system a funkcją system() można wywołać kompilację i uruchomienie programu z obliczeniem działania.

Prosta i przyjemna metoda bo czarną robotę z interpretacją kolejności działań odwala za nas kompilator :cool:

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

thx za posta, ale to juz nie aktualne :)

tzn. kalkulator juz dawno oddalem, ale i tak dzieki

pozdrawiam

veelck

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...