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

Zadanie L16 - niepoprawne działanie programu, error [rozwiązany]

Ostatnio zmodyfikowano 2016-08-20 14:40
Autor Wiadomość
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)

C/C++
#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;
}
P-151004
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:

C/C++
#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;
}
P-151005
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.
C/C++
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.
P-151006
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.
P-151007
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.
P-151009
« 1 »
  Strona 1 z 1