Wątek przeniesiony 2014-10-17 11:17 z C/C++ przez Shalom.

Program obliczający sumę szeregu Maclaurina funkcji sin x

0

Mam napisać program obliczający sumę szeregu Maclaurina funkcji sin x dla k od 1 do pewnej zadanej wartości całkowitej kmax i dla pewnego zadanego wymiernego x. Napisałam kod i kompilator nie pokazuje błędów, ale wynik zawsze wychodzi 1.000000. Mógłby ktoś mi podpowiedzieć co jest nie tak i co powinnam zmienić? Byłabym wdzieczna

#include <stdio.h>

int silnia(int k){ 
	int s = 1;
	int a=2*k+1;
	for (int i = 0; i < a; i++){
		s = s*(a - i);
	}
	return s;
}

int potega(int a, int x){
	int p = 1;
	int k;
	a=2*k+1;
	for (int i = 1; i < a; i++){
		p = p*x;
	}
	return p;
}

int main(){
	int k;
	int x;

	printf("podaj k w zakresie od 1 do 15\n");
	scanf("%d", &k);
	printf("podaj x\n");
	scanf("%d", &x);

	int a=2*k+1;

	double sum = 1;
	for (int i = 1; i < a; i++){
		sum = sum + (1/silnia(i)*potega(i,x));
	
		printf("suma szeregu wynosi %f\n", sum);
	}
}
1

W zasadzie nic w tym kodzie nie jest dobrze. Szczególnie że nie pokusiłaś się o włączenie myslenia tylko naklepałaś "na pałe" trochę kodu. Programowanie nie na tym polega.
Popatrz na ciąg:
1 + x + x2 + x3 + ... + xn
Czy liczyłabyś to poprzez liczenie za każdym razem kolejnej potęgi x? A nie widzisz czasem że kolejny wyraz takiego ciągu jest związany z wyrazem poprzednim? Że w tym przypadku a(i+1) = x*a(i) i nagle żadne potęgi nie są potrzebne...
W twoim przypadku ani liczenie potęgi ani silni nie jest potrzebne i właściwie nie ma sensu. Co więcej nie będzie nawet poprawnie działac bo silnia rośnie bardzo szybko i raz dwa przekroczy ci zakres zmiennej liczbowej.

A konkretny problem który masz w kodzie to operacja: 1/silnia(i). Dzielisz int/int co daje dzielenie całkowitoliczbowe tzn 1/2 = 0 i 1 reszty. Więc u ciebie ten człon zawsze wyniesie 0. Jak chcesz dzielenie zmiennoprzecinkowej to użyj 1.0/cośtam.

0
    int k;
    a=2*k+1;

Jaka jest wartość k? UB.

1/silnia(i)*potega(i,x)

jest to równoważne

(1/silnia(i))*potega(i,x)

Ponieważ obie funkcje zwracają int, liczysz z zaokrągleniem do całości, silnia zwraca wartości większe od 1, więc wynikiem dzielenia jest zero.

Wiesz, że masz poprawną i działającą funkcję pow, której możesz użyć zamiast Twojej błędnej?

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