Liczby ujemne w pętli

Odpowiedz Nowy wątek
2015-01-25 18:49
Panix
0

Mam taki problem, musze policzyć średnią arytmetyczną. Dla liczb dodatnich jest wszystko ok lecz gdy zaczne pętle od liczby ujemnej to wychodzą złe wyniki


#include<stdio.h>

int main()
{
        int i=0;
        float suma=0;

        for(i=-2; i<=6; i++)
        {
                suma+=i;
        }// i tutaj przyjmuje wartość 7 zamiast 9. Dlaczego?
        suma=suma/i;

        printf("%f\n",suma);
} 

Pozostało 580 znaków

2015-01-25 18:55
1

Ale dlaczego miałoby być 9?

for (a; b; c) d;

jest mniej więcej równoważny:

a; while (b) {d; c;}

Zamień to sobie w ten sposób i prześledź. Pętle while mam nadzieję masz w 100% rozkminioną.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Pozostało 580 znaków

2015-01-25 18:56
Panix
0

Poprawiłem to tak ale chciałbym wiedziec czemu tak jest i czy da sie to zrobic w inny sposob


#include<stdio.h>

int main()
{
        int i=0;
        float suma=0;

        for(i=-2; i<=6; i++)
        {
                suma+=i;
        }
        suma=suma/(i+=2);

        printf("%f\n",suma);
}
~        

Pozostało 580 znaków

2015-01-25 18:59
1

Bo sam napisałeś, że pętla ma się wykonywać dopóki i<=6, czyli w pewnym momencie po wykonaniu i++ wartość i będzie równa 7 i pętla się zakończy. Co w tym zaskakującego?

Pozostało 580 znaków

2015-01-25 19:02
Panix
0

No ale ona zaczyna się od -2 aż do 6 więc 9 a nie 7. Dalej tego nie rozumiem. Zamieniłem na while ale to nic mi nie rozjaśniło.
Więc to co napisałem wyżej jest poprawne?

Pozostało 580 znaków

2015-01-25 19:16
1

Skąd ci się 9 bierze?

For magicznie nie liczy ilości iteracji. Jeśli chcesz policzyć ilość iteracji, to policz je explicite. For nie wymaga też licznika pętli, zamiast zmiennej i typu int możesz wsadzić tam np konia. Przykład:

Koń koń;
for (koń = świeżyKoń(); koń.kolor() != KOLOR_CZERWONY; kopacz.kopKonia(koń)) {
  skoczNaPiwo();
}

"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 2x, ostatnio: Wibowit, 2015-01-25 19:20

Pozostało 580 znaków

2015-01-25 19:19
Panix
0

no bo pętla zaczyna sie od -2 do 6 włącznie to 8 ale dalej nie 7

Pozostało 580 znaków

2015-01-25 19:20
1

i<=6, czego nie rozumiesz w tym warunku?
Przecież to jasne, że wyjdziesz z pętli jak i > 6, w twoim przypadku i wtedy będzie miało wartość 7.

//Wróć do czytania pierwszych stron kursu, bo nie załapałeś jak działa pętla for.

edytowany 1x, ostatnio: some_ONE, 2015-01-25 19:22

Pozostało 580 znaków

2015-01-25 19:22
Panix
0

rzeczywiscie nie liczy, ale porażka.
Więc jak mam to zrobic?

Faktycznie porażka... - Tacet 2015-01-25 19:26

Pozostało 580 znaków

2015-01-25 19:24

Policz explicite, np:

int suma, liczba, licznik;
for (suma = 0, liczba = -2, licznik = 0; liczba <= 6; liczba++, licznik++) {
  suma += liczba;
};
wyprintuj(suma, licznik);

"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit, 2015-01-25 19:25

Pozostało 580 znaków

2015-01-25 19:29
Panix
0

aaaa dzięki wibowit, juz rozumiem, niby proste ale nigdy bym na to nie wpadl

Dzieki wam za pomoc

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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