Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] pętla z dodawaniem

Ostatnio zmodyfikowano 2017-02-23 15:35
Autor Wiadomość
Wilga
Temat założony przez niniejszego użytkownika
[C++] pętla z dodawaniem
» 2017-02-13 23:29:31
Treść polecenia: Napisz program sumujący liczby parzyste – liczba (-50) kończy wprowadzanie danych.

Mój kod:

C/C++
#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
    int a, b;
    int c = a % 2;
    int d = b % 2;
    cout << "Oto program sumujacy liczby parzyste. Zakonczy prace, gdy podasz liczbe -50. \n";
    cout << "Podaj pierwsza liczbe:";
    cin >> a;
    cout << "Podaj druga liczbe:";
    cin >> b;
    do
    {
        if( c == 0 || d == 0 )
        {
            cout << "Ich suma to:" << a + b << endl;
            cout << "Podaj pierwsza liczbe:";
            cin >> a;
            cout << "Podaj druga liczbe:";
            cin >> b;
        }
        else cout << "Podales liczbe nieparzysta. Podaj parzysta.";
       
    }
    while( a != - 50 || b != - 50 );
   
    cout << "Wpisales liczbe -50. Program konczy prace.";
   
    system( "pause" );
    return 0;
}

Kompiluje się prawidłowo, jednak nie reaguje na nieprawidłowe wpisanie - "łyka" zarówno wpisanie liczby nieparzystej, jak i -50. Czy ma ktoś z Was pomysł, co jest nie tak?
P-157682
latajacaryba
» 2017-02-14 00:21:12
Po pierwsze bład masz tu:

