• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zgadywanie liczb - problem

Object Storage Arubacloud
0 głosów
2,397 wizyt
pytanie zadane 31 marca 2017 w C i C++ przez vasquez Początkujący (480 p.)

Witam

Zabrałam się za napisanie krótkiej gerki w zgadywanie liczb. Program losuje liczbę, my mamy zgadnąć jaką. Przy błędnej odpowiedzi pisze czy podaliśmy za dużą czy za małą liczbę. Przy każdej błędnej odpowiedzi pisze która to jest nasza próba. Jeśli zgadniemy to wypisuje ile prób nam to zajęło. Program jest zabezpieczony przed wpisaniem błędnych znaków np. liter. Mam tylko jeden problem jak wpiszę litery zamiast liczby w którejś z kolei próbie to program zapętla się bez kontroli. Jeśli wpisze litery przy pierwszej próbie jest ok. Proszę o pomoc jak to naprawić. Jeśli ktoś ma jakieś inne uwagi w sprawie kodu chętnie wysłucham.

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main()
{
    int liczba, liczba_z, licznik=1;
    srand(time(NULL));
    liczba = (rand () % 1000) +1;
    cout << "Pomyslalem sobie liczbe od 1 do 1000. Zgadnij jaka:" << endl;
    cout << liczba << endl;
    cin >> liczba_z ;
        if (cin.good() && liczba_z>=1 && liczba_z<=1000)
        {
            for (int i=1; liczba!=liczba_z; i++)
            {
               licznik ++;
                if (liczba>liczba_z)
               {
                   cout << "Za malo. To twoja " << licznik << " proba. Sprobuj jeszcze raz:" << endl;
                   cin.sync(); cin.clear();
                   cin >> liczba_z ;
               }
               else if (liczba<liczba_z)
               {
                   cout << "Za duzo. To twoja " << licznik << " proba. Sprobuj jeszcze raz:" << endl;
                   cin.sync(); cin.clear();
                   cin >> liczba_z ;
               }
               else
               {
                   cout << "Wprowadziles bledne dane!!!" << endl;
                    cin.sync(); cin.clear();
               }
            }
            if (liczba==liczba_z)
            {
                cout << "Zgadles!!! Gratulacje. Ilosc prob:" << licznik << endl;
            }
        }
        else
        {
            cout << "Wprowadziles bledne dane!!!" << endl;
            cin.sync(); cin.clear();
        }

    return 0;
}

 

komentarz 31 marca 2017 przez tangarr Mędrzec (154,860 p.)

cin.good() jest twoim przyjacielem. Przykład:

while(true) {
    cin >> liczba_z ;
    if (cin.good())
        break;
    cout << "Nie rób sobie jaj!. Wprowadź liczbę!" << endl;
}


 

2 odpowiedzi

0 głosów
odpowiedź 31 marca 2017 przez 10kw10 Pasjonat (22,880 p.)
wybrane 31 marca 2017 przez vasquez
 
Najlepsza

Sprawdz ten kod:

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main()
{
    int liczba, liczba_z=0, licznik=0;
    srand(time(NULL));
    liczba = (rand () % 1000) +1;
    cout << "Pomyslalem sobie liczbe od 1 do 1000. Zgadnij jaka:" << endl;
    cout << liczba << endl;
    for (int i=1; liczba!=liczba_z; i++)
    {
        cin >> liczba_z ;
        licznik ++;
        if (cin.good()==false)
            cout << "Wprowadziles bledne dane!!!" << endl;
            
        else if (liczba>liczba_z)
            cout << "Za malo. To twoja " << licznik << " proba. Sprobuj jeszcze raz:" << endl;
            
        else if (liczba<liczba_z)
            cout << "Za duzo. To twoja " << licznik << " proba. Sprobuj jeszcze raz:" << endl;
            
        cin.clear();
        cin.sync();
    }
    cout << "Zgadles!!! Gratulacje. Ilosc prob:" << licznik << endl;
    return 0;
}

 

1
komentarz 31 marca 2017 przez vasquez Początkujący (480 p.)

Dzięki

Po przeanalizowaniu znalazłam wiele błędów. Takich jak nie potrzebne pętle.

