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

Lekcja 16 zadanie

Ostatnio zmodyfikowano 2017-02-26 14:05
Autor Wiadomość
Brys
Temat założony przez niniejszego użytkownika
Lekcja 16 zadanie
» 2017-02-21 19:12:38
Witam
Mam mały problem z zadaniem z lekcji 16, mianowicie zgadywanka działa tak jak powinna poza jednym błędem. Gdy wpisuję np. 123xxx to program się psuje i cały czas wykonuje jeden z IFów, ale gdy wpisuję np. xxx to wyskakuje mój komunikat tak jak chciałem. Jak zabezpieczyć się przed wpisaniem najpierw cyfr, a później liter?
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
    int liczba, strzal, proby = 0;
   
    srand( time( NULL ) );
    liczba =( std::rand() % 1000 ) + 1;
   
    cin.clear();
    cin.sync();
   
    cout << "Zgadnij liczbe od 1 do 1000: ";
    cin >> strzal;
   
    proby++;
    if( cin.good() && strzal >= 1 && strzal <= 1000 )
    { do
        {
            proby++;
           
            if( strzal > liczba )
            {
               
                cout << "Za duzo" << endl;
                cout << "Zgadnij liczbe od 1 do 1000: ";
                cin >> strzal;
               
            }
            if( strzal < liczba )
            {
               
                cout << "Za malo" << endl;
                cout << "Zgadnij liczbe od 1 do 1000: ";
                cin >> strzal;
               
            }
           
        } while( strzal != liczba );
       
        proby++;
        cout << "Gratulacje! Zgadles " << liczba << endl;
        cout << "Ilosc prob: " << proby;
    } else
         cout << "Wprowadziles zle dane";
   
   
   
   
    return 0;
}
P-158116
kordyl1010
» 2017-02-21 19:22:32
Możesz w tablicy string sprawdzić każdą literkę która została wpisana z ASCII czy się zgadza, jak jest inaczej niż kod cyfr z ASCII to znaczy, że źle :)
No chyba, że jest łatwiejszy sposób to ktoś może się jeszcze wypowie :) Tylko Ty chyba jeszcze nie miałeś ASCII i stringa, więc nie wiem czy poczekasz do tej lekcji czy może już sobie "wybiegniesz" z tematem i to sprawdzisz :)
P-158117
carlosmay
» 2017-02-21 19:56:07
Możesz sprawdzić czy po poprawnym wczytaniu danych w buforze strumienia pozostał tylko znak nowego wiersza
'\n'
.
Jeśli nie to znaczy, że oprócz oczekiwanej liczby jest coś jeszcze i tego musisz się pozbyć.
C/C++
int num;
std::cin >> num;
if( cin.get() != '\n' ) {
    std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
}
P-158119
Janusz2
» 2017-02-26 14:05:33
Hej, rozwiązanie problemu nie wymaga wiedzy większej niż ta z lekcji 16, zapomniałeś wyczyścić zawartość strumienia wejściowego przed każdym strzałem, poniżej poprawiony kod.
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
    int liczba, strzal, proby = 0;
   
    srand( time( NULL ) );
    liczba =( std::rand() % 1000 ) + 1;
   
    cin.clear();
    cin.sync();
   
    cout << "Zgadnij liczbe od 1 do 1000: ";
    cin >> strzal;
   
    proby++;
    if( cin.good() && strzal >= 1 && strzal <= 1000 )
    { do
        {
            proby++;
           
            if( strzal > liczba )
            {
               
                cout << "Za duzo" << endl;
                cout << "Zgadnij liczbe od 1 do 1000: ";
                std::cin.clear(); // Przyczyna problemu tutaj
                std::cin.sync();
                cin >> strzal;
               
            }
            if( strzal < liczba )
            {
               
                cout << "Za malo" << endl;
                cout << "Zgadnij liczbe od 1 do 1000: ";
                std::cin.clear(); // i tutaj
                std::cin.sync();
                cin >> strzal;
               
            }
           
        } while( strzal != liczba );
       
        proby++;
        cout << "Gratulacje! Zgadles " << liczba << endl;
        cout << "Ilosc prob: " << proby;
    } else
         cout << "Wprowadziles zle dane";
   
   
   
   
    return 0;
}
P-158306
« 1 »
  Strona 1 z 1