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

Sprawdzenie poprawnosci wprowadzenia danych

Ostatnio zmodyfikowano 2014-12-10 07:43
Autor Wiadomość
Vanilka
Temat założony przez niniejszego użytkownika
Sprawdzenie poprawnosci wprowadzenia danych
» 2014-12-08 10:28:00
Witam ma problem z kodem. Otoz,kilka rrazy w moim programie, proze uzytkownika o wprowadzenie danych, nastpenie program ma sprawdzic poprawnosc.

W wiekszosci przypadkow to dziala,  ( lub prawie dziala.. jak podam 1a to w tym przypadku program uzna to za wartosc 1)



int Wybor_lvl()
{
Logo();
int niv;

do
{
    std::cin.clear();
    std::cin.sync();
    for (int i=3; i<=8; i++)
    {
        cout << tablica1[kod_j][i]<< endl;
    };

cin >> niv;
cin.get();
    if ((niv < 1) || (niv > 5))
{
     cout << tablica1[kod_j][9] << endl;
}

} while ((niv < 1) || (niv > 5) || (licznik_bledow <= 5 ));
switch ( niv )
{
case 1 :
     ilosc_miejsc = 4;
     ilosc_cyfr = 4;
     break;
case 2 :

     ilosc_miejsc = 4;
     ilosc_cyfr = 6;
     break;
case 3 :
    ilosc_miejsc = 6;
    ilosc_cyfr = 6;
    break;

case 4:
    ilosc_miejsc = 6;
    ilosc_cyfr = 8;
    break;
case 5:
     ilosc_miejsc = 8;
     ilosc_cyfr = 8;
     break;
}
}

NIestety w tym 1 prypadku to nie dziala. I nie wiem dlaczego.
Jezeli uzytkownik wprowadzi wartosc liczbowa, to istotnie, program wyswietli komunikat zly wybor, jednakze kiedy wprowadzi jakakolwiek wartosc cyfrowa, lub wpisze glupoty, to jedynie odswiezy ekran i na nowo wyswietli menu.


do
    {

        system( "cls" );
        menu_poczatek();
        cin.clear();
        cin.sync();
        cin >> menu_wyb;
        cin.get();
        if (( menu_wyb < 1) || ( menu_wyb > 3) )
        {
            cout << "zly wybor" << endl;

        }
        else if ( menu_wyb == 1 )
        {

            Wybor_Gracza();
            cin.get();

            do
            {

                system( "cls" );
                Wybor_lvl();
                losowanie();

                cout << "czy zagrac jeszcze raz ??  tak =1 , nie = 2" << endl;

                cin >> odp;
            } while (odp != 2);
        }

       else if ( menu_wyb == 2 )
        {
            cout << "Jeszcze nie zaimplementowane" << endl;
        }

      else  if   ( menu_wyb == 3 )
        {
            cout << "Jeszcze nie zaimplementowane" << endl;

        }

        cin.get();
    } while ( ( menu_wyb < 1) || ( menu_wyb > 3) );

}



void menu_poczatek()
{
    Logo();

    cout <<  "M E N U " << endl;
    for (int i=10; i<=12; i++)
    {
        cout << tablica1[kod_j][i] << endl;

    };

}

Prosze o pomoc.
P-122523
darko202
» 2014-12-08 15:04:19
Trudno jest Ci coś poradzić, gdyż wygląda jakby każdy kawałek był innym programem (wersją programu)

np. w 1. obrazie w funkcji coś wczytujesz w pętli do tabeli zewnętrznej (zmienna globalna - ? ) która nie została przekazana do funkcji (dla mnie źle)
potem po opuszczeniu tej pętli ustalasz wartość zmiennej dla ostatnio pobranej wartości (nie znam założeń, ale to jest dziwne)
znów zmieniasz jakieś zmienne globalne (to też moim zdaniem kwalifikuje się pod błąd)

jeśli chcesz podpowiedzi opisz dokładnie algorytm który realizujesz
opisz dokładnie jakiego wyniku spodziewałeś się, a jaki otrzymujesz

wówczas otrzymasz błyskawiczną odpowiedz

Przepraszam, ale na podstawie tego co pokazałeś trudno mi Ci pomóc.


P-122537
Vanilka
Temat założony przez niniejszego użytkownika
» 2014-12-08 19:47:06
kazdy kawalek jest inna czescia programu. pierwszy to tylko przyklad ktory dziala w zasadzie dborze, poza taka jedna mala niedogodnoscia  ze gdy uzytkownik wpisze 1a, zamiast 1 to to zadziala tak jakby wpisal jeden, a powinien wywalic blad ( komunikaty znajduja sie w tablica 1), te casy co tam sa to po prostu zamiast ifow. Bo wlasnie w zaleznosci od poziomu trudnosci wybranego przez gracza, zmienne ilosc cyfr i ilosc miejsc maja ulec zmianie


