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. |
|
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.
|
|
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. |
|
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. |
|
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
|
|
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(); ... |
|
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 |
|
darko202 |
» 2014-12-09 07:41:49 |
|
« 1 » 2 |