Najważniejszym jednak błędem było zamiana dwóch funkcji czyszczących bufor

cin.sync();
cin.clear();

A poprawnie jest

cin.clear();
cin.sync();

To sprawiało najwięcej problemów.

0 głosów
odpowiedź 31 marca 2017 przez vasquez Początkujący (480 p.)

Ok, ale jakoś nie chce mi działać. Może wstawiam w złym miejscu tą pętle? próbowałam chyba wszystkiego z cin.good i nie chce zadziałać.

Zobaczyłam inny błąd więc wklejam poprawiony kod:

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main()
{
    int liczba, liczba_z, licznik=1;
    srand(time(NULL));
    liczba = (rand () % 1000) +1;
    cout << "Pomyslalem sobie liczbe od 1 do 1000. Zgadnij jaka:" << endl;
    cout << liczba << endl;
    cin >> liczba_z ;
        if (cin.good())
        {
            if (liczba_z>=1 && liczba_z<=1000)
            {
                for (int i=1; liczba!=liczba_z; i++)
                {
                   licznik ++;
                    if (liczba>liczba_z)
                   {
                       cout << "Za malo. To twoja " << licznik << " proba. Sprobuj jeszcze raz:" << endl;
                       cin.sync(); cin.clear();
                       cin >> liczba_z ;
                   }
                   else if (liczba<liczba_z)
                   {
                       cout << "Za duzo. To twoja " << licznik << " proba. Sprobuj jeszcze raz:" << endl;
                       cin.sync(); cin.clear();
                       cin >> liczba_z ;
                   }
                   else if (cin.good())
                   {
                        cout << "Wprowadziles bledne dane!!!" << endl;
                        cin.sync(); cin.clear();
                   }
                }
                if (liczba==liczba_z)
                {
                    cout << "Zgadles!!! Gratulacje. Ilosc prob:" << licznik << endl;
                }
            }
             else
            {
                cout << "Wprowadz liczbe od 1 do 1000" << endl;
                cin.sync(); cin.clear();
                cin >> liczba_z;
            }
        }
        else
        {
            cout << "Wprowadziles bledne dane!!!" << endl;
            cin.sync(); cin.clear();
        }

    return 0;
}

 

1
komentarz 31 marca 2017 przez egoon Obywatel (1,360 p.)

Witam.

Więc tak, oczywiście to, co napiszę to moje zdanie, a że każdy ma własne...

Ja bym 'łapał' błędy inaczej, nie puszczając w ogóle liter dalej, do pętli sprawdzającej. Użył bym np. wpisania liczby do 'string', a w 'try...catch' była by próba zmiany w 'int' przez 'stoi()'.

Mogę to wpisać, ale mnie znowu zjadą, że gotowce podrzucamdevil, więc tylko samo sprawdzenie:


	try
	{
		liczba = stoi(znaki);
	}
	catch (exception& err)
	{
		cerr<<"Wprowadz poprawna liczbe!\n";
		liczba = 0;
	}

A wszystko w pętli 'while', dopóki liczba == 0

Może to pomoże.

Pozdrawiam.

komentarz 31 marca 2017 przez tangarr Mędrzec (154,860 p.)
W liniach 26, 32 i 49 pobierasz dane ze strumienia cin, ale nie sprawdzasz czy si cię to powiodło. Musisz sprawdzić cin.good() za każdym razem gdy pobierzesz dane z tego strumienia.
komentarz 31 marca 2017 przez vasquez Początkujący (480 p.)
Niestety jeszcze nie do końca rozumiem o czym piszesz. Chyba jeszcze nie ten poziom.
komentarz 31 marca 2017 przez tangarr Mędrzec (154,860 p.)

Czy rozumiesz co robi poniższy kod?
 

int liczba;
cin >> liczba;

 

Podobne pytania

0 głosów
1 odpowiedź 179 wizyt
pytanie zadane 1 lutego 2017 w C i C++ przez ofnero Użytkownik (830 p.)
0 głosów
0 odpowiedzi 220 wizyt
0 głosów
1 odpowiedź 1,837 wizyt

92,580 zapytań

141,432 odpowiedzi

319,665 komentarzy

61,965 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...