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

Pętla do while

Ostatnio zmodyfikowano 2015-05-04 22:58
Autor Wiadomość
Bubu
Temat założony przez niniejszego użytkownika
Pętla do while
» 2015-04-13 14:40:39
Cześć, męczę się z tym kodem od 30 minut i za nic nie mogę wykombinować rozwiązania, chodzi o to, że mam podać liczbę, jeżeli jest okej to program ją wypisze, jeżeli nie to znowu poprosi o wpisanie liczby, zrobiłem coś takiego:

C/C++
int liczba;

int main()
{
    do
    {
        cout << "Podaj liczbe: " << endl;
        cin >> liczba;
        if( liczba )
        {
            cout << "Liczba to: " << liczba << endl;
        }
        else
        {
            cout << "Niepoprawny znak";
        }
    } while( liczba != cin.good() );
   
    return 0;
}

Program działa okej, ale jeżeli wpiszę literę to pętla zaczyna wykonywać się nieskończenie wiele razy, podając "Nieprawidlowy znak! Podaj liczbe:!" Na moją logikę nie wiem co tu jest źle. do - powtarzaj ten kod, while - dopóki liczba nie będzie jedynką logiczną.
P-130797
wojownik266
» 2015-04-13 14:44:09
Może funkcja isdigit rozwiązała by Twój problem? Poczytaj:
http://cpp0x.pl/dokumentacja​/standard-C/isdigit/252
P-130798
Bubu
Temat założony przez niniejszego użytkownika
» 2015-04-13 14:53:52
Poczytałem o tej funkcji, trochę logiki i działa idealnie, dzięki - zarzucam gotowiec do nauki:

C/C++
char liczba;

int main()
{
    do
    {
        cout << "Liczba: " << endl;
        cin >> liczba;
        if( isdigit( liczba ) )
        {
            cout << "Liczba to: " << liczba << endl;
        }
        else
        {
            cout << "To nie jest liczba!" << endl;
        }
    } while( !isdigit( liczba ) );
   
    return 0;
}
P-130800
spike1975
» 2015-04-17 19:10:32
ja instrukcji do... while nie znam jeszcze ale wiem dlaczego ci się w nieskończoność pokazuje błąd i nie daje sie zatrzymac.
tak jak i u kolegi który mial problem z wczytaniem liczb nie wyczyściles bufora strumienia wejściowego przed wprowadzaniem z niego danych.
ponieważ nie zrobiles tego to jeżeli wprowadzisz do bufora wartość która nie jest liczba ona sama nie zniknie tylko ciągle siedzi w buforze i pętla wykonuje się w nieskończoność bo ciągle wpada w nią błędny znak który nie jest liczbą. ten znak nie znika bo nie da się go przypisać zmiennej liczbowej i tak w koło macieju (znaczy w nieskończoność).
wystarczy tylko przed instrukcją
cin >>
wpisać instrukcje czyszczenia bufora:

cin.clear ()
cin.sync ()

i już nie będzie petla dzialac w nieskonczoność.
choć nie zmienia to faktu że i tak nie działa komunikat "Niepoprawny znak".

Nie działa bo w instukcji if wpisałeś w nawiasie zmienną liczba. to oznacza że dla każdej wartości zmiennej innej niż 0 będzie ci pokazywało wartość zmiennej a komunikat "niepoprawny znak" dostaniesz jak wpiszesz 0 (które paradoksalnie jednak jest liczbą :)

moim zdaniem pownno być:

if (cin.good())...

wtedy będzie dla każdej poprawnie wczytanej liczby wypisywalo jej wartość a dla tego co się nie wczyta będzie dawalo komunikat "niepoprawny znak".
no ale ja się też dopiero uczę.
P-131081
Szymon2727
» 2015-04-28 18:45:09
Wojownik, a bez tego też można napisać taką pętlę ?
P-131561
pekfos
» 2015-04-28 20:34:38
Wojownik, a bez tego też można napisać taką pętlę ?
Można. isdigit() to nie jest (dobre) rozwiązanie tego problemu.
P-131577
Szymon2727
» 2015-04-29 16:40:33
Bardzo fajnie, że można, ale pod tym kryj się takie ukryte pytanie, które się schowało (wiesz, jak białe znaki w std::cin). Jak ?
P-131616
pekfos
» 2015-04-29 16:49:49
C/C++
while( !( std::cin >> liczba ) )
{
    std::cin.clear();
    std::cin.sync();
    std::cout << "Niepoprawne dane.\n";
}
std::cout << liczba;
P-131617
« 1 » 2 3
  Strona 1 z 3 Następna strona