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

Sprawdzanie poprawności wprowadzonych danych

Ostatnio zmodyfikowano 2016-08-21 14:26
Autor Wiadomość
DavidYi
Temat założony przez niniejszego użytkownika
Sprawdzanie poprawności wprowadzonych danych
» 2016-08-18 23:08:22
Witam. Na wstępie powiem, że jestem tu nowy, regulamin czytałem, aczkolwiek jeśli coś zrobię nie tak, proszę mnie poprawić :)

Tytułem wstępu uczę się programować, robiąc kalkulator. Zatrzymałem się przy sprawdzaniu poprawności wprowadzonych danych. Szukałem długo w internecie, kombinowałem na różne sposoby, ale żaden mi nie wychodzi. Głównie chodzi o tą część:



C/C++
#include <iostream>
#include <limits>
using namespace std;
int main()
{
    long double wynik = 0;
    long double liczba, liczba1;
    char znak;
    //********************************************************************************
    do
    {
        if( wynik == 0 )
        {
            cout << "Podaj liczbe: ";
            cin >> liczba;
            if( cin.fail() )
            { cout << "Nieprawidlowa liczba\n";
                cin.sync();
                cin.clear();
                cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
                continue;
            }
           
            cout << "Podaj znak: ";
            cin >> znak;
            if( cin.fail() )
            {
                cout << "Nieprawidlowy znak\n";
                cin.sync();
                cin.clear();
                cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
                continue;
            }
        }
    } while( true );
   
}


Przy podawaniu liczby oraz znaku, jeśli wpiszę za dużo cyfr, liter lub znaków jednocześnie, pojawia się sekwencja cout-ów z całego programu. Jedyne co się nie pojawia to "Nieprawidłowy znak". Również gdy przy cout<<"Podaj znak" podam cyfry, program pomija cin>>liczba i przechodzi do cin>>znak, a chciałbym, żeby powracało na początek pętli i wszystko działało od nowa.
P-150979
carlosmay
» 2016-08-19 09:11:09
C/C++
if( cin.fail() )
{ cout << "Nieprawidlowa liczba\n";
    cin.sync(); // ta linijka nic nie robi (tym bardziej używając ignore(), użycie sync() nie ma sensu)
    cin.clear();
    cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
    continue;
}
cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); // tą linijką pozbywasz się pozostałych znaków po udanym wczytywaniu (np. 12abc)

Wczytywanie znaku
char
 jest trochę trudniejsze ponieważ liczby to też znaki,
więc musisz sprawdzić jaki znak jest wczytany.
P-150981
cppnewbie
» 2016-08-20 12:29:40
Możesz zapętlić to wszystko w pętli for(;;), while(true). Możesz także skorzystać z funkcji "switch" i jako jeden case przypisać "exit(0)".
P-151003
carlosmay
» 2016-08-20 14:38:41
Możesz także skorzystać z funkcji "switch" i jako jeden case przypisać "exit(0)".
Możesz trochę rozwinąć pomysł?
P-151008
cppnewbie
» 2016-08-20 22:59:14
sam sie ucze wiec troche moich komentarzy



#include <iostream>
#include <stdio.h>//potrzebne do dzialania exit
#include <stdlib.h>//do dzialania cls
#include <conio.h>//biblioteka dzieki ktorej przy wyborze z menu nie musimy klikac enter
using namespace std;

