Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C] Pobieranie od użytkownika wzoru dowolnej funkcji

Mu-H 14 Sty 2011 19:37 1274 6
  • #1 14 Sty 2011 19:37
    Mu-H
    Poziom 2  

    Witam
    Dostałem na zadanie napisanie programu, który będzie rysował wykresy dowolnych funkcji. Z rysowaniem sam sobie poradzę, problemem jest dla mnie pobranie od użytkownika wzoru funkcji. Zapisuję podane wyrażenie (np. x*x+2) jako string, pytanie co zrobić, lub jak to zrobić żeby przyporządkować jego wartość zmiennej tak, abym mógł sobie sczytać w pętli wartości dla kolejnych argumentów i potem narysować wykres. Z tego co sam kombinowałem, doszedłem do wniosku, że wyrażenie powinno być zapisane w odwrotnej notacji polskiej (z tym też sobie poradzę) tylko jak rozwiązać kwestię zmiennych? Myślę, że największym problemem będą w tym przypadku funkcje trygonometryczne, kompletnie nie wiem od czego zacząć. Program ma być napisany w ANSI C, będę wdzięczny za nakierowanie mnie na właściwy tok rozumowania
    Z góry dziękuję za poświęcony czas

    0 6
  • #2 14 Sty 2011 20:43
    directx11
    Poziom 17  

    Praktycznie rozpracowałeś problem, więc nie wiem tak naprawdę z czym masz kłopot, chodzi Ci o to, jak przekazywać na stos wyrażeń wartość argumentu obliczanej funkcji?

    0
  • #3 15 Sty 2011 11:45
    Mu-H
    Poziom 2  

    Dzięki za szybką odpowiedź
    Wymyśliłem to sobie tak - program pobiera wzór funkcji za pomocą scanf i zapisuje w tablicy znaków. Dla programu jest to ciąg znaków, nie wie, że to są liczby, zmienne i operatory. Gdyby to były same liczby można by to zamienić np. poprzez atof(), ale oprócz liczb będzie tam zmienna "x" i funkcje trygonometryczne, więc zmierzając do sedna - jak sprawić by string np. 2x*sin(x) móc przypisać zmiennej double y i następnie za x sobie podstawiać w pętli np. [1...100] i sczytywać kolejne wartości? Być może moje założenie jest od początku złe, może robi się to jakoś inaczej? Jestem bardzo początkujący także istnieje ryzyko, że niepotrzebnie kombinuje jeśli jest jakaś konkretna funkcja do takich właśnie zadań, niestety mnie się nie udało nic lepszego wymyślić
    Pozdrawiam

    0
  • #4 15 Sty 2011 12:12
    kubatek94
    Poziom 17  

    Hmm.. nie wiem czy nie bedziesz musial "filtrowac" wejscia uzytkownika za pomoca np regexu- i ja bym tak sprobowal. Pozdrawiam

    0
  • Pomocny post
    #5 15 Sty 2011 12:17
    Dżyszla
    Poziom 42  

    Ja bym po prostu leciał znak po znaku i analizował... Jeśli liczba to tymczasową zmienną mnożył * 10 i dodawał odczytaną cyfrę. Jeśli napotkasz coś nieliczbowego - utworzoną cyfrę zapisujesz i analizujesz dalej. Np jeśli był to operator, to odkładasz na stos jako określoną operację. Jeśli x - stawiasz swój znacznik wskazujący zmienną. Jeśli coś innego - znów tworzysz ciąg tymczasowy aż do napotkania operatora lub nawiasu lub liczby. Wtedy porównujesz z bazą dozwolonych wyrażeń (np. sin) i odkładasz na stos jako stosowną operację.

    0
  • #6 15 Sty 2011 16:28
    directx11
    Poziom 17  

    Link Tu masz taki najprostszy kalkulator korzystający z tej techniki, wprawdzie to C++, ale przerobić na C i rozwinąć o funkcje trygonometryczne to nie jest już duży problem. Jeśli ma być już tak 'full-wypas' to trzeba będzie napisać jakieś filtrowanie wprowadzanych danych, najlepiej wtedy korzystać z okienek, np. Qt czy wxWidgets albo coś w tym stylu. Można podpiąć do tego, jak już ktoś wspomniał wyrażenia regularne - możliwości jest naprawdę wiele.

    0
  • #7 15 Sty 2011 17:00
    Mu-H
    Poziom 2  

    Zadanie nie musi być super zrobione, to jest tylko na zaliczenie pierwszego sem. Dziękuje za pomoc, spróbuje zrobić to metodą Dżyszla zerkając do linka zaproponowanego przez directx11. Jeśli nie dam rady to jeszcze się odezwę

    0