Obliczanie sumy oraz ilości liczb parzystych w ciągu

0

Dany jest ciąg liczb zakończony liczbą ujemną, która do niego nie nienależy. Oblicz sumę oraz ilość liczb parzystych w ciągu. Napisałem poniższy kod ale nie działa, ktoś podpowie?

#include <iostream>
#include <string>
#include <cstdlib>

int main()
{
    int suma = 0;
    int temp  = 0;
    int parzyste  = 0;
    
    std::cout << "Podaj liczbe: " <<std::endl;
    
    while( temp < 0 )
    {
        if (temp % 2 == 0) 
            parzyste++;
    
        std::cin >> temp;    
        suma = suma + temp;
    }
    
    std::cout << "suma liczb = " << suma <<" a liczba liczb parzystych wynosi: " << parzyste <<std::endl;
    return 0;
}
0

Co rozumiesz przez "nie działa"?

2
int temp  = 0;

// ...

while( temp < 0 )

Jak to niby ma działać? Warunek pętli nigdy nie jest spełniony, więc i nigdy nie jest wykonywana.

1
while( temp < 0 )

Warunek jest zły

To tak na pierwszy rzut okiem.

0

While( temp < 0 )
to warunek końca pętli czyli kończy ja gdy zmienna temp przyjmie wartości mniejsze niż 0 w przeciwnym wypadku wykonuje jeden cyk. Przynajmniej takie jest założenie :D

0

Odwrotnie. To jest warunek wykonania pętli. Pętla będzie się wykonywała wyłącznie gdy temp < 0.

0

Po zmianie znaku na przeciwny nadal coś nie działa zgodnie z założeniem. Nie czeka na podanie liczby.

1

Zacznij opisywać swoje problemy sensownie, zamiast pisać, że „coś nie działa”.

0
kq napisał(a):

Odwrotnie. To jest warunek wykonania pętli. Pętla będzie się wykonywała wyłącznie gdy temp < 0.

while( /* warunek kończący pętlę */ )
{
    //powtarzany blok instrukcji
}

http://cpp0x.pl/kursy/Kurs-C++/Poziom-3/Petla-while/354

jesteś pewnie, że masz racje z tym warunkiem?

0

Owszem, przeczytaj ze zrozumieniem:

Dopóki warunek jest spełniony (czyli wartość logiczna wynosi true) dopóty pętla będzie powtarzała instrukcję (lub blok instrukcji) występujący bezpośrednio po słowie kluczowym while.

0

@rafall93123: po co starasz się nam tłumaczyć jak działają pętle, skoro sam tego nie rozumiesz? Czytaj co się do Ciebie pisze, a Twój program zacznie działać prawidłowo. ;)

0

Dziękuję za pomoc. Ostateczna wersja - może przyda się jakiemuś innemu gimnazjaliście.

#include <iostream>
#include <string>
#include <cstdlib>
//&& temp>=0
int main()
{
    int suma = 0;
    int temp = 0;
    int parzyste = 0;
    
    std::cout << "suma liczb = "<<std::endl;
    
    while( temp >= 0 )
    {
        suma = suma + temp;   
        std::cin >> temp;
        if (temp % 2 == 0) 
            parzyste++;  
        
    }
    std::cout << "suma liczb = " << suma <<" a liczba liczb parzystych wynosi: " << parzyste <<std::endl;
    return 0;
}

1

Pętla while nie jest odpowiednia do tego celu – ma się wykonać co najmniej raz, więc należy użyć do while.

Druga rzecz to niepotrzebne wyświetlenie danych przed pętlą. Dwa razy wyświetlasz ciąg suma liczb = – najpierw raz w jednej linii, następnie drugi raz w kolejnej linii. Uruchamiałeś w ogóle ten program? Przecież to widać w konsoli.

Trzecia rzecz to inkrementacja – suma = suma + temp można zapisać jako suma += temp. Poza tym, jak już używasz polskich nazw, to używaj ich w całym programie. Jednak najlepiej będzie, jeśli cały kod zawsze pisać będziesz w całości po angielsku.

Czwarta rzecz to niepotrzebny warunek w celu inkrementacji zmiennej parzyste. Wynik modulo możesz bezpośrednio wykorzystać do inkrementacji zmiennej – albo wartość powiększy się o 1, albo nie powiększy się wcale:

parzyste += temp % 2;

Piąta rzecz (w ramach ciekawostki) – deklarację i inicjalizację zmiennych możesz zgrupować:

int suma, temp, parzyste;
suma = temp = parzyste = 0;

Lub tak:

int suma = 0, temp = 0, parzyste = 0;

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