Tabelaryzcja danej funkcji.

0

Witam,
Mam do napisania program, który dla podananych granic przedziałów a i b, tabelaryzuję funkcję f(x) = 1 / (1+x).
Napisałem taki oto kod lecz coś jest źle prosiłbym o wskazanie błędu.

Istnieje również dalsza część zadania za którą nie bardzo wiem jak się zabrać:
Dodatkowo program rysuje wykres słupkowy funkcji, w którym wysokość
słupka (liczba znaków w słupku) jest dopasowana do szerokości 50 znaków
wartością funkcji. Poprawnie działający program wywołany z argumentami
0 i 5 powinien generować następujące wyniki.
0.00 1.00 **************************************************
1.00 0.50 *************************
2.00 0.33 ****************
3.00 0.25 ************
4.00 0.20 **********
5.00 0.17 ********

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

//Program tabelaryzujący funkcję dla danego przedziału.

double funkcja(double);

int main () {
	double x, a, b, krok;
	printf("\n");
	printf("Podaj poczatek przedzialu: ");
	scanf("%lf", &a);
	printf("Podaj koniec przedzialu: ");
	scanf("%lf", &b);
	printf("Podaj krok: ");
	scanf("%lf", &krok);
	printf("\n");

    

//rysowanie tabeli.

	printf("   x   |  funkcja  \n");
	printf("-------+------------------\n");
	for (x = a; x < b; x += krok)
        printf("%5.3f  |%8.3f  |%8.3f\n", x, funkcja(x));

	printf("%5.3f  |%8.3f\n", b, funkcja(b));
	printf("-------+------------------\n");
	printf("\n");
	system("PAUSE");
    return 0;
}

double funkcja(double x) {
    int y;
    y = 1 / (1+x);
    return y;
}
0

Co konkretnie jest źle?

0

Podczas uruchamiania wartosci funkcji w tabeli sa jako 0.00000
aha i w tej linijce printf("%5.3f |%8.3f |%8.3f\n", x, funkcja(x)); niepotrzebie dałem |%8.3f
Ale po zmianie nadal jest tem sam blad

0

Jakie wartości a i b podajesz?

0
_13th_Dragon napisał(a):

Jakie wartości a i b podajesz?

a=1, b=5 , krok = 1

2

Z funkcji zwracasz int (zmienna y), chyba miało być double (zobacz wewnątrz funkcji, nie chodzi o typ zwracany).

Tak na marginesie to ta zmienna jest niepotrzebna, po prostu napisz return <wyrazenie>;.

0
Endrju napisał(a):

Z funkcji zwracasz int (zmienna y), chyba miało być double (zobacz wewnątrz funkcji, nie chodzi o typ zwracany).

Ok, dzięki wartości dobrze podaje, ma może ktoś pomysł na tą dalszą część zadania?

0

Ja bym to zrobił tak, że 50 znaków odpowiada maksymalnej wartości w tym zakresie jaki wypisujesz, a reszta jest przeskalowana odpowiednio. Można też ustalić, że 50 to jakaś wartość i potem skalować odpowiednio każdą wygenerowaną. Zaletą drugiego rozwiązania jest to, że nie trzeba nigdzie zapisywać wyników, żeby szukać maksimum*. (I chyba o to drugie chodzi)

  • Jak słusznie zauważył @_13th_Dragon dla tej funkcji nie trzeba niczego zapisywać, bo jest to funkcja ściśle malejąca.
0

Radzę tęż przerobić pętle:
int n=(b-a)/krok+1;
for(int i=0;i<=n;++i) { x=(a*(i-n)+bi)/n; y=funkcja(x); printf("%5.3f |%8.3f |%8.3f | %c\n", x, y,(int)((y50)/max+0.5),''); }

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