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

[Lekcja 15] Zadanie domowe KALKULATOR, problem z dwukrotnym wpisywaniem zmiennej

Ostatnio zmodyfikowano 2014-05-20 19:48
Autor Wiadomość
radek04
Temat założony przez niniejszego użytkownika
[Lekcja 15] Zadanie domowe KALKULATOR, problem z dwukrotnym wpisywaniem zmiennej
» 2014-05-20 12:57:42
Cześć, to mój pierwszy post i jestem zielony w programowaniu (ale coraz mniej dzięki kursowi).

Udało mi się już napisać 2 lub 3 działające kalkulatory, ale mam problem z zadaniem domowym z lekcji 15.

Próbowałem sztywno się trzymać zadania, czyli działanie programu ma wyglądać 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.

Błąd objawia się tym, że po dopisaniu:

C/C++
while( !( cin >> liczba ) )
{ cin.clear();
    cin.sync(); }

przy wpisaniu poprawnej wartości (liczby) nie wczytuje jej od razu, lecz za drugim razem.

Gdy robiłem to innym sposobem ( np. if (liczba>0 && liczba <=9) ) działało, ale dlaczego mam się ograniczać do konkretnego przedziału liczbowego. Chcę, by program rozpoznał poprawne wprowadzenie typu int.

C/C++
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
    int liczba;
    int wynik = 1;
    int dzialanie;
    cout << "Wynik = " << wynik << endl;
    do
    {
        cin.clear();
        cin.sync();
        cout << "\nWprowadz liczbe: ";
       
        cin >> liczba; // za drugim wpisaniem dopiero działa
       
        while( !( cin >> liczba ) )
        {
            cin.clear(); //kasowanie flagi błędu strumienia
            cin.sync(); //kasowanie zbędnych znaków z bufora
        }
       
        cout << "\nWybierz dzialanie: \n"
        "[1] Dodawanie\n"
        "[2] Odejmowanie\n"
        "[3] Mnozenie\n"
        "[4] Dzielenie\n"
        "[5] Rezygnuj\n\n";
        cin.clear();
        cin.sync();
        cin >> dzialanie;
       
        switch( dzialanie )
        {
        case 1:
            wynik = wynik + liczba;
            cout << "\nWynik = " << wynik << endl;
            break;
           
        case 2:
            wynik = wynik - liczba;
            cout << "\nWynik = " << wynik << endl;
            break;
           
        case 3:
            wynik = wynik * liczba;
            cout << "\nWynik = " << wynik << endl;
            break;
           
        case 4:
            wynik = wynik / liczba;
            cout << "\nWynik = " << wynik << endl;
            break;
           
        case 5:
            break;
           
        default:
            cout << "Zle wprowadzone dzialanie";
        }
       
    } while( liczba != 0 );
   
    system( "pause" );
    return 0;
}
P-110453
MrPoxipol
» 2014-05-20 13:26:10
C/C++
cin.clear();
cin.sync();
Wykonuj tylko po odczycie.
P-110456
radek04
Temat założony przez niniejszego użytkownika
» 2014-05-20 13:35:51
Czyli w którym momencie dokładnie? Usunięcie któregokolwiek cin.clear(); cin.sync(); (  poza tym z petli while(!(cin>>liczba))  )nie pomaga.
Chciałem czyścić bufor przed wczytaniem każdej kolejnej zmiennej. Źle?
P-110457
MrPoxipol
» 2014-05-20 13:49:05
C/C++
do
{
    cin.clear();
    cin.sync();
    cout << "\nWprowadz liczbe: ";
P-110461
radek04
Temat założony przez niniejszego użytkownika
Nie pomaga
» 2014-05-20 13:51:30
Niestety nie zmienia to działania programu.
Problem pozostał.
P-110462
Jacob99
» 2014-05-20 17:47:45
Do sprawdzenia czy strumień jest w dobrym stanie nie stosuje się while tylko if
C/C++
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
    int liczba;
    int wynik = 1;
    int dzialanie;
    cout << "Wynik = " << wynik << endl;
    do
    {
       
        cout << "\nWprowadz liczbe: ";
       
        cin >> liczba; // za drugim wpisaniem dopiero działa
       
        if( !cin >> liczba )
        {
            cin.clear();
            cin.sync();
        }
       
        cout << "\nWybierz dzialanie: \n"
        "[1] Dodawanie\n"
        "[2] Odejmowanie\n"
        "[3] Mnozenie\n"
        "[4] Dzielenie\n"
        "[5] Rezygnuj\n\n";
        cin >> dzialanie;
       
        switch( dzialanie )
        {
        case 1:
            wynik = wynik + liczba;
            cout << "\nWynik = " << wynik << endl;
            break;
           
        case 2:
            wynik = wynik - liczba;
            cout << "\nWynik = " << wynik << endl;
            break;
           
        case 3:
            wynik = wynik * liczba;
            cout << "\nWynik = " << wynik << endl;
            break;
           
        case 4:
            wynik = wynik / liczba;
            cout << "\nWynik = " << wynik << endl;
            break;
           
        case 5:
            break;
           
        default:
            cout << "Zle wprowadzone dzialanie";
        }
       
    } while( liczba != 0 );
   
    system( "pause" );
    return 0;
}

Spróbuj teraz. U mnie działało, u ciebie też powinno:)
P-110481
radek04
Temat założony przez niniejszego użytkownika
» 2014-05-20 18:44:52
U mnie nie działa po wpisaniu np. litery. Z liczba faktycznie wpisuje za pierwszym razem.
A z while to nie wiem, ale taki przykład znalazłem na jakiejś stronie próbując rozwiązać problem.

edit: z if nie działa, u mnie musi być while
P-110483
maly
» 2014-05-20 19:01:58
Bo to ten while miał zostać a ten cin powyzej miał zniknąć.
P-110488
« 1 » 2
  Strona 1 z 2 Następna strona