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

Rozdział 15, zadanie 2 i 3 - rozwiazanie

Ostatnio zmodyfikowano 2018-09-18 18:50
Autor Wiadomość
rupson
Temat założony przez niniejszego użytkownika
Rozdział 15, zadanie 2 i 3 - rozwiazanie
» 2018-09-18 15:15:25
Witam serdecznie,

Walczę z zadaniem 2 i 3 z rozdziału 15.
Kalkulator działa jak należy z tym, że gdy przyszło do jego zabezpieczenia przed wprowadzeniem złych danych czegoś cały czas mi brakuje.
C/C++
#include <iostream>
#include <limits>

using namespace std;

int main()
{
    float a, w = 0;
    int d;
    bool dobra_liczba, dobre_dzialanie;
    do
    {
        cout << "Wynik to " << w << endl;
        cout << "Podaj liczbe niezerowa lub 0 by zakonczyc: " << endl;
        cin >> a;
        dobra_liczba = cin.good();
        if( dobra_liczba == 1 )
        {
            cout << "Wybierz dzialanie: " << endl;
            cout << "[1] Dodawanie" << endl;
            cout << "[2] Odejmowanie" << endl;
            cout << "[3] Mnozenie" << endl;
            cout << "[4] Dzielenie" << endl;
            cout << "[5] Rezygnuje" << endl;
            cin >> d;
            dobre_dzialanie = cin.good();
            if( dobre_dzialanie == 1 )
            {
                switch( d )
                {
                case 1:
                    w = w + a;
                    break;
                case 2:
                    w = w - a;
                    break;
                case 3:
                    w = w * a;
                    break;
                case 4:
                    w = w / a;
                    break;
                case 5:
                    break;
                }
            }
        }
        else
             cin.clear();
       
        cin.ignore( numeric_limits < streamsize >::max(), '\n' );
    } while( dobra_liczba == 1 || dobre_dzialanie == 1 || a != 0 );
   
    return 0;
}
Tak więc przy wprowadzaniu poprawnych liczb program działa zgodnie z założeniami. Przy wprowadzeniu liter za pierwszą liczbę program się zapętla i działa jak należy, natomiast przy wpisaniu liter za wybór działania dwukrotnie wyświetla linijkę z wynikiem i prośbą o podanie liczby niezerowej, po której jeśli podać znowu litery to zakańcza swoje działanie...
Dodam iż przy podaniu licz spoza zakresu wyboru działania np. 50 wtedy zapętla do początku tak jak być powinno.
Taki wynik mnie nie satysfakcjonuje dlatego szukam porady :)
P-172339
pekfos
» 2018-09-18 15:33:45
» Kurs C++ » Poziom 1Obsługa strumienia wejściowego lekcja
Tu masz przykład jak wygląda wczytywanie liczby z czyszczeniem strumienia i zachowaniem informacji, czy wystąpił błąd. Chcesz to zapętlić dopóki występuje błąd. Co oznacza że będziesz mieć kawałek kodu do skopiowania w każde miejsce, gdzie chcesz wymagać od użytkownika wprowadzenia poprawnej liczby. Po konstrukcji twojego kodu wnioskuję, że chciałeś uniknąć kopiowania kodu, ale w efekcie zapętlasz niewłaściwe rzeczy. Za dwie lekcje poznasz mechanizm do poprawnego unikania kopiowania kodu w takim przypadku.
P-172341
rupson
Temat założony przez niniejszego użytkownika
» 2018-09-18 18:50:05
Dzięki bardzo za rady, trochę pomyślałem i poszło :)
Wrzucam kod dla osób z podobnym problemem.
C/C++
#include <iostream>
#include <limits>

using namespace std;

int main()
{
    float a, w = 0;
    int d;
    bool blad_liczba, blad_dzialanie;
    do
    {
        do
        {
            cout << "Wynik to " << w << endl;
            cout << "Podaj liczbe niezerowa lub 0 by zakonczyc: " << endl;
            cin >> a;
            blad_liczba = cin.fail();
            cin.clear();
            cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
        } while( blad_liczba == 1 );
       
        if( a == 0 ) return 0;
       
        do
        {
            cout << "Wybierz dzialanie: " << endl;
            cout << "[1] Dodawanie" << endl;
            cout << "[2] Odejmowanie" << endl;
            cout << "[3] Mnozenie" << endl;
            cout << "[4] Dzielenie" << endl;
            cout << "[5] Rezygnuje" << endl;
            cin >> d;
            blad_dzialanie = cin.fail();
            cin.clear();
            cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
        } while( blad_dzialanie == 1 );
       
        if( d == 0 ) return 0;
       
        switch( d )
        {
        case 1:
            w = w + a;
            break;
        case 2:
            w = w - a;
            break;
        case 3:
            w = w * a;
            break;
        case 4:
            w = w / a;
            break;
        case 5:
            break;
        }
    } while( blad_liczba == 0 || blad_dzialanie == 0 || a != 0 );
   
    return 0;
}
P-172348
« 1 »
  Strona 1 z 1