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

Rozdzial 16 Zadanie domowe | Zabezpieczenie przed wprowadzeniem złych danych

Ostatnio zmodyfikowano 2017-01-31 17:04
Autor Wiadomość
rambosek
Temat założony przez niniejszego użytkownika
Rozdzial 16 Zadanie domowe | Zabezpieczenie przed wprowadzeniem złych danych
» 2017-01-30 13:26:48
Witam,

Mam pytanie odnośnie zabezpieczenia przed wprowadzaniem błędnych liczba. Napisałęm program z pracy domowej z rozdziału 16. Zabezpieczyłem go wg. tego schematu: https://4programmers.net/C/FAQ/Zabezpieczenie_przed_wpisywaniem_liter

Aczkolwiek mam pytanie: Jeżeli dałbym cina przed pętlą sprawdzającą while, a w warunku napisał while(!cin.good()) to czemu pętla wykonuje się, bo wyświetla komunikat o tym żeby wprowadzić poprawną liczbę, ale dodatkowo wyświetla komunikat z IFa (x<liczba) o tym, że liczba jest za mała i wykonuje całą petlę? Czekam na odpowiedź i pozdrawiam :)

wklejam kod:

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

using namespace std;

int x;
int proba = 0;


int main()
{
    srand( time( NULL ) );
    int liczba;
    liczba =( rand() % 1000 ) + 1;
    liczba =( rand() % 1000 ) + 1;
   
    cout << "Witaj w zgadywance. Twoim zadaniem jest jak najszybsze odgadniecie wylosowanej liczby.\nPowodzenia!\n";
    cout << "Wprowadz liczbe: ";
   
   
    while( liczba != x )
    {
        proba++;
        cout << endl << proba << ". Proba ";
       
        while( !( cin >> x ) )
        {
            proba++;
            cout << "Wprowadz poprawna liczbe.\n" << proba << ". Proba";
            cin.clear();
            cin.sync();
        }
        if( x > liczba ) cout << "Za duza liczba, sprobuj ponownie: ";
       
        if( x < liczba ) cout << "Za mala liczba, sprobuj ponownie: ";
       
    }
    cout << "Gratuluje! Udalo Ci sie odgadnac wylosowana liczbe w " << proba << " probie!";
   
   
    return 0;
}
P-157119
carlosmay
» 2017-01-30 16:37:25

C/C++
while( !( cin >> x ) ) // wykonuj póki nie udało się wczytać liczbę
{
    proba++;
    cout << "Wprowadz poprawna liczbe.\n" << proba << ". Proba";
    cin.clear();
    cin.sync();
}
a to co innego, niż liczba inna od oczekiwanej.
P-157122
rambosek
Temat założony przez niniejszego użytkownika
» 2017-01-30 17:07:51
Rozumiem że co innego, ale efekt powinno dawać taki sam? Nie do końca rozumiem chyba...

a i co w związku z tym że użycie niezainicjowanej zmiennej? Program dziala poprawnie :P
P-157125
latajacaryba
» 2017-01-30 17:12:15
Rozumiem że co innego, ale efekt powinno dawać taki sam? Nie do końca rozumiem chyba... a i co w związku z tym że użycie niezainicjowanej zmiennej? Program dziala poprawnie :P
W takiej niezdefiniowanej (zadeklarowanej, ale nie zdefiniowanej (bez nadania wartości)) zmiennej są tzw. śmieci. Są to pozostałości w pamięci. Wypisz sobię taką zmienną x i zobaczysz, co Ci się wyświetli. Może być taka sytuacja, że w zmiennej x będzie liczba wylosowana. Oczywiście jest to praktycznie niemożliwe przy tylu kombinacjach, ale dobry zwyczaj nakazuje żeby taka zmienna była zdefiniowana. Np. program losuje liczby 1-1000
int x = 0;
Przynajmniej wiesz, na czym pracujesz/
P-157126
Monika90
» 2017-01-30 18:12:09
x jest zmienną globalną, więc jest zainicjalizowany zerem.
P-157128
latajacaryba
» 2017-01-30 18:55:22
@up
Upss... nie sprawdziłem gdzie zadeklarował zmienną :p
Racja, wtedy zerem.
P-157131
rambosek
Temat założony przez niniejszego użytkownika
» 2017-01-30 23:51:02
@Monika90

ale skoro tak jest, to nie musialbym przy zmiennej proba deklarować jej na 0. A musiałem bo inaczej pokazywało mi próbę nr. kilka tysięcy?:P
Ponadto czy mogłabyś mi podpowiedzieć z moim pytaniem dot. funkcji cin.good(), czemu te sprawdzenie nie działa jak należy (przynajmniej mi się wydaje jak powinno)..

pozdrawiam
P-157147
carlosmay
» 2017-01-31 13:45:43
Zmienne globalne są słabym pomysłem. Można poszukać w necie dlaczego.
Wstaw przykład, który chcesz rozwiązać.
Opisz dokładnie czego oczekujesz, a co jest na wyjściu.
P-157163
« 1 » 2
  Strona 1 z 2 Następna strona