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

Rozdzial 15. Praca domowa, zadanie 2 i 3

Ostatnio zmodyfikowano 2017-04-23 22:34
Autor Wiadomość
trb
Temat założony przez niniejszego użytkownika
Rozdzial 15. Praca domowa, zadanie 2 i 3
» 2017-04-23 21:22:27
Witam, jestem początkujący i mam problem z praca domowa. Wydaje mi się, że rozwiązanie jest napisane poprawnie (tj. spełnia warunki postawione w poleceniu) ale gdy zmienna symbolizująca wybór działania jest typu int i kiedy wybór jest z zakresu 1-5, kiedy zmieniam typ zmiennej na char to po wpisaniu wyboru (nawet jeżeli jest prawidłowy) kończy działanie programu i czeka na wciśniecie dowolnego klawisza. Kiedy podam wartość działania z poza zakresu 1-5  w przypadku kiedy zmienna wyboru działania jest typu int program zwraca to co jest po instrukcji default. Co robię źle?

C/C++
#include <iostream>
int main()
{
    float liczba1, liczba2;
   
    std::cout << "wprowadz  pierwsza liczbe na ktorej chcesz przeprowadzic dzialanie: " << std::endl;
    std::cin >> liczba1;
   
    if( std::cin.fail() ) //sprawdza czy pierwsza liczba jest wpisana porpawnie
    {
        do
        {
            std::cout << "pierwsza liczba jest niepoprawna, sproboj cos innego " << std::endl;
            std::cin.clear(); //clear i sync sa potrzebne przed wprowadzeniem nowej wartosci poniewaz inaczej petla sie nie konczy
            std::cin.sync();
            std::cin >> liczba1;
        } while( std::cin.fail() );
       
    }
   
    std::cout << "podaj druga liczbe, na ktorej chcesz przeprowadzic dzialanie" << std::endl;
    std::cin >> liczba2;
   
    if( std::cin.fail() ) //sprawdza czy druga liczba jest wpisana poprawnie
    {
        do
        {
            std::cout << "druga liczba jest niepoprawna, sproboj cos innego " << std::endl;
            std::cin.clear();
            std::cin.sync();
            std::cin >> liczba2;
        } while( std::cin.fail() );
       
    }
   
    if( liczba2 != 0 )
    {
        std::cout << "Wybierz rodzaj dzialania: " << std::endl;
        std::cout << "[1] Dodawanie" << std::endl;
        std::cout << "[2] Odejmowanie" << std::endl;
        std::cout << "[3] Mnozenie" << std::endl;
        std::cout << "[4] Dzielenie" << std::endl;
        std::cout << "[5] Rezygnuj" << std::endl;
        int dzialanie;
        std::cin >> dzialanie;
       
        if( std::cin.fail() )
        {
            do
            {
                std::cout << "niepoprawny wybor dzialania, sproboj ponownie " << std::endl;
                std::cin.clear();
                std::cin.sync();
                std::cin >> dzialanie;
            } while( std::cin.fail() || dzialanie <= 0 || dzialanie > 5 );
           
        }
       
        switch( dzialanie )
        {
        case 1:
            std::cout << "wynik dodawania to " << liczba1 + liczba2 << std::endl;
            break;
        case 2:
            std::cout << "wynik odejmowania to " << liczba1 - liczba2 << std::endl;
            break;
        case 3:
            std::cout << "wynik mnozenia to " << liczba1 * liczba2 << std::endl;
            break;
        case 4:
            std::cout << "wynik dzielenia to " << liczba1 / liczba2 << std::endl;
            break;
        case 5:
            std::cout << "rezygnujesz" << std::endl;
            break;
        default:
            std::cout << "cos poszlo nie tak" << std::endl;
        }
    } else std::cout << "podales 0 jako druga liczbe, tak nie mozna" << std::endl;
   
    return 0;
}
P-160446
pekfos
» 2017-04-23 21:23:55
1 wczytane jako char jest spoza zakresu. Znak '1' ma wartość liczbową 49.
P-160447
trb
Temat założony przez niniejszego użytkownika
» 2017-04-23 21:29:59
Dzieki za szybką odpowiedź, czyli mam zrezygnować z używania typu char? Jak poradzić sobie z wymuszeniem wartości zmiennej dzialanie żeby użytkownik musuial wprowadzić coś z zakresu 1-5?

Edit:

Chyba sobie poradziłem, dopisałem cin.clear() i cin.sync() przed pierwszym wczytaniem zmiennej dzialanie i jak na razie działa :)

Edit2:

Jednak nie do końca, nic nie zmieniałem w kodzie a kiedy wpisuje jako dzialanie coś spoza zakresu 1-5, program zwraca to co jest po default
P-160448
pekfos
» 2017-04-23 22:34:53
Jednak nie do końca, nic nie zmieniałem w kodzie a kiedy wpisuje jako dzialanie coś spoza zakresu 1-5, program zwraca to co jest po default
Bo nie sprawdzasz tego za pierwszym razem.

czyli mam zrezygnować z używania typu char?
Wystarczy pamiętać, że '0' to nie 0.
P-160451
« 1 »
  Strona 1 z 1