Problemy z przypisaniem zmiennych
Ostatnio zmodyfikowano 2014-09-24 18:41
Anim Temat założony przez niniejszego użytkownika |
Problemy z przypisaniem zmiennych » 2014-09-24 14:11:03 Znowu nadziałem się na problem. Mam za zadanie stworzyć program , który metodą bisekcji znajdzie pierwiastki 3 równań, w zależności od wyboru równania. Dodatkowa uwaga była taka, że powinienem stworzyć 5 funkcji (menu, f(x),g(x),h(x),funkcja z algorytmem bisekcji). Stworzyłem funkcje, tylko mam taki problem z funkcja bisekcji. Niestety tam mam przypisanie fa=f(a); fb=f(b); co niestety wskazuje niezależnie od mojego wyboru przy pomocy switch/case na funkcje pierwsza... bo tylko Ona jest postaci f()... Jak mogę sobie z tym poradzic ? #include <iostream> #include <math.h> #include <iomanip>
using namespace std;
void menu(); double x, y, z, x0; double a, b, epsilon, fa, fb, f0; int licznik = 0;
double f( double x ) { return sin( x ) * cos( x ) + 5 * x + 1; }
double g( double x ) { return( M_PI - x * x + sin( x ) ) / sqrt( 25 - x ); }
double h( double x ) { return pow( M_E, - 1.5 * x ) - 0.3 * x * x; }
double bisekcja() { cout << setprecision( 6 ) << fixed; cout << "Podaj dolny przedzial a = "; cin >> a; cout << "Podaj gorny przedzial b = "; cin >> b; cout << "Podaj dokladnosc epsilon = "; cin >> epsilon; fa = f( a ); fb = f( b ); if( fa * fb > 0 ) cout << "Funkcja nie spelnia zalozen (fa*fb<0)" << endl; else { while( fabs( a - b ) > epsilon ) { x0 =( a + b ) / 2; f0 = f( x0 ); if( fabs( f0 ) < epsilon ) break; if( fa * f0 < 0 ) { b = x0; } else { a = x0; fa = f0; } } cout << "Miejscem zerowym jest x0 = " << x0 << endl; } }
void menu() { cout << "[1] - f(x) = sin(x) * cos(x)+5*x+1" << endl; cout << "[2] - g(x) = (M_PI-x*x+sin(x))/sqrt(25-x)" << endl; cout << "[3] - h(x) = pow(M_E,-1.5*x) - 0.3*x*x" << endl; cout << "[0] - wyjscie z programu" << endl; }
int main() { int liczba; cout << "Program oblicza miejsce zerowe metoda bisekcji dla 3 wybranych funkcji podanych ponizej. Podaj liczbe w przedziale 1-4 zgodnie z panelem menu: " << endl; cout << "" << endl; menu(); cout << "" << endl; do { cout << "\nWybor z menu. Liczba 0-3: "; cin >> liczba; switch( liczba ) { case 1: f( x ); bisekcja(); break; case 2: g( x ); bisekcja(); break; case 3: h( x ); bisekcja(); break; } } while( liczba != 0 ); return 0; }
Pomożecie? ^^ Ps: przypisanie funkcje bisekcja() dla case 2, case 3 wskazują tylko ,jak chciałbym ,aby to wyglądało :) |
|
Monika90 |
» 2014-09-24 14:17:43 Możnaby użyć wskaźników do funkcji, ale w C++ lepiej jest użyć szablonów. W tym celu zmieniasz deklarację funkcji bisekcja, na coś takiego template < class Func > void bisekcja( Func f ) { }
a wywołujesz ją tak: bisekcja( f ); bisekcja( g ); bisekcja( h );
A poza tym, w C++ nie używamy #include <math.h> lecz #include <cmath> . W C i w C++ nie ma też M_PI ani M_E, pi musisz zdefiniować samemu, a e nie jest potrzebne bo istnieje funkcja exp |
|
Anim Temat założony przez niniejszego użytkownika |
» 2014-09-24 14:39:19 Bardzo dziękuję :) nie dość ,że rozwiązuje to mój problem to poszerzyło moją wiedzę :) dziękuję jeszcze raz.
Ps: u mnie M_PI oraz M_E działają bez zarzutu... to zasługa kompilatora ? czy mimo to powinienem definiować M_PI oraz M_E ? |
|
Monika90 |
» 2014-09-24 18:41:48 W twoim kompilatorze jest M_PI i M_E, ale w innych może nie być, bo M_PI i M_E nie należą do standardu języka. Jeżeli chcesz mieć przenośny kod, to musisz sobie te stałe zdefiniować sam. Ja tak robię. Np.: const double pi = 3.14159265358979323846;
albo, zgodnie z nową modą: constexpr double pi = 3.14159265358979323846;
|
|
« 1 » |