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

Zabezpieczanie przed wprowadzaniem liter

Ostatnio zmodyfikowano 2014-01-01 16:38
Autor Wiadomość
Pytajnik
Temat założony przez niniejszego użytkownika
Zabezpieczanie przed wprowadzaniem liter
» 2013-12-14 15:12:43
Witam,


Napisałem program do wykonywania prostych działań matematycznych. Mam problem z zabezpieczeniem go przed wpisywaniem liter, zrobiłem coś takiego:
C/C++
case 2: { system( "cls" );
    cout << "=====================" << endl;
    cout << "      DODAWANIE      " << endl;
    cout << "=====================" << endl;
    cout << "Podaj pierwsza liczbe: ";
    cin >> a;
    if( cin.fail() == true )
    { system( "cls" );
        cout << "Zly znak";
        cout << "\nNacisnij 0 aby wrocic";
        cin.clear();
        cin.sync(); break; }
    cout << "Podaj druga liczbe: ";
    cin >> b;
    if( cin.fail() == true )
    { system( "cls" );
        cout << "Zly znak";
        cout << "\nNacisnij 0 aby wrocic";
        cin.clear();
        cin.sync(); break; }
    cout << "Liczba " << a << " dodac liczba " << b << " = " << a + b << endl;
    cout << "\nAby wrocic wcisnij klawisz 0"; break; }
Jeśli podam do zmiennej 'a' np: literę 'k' to program pokazuje komunikat o złym znaku,  gdy podam '7k' dalej wszystko działa prawidłowo.
Problem pojawia się gdy program dochodzi do zmiennej 'b', gdy podam 'k' wszystko jest dobrze, ale jak podam '7k' to program przechodzi dalej podaje wynik, a litera 'k' zostaje jakby pominięta,nie ma komunikatu o błędzie, następnie wracam do menu głównego klawiszem 0, wchodzę ponownie w jakieś menu (dodawanie,odejmowanie...) i od razu wyrzuca błąd o złym znaku. Tak jakby odkłada błąd na później :D

No to chyba wszystko. Pozdrawiam ;) 
P-99190
pekfos
» 2013-12-15 12:01:51
Operator >> odczytuje dane do pierwszego nieprawidłowego znaku i wyrzuca błąd, gdy niczego się nie udało odczytać. Gdy podasz 7k pobrane jest 7, a k zostaje w strumieniu i, przy następnym wczytywaniu, jest pobierane w pierwszej kolejności. Czyść strumień przed wczytywaniem.
P-99260
Pytajnik
Temat założony przez niniejszego użytkownika
» 2013-12-15 12:56:38
Ok, nie mam już błędu po przejściu do innego menu, ale dalej nie wiem jak zabezpieczyć zmienną b przed wpisywaniem liter. Po podaniu '7k' do zmiennej a, 'k' przechodzi do b i dalej działa if(cin.fail() == true)(czyli tu wszystko działa), ale już przy podaniu tego samego do b zabezpieczenie nie działa, bo tak jak pisałeś 'k' przechodzi dalej(albo do następnego menu, albo jest czyszczone, po zastosowaniu się do twoje rady)
P-99270
pekfos
» 2013-12-15 13:01:15
Czyść strumień przed wczytywaniem.
Niezależnie od tego, czy błąd wystąpił.
P-99271
Pytajnik
Temat założony przez niniejszego użytkownika
» 2013-12-15 13:15:09
No i tak też zrobiłem, ale chodzi mi o zabezpieczenie przed wpisywaniem do zmiennych liter (przy podaniu najpierw liczby potem litery też ma to działać, a nie działa, działa tylko przy podaniu najpierw litery)
P-99272
pekfos
» 2013-12-15 15:16:53
Podaj kod.
P-99280
Pytajnik
Temat założony przez niniejszego użytkownika
» 2013-12-24 14:00:55
C/C++
#include<iostream>
#include<windows.h>
#include<conio.h>

using namespace std;

