Jak przesłać funkcję do funkcji?

0

Witam,
mam problem, otóż mam funkcję:

 double fun(double x, double eps)
{
        double s, a;
        long n;
        a = 1;
        s = 1;
        n = 2;
       
        do
        {
                a = (pow(x, n))/(silnia(n));
                s = s+a;
                n = n+2;
        }while (fabs(a) > fabs(s)*eps);
        return s;
}

I nie wiem jak przesłać moją funkcję 'silnia' do tej funkcji...

int silnia (int liczba)
{
		if (liczba == 0) return 1;
		else return liczba*silnia(liczba-1);
}

Dzięki za pomoc i pozdrawiam

0

W jakiej kolejności definiujesz funkcje? Najpierw powinna być zdefiniowana / zadeklarowana funkcja silnia. W przeciwnym wypadku nie będzie ona widoczna w funkcji fun.

0

Super, w końcu ruszyło :) ale niestety nadal wychodzą złe wartości w moim programiku:

#include <stdio.h>
#include <math.h>
 
int main()
{
        double a, b, x, y, eps, n, dx, fun() ;
        int silnia(int) ;
        FILE *plik;
        do
        {
       
                printf ("Program oblicza rozwiniecie wzoru cos x\nPodaj poczatek przedzialu: ");
                scanf ("%lf", &a); //wprowadzamy poczatek przedzialu
                if (a < 0)
                {
                        printf ("Wartosc spoza dziedziny\n Podaj inna wartosc: ");
                }
                printf ("Podaj koniec przedzialu: "); //wprowadzamy koniec przedzialu
                scanf ("%lf", &b);
                if (b < 0)
                {
                        printf ("Wartosc spoza dziedziny\n Podaj inna wartosc: ");
                        scanf ("%lf", &b);
                }
                if (a == b)
                {
                        printf ("Poczatek przedzialu nie moze byc taki sam jak jego koniec\n");
                }
                if (a > b)
                {
                        printf ("Poczatek przedzialu nie moze byc wiekszy od jego konca\n");
                }
        }while (a >= b);
       
        printf ("Podaj ilosc podzialow: "); //podajemy ilosc podzialow
        scanf ("%lf", &n);
        while (n <= 0)
        {
                printf ("Ilosc podzialow musi byc wieksza od zera\nPodaj nowa ilosc podzialow: ");
                scanf ("%lf", &n);
        }
       
        printf ("Podaj dokladnosc: ");
        scanf ("%lf", &eps);
        
                dx = (b-a)/n;
                plik = fopen ("wynik", "w"); //otwarcie pliku
                for (x=a; x<=b; x=x+dx)
                {
						y = fun(x, eps); //wywolanie funkcji
						printf ("x=%.3lf f(x)=cosx szereg: f(x)=%lf funkcja: %lf\n", x, y, cos(x));
						fprintf (plik, "x=%.3lf f(x)=cosx szereg: f(x)=%lf funkcja: %lf\n", x, y, cos(x));
				}
			    fclose (plik); //zamkniecie pliku
                        
       
      return 0 ; 
}
 
/****************FUNKCJA***************/
int silnia (int liczba)
{
		if (liczba == 0) return 1;
		else return liczba*silnia(liczba-1);
}

double fun(double x, double eps)
{
        double s, a;
        long n;
        a = 1;
        s = 1;
        n = 2;
       
        do
        {
                a = (pow(x, n))/(silnia(n));
                s = s+a;
                n = n+2;
        }while (fabs(a) > fabs(s)*eps);
        return s;
}
 

takie dziwne wartości wywala: f(x)=1.#INF00

0

Mi wypisuje okej, spróbuj zadeklarować funkcję tak:

double fun(double, double);
0

To samo ciągle:

Program oblicza rozwiniecie wzoru cos x
Podaj poczatek przedzialu: 1
Podaj koniec przedzialu: 10
Podaj ilosc podzialow: 20
Podaj dokladnosc: 0.0001
x=1.000 f(x)=cosx szereg: f(x)=1.543080 funkcja: 0.540302
x=1.450 f(x)=cosx szereg: f(x)=2.248842 funkcja: 0.120503
x=1.900 f(x)=cosx szereg: f(x)=3.417727 funkcja: -0.323290
x=2.350 f(x)=cosx szereg: f(x)=5.290468 funkcja: -0.702713
x=2.800 f(x)=cosx szereg: f(x)=8.252707 funkcja: -0.942222
x=3.250 f(x)=cosx szereg: f(x)=1.#INF00 funkcja: -0.994130
x=3.700 f(x)=cosx szereg: f(x)=1.#INF00 funkcja: -0.848100
x=4.150 f(x)=cosx szereg: f(x)=1.#INF00 funkcja: -0.533209
x=4.600 f(x)=cosx szereg: f(x)=1.#INF00 funkcja: -0.112153
x=5.050 f(x)=cosx szereg: f(x)=1.#INF00 funkcja: 0.331234
x=5.500 f(x)=cosx szereg: f(x)=1.#INF00 funkcja: 0.708670
x=5.950 f(x)=cosx szereg: f(x)=1.#INF00 funkcja: 0.945005
x=6.400 f(x)=cosx szereg: f(x)=1.#INF00 funkcja: 0.993185
x=6.850 f(x)=cosx szereg: f(x)=1.#INF00 funkcja: 0.843616
x=7.300 f(x)=cosx szereg: f(x)=1.#INF00 funkcja: 0.526078
x=7.750 f(x)=cosx szereg: f(x)=1.#INF00 funkcja: 0.103794
x=8.200 f(x)=cosx szereg: f(x)=1.#INF00 funkcja: -0.339155
x=8.650 f(x)=cosx szereg: f(x)=1.#INF00 funkcja: -0.714576
x=9.100 f(x)=cosx szereg: f(x)=1.#INF00 funkcja: -0.947722
x=9.550 f(x)=cosx szereg: f(x)=1.#INF00 funkcja: -0.992170
x=10.000 f(x)=cosx szereg: f(x)=1.#INF00 funkcja: -0.839072
Press any key to continue . . .

Funkcja 'fun' powinna liczyć taki wzór: user image

0

Gdyby tak czytałeś uważnie zadanie, lub znałeś jakieś podstawy matematyki to wiedziałbyś cokolwiek o dziedzinie tego rozkładu.

0

Dzięki za wyczerpującą odpowiedź.
Czy ktoś jest w stanie mi pomóc?

0

Pomyśl, jaka największa liczba mieści się na int, a potem zastanów się, dlaczego jest mniejsza od 12! i co to dla Ciebie oznacza. W efekcie albo zmień typ wyniku zwracanego przez funkcję silnia albo przemyśl algorytm i zaimplementuj go w inny sposób, przy czym sugeruję Ci tę drugą opcję. Dragon podał Ci poprawne rozwiązanie problemu, tylko nie zrozumiałeś jego odpowiedzi, bo bezmyślnie stosujesz swój algorytm. Powtórzę to innymi słowami: sprawdź we wzorze na rozwinięcie cos(x) w szereg dla jakiej dziedziny argumentów jest on poprawny.

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