Wątek przeniesiony 2018-11-12 16:52 z C/C++ przez furious programming.

Pomoc w znalezieniu błędu w kodzie zadania

0

Siemka, zacząłem ostatnio przygodę z programowaniem w c++, natknąłem sie na taki problem:

Napisz program wyznaczający iteracyjnie (numerycznie) sumę szeregu: 1/1 + 1/2 + 1/3 + 1/4 + . . . + 1/n.

Prosiłbym o pomoc i wskazanie błędu w kodzie lub wgl w zrozumieniu sensu zadania. Tak jak mówię jestem dosyć świeży w tym temacie.

#include <iostream>
using namespace std;

int main()
{
	float n, m, suma;
	cout<<"Podaj n: ";
	cin>>n;
	m= 1/n;
	suma=1;
    for(int i=1; i<=n-1; i++){
        n--;
        suma+=m;
    }
    cout<<"suma wynosi: "<<suma<<endl;
}
0
int main()
{
    float n, m, suma;
    cout<<"Podaj n: ";
    cin>>n;
    suma=0; //zmiana
    for(int i=1; i<=n-1; i++){
         m= 1/i;
        suma+=m;
    }
    cout<<"suma wynosi: "<<suma<<endl;
}
1

Twoja pętla robi coś bardzo dziwnego i zupełnie nie to, o co chodzi w zadaniu. Tutaj z jednej strony zwiększasz licznik i, a z drugiej zmniejszasz n, jednocześnie obniżając granicę pętli. Oprócz tego, dodajesz cały czas to samo wyrażenie, 1/n.

A w zadaniu, no cóż, chodzi o zsumowanie kolejnych malejących ułamków — 1/1, 1/2, 1/3, 1/4 i tak dalej, aż do 1/n. Czyli masz licznik idący od jedynki do n. I tak właśnie zakodź pętlę.

0
    for(int i=1; i<=n-1; i++){
        n--;
        suma+=m;
    }

Bardzo dziwna pętla, szczególnie, że modyfikujesz zarówno n jak i i, czyli obydwa warunki. Staraj się robić pętle w których tylko jedna część warunku się zmienia.

Dodajesz m, które jest stałe - powinieneś zmieniać jego wartość w pętli. Przykład:

double suma = 0;
int n;
cin >> n;
for(int i = 1; i <= n; i++) {
    suma += 1.0/n;
}
0

A w zadaniu, no cóż, chodzi o zsumowanie kolejnych malejących ułamków — 1/1, 1/2, 1/3, 1/4 i tak dalej, aż do 1/n. Czyli masz licznik idący od jedynki do n. I tak właśnie zakodź pętlę.

W ten sposób?

#include<iostream>
using namespace std;

int main()
{
	float n, suma;
	cout<<"Podaj n: ";
	cin>>n;
    for(int i=2; i<=n; i++){
        suma+= 1/i;
    }
    cout<<"suma wynosi: "<<suma+1<<endl;
}
1

Prawie.

#include <cstdio>
float n, suma;
/* korzystamy z domyślnego inicjalizowania typów wbudowanych w c++
* tutaj, suma przed pętlą wynosi ```0``` 
*/
n = 3;
for(float i=1; i<=n; i++)
suma+= 1/i;
printf("suma %f\n", suma); // -> 1.833333
printf("suma recznie %f\n", 1 + 1/2 + 1/3); // -> 1.833333

EDYCJA: Gdyby liczyć tę sumę w funkcji, to już musimy ustawić początkową wartośc na zero, inaczej będzie UB (komentarz).

float sum(int n){
	float suma = 0;
	
	for(float i=1; i<=n; i++)
		suma += 1/i;
	
	return suma;
}
0

Nie Obrażaj się, że pojadę personalnie (a nie tak jak powinno się dyskutować na fachowych forach: z argumentami), ale Czytasz posty w tym wątku? Zauważyłeś jakieś różnice pomiędzy kodem PHP;), który Wkleiłeś, a moim c++?

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