float x,y;
char wybor; //zmienna dzieki ktorej wczytujemy bezposrednio z klawiatury
int main()
{
    for(;;)
    {
    cout << "Podaj liczbe a: " << endl;
    cin >>x;
    cout <<"Podaj liczbe b: "<<endl;
    cin>>y;

    cout <<"MENU GLOWNE"<< endl;
    cout <<endl;
    cout <<"1. Dodawanie"<<endl;
    cout <<"2. Odejmowanie"<<endl;
    cout <<"3. Mnozenie"<< endl;
    cout <<"4. Dzielenie"<<endl;
    cout <<"5. Koniec programu"<<endl;
    cout<<endl;
    wybor=getch();
    switch(wybor) //wybor miedzy funkcjami przydatny w tworzeniu menu
    {               // zmienna switch moze byc tylko char albo int. Wymagana jest wartosc calkowita
        case '1':
        {
        cout << "Suma liczb to: "<<x+y<<endl;
        }
        break;

        case '2': //wartosc zapisana w apostrofie dlatego ze wybieramy bezposrednio z klawaitury
        {
        cout << "Roznica liczb to: "<<x-y<<endl;
        }
        break;

        case '3':
        {
        cout << "Iloczyn liczb to: "<<x*y<<endl;
        }
        break;

        case '4':
        {
        if (y==0) cout<<"nie dziel przez zero";
        else
        cout << "Iloraz liczb to: "<<x/y<<endl;
        }
        break;
        case '5':
        {
        exit(0); // sluzy do zamkniecia programu
        }
        break;

        default: cout<< "nie ma takiej opcji w menu"<<endl;
    }
    cout<<endl;
    getchar();getchar(); //kliknac enter dwa razy na koncu
    system("cls"); //czyszczenie ekranu
    }
    return 0;
}
P-151012
DavidYi
Temat założony przez niniejszego użytkownika
» 2016-08-21 14:26:14
Poradziłem sobie z problemem dzięki carlosmay :)
Usunąłem cin.cyns();, powtórzyłem cin.ignore(); po skończeniu instrukcji if(cin.fail()), do tego wyzerowałem wszystkie wartości, a po wpisaniu znaku dałem sprawdzanie, czy znak jest prawidłowy, mimo iż dalej też było to zrobione. Ogółem ten wycinek wygląda teraz tak:

C/C++
#include <iostream>
#include <limits>
using namespace std;
int main()
{
    long double wynik = 0;
    long double liczba, liczba1;
    char znak;
    //********************************************************************************
    do
    {
        if( wynik == 0 )
        {
            cout << "Podaj liczbe: ";
            cin >> liczba;
            if( cin.fail() )
            { cout << "Nieprawidlowa liczba\n";
                cin.clear();
                cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
                liczba = 0;
                liczba1 = 0;
                wynik = 0;
                continue;
            }
            cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
           
           
            cout << "Podaj znak: ";
            cin >> znak;
            if( cin.fail() )
            {
                cout << "Nieprawidlowy znak\n";
                cin.clear();
                cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
                liczba = 0;
                liczba1 = 0;
                wynik = 0;
                continue;
            }
            else if( znak != 'C' && znak != 'c' && znak != '=' && znak != '+' && znak != '-' && znak != '*' && znak != 'x' && znak != ':' && znak != '/' )
            { cin.clear();
                cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
                liczba = 0;
                liczba1 = 0;
                wynik = 0;
                cout << "Nieprawidlowy znak\n";
                continue;
            }
            cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
        } while( true )
    }
   

Jeśli są tu jakieś nieptorzebne rzeczy, śmieci, czy czegoś jest za dużo to chętnie się o tym dowiem :)
Tak czy inaczej uporałem się z problemem i błędy się dobrze czyszczą i wszystko działa poprawnie i jak należy :)

