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

Gra - losowanie liczb

Ostatnio zmodyfikowano 2016-08-22 00:24
Autor Wiadomość
adrianolsz
Temat założony przez niniejszego użytkownika
Gra - losowanie liczb
» 2016-08-21 21:35:34
C/C++
/* 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 progam 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. */

#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
int main()
{
    srand( time( NULL ) );
    int liczba =( rand() % 20 ) + 1;
    cout << "(wylosowana liczba to: " << liczba << ")\n\n";
    int licznik = 0;
    double zgaduj;
   
    do
    {
        cout << "Podaj liczbe do zgadniecia: ";
        cin >> zgaduj;
       
        if( cin.fail() ) // zabezpieczenie przed wpisywaniem liter
        {
            cout << "To nie jest liczba! \nPodaj liczbe do zgadniecia: ";
            cin.clear();
            cin.sync();
        }
       
       
        licznik++;
       
       
        if( zgaduj == liczba )
        {
            cout << "\nBrawo, wylosowana liczba to: " << zgaduj;
            cout << "\nLiczba strzalow: " << licznik << "\n\n";
            return 0;
        }
        else if( zgaduj > liczba )
        {
            cout << "Liczba jest za duza.\n";
        }
        else if( zgaduj < liczba )
        {
            cout << "Liczba jest za mala.\n";
        }
       
    }
    while( true );
   
    return 0;
}

Mam taki problem, że nie wiem jak zabezpieczyć program przed używaniem liczb zmiennoprzecinkowych. Jeżeli program wylosuje liczbę np 8, a ja podaję do zgadnięcia 8.12345, to program porównuje i odpowiada normalnie, że 8.12345 > 8. Chcę, żeby wyskakiwała wiadomość żeby wpisywać tylko całkowite. Jak to sprawdzać? Gdy zmienną zgaduj zamienię z double na int, to wtedy 8.12345 == 8.
W dodatku kiedy podaję zamiast liczb jakieś inne znaki np a,b,c to program powinien wyczyścić mi strumień i od nowa czekać na wpisanie liczby, a informuje o tym że to nie jest liczba i przechodzi dalej podając np "Liczba jest za mała".

Druga sprawa, chcę sprawdzać czy są większe od 0 ale też się na tym zatrzymałem, bo najpierw muszę ogarnąć problem wyżej.
P-151020
carlosmay
» 2016-08-21 21:45:30
Użyj typu dla liczb całkowitych.

if( zgaduj == liczba )
Nie powinno się porównywać liczby całkowitej ze zmiennoprzecinkową.
Zwykle daje błędny wynik. Wynika to z niedokładności liczb zmiennoprzecinkowych.
P-151021
adrianolsz
Temat założony przez niniejszego użytkownika
» 2016-08-21 21:56:01
Już napisałem w 1 poście, że nie skutkuje zmienna int zgaduj. Muszę jakoś zabezpieczyć przed podaniem innej niż całkowita, bo wtedy program uznaje że są równe.
P-151022
Geniusz
» 2016-08-22 00:24:46
Tak możesz sprawdzić czy wprowadzona liczba jest całkowita.
C/C++
if( zgaduj != int( zgaduj ) )
{
    cout << "Mozesz uzywac tylko liczb calkowitych" << endl;
    continue;
}

A jeżeli po podaniu np. litery nie chcesz żeby wykonywały się dalsze instrukcje w tym obiegu pętli dopisz
continue;
 w odpowiednim miejscu.
Czyli:
C/C++
if( cin.fail() ) // zabezpieczenie przed wpisywaniem liter
{
    cout << "To nie jest liczba! \n"; //Tą linijkę też poprawiłem. Tak powinno być lepiej ;)
    cin.clear();
    cin.sync();
    continue;
}
P-151023
« 1 »
  Strona 1 z 1