Krótki algorytm z prostą pętlą

0

Proszę o pomoc dlaczego to nie liczy dobrze. Treść zadania jest taka "Dla podanego n oblicz następują wartość: 1/2+2/3+3/4+...+n/(n+1)."
Widzę, że liczy nie sumę, a pokazuje poszczególny wyraz ciągu w wyniku.

#include <stdio.h>
#include <stdlib.h>

int main() {
    // Write C code here
    int n;
    float i, a, suma;
    printf("Podaj liczbe wyrazow ciagu\n");
    scanf("%d", &n);

    for(i=1;i<=n;++i)
    {
    suma=0.0;
    a=i/(i+1);
    suma=a+suma;
    }
    printf("Suma wyrazow ciagu s(%d) to %f", n, suma);
    return 0;
}
4

suma=0.0; daj przed pętle

0

Dziękuję za szybką odpowiedź. Czy mógłbyś tylko wytłumaczyć dlaczego? Staram się zrozumieć działanie tego wszystkiego.

2

Czy mógłbyś tylko wytłumaczyć dlaczego

Jeśli chcesz sumować wyniki cząstkowe to nie możesz żerować sumy co iteracje

0

@KamilAdam: Widzę, że nadal gdzieś jest błąd, bo dla 2 wyrazów w ciągu pokazuje wynik 0,75, a powinno być 1,166

@Karol321: @KamilAdam: Dobrze napisałeś, przeniosłem sumę przed nawias {, ale nadal w pętli.

@KamilAdam: Czy mógłbyś krok po kroku wytłumaczyć jak to działa? Bo widzę, że w zależności od tego gdzie wstawię sumę to pokazuje inny wynik.
Nie mogę zrozumieć różnicy.

Jak wstawię tak jak poniżej to jest dobrze:

suma=0.0;
    for(i=1;i<=n;++i)
    {
    a=i/(i+1);
    suma=a+suma;
    }

jak wstawię jak poniżej to dla sumy 2 wyrazów pokazuje wynik 0,75

for(i=1;i<=n;++i)
        suma=0.0;
    {
    a=i/(i+1);
    suma=a+suma;
    }

jak wstawię jak poniżej to dla sumy 2 wyrazów pokazuje wynik 0,66

for(i=1;i<=n;++i)

    {
    suma=0.0;
    a=i/(i+1);
    suma=a+suma;
    }
1

W drugim kodzie nie wykonujesz w pętli tego co jest w nawiasach. Wykonujesz tylko i wyłączenie zerowanie w pętli. O trzecim już pisałem

0

Dzięki za pomoc. Trzecie zrozumiałem. NIe zdawałem sobie sprawy, że w każdej pętli nadawało sumie wartość 0.0. Myślałem, że bez różnicy będzie gdzie umieszczę sumę. Odnośnie 2 to jeszcze nie rozumiem. Tam dla i=1, ma sumę 0.0 i sumę łączną: 1/2, później i=2, i teraz co się dzieje, bo jeśli suma znowu jest zerowana , to po wykonaniu nawiasów powinno być 0,66, a jest 0,75

2

Odnośnie 2 to jeszcze nie rozumiem

kod drugi dla n=2

for(i=1;i<=n;++i) suma=0.0;

//tutaj i == 3 
{
a=i/(i+1); // a = 3/4
suma=a+suma; // suma = 3/4 + 0
}
0

Zastanawiam się cały czas, dlaczego i=3? Czy dla n=2, "i" nie będzie wynosiło 2, a "a" wynosiło 2/3? Przy i =3 nie wykona się pętla po raz 3, bo i=3 nie jest <= n=2.

2

Przy i =3 nie wykona się pętla po raz 3, bo i=3 nie jest <= n=2

Dokładnie tak. dla i == 3 przerwie się bezsensowna pętla for(i=1;i<=n;++i) suma=0.0; i zacznie wykonywać się reszta kodu czyli:

{
a=i/(i+1); // a = 3/4
suma=a+suma; // suma = 3/4 + 0
}

Ta, ten kod jest poza pętlą i wykona się po petli

2

Czyli to jest tak, że po nie spełnieniu warunku pętli po raz ostatni wykonywane jest to co jest między nawiasami?

Nie. Pętla powtarza następną instrukcję za pętlą. W drugim przykładzie cała pętla to:

for(i=1;i<=n;++i)
  suma=0.0;

Nic więcej nie jest tam w pętli. Jest to "skrócony" zapis

for(i=1;i<=n;++i) 
{
  suma=0.0;
}

Za to zmienna i po pętli dalej istnieje oraz ma wartość n + 1
W uproszczeniu ten kod jest równoważny:

i = 1;
while(i<=n) 
{
  suma=0.0;
  ++i;
}

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