14. Napisz program, w którym zdefiniowana jest początkowo jedna zmienna typu całkowitego
(nazwijmy ją w treści n). Program oblicza częściową sumę szeregu harmonicznego biorąc n
początkowych wyrazów szeregu harmonicznego. Proszę
zrealizować to zadanie wykorzystując jeden raz pętle for, a drugi raz pętlę while (lub do-while).
Przykładowy wynik działania programu:
Wybrana liczba: 11
Częściowa suma szeregu harmonicznego dla 11 początkowych wyrazów: 3.0198773448773446
int n = 11;
System.out.println("Wybrana liczba: " + n);
// SPOSOB 1 (petla for):
double suma1=0;
for(int i = 1; i <= n; i++)
{
suma1+=(double)1/i; // suma1 = suma1 + 1/liczba1;
}
System.out.println("Czesciowa suma szeregu harmonicznego dla "+n+" poczatkowych wyrazow: "+suma1);
// SPOSOB 2 (petla while):
int liczba2=1;
double suma2=0;
while(liczba2 <= n)
{
suma2+=(double)1/liczba2; // suma2 = suma2 + 1/liczba2;
liczba2++;
}
System.out.println("Czesciowa suma szeregu harmonicznego dla "+n+" poczatkowych wyrazow: "+suma2);
// SPOSOB 3 (petla do while):
int liczba3=0;
double suma3=0;
do
{
liczba3++;
suma3+=(double)1/liczba3; // suma3 = suma3 + 1/liczba3;
}
while(liczba3 <= n);
System.out.println("Czesciowa suma szeregu harmonicznego dla "+n+" poczatkowych wyrazow: "+suma3);
1 - Czy sposób 2 jest poprawny?
2 - Nie do końca rozumiem "wdrożenia w życie" pętli do while, mój wynik trochę różni się od pozostałych, mimo że zmienną "liczba3" specjalnie zmniejszyłem o 1.
Faktycznie teraz działa, ale nie rozumiem dlaczego trzeba zacząć od liczba3=1 i czemu w części "do" kolejność ma znaczenie (chodzi o to, że wyrażenie liczba3++ ma być na końcu).
Powód jest podobny jak w jednym z innych tematów, w którym odpowiadałem - gdy zrobisz tak jak wspomniałem, to liczenie sumy zakończy się na wartości liczba3 równej 11 (tak jak powinno być). Gdy dasz liczba3++ wcześniej tak jak jest teraz, to jej wartość wskoczy już na 12 i dla niej jeszcze ta suma zostanie policzona, a tego już nie chcemy.
No ale przecież ta pętla już nie powinna się wykonać po jedenastym przejściu, więc patrząc na kolejność wydaje mi się, że powinno być liczba3++ przed zliczaniem sumy tak na logikę
Gdy liczba3 == 11 to pętla wejdzie w kolejny obieg, bo Twój warunek to liczba3 <= n. A w kolejnym obiegu liczba3 wzrośnie do 12 i wykona się jeszcze sumowanie. I dopiero w 13. obieg pętla nie wejdzie.
A nie można zacząć od liczba3=0 tylko dlatego, że nie dzielimy przez 0 tak?
Tak, dzielenie przez 0 nie jest dobrym pomysłem ;)
1 - liczy w porządku, więc wygląda na to, że wszystko jest ok ;)
2 - przesuń liczba3++ za zliczanie sumy (ogólnie w pętlach tę instrukcję kroku, w której zwiększamy wartość zmiennej iteracyjnej robi się raczej na końcu - tak przecież automatycznie już nawet robi to pętla for) i zacznij od liczba3 = 1 i będzie ok ;)