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

Zadanie Domowe. Kalkulator na pętli do...while.

Ostatnio zmodyfikowano 2014-12-15 21:05
Autor Wiadomość
Piotrek9706
Temat założony przez niniejszego użytkownika
Zadanie Domowe. Kalkulator na pętli do...while.
» 2014-12-13 18:13:36
Witam,
Od kilku dni uczę się C++. Dziś napotkałem problem przy tworzeniu kalkulatora z pracy domowej w rozdziale 14.
Nie mogę jakoś ogarnąć tych cin.good() i cin.fail() . Dołączę kod źródłowy programu, może ktoś pomoże mi jak zabezpieczyć przed wprowadzeniem błędnych danych i co zrobiłem źle.

C/C++
#include <iostream>
using namespace std;

int main()
{
    int a, b;
    int wynik = 0;
    int dzialanie;
   
    do
    {
        cin.clear(); cin.sync();
        bool blad = true;
        cout << "Podaj liczbe a: ";
        cin >> a;
        cout << "   " << endl;
        cout << "Podaj liczbe b: ";
        cin >> b;
        cout << "   " << endl;
        if( a == 0 || b == 0 ) blad = false;
       
        if( blad == true )
        {
            cin.clear(); cin.sync();
            cout << " [1] - Dodawanie \n [2] - Odejmowanie \n [3] - Mnozenie \n [4] - Dzielenie \n [5] - Rezygnuj" << endl;
            cout << "   " << endl;
            cout << "Wybierz dzialanie: ";
            cin >> dzialanie;
            if( cin.good() ) blad = true;
            else if( cin.fail() ) blad = false;
           
            cout << "   " << endl;
           
            switch( dzialanie )
            {
            case 1:
                wynik = a + b;
                break;
            case 2:
                wynik = a - b;
                break;
            case 3:
                wynik = a * b;
                break;
            case 4:
                wynik = a / b;
                break;
            case 5:
                cout << " =================DO ZOBACZENIA=================";
                return 0;
                break;
            default:
                blad = false;
                if( cin.fail() ) blad = false;
               
                cin.clear(); cin.sync();
            }
           
            if( blad == false )
            {
                cout << "Cos poszlo nie tak :( " << endl;
                cout << "-------------------------------   " << endl;
                cout << "   " << endl;
            }
            else
            {
                cout << "Obecny wynik wynosi: " << wynik << endl;
                cout << "-------------------------------   " << endl;
                cout << "   " << endl;
               
               
            }
        }
       
        else
        {
            cout << "Wprowadziles bledne dane!";
            cout << "   " << endl;
        }
       
    } while( a != 0 && b != 0 );
   
    return 0;
   
   
}

No i powiedzcie czy bardzo strasznie ten kod wygląda :D
P-122807
Rashmistrz
» 2014-12-13 19:55:20
Nie mogę jakoś ogarnąć tych cin.good() i cin.fail()
Przyjmij na razie że są one "zmiennymi" i zawierają wartość typu
bool
,
a po użyciu cin.clear() ustawiana jest obydwu wartość
false

//EDIT  ustawi w cin.fail() wartość
false
, a w cin.good()
true


Możesz więc zrobić pętlę do...while,
której warunkiem będzie cin.fail(),
do wczytania liczby od użytkownika.
(i nie zapomnij o czyszczeniu bufora)
________________________________________________________________________

C/C++
if( a == 0 || b == 0 ) blad = false;
//...
if( blad == true )
A co jeśli będę chciał dodać zero do zera? >:D
______________________________________________________________________

Polecam Ci napisać TO jeszcze raz od nowa.

PS. Nie zapomnij że nie wolno dzielić przez zero.
P-122819
Piotrek9706
Temat założony przez niniejszego użytkownika
» 2014-12-13 21:31:05
Jutro napiszę jeszcze raz.
Dobrze rozumiem? :
cin.good() oznacza, że wprowadzone dane są prawidłowe, a cin.fail(), że wystapił jakiś błąd. Jeśli wpiszę do zmiennej a typu integer np jakąś literkę to będzie cin.fail() ?

No i czy powinienem użyć więcej niż jednej zmiennej typu bool do sprawdzenia poprawności wczytanych zmiennych? tj. jedna do liczby a, druga do b i trzecia do działania?

Przyjmij na razie że są one "zmiennymi" i zawierają wartość typu bool,a po użyciu cin.clear() ustawiana jest obydwu wartość false.
Mam jako początkową wartość boola przyjąć prawdę, czy fałsz?

Z góry dziękuję za odpowiedzi,
Pozdrawiam
P-122832
Rashmistrz
» 2014-12-14 00:40:25
Jeśli wpiszę do zmiennej a typu integer np jakąś literkę to będzie cin.fail() ?
Tak, wtedy ustawi się wartość
true
, a fladze cin.good() wartość
false
.

No i czy powinienem użyć więcej niż jednej zmiennej
typu bool do sprawdzenia poprawności wczytanych zmiennych?
tj. jedna do liczby a, druga do b i trzecia do działania?
Tylko wtedy gdy musisz wyczyścić flagi i będziesz
potrzebował informacji o wczytaniu przed ich wyczyszczeniem,
a jak nie to skonstruuj to tak, by nie
musieć używać dodatkowych zmiennych.

