Skocz do zawartości
Puchacz1

[c++] przetwarzanie wyrażeń

Rekomendowane odpowiedzi

witam, potrzebuję abym mógł wpisać wyrażenie np. 2x^2+2*x+3 i je obliczyć. Na jednym forum polecono mi skorzystać z ONP jednak to nieco zbyt złożone zadanie (narazie). Potrzebuję czegoś prostszego (obsługa tylko podst. wyrażeń) i tu pytanie. Czy jest to w ogóle wykonalne. O ile lecąc pętlą po stringu jestem w stanie odczytać liczby i je zapisać o tyle nie do końca wiem jak podmieniać znak (np. + na -). W ogóle jakoś nie mogę sobie wyobrazić takiego "dynamicznego" składania wyrażenia. W związku z tym proszę o pomoc, może jakąś podpowiedź. Takie coś mi wpada do głowy: mógłbym "na sztywno" wykrywać liczbę x w ciągu i mieć już gdzieś przygotowane wyrażenia dla odpowiedniej liczby zmiennych x. Jednak jak podmieniać w takim wyrażenia + na - lub / na jakakolwiek inna kombinacje.

Edytowane przez Puchacz1

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

nie za bardzo rozumiem o czym piszesz ale domyślam się, że chodzi o sztywne wbijanie współczynników itd... tak właśnie robię :)

 

ps. napisałem funkcję licząca całkę metodą trapezów jednak nie jestem pewien prawidłowości jej działania. Mianowicie mam wrażenie czasem daje mało dokładne wyniki mimo dość dużej liczby kroków (10000)

 

double *calkuj(int liczbaKrokow, float start, int stop, float a, float pot, float b, float pot2, float c, float pot3, float d, float pot4, float C ){    float krok = (sqrt(pow(stop-start,2)))/liczbaKrokow; //wartosc o jaka bedziemy przeskakiwali (np. 0,25)    cout << "krok co:" << krok << endl;    double *wynik = new double [liczbaKrokow]; //tworzymy dynamiczna tablice z liczba krokow.    double y[2] = {0.00000000};    for(int i=0; i<liczbaKrokow; ++i)    {        if(i==0)        {            y[1] = a*pow(start,pot) + b*pow(start,pot2) + c*pow(start,pot3) + d*pow(start,pot4) + C;            y[2] = a*pow(start+krok,pot) + b*pow(start+krok,pot2) + c*pow(start+krok,pot3) + d*pow(start+krok,pot4) + C;            wynik[i] = ((y[1]+y[2])/2)* krok;            if(wynik[i]<0)            {                wynik[i] *= -1;            }        }        else if(i!=0)        {            y[1] = y[2];            y[2] = a*pow(start+krok,pot) + b*pow(start+krok,pot2) + c*pow(start+krok,pot3) + d*pow(start+krok,pot4) + C;            wynik[i] = ((y[1]+y[2])/2)*krok;            if(wynik[i]<0)            {                wynik[i] *= -1;            }        }        start+=krok;    }    return wynik;}

zastanawiam się czy na pewno jest to dobrze napisane.

Edytowane przez Puchacz1

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

1. Wystarczy if/else - bez else if. Niepotrzebnie sprawdzasz drugi warunek.

2. Tablica y na 2 elementy i y[2]=... - indeksujemy od zera.

3. Skoro to wielomiany, możesz odczytać całe wyrażenie, a potem sobie je podzielić na części - dla 2x^2+2*x+3 masz +2x^2, +2*x, +3. W każdej części masz znak +/- lub nie (na początku), jakąś liczbę przed x, znaczek potęgi i liczbę po znaku potęgi.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...