Puchacz1 Opublikowano 3 Kwietnia 2011 Zgłoś Opublikowano 3 Kwietnia 2011 (edytowane) 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 3 Kwietnia 2011 przez Puchacz1 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
stivo Opublikowano 3 Kwietnia 2011 Zgłoś Opublikowano 3 Kwietnia 2011 A nie można tego sprowadzić do wprowadzenia z palca stopnia równania, a potem tylko parametrów przy iksach (liczba parametrów zależna od stopnia, prawda)? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Puchacz1 Opublikowano 3 Kwietnia 2011 Zgłoś Opublikowano 3 Kwietnia 2011 (edytowane) 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 3 Kwietnia 2011 przez Puchacz1 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
_OskaR Opublikowano 3 Kwietnia 2011 Zgłoś Opublikowano 3 Kwietnia 2011 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. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
stivo Opublikowano 3 Kwietnia 2011 Zgłoś Opublikowano 3 Kwietnia 2011 Kiedy chcesz zmienić znak przy parametrze wystarczy przemnożyć danego floata przez -1 (minus jeden). Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...