Zadanie L16 - niepoprawne działanie programu, error [rozwiązany]
Ostatnio zmodyfikowano 2016-08-20 14:40
macara48 Temat założony przez niniejszego użytkownika |
Zadanie L16 - niepoprawne działanie programu, error [rozwiązany] » 2016-08-20 12:52:18 Witam. Mam mały problem z zadaniem z Lekcji 16: "Zadanie domowe Twoim zadaniem domowym jest napisanie prostej gry, która ma działać następująco: 1. Program losuje liczbę z przedziału od 1 do 1000. 2. Użytkownik zgaduje liczbę, która została wylosowana. 3. Jeżeli podana liczba jest za duża (za mała) gra wypisuje stosowny komunikat i powraca do kroku 2. 4. Jeżeli gracz trafi liczbę wylosowaną to program kończy działanie, wypisując na ekran wylosowaną liczbę oraz liczbę 'strzałów', które oddał gracz. Gra ma być zabezpieczona przed możliwością wprowadzenia błędnych wartości liczbowych." Program kompiluje się bez problemów. Używam Visual Basic C++ 2010 Express. Program działał źle zarówno gdy napisałem go na samych funkcjach if jak i teraz gdy jest zrobiony z do...while. Błędy: 1. Gdy wpisuję zgadywaną liczbę to działa dobrze dla liczb do 65. Powyżej liczby 65 program uznaje ją za nieprawidłowo podaną odpowiedź i zawraca użytkownika. 2. Przy wpisywanych wynikach od 200 lub 300 w górę program generuje błąd Debug Assertion Failed! Program C:\Users\Nazwa_Profilu\Desktop\c++\rand.exe File: f:\dd\vctools\crt_bld\self_x86\crt\src\isctype.c Line:56
Expression: (unsigned)(c + 1)<=256 |
(ścieżka Program C:... to zwyczajnie ścieżka do miejsca gdzie zapisałem projekt) #include <iostream> #include <cstdlib> #include <ctime> #include <cctype> using namespace std;
int main() { srand( time( NULL ) ); int liczba =( rand() % 1000 ) + 1; cout << "wylosowalem liczbe od 1 do 1000. zgadnij jaka to" << endl; int wynik; int liczba_prob = 0; do { RETURN: cout << "podaj liczbe:" << endl; cin >> wynik; cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); if( wynik > 1000 || wynik < 0 || isalpha( wynik ) ) { cout << "musisz podac liczbe z zakresu od 1 do 1000, sproboj jeszcze raz" << endl; goto RETURN; } liczba_prob++; if( wynik > liczba ) { cout << "Podales za duza liczbe, sproboj jeszcze raz" << endl; } if( wynik < liczba ) { cout << "Podales za mala liczbe, sproboj jeszcze raz" << endl; } } while( wynik == liczba ); cout << "brawo, udalo ci sie!" << endl; cout << "liczba prob: " << liczba_prob << endl; system( "pause" ); return 0; }
|
|
kistel66 |
» 2016-08-20 13:10:06 Nie używaj goto . Po to są pętle, by ich używać Ja bym to zadanie zrobił w taki sposób: #include <iostream> #include <cstdlib> #include <ctime> #include <cctype> using namespace std;
int main() { srand( time( NULL ) ); int liczba =( rand() % 1000 ) + 1; cout << "wylosowalem liczbe od 1 do 1000. zgadnij jaka to" << endl; int wynik; int liczba_prob = 0; do { while( !( cin >> wynik || wynik < 0 || wynik > 1000 ) ) { cout << endl << "Blad, podaj poprawna liczbe: "; cin.clear(); cin.sync(); } if( wynik > liczba ) cout << "Podales zbyt duza liczbe" << endl; else if( wynik < liczba ) cout << "Podales zbyt mala liczbe" << endl; liczba_prob++; } while( wynik != liczba ); cout << "brawo, udalo ci sie!" << endl; cout << "liczba prob: " << liczba_prob << endl; system( "pause" ); return 0; }
|
|
macara48 Temat założony przez niniejszego użytkownika |
» 2016-08-20 13:19:37 Kod od ciebie działa dobrze, dzięki za niego ale po przerobieniu kodu bez goto, zostawiając resztę jak była widzę, że goto nie powoduje błędu tylko ( wynik > 1000 || wynik < 0 || isalpha( wynik ) ) . Co jest nie tak? Chcę, żeby program sprawdzał nie tylko czy podano mu dobrą liczbę ale także czy nie jest to litera. Edit: Tu jest fragment który ma sprawdzać kod. if( wynik > 1000 || wynik < 0 || isalpha( wynik ) ) { do { cout << "musisz podac liczbe z zakresu od 1 do 1000, sproboj jeszcze raz" << endl; cout << "podaj liczbe:" << endl; cin >> wynik; cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); } while( wynik > 1000 || wynik < 0 || isalpha( wynik ) ); }
Edit2: Po usunięciu || isalpha( wynik ) wszystko śmiga ale pozostaje problem - teraz program nie sprawdza czy ktos nie wpisal litery. |
|
carlosmay |
» 2016-08-20 14:31:58 To jest trochę bardziej złożone. Poszukaj w postach tematów o sprawdzaniu poprawności danych. Jeśli chcesz tak rygorystycznie sprawdzać wprowadzane dane, pobieraj je w pętli. Pętlą będzie powtarzać działanie póki coś jest nie tak.
@kistel66 dał fajny przykład pobierania danych ze sprawdzeniem zgodności z typem danych. |
|
macara48 Temat założony przez niniejszego użytkownika |
» 2016-08-20 14:40:06 Popracuję nad tym. Dzięki za pomoc. Temat do zamknięcia. |
|
« 1 » |