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

Sprawdzanie poprawności wprowadzanych danych.

Ostatnio zmodyfikowano 2016-02-18 22:22
Autor Wiadomość
samail
Temat założony przez niniejszego użytkownika
Sprawdzanie poprawności wprowadzanych danych.
» 2016-02-16 16:16:36
Witam,

Od niedawna zacząłem wałkować kurs do nauki C++. Doszedłem do pewnego punktu w których musiałem cofnąć się i przewałkować materiał od początku. Wiedząc mniej więcej czego nie wiem doszedłem do tematu sprawdzania poprawności wprowadzanych danych. Mój problem polega na tym, że nie potrafię zrozumieć pewnej rzeczy. Najpierw zamieszczę kod:

C/C++
#include <iostream>
#include <cstdio>
using namespace std;

int main()

{
    float a, b, c;
    bool bledy = cin.fail();
    bool powodzenie = cin.good();
    cout << "Lekcja: Czyszczenie buforu, sprawdzanie poprawnosci wprowadzonych danych";
    cout << endl << "cz.II wprowadzanie informacji o bledach do zmiennych." << endl << endl;
    cout << "Prosze podac pierwsza liczbe: ";
    cin >> a;
    cin.fail();
    cin.good();
   
   
    cout << "Bledy " << cin.fail() << " powodzenie " << cin.good() << "\t" << " bezposrednio " << endl;
    cout << "Bledy " << bledy << " powodzenie " << powodzenie << "\t" << " przez zmienna ";
    return 0;
}

Nie rozumiem dlaczego po wprowadzeniu błędu, program bezpośrednio z "cin.fail()" i "cin.good()" wyrzuca prawidłowe informacje, a kiedy używam do tego zmiennych informacje są błędne.

Zdaje sobie sprawę z tego, że to absolutne podstawy dlatego zależy mi na tym, żeby w pełni to zrozumieć.

Dzięki i pozdrawiam :).
P-144927
carlosmay
» 2016-02-16 17:03:31
Nie rozumiem dlaczego po wprowadzeniu błędu, program bezpośrednio z "cin.fail()" i "cin.good()" wyrzuca prawidłowe informacje, a kiedy używam do tego zmiennych informacje są błędne.
Ponieważ zmienne te zainicjalizowane są przed użyciem operatora strumienia wejściowego.
Czyli mają wartości dla poprawnego stanu strumienia.
P-144929
Rashmistrz
» 2016-02-18 22:22:38
Nie rozumiem dlaczego po wprowadzeniu błędu,
program bezpośrednio z "cin.fail()" i
"cin.good()" wyrzuca prawidłowe informacje,

cin.good() i cin.fail() zwracają aktualny stan strumienia cin.

a kiedy używam do tego zmiennych informacje są błędne.
Wiesz gdzie problemu szukać. :)

W zasadzie nie są one błędne, a stare.
Wytłumaczę po kolei co i jak się dzieje.

Funkcje .fail() i .good() są funkcjami zwracającymi wartość,
czyli upraszczając, pozostawiają po sobie konkretną wartość danego typu,
a w tym przypadku typu
bool
, który przechowuje wartość
true
 lub
false
.

Zwrócona wartość jest tylko aktualna w momencie jej zwrócenia
(chodzi mi o aktualność informacji o stanie strumienia),
zatem jeśli ją gdzieś zapiszemy (np. tak jak ty to zrobiłeś)
to jeśli wykonamy kolejną akcję na strumieniu cin
zmieniającą stan strumienia (pobranej flagi sygnalizującej stan)
to zapisana kopia zacznie być różna od aktualnego stanu.

Zapisana kopia się nie będzie się samodzielnie aktualizować
(tak jak "wewnętrzne dane" cin'a),
gdyż nie "nauczyłeś" programu jak to robić...


C/C++
bool bledy = cin.fail();
bool powodzenie = cin.good();
Zmienne te przechowują kopię jednych ze stanów strumienia cin z danego momentu w czasie
i kopie będą przechowywane tam tak długo aż nie określisz kiedy zmienne mają przybrać nową wartość. :
C/C++
bledy = cin.fail();
powodzenie = cin.good();

(bądź aż nie zakończy się program :D)



(// BTW: takie funkcje są nazywane metodami,
bo są ściśle powiązane ze swoją klasą.
np.cin reprezentuje klasę strumienia,
a .fail() i .good() są na nim wykonywane)

Jeśli masz Skype czy jakąś inną formę kontaktu
to mogę Ci pomóc przy nauce w formie mentora.
Sam pomagam mojemu młodszemu o 5 lat
kuzynowi przy przerabianiu tego kursu.

P-145007
« 1 »
  Strona 1 z 1