Drzewo wyrażenia algebraicznego

0

Witam
Mam taki problem, otóż mam na zadanie napisanie kalkulatora, który będzie liczył pole pod wykresem funkcji z przedziału 1 do 10. Przykładowo, wpisuje mu funkcję 4x3+2x</sup>2-(1/7)*x+9, a on ma policzyć pole pod jej wykresem.
Ogólnie wiem jak to powinno wyglądać, będę liczyć to metodą prostokątów, ich szerokość * wartość w tym punkcie, potem to zsumuje i ok, problem mam tylko z tym wyrażeniem. Zrobiłem już że czyta mi po kolei znaki tego wyrażenia i wpisuje je do tablicy charów. Potem podzieliłem to na tablicę liczb i znaków, bo jakbym wpisał dajmy '23' do tego wyrażenia to odczyta mi to jako znaki '2' i '3'. Teraz zostało mi tylko napisać drzewo tego wyrażenia i tutaj nie mogę sobie poradzić.

        drzewo *nowy; 
        drzewo *temp; 
        for (i=0 ; i<ilosc ; i++) 
        { 
                if (znaki[i] == '+' || znaki[i] == '-') 
                        if (nowy == NULL) 
                        { 
                                nowy = new drzewo; 
                                nowy->wartosc = znaki[i]; 
                                nowy->lewo = NULL; 
                                nowy->prawo = NULL; 
                                temp = nowy; 
                        } 
                        else 
                        { 
                                nowy = new drzewo; 
                                nowy->wartosc = znaki[i]; 
                                nowy->lewo = NULL; 
                                nowy->prawo = NULL; 
                                temp->prawo = nowy; 
                                temp = nowy; 
                        } 
        }

Coś takiego zacząłem kombinować, nie wiem czy dobrze. Drzewo to jest u mnie struktura składająca się z dwóch wskaźników, prawy i lewy oraz wartości.
Może podpowiedziałby mi ktoś jak się zabrać za to, w jaki sposób to ugryźć.

0

A coś po polsku i prościej napisane? Bo z tego co podesłałeś niewiele rozumiem i nie wiem jak to wykorzystać w mojej pracy:)

0

Czas się nauczyć języka angielskiego:)

0

Nie chodzi o to że tego nie rozumiem, tylko że nie potrafię tego zaimplementować, nie mogę sobie wyobrazić jak to ma wyglądać, w jaki sposób to zapętlić. Mam znaki i liczby, więc muszę mieć 2 typy danych w strukturze, jak to połączyć jedno z drugim?

0

Przede wszystkim zainteresuj się algorytmem "stacja rozrządowa" ("shunting-yard").
Tu masz gotowiec. Tyle że zamiast drzewa działań tworzy on stos ONP (czyli elementy takiego drzewa ułożone w kolejności pre-order).
http://4programmers.net/Pastebin/1460

Zaimplementowane są tam algorytmy o których mowa na polskiej Wikipedii (Odwrotna notacja polska).

  1. Parsowanie wyrażenia (konwersja na kolejkę w notacji infiksowej)
  2. (najważniejszy) Stacja rozrządowa (shunting-yard) - konwersja z kolejki infiksowej na stos ONP
  3. Obliczanie wyrażenia ONP

Jeśli chcesz drzewo zamiast stosu ONP trzeba będzie nieznacznie zmodyfikować staję rozrządową.

1 użytkowników online, w tym zalogowanych: 0, gości: 1