Przyjmij na razie że są one "zmiennymi" i zawierają wartość typu bool,
a po użyciu cin.clear() ustawiana jest obydwu wartość
false
.
//EDIT  ustawi w cin.fail() wartość
false
, a w cin.good()
true
Mam jako początkową wartość boola przyjąć prawdę, czy fałsz?
Przed pierwszym użyciem cin'a są ustawione
takie same wartości jak po użyciu cin.clear().
P-122836
Piotrek9706
Temat założony przez niniejszego użytkownika
» 2014-12-14 13:22:02
Oto treść zadania domowego:


Napisz prosty kalkulator, który będzie potrafił dodawać, odejmować, mnożyć i dzielić. Program ten ma działać następująco:
1. Wypisuje obecny wynik
2. Wprowadź liczbę
3. Wybierz działanie (jeżeli liczba różna od 0)
4. Wykonaj obliczenia (jeżeli liczba różna od 0)
5. Wróć do kroku 1.
6. Jeżeli wprowadzoną liczbą jest 0, zakończ program.


Przykładowe menu wyboru działania:
[1] Dodawanie
[2] Odejmowanie
[3] Mnożenie
[4] Dzielenie
[5] Rezygnuj

Zabezpiecz wcześniej napisany kalkulator przed podawaniem niepoprawnych liczb i operacji. Wykorzystaj wiedzę zdobytą z pierwszego zadania pracy domowej niniejszego rozdziału. Zabezpiecz również w analogiczny sposób przed możliwością wyboru nieprawidłowego działania.

A tutaj zamieszczam nowo napisany dziś przeze mnie kod. Wszystko wydaje się działać prawidłowo, jak w poleceniu.
Proszę o sprawdzenie kodu i ewentualne poprawki :)

C/C++
#include<iostream>
using namespace std;

int main()
{
    int a, b, wynik, znak;
    bool bladA, bladB, bladDzialania, SprawdzCzy0;
    do
    {
        cout << "Podaj pierwsza liczbe: ";
        cin >> a;
        if( cin.fail() )
             bladA = 0;
        else
             bladA = 1;
       
        cin.clear(); cin.sync();
        cout << "Podaj druga liczbe: ";
        cin >> b;
        if( cin.fail() )
             bladB = 0;
        else
             bladB = 1;
       
        cin.clear(); cin.sync();
        //---------------------------------Wczytywanie danych-----------------------------------
       
        if( bladA == 0 || bladB == 0 )
        {
            cout << "Wprowadziles bledne dane!" << endl;
            cout << "-------------------------------------" << endl;
            cout << "  " << endl;
        }
        else
        if( a != 0 && b != 0 )
        {
            SprawdzCzy0 = true;
            cout << " [1] - Dodawanie \n [2] - Odejmowanie \n [3] - Mnozenie \n [4] - Dzielenie \n [5] - Rezygnuj " << endl;
            cout << "Wprowadz liczbe odpowiadajaca dzialaniu: ";
            cin >> znak;
            cout << "  " << endl;
            if( cin.fail() )
                 bladDzialania = 0;
            else
                 bladDzialania = true;
           
            cin.clear(); cin.sync();
           
            switch( znak )
            {
            case 1:
                wynik = a + b;
                break;
            case 2:
                wynik = a - b;
                break;
            case 3:
                wynik = a * b;
                break;
            case 4:
                wynik = a / b;
                break;
            case 5:
                SprawdzCzy0 = false;
                break;
            default:
                bladDzialania = 0;
                break;
            }
           
            if( bladDzialania )
            {
                cout << "Obecny wynik wynosi: " << wynik << endl;
                cout << "-------------------------------------" << endl;
                cout << "  " << endl;
            }
            else
            {
                cout << "Wprowadziles bledne dane!" << endl;
                cout << "-------------------------------------" << endl;
                cout << "  " << endl;
            }
           
        }
       
        else
        {
            SprawdzCzy0 = 0;
            cout << "Wprowadzono 0! Program zakonczy dzialanie.";
        }
       
    } while( SprawdzCzy0 );
   
}
P-122850
Rashmistrz
» 2014-12-14 13:41:55
Dość przekombinowane...


bool bladA, bladB, bladDzialania, SprawdzCzy0;
Tylko wtedy gdy musisz wyczyścić flagi i będziesz
potrzebował informacji o wczytaniu przed ich wyczyszczeniem,
a jak nie to skonstruuj to tak, by nie
musieć używać dodatkowych zmiennych.
Dlaczego nie wstawić wczytywanie tych liczb w pętle? (każdą w osobnej)


C/C++
if( cin.fail() )
     bladA = 0;
else
     bladA = 1;

bladA = !cin.fail();

________________________________________________________

Twój program zachowuje się dość poprawnie,
jednak nie mogłem się za bardzo skupić,
więc nie wiem czy czegoś nie pominąłem.
P-122852
Piotrek9706
Temat założony przez niniejszego użytkownika
» 2014-12-14 20:29:19
Nie bardzo wiem jak ująć to w pętle i jaką pętle zastosować :/
Jeśli to wpakuję w pętle to nie będę potrzebował zmiennych pomocniczych ?
P-122867
Rashmistrz
» 2014-12-14 21:08:34
Jeśli to wpakuję w pętle to nie będę potrzebował zmiennych pomocniczych ?
Tak! Tak!

Nie bardzo wiem jak ująć to w pętle i jaką pętle zastosować :/
Użyjemy pętli do...while,
bo taką na razie znasz i
chcemy żeby przynajmniej
raz się wykonała zawartość:
C/C++
do
{
    cin.clear();
    cin.sync();
    cin >> liczba;
} while( cin.fail() );

O! Widzisz? :)
P-122869
« 1 » 2
  Strona 1 z 2 Następna strona