Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problemy z przypisaniem zmiennych

Ostatnio zmodyfikowano 2014-09-24 18:41
Autor Wiadomość
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 ?

C/C++
#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 :)
P-117421
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
C/C++
template < class Func >
void bisekcja( Func f )
{
    /* w środku bez zmian */
}

a wywołujesz ją tak:
C/C++
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
P-117422
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 ?
P-117423
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.:
C/C++
const double pi = 3.14159265358979323846;

albo, zgodnie z nową modą:
C/C++
constexpr double pi = 3.14159265358979323846;
P-117440
« 1 »
  Strona 1 z 1