C/C++
int a, b;
int c = a % 2;
int d = b % 2;
cout << "Oto program sumujacy liczby parzyste. Zakonczy prace, gdy podasz liczbe -50. \n";
cout << "Podaj pierwsza liczbe:";
cin >> a;
cout << "Podaj druga liczbe:";
cin >> b;
do
{
    if( c == 0 || d == 0 )
Na początku w zmiennych a i b masz śmieci (pozostałości w pamięci - losowe liczby), zrób tak
int a = 0, b = 0;

Po drugie

    int c = a % 2;
    int d = b % 2;

Nie oznacza to, że po wpisaniu liczby będzie to aktualne. Przykład:

C/C++
int a = 5;
int modulo = a % 2 // czyli 2/5 reszta = 1
cout << "modulo: " << modulo << endl;
a = 4; // 4/2 r = 0
cout << "modulo teraz " << modulo << endl;
Rezultat:
modulo: 1
modulo teraz: 1

Jeśli chcesz to naprawić to po każdej zmianie liczby a musisz jeszcze raz podstawić tą liczbę, w sensie:
C/C++
int a = 5
int modulo = a % 2 // czyli 2/5 reszta = 1
cout << "modulo: " << modulo << endl;
a = 4; // 4/2 r = 0
modulo = a % 2 // 4/2 r = 0
cout << "modulo teraz " << modulo << endl;

Dlatego właśnie łyka nieparzyste :)
C/C++
int a = 0, b = 0;
cout << "Oto program sumujacy liczby parzyste. Zakonczy prace, gdy podasz liczbe -50. \n";
cout << "Podaj pierwsza liczbe:";
cin >> a;
cout << "Podaj druga liczbe:";
cin >> b;
int c = a % 2;
int d = b % 2;
do
{
    if( c == 0 || d == 0 )
    { //dalsza czesc kodu
to samo tu:
C/C++
if( c == 0 || d == 0 )
{
    cout << "Ich suma to:" << a + b << endl;
    cout << "Podaj pierwsza liczbe:";
    cin >> a;
    cout << "Podaj druga liczbe:";
    cin >> b;
    c = a % 2;
    d = b % 2;
}
P-157685
michal11
» 2017-02-14 10:04:05
Z tego jak ja rozumiem treść zadania to w tym programie wystarczą dwie zmienne, jedna pętla i jeden if. Moim zdaniem przekombinowałeś.
P-157692
Wilga
Temat założony przez niniejszego użytkownika
» 2017-02-14 11:51:33
Latajacaryba, dzięki za odpowiedź, powoli czyszczę. Na razie znalazłam jeszcze inny błąd - w while powinny być && zamiast ||, inaczej kończy program dopiero wtedy, gdy obie podane liczby to -50.
P-157694
latajacaryba
» 2017-02-14 13:28:19
while (x == 0 && y == 0) - wykonuj pętle dopóki x równa się 0 ORAZ/I y = 0 - muszą być spełnione 2 warunki
while (x == 0 || y == 0) - wykonuj pętle dopóki x równa się 0 LUB y = 0  - musi być spełniony jeden z warunków

C/C++
do {
} while( a != - 50 || b != - 50 );

Wykonuj dopóki a jest inne od -50 LUB b jest inne od -50.
Dlatego jeśli a = -50, b = 4 program dalej wykonuje pętle - w końcu warunek się zgadza, jedna ze zmiennych jest inna niż -50 - jest to zmienna 'b' o wartości 4
P-157696
Wilga
Temat założony przez niniejszego użytkownika
» 2017-02-14 20:51:02
Wiem, że tak, jak piszesz, jest logicznie i powinno być, co nie zmienia faktu, że z koniunkcją wychodzi, a alternatywą nie. Ale ogólnie nie wychodzi nadal, może wynika to z innego błędu.

Michal11 - jak w takim razie zrobić, żeby były dodawane wyłącznie parzyste?
P-157717
michal11
» 2017-02-14 22:44:25
jedna zmienna na sumę druga na wczytywaną liczbę. Wczytujesz liczbę w pętli do while, po wczytaniu sprawdzasz czy jest parzysta i czy nie jest równa -50, jeżeli warunki są spełnione to dodajesz ją do sumy, po wyjściu z pętli jeszcze tylko wypisujesz sumę i tyle.

jak napisałeś treść zadania
Napisz program sumujący liczby parzyste – liczba (-50) kończy wprowadzanie danych
rozumiem to tak, że masz wczytywać liczby dopóki nie natrafisz na -50 (czyli nie wczytywać po dwie) i sumować z tych wczytanych tylko parzyste.
P-157719
Wilga
Temat założony przez niniejszego użytkownika
» 2017-02-16 09:15:39
Próbuję i wiele z tego nie wychodzi. Po zmianach wygląda tak:

C/C++
#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
    int a = 0;
    int b = 0;
    cout << "Oto program sumujacy liczby parzyste. Zakonczy prace, gdy podasz liczbe -50. \n";
    cout << "Podaj pierwsza liczbe:";
    cin >> a;
    cout << "Podaj druga liczbe:";
    cin >> b;
    int c = a % 2;
    int d = b % 2;
   
    do
    {
        if( c == 0 && d == 0 )
        {
            cout << "Ich suma to:" << a + b << endl;
            cout << "Podaj pierwsza liczbe:";
            cin >> a;
            cout << "Podaj druga liczbe:";
            cin >> b;
            int c = a % 2;
            int d = b % 2;
        }
        else
        { cout << "Podales liczbe nieparzysta, podaj parzysta. Pierwsza liczba:";
            cin >> a;
            cout << "Podaj druga liczbe:";
            cin >> b;
            int c = a % 2;
            int d = b % 2; }
    }
    while( a !=( - 50 ) && b !=( - 50 ) );
   
    cout << "Wpisales liczbe -50. Program konczy prace.";
   
    system( "pause" );
    return 0;
}

Kończy pracę przy -50, ale nic sobie nie robi z nieparzystych. Próbowałam już różnych rozwiązań, ale, jak widać, nic nie dały.
P-157816
« 1 » 2
  Strona 1 z 2 Następna strona