problemem jest drugi kawalek programu.

Gdy wpisze wartosc liczbowa rozna od 1,2,3 to istotnie blad sie wywala czyli komunikat "zly wybor". NIestety jsli uzytkownik wpisze  "dupad" fghhhwr lub sama litere.. to juz nie wyskoczy komunikat zaden, tylko ekran sie odswiezy.

Jest to dla mnie o tyle dziwne ze pierwsyz przyklad zbudowany jest podobnie a dziala.... a ten nie.

trzeci fragment to tylko pokazanie co znajduje sie pod funkcja menu_poczatek, czyli inczej moim glownym menu.
P-122552
Vanilka
Temat założony przez niniejszego użytkownika
» 2014-12-08 22:49:06
maly edit..
do pierwszego kodu dodalam czyszczenie ekranu, i mam dokladnie to samo co w drugim przykladzie.

Czyli podsymowujac. Komunikat " zly wybor" wyswietla sie tylko jesli user poda wartosc liczbowa. Jesli wpisze litery, to komunikat nie wyswietli sie, jedynie okran sie odswiezy.

Gdy usune opcje czyszczenia ekranu to istotnie komunikat wyswietla sie.
P-122561
darko202
» 2014-12-09 01:00:57
skomentowany przeze mnie fragment programu był niedobry bo :
1. nie rozumiesz celu istnienia procedury, funkcji. One nie są po to, aby 100 linijkowy kod podzielić na 5 procedur ~20 linijkowych
   procedura/funkcja ma być hermetyczną jednostką programu i realizuje zadania tylko na własnych zmiennych, lub przekazanych w argumentach
   filozofia ta wynika z doświadczenia - mniejszy program - mniej możliwości błędów, tzn. aby ten blok programu nie realizował wymaganej funkcjonalności
   nie należy zapominać o powtórnym wykorzystaniu kodu (to zaprocentuje w przyszłości)
   działanie na zmiennych globalnych jest proszeniem się o kłopoty. 

2. może niewyraźnie to napisałem, ale zobacz jakie jest działanie Twojej procedury
   a) pętla
      do .. while ((niv < 1) || (niv > 5) || (licznik_bledow <= 5 ));
     * magiczny licznik błędów który nie wiadomo ile wynosi
     ** || to operator or  czyli niv<1 lub niv> 5 a jeśli to będzie litera  'a' a w ASCI to chyba >=65
     wtedy oczywistym jest dlaczego czasami otrzymywałeś dobre wyniki, a czasami śmieci 

   b) decyzja na podstawie ostatniej odpowiedzi jest powieleniem warunku if.
      Dlatego do switch dodaje się default - niby zbędny element jezyka
     
   d) jeśli chcesz sprawdzić czy podana wartość jest poprawna użyj np. funkcji atoi lub podobnej z tej rodziny -1 to chyba błąd konwersji a 0 wynik poprawny

 
Czytam po raz kolejny Twój program i opis obserwowanego przez Ciebie błędu i chyba udzieliłem Ci wyczerpującej odpowiedzi.
no może jeszcze jedno pytania czy znasz debuger'a ? 
jak z niego skorzystasz to szybko sam znajdziesz  wiele błędów


 

P-122567
killjoy
» 2014-12-09 02:36:12
d) jeśli chcesz sprawdzić czy podana wartość jest poprawna użyj np. funkcji atoi lub podobnej z tej rodziny -1 to chyba błąd konwersji a 0 wynik poprawny

Jest jeszcze
cin.good(); cin.fail(); cin.bad();
...
P-122568
Vanilka
Temat założony przez niniejszego użytkownika
» 2014-12-09 02:43:38
sprawdzalam tez z cin.fail i mimo ustawienia warunku if  nie reaguje, petla przelatuje dalej.


darko.. ja rozumiem cel funkji.. u siebie zrobilamje po to aby bylo mi potem latwiej sie ogarnac i tyle.   Co do tego licznika bledow, to jest to niewykasowana pozostalosc po pewnym pomysle, ktory mi nie zadzialal  wiec z niego zrezygnowalam.

nie mam pojecia co to atoi
P-122569
darko202
» 2014-12-09 07:41:49
sprawdź jaką wartość wczytujesz po wprowadzeniu 

na
http://www.cplusplus.com​/reference/cstdlib/atoi/
http://en.cppreference.com/w​/cpp/string/byte/atoi
masz wyjaśnione  + przykład użycia funkcji atoi
na
http://www.cplusplus.com​/reference/ios/ios/good/
cin.good();


Czy mógłbyś załączyć kod aktualnej wersji programu ?



P-122571
« 1 » 2
  Strona 1 z 2 Następna strona