cppnewbie- kalkulator z menu nie wchodzi w gre, bo ja robie go bez menu :)
Dla ciekawskich wygląda to tak:
C/C++
#include <iostream>
#include <limits>
using namespace std;
int main()
{
    long double wynik = 0;
    long double liczba, liczba1;
    char znak;
    //********************************************************************************
    do
    {
        if( wynik == 0 )
        {
            cout << "Podaj liczbe: ";
            cin >> liczba;
            if( cin.fail() )
            { cout << "Nieprawidlowa liczba\n";
                cin.clear();
                cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
                liczba = 0;
                liczba1 = 0;
                wynik = 0;
                continue;
            }
            cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
           
           
            cout << "Podaj znak: ";
            cin >> znak;
            if( cin.fail() )
            {
                cout << "Nieprawidlowy znak\n";
                cin.clear();
                cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
                liczba = 0;
                liczba1 = 0;
                wynik = 0;
                continue;
            }
            else if( znak != 'C' && znak != 'c' && znak != '=' && znak != '+' && znak != '-' && znak != '*' && znak != 'x' && znak != ':' && znak != '/' )
            { cin.clear();
                cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
                liczba = 0;
                liczba1 = 0;
                wynik = 0;
                cout << "Nieprawidlowy znak\n";
                continue;
            }
            else if( znak == 'C' || znak == 'c' )
            { wynik = 0;
                cout << "Reset liczby\n\n";
                continue;
            }
            else if( znak == '=' )
            { wynik = liczba;
                cout << wynik << "\n";
                continue;
            }
            cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
           
            cout << "Podaj liczbe: ";
            cin >> liczba1;
            if( cin.fail() )
            { cout << "Nieprawidlowa liczba\n";
                cin.clear();
                cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
                liczba = 0;
                liczba1 = 0;
                wynik = 0;
                continue;
            }
            else if( liczba1 == 0 )
            { cout << "Nieprawidlowa liczba\n";
                liczba = 0;
                liczba1 = 0;
                wynik = 0;
                continue;
            }
           
           
           
            else if( znak == '*' || znak == 'x' )
            { wynik = liczba1 * liczba;
                cout << "Wynik: " << wynik << "\n\n";
            }
           
            else if( znak == '+' )
            { wynik = liczba + liczba1;
                cout << "Wynik: " << wynik << "\n\n";
            }
           
            else if( znak == '-' )
            { wynik = liczba - liczba1;
                cout << "Wynik: " << wynik << "\n\n";
            }
           
            else if( znak == '/' || znak == ':' )
            { wynik = liczba / liczba1;
                cout << "Wynik: " << wynik << "\n\n";
            }
           
            else
            { cout << "\nNieprawidlowy znak\n";
                wynik = 0;
                liczba = 0;
                liczba1 = 0;
                cin.clear();
                cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
                continue;
            }
            cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
        }
       
        //**************************************************************************
        else if( wynik != 0 )
        {
            cout << "Podaj znak: ";
            cin >> znak;
            if( cin.fail() )
            { cout << "Nieprawidlowy znak\n";
                cin.clear();
                cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
                liczba = 0;
                liczba1 = 0;
                wynik = 0;
                continue;
            }
            else if( znak != 'C' && znak != 'c' && znak != '=' && znak != '+' && znak != '-' && znak != '*' && znak != 'x' && znak != ':' && znak != '/' )
            { cin.clear();
                cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
                liczba = 0;
                liczba1 = 0;
                wynik = 0;
                cout << "Nieprawidlowy znak\n";
                continue;
            }
            else if( znak == 'C' || znak == 'c' )
            { wynik = 0;
                cout << "Reset liczby\n\n";
                continue;
            }
            else if( znak == '=' )
            { wynik = wynik;
                cout << wynik << "\n";
                continue;
            }
            cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
           
            cout << "Podaj liczbe: ";
            cin >> liczba;
            if( cin.fail() )
            { cout << "Nieprawidlowa liczba\n";
                cin.clear();
                cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
                liczba = 0;
                liczba1 = 0;
                wynik = 0;
                continue;
            }
            else if( liczba1 == 0 )
            { cout << "Nieprawidłowa liczba\n";
                liczba = 0;
                liczba1 = 0;
                wynik = 0;
                continue;
            }
           
           
           
            else if( znak == '*' || znak == 'x' )
            { wynik = wynik * liczba;
                cout << "Wynik: " << wynik << "\n\n";
            }
           
            else if( znak == '+' )
            { wynik = liczba + wynik;
                cout << "Wynik: " << wynik << "\n\n";
            }
           
            else if( znak == '-' )
            { wynik = wynik - liczba;
                cout << "Wynik: " << wynik << "\n\n";
            }
           
            else if( znak == '/' || znak == ':' )
            { wynik = wynik / liczba;
                cout << "Wynik: " << wynik << "\n\n";
            }
           
            else
            { cout << "\nNieprawidlowy znak\n";
                wynik = 0;
                liczba = 0;
                liczba1 = 0;
                znak = 0;
                cin.clear();
                cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
            }
            cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
        }
    } while( true );
   
   
}
P-151016
« 1 »
  Strona 1 z 1