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

Rozdział 16 Delikatnie rozszerzona praca domowa :)

Ostatnio zmodyfikowano 2017-02-19 21:40
Autor Wiadomość
shrvabl
Temat założony przez niniejszego użytkownika
Rozdział 16 Delikatnie rozszerzona praca domowa :)
» 2017-02-09 00:48:26
Siemka,

Zrobiłem grę z rozdziału 16 (http://cpp0x.pl/kursy/Kurs-C++/Poziom-2/Pseudolosowe-liczby-calkowite/290), tylko występuje u mnie problem jeśli się wpisze lterę bądź znak inny od liczby. Nie mam w ogóle pojęcia jak to naprawić. Formułę na razie robię w tym drugim kroku, więc zakładam, że użytkownik dobrze wprowadza pierwszą cyfrę. Po wpisaniu literki w drugiej części mam nieskończoną pętlę :C

Będę wdzięczny za pomoc :)

Tutaj wstawiam kod:
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main()
{
    srand( time( NULL ) );
    int liczba;
    int koncowa;
    cout << "------------------------------------" << endl;
    cout << "-----ZGADNIJ WYLOSOWANA LICZBE------" << endl;
    cout << "-------------------------- ---------" << endl;
    cout << endl;
    cout << "Chcesz losowac liczby od 0 do ...?" << endl;
    cin >> koncowa;
    liczba =( rand() % koncowa + 1 );
    cout << "Wpisz liczbe wylosowana przez program" << endl;
    cout << "   i zatwierdz przyciskiem 'ENTER'" << endl;
    cout << endl;
    cout << " ( Wylosowana liczba zawiera sie w ) " << endl;
    cout << " (     przedziale od 0 do " << koncowa << "       )" << endl;
    cout << endl;
    int los;
    int proba = 0;
   
    cout << liczba << endl; //Probna, do usuniecia po skonczeniu programu
   
    do
    {
        bool oke;
        do
        {
            cout << "WPISZ SWOJ LOS." << endl;
            cin >> los;
           
            oke = cin.good();
            cout << oke << endl; // Probne.
            cin.clear();
           
            if( oke == 0 )
            {
                cout << "Ktos tu pomijal lekcje w przedszkolu, skoro nie odroznia cyfr od innych znakow." << endl;
                oke = 0;
            }
           
           
        } while( oke != 1 );
       
       
       
       
        if( los < liczba )
             cout << "Strzeliles za nisko! Wybierz WYZSZA liczbe!" << endl;
        else if( los > liczba )
             cout << "Strzeliles/as zbyt wysoko! Wybierz NIZSZA liczbe!" << endl;
       
        proba++;
        cout << endl;
       
       
    } while( los != liczba );
   
    cout << "Gratulacje! Zgadles/as za " << proba << "razem!" << endl;
    cout << "KONIEC" << endl;
   
    return 0;
}
P-157513
carlosmay
» 2017-02-09 06:07:10
Sprawdzaj stan strumienia po próbie pobrania danych od użytkownika
i oczyszczaj go gdy jest coś nie tak.
» Kurs C++ » Poziom 1Obsługa strumienia wejściowego lekcja
P-157517
shrvabl
Temat założony przez niniejszego użytkownika
» 2017-02-10 00:12:36
Dzięki, w końcu się udało. Zwracam poprawiony kod. Są jeszcze jakieś uwagi co do kodu, będę wdzięczny za każdy feedback :)

C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main()
{
    srand( time( NULL ) );
    int liczba;
    int koncowa;
    cout << "------------------------------------" << endl;
    cout << "-----ZGADNIJ WYLOSOWANA LICZBE------" << endl;
    cout << "-------------------------- ---------" << endl;
    cout << endl;
    bool oke0;
    do
    {
        cout << "Chcesz losowac liczby od 0 do ...?" << endl;
        cin >> koncowa;
        oke0 = cin;
        if( cin == 0 )
        {
            cout << "Ktos tu pomijal lekcje w przedszkolu, skoro nie odroznia cyfr od innych znakow." << endl;
            cout << endl;
            cin.clear();
            cin.sync();
        }
    } while( oke0 != 1 );
   
    liczba =( rand() % koncowa + 1 );
    cout << "Wpisz liczbe wylosowana przez program" << endl;
    cout << "   i zatwierdz przyciskiem 'ENTER'" << endl;
    cout << endl;
    cout << " ( Wylosowana liczba zawiera sie w ) " << endl;
    cout << " (     przedziale od 0 do " << koncowa << "       )" << endl;
    cout << endl;
    int los;
    int proba = 0;
   
    do
    {
        bool oke;
        oke = 1;
        do
        {
            cout << "WPISZ SWOJ LOS." << endl;
            cin >> los;
            oke = cin;
           
            if( cin == 0 )
            {
                cout << "Ktos tu pomijal lekcje w przedszkolu, skoro nie odroznia cyfr od innych znakow." << endl;
                cout << endl;
                cin.clear();
                cin.sync();
            }
           
           
        } while( oke != 1 );
       
       
       
       
        if( los < liczba )
             cout << "Strzeliles za nisko! Wybierz WYZSZA liczbe!" << endl;
        else if( los > liczba )
             cout << "Strzeliles/as zbyt wysoko! Wybierz NIZSZA liczbe!" << endl;
       
        proba++;
        cout << endl;
       
       
    } while( los != liczba );
   
    cout << "Gratulacje! Zgadles/as za " << proba << "razem!" << endl;
    cout << "KONIEC" << endl;
    return 0;
}
P-157566
carlosmay
» 2017-02-10 06:55:44
Dla zmiennych logicznych używaj
true
 i
false
. Są wymowniejsze. Od razu widać jaką mają rolę.
P-157569
shrvabl
Temat założony przez niniejszego użytkownika
» 2017-02-16 11:52:22
carlosmay, chodzi Ci o to, aby zamiast
bool oke = 1
 wstawić:
bool oke = true
?
P-157822
Szymon2727
» 2017-02-16 18:01:33
Zamiast robić tak:
C/C++
bool prawda;
prawda = 1;
Zastosuj samo true, nie ma sensu robić zmiennej bool tylko dlatego, by miała wartość prawdziwą, bo od tego jest true. Co innego gdyby ta prawda zmieniła się na fałsz w określonym przypadku.
P-157836
shrvabl
Temat założony przez niniejszego użytkownika
» 2017-02-17 00:08:41
Ale ona później może się zmieniać na fałsz, jeśli użytkownik wprowadzi zamiast cyfry literę
P-157876
Szymon2727
» 2017-02-17 13:08:03
C/C++
cin >> los;
oke = cin;

Co to ma być? Skąd to wziąłeś?

Przypisujesz wartość oke do operacji pobrania danych std::cin.

Pierwszy raz coś takiego widzę, a po przekompilowaniu bool nawet jak będziesz miał zero
to dzięki temu nadal będzie miał jeden.

C/C++
if( cin == 0 )
{
    cout << "Ktos tu pomijal lekcje w przedszkolu, skoro nie odroznia cyfr od innych znakow." << endl;
    cout << endl;
    cin.clear();
    cin.sync();
}

Zbędny warunek, a wiesz dlaczego? Po podaniu liczby zero:

Floating point exception(core dumped)

Zapchałeś coś w procesorze bez zabawy nawet z wskaźnikami czy bibliotekami od memory xdd

Z resztą drobna sugestia, jak już piszesz taki długi cout to zero też jest cyfrą.
P-157896
« 1 » 2 3
  Strona 1 z 3 Następna strona