void Draw( int type )
{
    HANDLE pisadlo;
    pisadlo = GetStdHandle( STD_OUTPUT_HANDLE );
    double a, b;
   
    switch( type )
{ case 1: { system( "cls" );
           
            cout << "======================" << endl;
            SetConsoleTextAttribute( pisadlo, 3 );
            cout << "      KALKULATOR      " << endl;
            SetConsoleTextAttribute( pisadlo, 7 );
            cout << "======================" << endl;
            cout << "1) Dodawanie" << endl;
            cout << "2) Odejmowanie" << endl;
            cout << "3) Mnozenie" << endl;
            cout << "4) Dzielenie" << endl;
            cout << "5) Potegowanie" << endl;
            cout << "6) Pierwiastkowanie" << endl;
            cout << "0) Wyjscie" << endl; break; }
       
    case 2: { system( "cls" );
            cout << "=====================" << endl;
            SetConsoleTextAttribute( pisadlo, 3 );
            cout << "      DODAWANIE      " << endl;
            SetConsoleTextAttribute( pisadlo, 7 );
            cout << "=====================" << endl;
            cout << "Podaj pierwsza liczbe: ";
            cin >> a;
            cout << "Podaj druga liczbe: ";
            cin >> b;
            cout << "Liczba " << a << " dodac liczba " << b << " = " << a + b << endl;
            cout << "\nAby wrocic wcisnij klawisz 0"; break; }
       
    case 3: { system( "cls" );
            cout << "=======================" << endl;
            SetConsoleTextAttribute( pisadlo, 3 );
            cout << "      ODEJMOWANIE      " << endl;
            SetConsoleTextAttribute( pisadlo, 7 );
            cout << "=======================" << endl;
            cout << "Podaj pierwsza liczbe: ";
            cin >> a;
            cout << "Podaj druga liczbe: ";
            cin >> b;
            cout << "Liczba " << a << " odjac liczba " << b << " = " << a - b << endl;
            cout << "\nAby wrocic wcisnij klawisz 0"; break; }
       
    case 4: { system( "cls" );
            cout << "====================" << endl;
            SetConsoleTextAttribute( pisadlo, 3 );
            cout << "      MNOZENIE      " << endl;
            SetConsoleTextAttribute( pisadlo, 7 );
            cout << "====================" << endl;
            cout << "Podaj pierwsza liczbe: ";
            cin >> a;
            cout << "Podaj druga liczbe: ";
            cin >> b;
            cout << "Liczba " << a << " razy liczba " << b << " = " << a * b << endl;
            cout << "\nAby wrocic wcisnij klawisz 0"; break; }
       
    case 5: { system( "cls" );
            cout << "=====================" << endl;
            SetConsoleTextAttribute( pisadlo, 3 );
            cout << "      DZIELENIE      " << endl;
            SetConsoleTextAttribute( pisadlo, 7 );
            cout << "=====================" << endl;
            cout << "Podaj pierwsza liczbe: ";
            cin >> a;
            cout << "Podaj druga liczbe: ";
            cin >> b;
            cout << "Liczba " << a << " dzielona na liczbe " << b << " = " << a / b << endl;
            cout << "\nAby wrocic wcisnij klawisz 0"; break; }
       
    case 6: { system( "cls" );
            cout << "=======================" << endl;
            SetConsoleTextAttribute( pisadlo, 3 );
            cout << "      POTEGOWANIE      " << endl;
            SetConsoleTextAttribute( pisadlo, 7 );
            cout << "=======================" << endl;
            cout << "Podaj liczbe: ";
            cin >> a;
            cout << "Podaj potege: ";
            cin >> b;
            cout << "Liczba " << a << " do potegi " << b << " = " << pow( a, b ) << endl;
            cout << "\nAby wrocic wcisnij klawisz 0"; break; }
       
    case 7: { system( "cls" );
            cout << "============================" << endl;
            SetConsoleTextAttribute( pisadlo, 3 );
            cout << "      PIERWIASTKOWANIE      " << endl;
            SetConsoleTextAttribute( pisadlo, 7 );
            cout << "============================" << endl;
            cout << "Podaj liczbe: ";
            cin >> a;
            cout << "Pierwiastek z " << a << " = " << sqrt( a ) << endl;
            cout << "\nAby wrocic wcisnij klawisz 0"; break; }
       
    }
   
}

int main()
{
    int menu = 1;
    bool narysuj = 1;
   
    for(;; )
    {
       
        if( _kbhit() )
        {
           
            int klawisz = _getch();
           
            switch( menu )
            {
            case 1: switch( klawisz )
            { case 49: menu = 2; narysuj = 1; break;
                case 50: menu = 3; narysuj = 1; break;
                case 51: menu = 4; narysuj = 1; break;
                case 52: menu = 5; narysuj = 1; break;
                case 53: menu = 6; narysuj = 1; break;
                case 54: menu = 7; narysuj = 1; break;
                default: cout << "Nieznany klawisz!"; Sleep( 400 ); narysuj = 1; break;
                case 27: return 0;
                case 48: return 0;
                }
            case 2: if( klawisz == '0' ) { menu = 1; narysuj = 1; } break;
            case 3: if( klawisz == '0' ) { menu = 1; narysuj = 1; } break;
            case 4: if( klawisz == '0' ) { menu = 1; narysuj = 1; } break;
            case 5: if( klawisz == '0' ) { menu = 1; narysuj = 1; } break;
            case 6: if( klawisz == '0' ) { menu = 1; narysuj = 1; } break;
            case 7: if( klawisz == '0' ) { menu = 1; narysuj = 1; } break;
               
               
               
               
            } //s(menu)
           
           
        } //if
       
        if( narysuj )
        { Draw( menu );
            narysuj = 0; }
       
    } //for
    return 0;
}

Oto cały kod programu, podpowiedzcie mi jak zabezpieczyć go przed wpisywaniem innych znaków niż liczby.
P-100068
pekfos
» 2013-12-24 14:05:17
P-100070
« 1 » 2
  Strona 1 z 2 Następna strona