Przekazywanie parametrów przez wskaźnik.

0

Witam wszystkich, jestem początkującym programistą i borykam się z pewnym problemem, a mianowicie:
Mam napisac program który, oblicza miejsce zerowe funkcji wykorzystując jej pochodną. Wygląda to tak, że w jednej funkcji deklaruję jak wyglądać ma moja funkcja, a w drugiej funkcji deklaruję jej pochodną. Udało mi się napisac program, który działa wg narzuconego z góry schematu (myslę że poprawnie), ale jest pewien problem. Prowadzący zajęcia powiedział, że mam zastosować wskaźniki. Zasadę działania wskaźników mniej więcej rozumiem, jest to bardzo przejrzyście opisane np. tutaj:
http://www.p-programowanie.pl[...]anie-argumentow-do-funkcji-c/

W powyższym artykule pokazano jak przekazać wartości za pomocą wskaźników z ciała programu głównego do jednej funkcji i z powrotem. W moim zadaniu wartość przekazywana ma być do jednej funkcji (funkcja warunek), ale wewnątrz niej wykorzystywane są dwie pozostałe funkcje (o nazwach funkcja i pochodna). Nie wiem jak to zrobić.. Prowadzący chce, aby prototyp funkcji wyglądał następująco:

float warunek (float x0, float eps, float f1, float f2)

Nie wiem tylko czy to f1 i f2 ma być wskaźnikami czy nie. Poniżej program bez wskaźników:

#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <iostream>

float funkcja (float x);
float pochodna (float x);
float warunek (float x0, float eps);
float x0, eps, f1, f2, x;

using namespace std;
int main()

{
    cout<<"Podaj przyblizenie poczatkowe x0: ";
    cin>>x0;
    cout<<"Okresl dokladnosc wyznaczenia miejsca zerowego: ";
    cin>>eps;
    warunek(x0,eps);

    getch();
    return 0;
}

float funkcja (float x)
{
    f1 = 5*x*x + 10*x - 1;      //deklaracja funkcji f(x)
    return f1;
}

float pochodna (float x)
{
    f2 = 10*x + 10;            //deklaracja pochodonej f'(x)
    return f2;
}

float warunek (float x0, float eps)
{
    float y0, y1, x1;
    float n;
    n=1;

    y0=funkcja(x0);
    y1=pochodna(x0);

    if (y1==0)
    {
        cout<<"\nPochodna funkcji jest rowna 0\n";
    }

    else
    {
        x1=x0-(y0/y1);

        if (fabs(x1-x0)<eps)
        {
            cout<<"\nMiejsce zerowe wynosi: "<<x1<<endl;
        }

        else
        {
            do
            {
                x0=x1;
                y0=funkcja(x0);
                y1=pochodna(x0);
                x1=x0-(y0/y1);
                n++;

                if (n>10000)
                {
                    cout<<"\nBrak miejsc zerowych.\n";
                    return 0;
                }
            }
            while (fabs(x1-x0)>=eps);

            cout<<"\nMiejsce zerowe wynosi: "<<x1<<endl;
        }

    }
} 

Jak ktoś ma pomysł jak to zmienic, to bardzo prosze o pomoc. Pozdrawiam ;))

0

Z pozdrowieniami dla _13th_Dragon ;-)
Twoje krytykanctwo było nie na miejscu...


#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <iostream>

float funkcja (float x);
float pochodna (float x);
float warunek (float *x0, float eps, float (*wskaznik1)(float t), float (*wskaznik2)(float t));
float *x0, eps, x;
float a, b;

using namespace std;
int main()

{
    cout<<"Podaj przyblizenie poczatkowe x0: ";
    cin>>a;
    cout<<"Okresl dokladnosc wyznaczenia miejsca zerowego: ";
    cin>>b;
    warunek(&a, b, funkcja, pochodna);

    getch();
    return 0;
}

float funkcja (float x)
{       
    return 5*x*x + 10*x - 1;     //deklaracja funkcji f(x)
}

float pochodna (float x)
{
    return 10*x + 10;           //deklaracja pochodonej f'(x)
}

float warunek (float *x0, float eps, float (*wskaznik1)(float t), float (*wskaznik2)(float t))
{
    float y0, y1, x1;
    float n;
    n=1;

    y0=wskaznik1(*x0);
    y1=wskaznik2(*x0);

    if (y1==0)
    {
        cout<<"\nPochodna funkcji jest rowna 0.\n";
    }

    else
    {
        x1=*x0-(y0/y1);

        if (fabs(x1-*x0)<eps)
        {
            cout<<"\nMiejsce zerowe wynosi: "<<x1<<endl;
        }

        else
        {
            do
            {
                *x0=x1;
                y0=wskaznik1(*x0);
                y1=wskaznik2(*x0);
                x1=*x0-(y0/y1);
                n++;

                if (n>10000)
                {
                    cout<<"\nBrak miejsc zerowych.\n";
                    return 0;
                }
            }
            while (fabs(x1-*x0)>=eps);

            cout<<"\nMiejsce zerowe wynosi: "<<x1<<endl;
        }

    }
}

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