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

Niedziałające warunki w pętli while

Ostatnio zmodyfikowano 2015-02-13 15:26
Autor Wiadomość
Vanilahajs
Temat założony przez niniejszego użytkownika
Niedziałające warunki w pętli while
» 2015-02-12 10:35:40
Witam.
Mam napisać program wczytujący liczby z klawiatury, oparty na pętli "do while", który ma się kończyć w następujących przypadkach:
1) suma podanych liczb jest większa niż 10,
2) liczba podanych ujemnych liczb jest większa niż 5,
3) dwie ostatnio podane liczby są identyczne.

Niestety warunki w while, nie działają gdy są napisane tak jak poniżej, czyli z operatorem logicznym ||. W przypadku gdy są zapisane pojedynczo to wszystko jest ok. Gdzie popełniłem błąd? Pracuję na Visualu. Pozdrawiam.
C/C++
#include<iostream>

using namespace std;

int main()
{
    int i = 0, s = 0, a;
   
    do
    {
        cout << "Podaj liczbe: ";
        cin >> a;
        s += a;
        if( a < 0 )
        {
            i++;
        }
       
    }
    while(( s < 10 ) ||( i < 5 ) );
   
    system( "pause" );
}
P-126415
wilkoo13
» 2015-02-12 11:20:27
s<10 to nie to samo co liczby nie większe od 10. tak samo w podpunkcie b.

Zależy czy te przypadki muszą być wszystkie czy wystarczy jeden aby zakończyć pętle.
Jeśli wszystkie to warunki jakie podałem s>10 oraz i>5 zrób z operatorem && oraz zneguj:
!(warunek1 && warunek2)

Jeśli ma chociaż jeden być spełniony zrób tak samo tylko że z operatorem ||.
!(warunek1 || warunek2)
P-126416
Peruskough
» 2015-02-12 11:21:36
Problem jest w tym, że napisałeś ||. Teraz pętla działa gdy co najmniej jeden z warunków jest spełniony (gdy np. i<5 nie jest już prawdziwe, to pętla nadal będzie działać, bo s<10 to wciąż prawda). While powinno się przerwać gdy którykolwiek z warunków jest nieprawdziwy, dlatego zastosuj &&. Kolejna rzecz, że w obu warunkach zamiast < powinno być <=, inaczej funkcja przerwie się gdy suma liczb będzie równa 10, a ma być przecież większa niż 10.

@UP

To jest pętla do while, ma się wykonywać dopóki warunki są spełnione, czyli bez tego !. Z tą negacją przerwie się po jednym obiegu.
P-126417
Vanilahajs
Temat założony przez niniejszego użytkownika
» 2015-02-12 12:23:13
Dzięki śliczne za pomoc. Rzeczywiście na początku w zły sposób zacząłem myśleć ;)

Tutaj wklejam pełną treść zadania oraz rozwiązanie:

Na prośbę programu użytkownik podaje liczbę. Czynność ta powtarzana jest, zanim
zostanie spełniony chociaż jeden z następujących warunków:
1) suma podanych liczb jest większa niż 10,
2) liczba podanych ujemnych liczb jest większa niż 5,
3) dwie ostatnio podane liczby są identyczne.
Po zakończeniu podawania liczb program w nowej linii wyświetla liczby minimalną i
maksymalną ze wszystkich podanych. Do podawania liczb użyj pętli do ... while.

C/C++
#include<iostream>
#include<cstddef>
#define NULL 0
using namespace std;

int main()
{
    float s = 0, a, max = NULL, min = NULL;
    float poprzednia = NULL;
    int i = 0;
    bool identyczne = false;
    do
    {
        cout << "Podaj liczbe: ";
        cin >> a;
       
        if( poprzednia == a )
        {
            identyczne = true;
        }
       
       
        s += a;
       
        if( a < 0 )
        {
            i++;
        }
       
        if( a >= max ) max = a;
       
        if( a <= min ) min = a;
       
        poprzednia = a;
       
    }
    while(( s <= 10 ) &&( i <= 5 ) &&( identyczne != true ) );
   
    cout << "Liczba maksymalna: " << max << endl;
    cout << "Liczba minimalna: " << min << endl;
   
    system( "pause" );
}
P-126421
wilkoo13
» 2015-02-12 14:20:57
Nie przerwie się, będzie się wykonywał wg założeń. Program będzie się wykonywał gdy suma liczb będzie większa niż 10 oraz gdy ilość wpisanych liczb ujemnych będzie większa niż 5. Działa tak samo.
P-126422
Peruskough
» 2015-02-12 14:30:36
Będzie się wykonywał kiedy suma liczb będzie większa niż 10, a ma się wykonywać gdy będzie mniejsza lub równa 10.

Jeśli chodzi o wypisywanie liczby maksymalnej i minimalnej, to musisz to poprawić bo początkowo max i min są równe 0, więc gdyby wszystkie cyfry były ujemne, to największa u Ciebie równa by była 0, z kolei gdyby wszystkie były dodatnie to najmniejsza byłaby równa 0.
P-126423
wilkoo13
» 2015-02-12 15:10:01
Pisząc "gdy" miałem na myśli "dopóki nie".
Przeanalizuj jeszcze raz co napisałem na początku i sprawdź czy mówimy o tym samym.
C/C++
do {
    //kod
} while( !(( s > 10 ) &&( i > 5 ) ) );
P-126425
Peruskough
» 2015-02-12 21:32:00
Wybacz, nie zauważyłem, że dałeś znak większości, myślałem, że mniejszości. Zwracam honor.
P-126448
« 1 » 2
  Strona 1 z 2 Następna strona