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

Zadanie 1. Pętla do...while

Ostatnio zmodyfikowano 2014-06-18 14:31
Autor Wiadomość
Haryen
Temat założony przez niniejszego użytkownika
Zadanie 1. Pętla do...while
» 2014-06-17 22:03:40
Cześć! Zrobiłem pierwsze zadanie z lekcji do..while za pomocą samych boolów, ale chciałem to również zrobić ifami. Problem w tym, że kiedy uruchamiam program i wpiszę na przykład 'e', to wyświetla mi "Nieprawidlowy znak! Podaj prawidlowa liczbe: " (ok, tak ma być), ale kiedy wpiszę nieprawidłowy znak jeszcze raz, to muszę wpisywać liczbę 2 razy. Nie wiem jak to wytłumaczyć, najlepiej gdybyście sami sprawdzili. Pewnie wina leży po stronie
if( !( cin >> liczba ) )
 oraz
cin >> liczba;
, ale nie wiem jak to naprawić. Treść zadania:

Napisz program, który wczyta liczbę, a następnie wypisze ją na ekranie. Zabezpiecz przed wczytaniem nieprawidłowej liczby.
1. Podaj liczbę
2. Jeżeli błąd, wróć do kroku 1.
3. Wypisz liczbę, która została podana.

Kod:
C/C++
#include <iostream>

using namespace std;

int main()
{
    double liczba;
   
    cout << "Podaj liczbe: ";
    do
    {
        if( !( cin >> liczba ) )
        {
            cin.clear();
            cin.sync();
            cerr << "Nieprawidlowy znak!" << endl;
            cout << "Podaj prawidlowa liczbe: ";
            cin >> liczba;
            bool czySukces = cin.good();
            cin.clear();
            cin.sync();
           
            if( czySukces )
            {
                cout << "Liczba to: " << liczba << endl;
                break;
            }
        }
        else
        {
            cout << "Liczba to: " << liczba << endl;
            break;
        }
       
    } while( !( cin >> liczba ) );
   
    return 0;
}
P-112205
pekfos
» 2014-06-17 22:40:47
Nie wiem jak to wytłumaczyć, najlepiej gdybyście sami sprawdzili.
Po co sprawdzać, od razu widać.. Sprawdzenie warunku while wymaga podania dodatkowej liczby.
C/C++
while( !( std::cin >> liczba ) )
{
    std::cerr << "blablabla\n";
    std::cin.clear();
    std::cin.sync();
}
std::cout << liczba;
P-112206
Haryen
Temat założony przez niniejszego użytkownika
» 2014-06-18 14:31:29
Ok, wszystko jasne. Już wszystko działa. Jeśli chciałbym rozwiązać to w taki sposób, to jedynym wyjściem jak rozumiem jest pętla while, bo ona sprawdza warunek na początku, tak?

C/C++
#include <iostream>

using namespace std;

int main()
{
    double liczba;
   
    cout << "Podaj liczbe: ";
    while( !( cin >> liczba ) )
    {
        cerr << "Nieprawidlowa liczba!" << endl;
        cout << "Podaj prawidlowa liczbe: ";
        cin.clear();
        cin.sync();
    }
   
    cout << "Twoja liczba: " << liczba << endl;
   
    return 0;
}

A czy na tę chwilę najlepsze rozwiązanie z pętlą do...while jest takie? Można coś tu usprawnić?
C/C++
#include <iostream>
using namespace std;

int main()
{
    double liczba;
    bool czyWczytano;
   
    do
    {
        cout << "Podaj liczbe: ";
        cin >> liczba;
        czyWczytano = cin.good();
        cin.clear();
        cin.sync();
       
        if( czyWczytano == false )
        {
            cout << "Nieprawidlowa liczba!" << endl;
            continue;
        }
       
    } while( czyWczytano == false );
   
    cout << "Twoja liczba: " << liczba << endl;
   
    return 0;
}
P-112227
« 1 »
  Strona 1 z 1