snky1987 Temat założony przez niniejszego użytkownika |
Ciekawy problem po rozwiązaniu zdania domowego nr.9. » 2010-11-02 22:14:56 Witam.
Mam problem z zadaniem domowym w lekcji nr.9. Rozwiązałem je jednak znalazłem ciekawy problem którego nie mogę rozgryźć.
Po przeczytaniu wskazówki i domyśleniu się jak to mogłoby być zrobione napisałem taki program:
#include <iostream> using namespace std; int main() { int a, b, c; bool s, o, p; cout << "podaj pierwsza liczbe: "; cin >> a; s = cin.fail(); s = cin.good(); cin.clear(); cin.sync(); cout << "podaj druga liczbe: "; cin >> b; o = cin.fail(); o = cin.good(); cin.clear(); cin.sync(); cout << "podaj trzecia liczbe: "; cin >> c; p = cin.fail(); p = cin.good(); cin.clear(); cin.sync(); cout << "pierwsza liczba to: " << a << " wczytano? " << s << endl; cout << "druga liczba to: " << b << " wczytano? " << o << endl; cout << "trzecia liczba to: " << c << " wczytano? " << p << endl; return( 0 ); }
Program w takiej formie działał prawidłowo i wykonał zadanie zawarte w ćwiczeniu jednak gdy zamieniłem cześć kodu z:
o = cin.fail(); o = cin.good();
na:
o = cin.good(); o = cin.fail();
w tym momencie program zaczął mi pokazywać w przypadku udanego wczytania zmiennej "0" a w przypadku nieudanego wczytania "1".
Moje pytanie brzmi: "Dlaczego tak się dzieje?"
|
|
DejaVu |
» 2010-11-02 23:06:05 Czemu do tej samej zmiennej wczytujesz wyniki dwóch różnych funkcji? Ostatnim zapisem zawsze nadpiszesz wynik poprzedniego. |
|
snky1987 Temat założony przez niniejszego użytkownika |
» 2010-11-02 23:17:29 właśnie problem w tym że nie ;) Też tak myślałem ale krótki eksperyment wyprowadził mnie z tego toku rozumowania.
Gdyby tak było to za każdym razem wychodziło by "0" lub za każdym razem "1" niezależnie jaką wartość bym wpisał. A w moim przypadku program widzi błąd i go wykazuje jednak w przypadku pierwszego programu błąd wypisuje jako "0" a poprawne funkcjonowanie jako "1" a w przypadku programu po zamianie kolejności pokazuje odwrotnie.
Używam programu Code::Blocks tak jak rekomendował autor. |
|
ison |
» 2010-11-02 23:32:24 właśnie problem w tym że nie ;)
|
odważne stwierdzenie... ;p Gdyby tak było to za każdym razem wychodziło by "0" lub za każdym razem "1" niezależnie jaką wartość bym wpisał
|
dlaczego tak twierdzisz? cin.good() zwraca false jeśli wczytanie się nie powiodło a true gdy się powiodło cin.fail() na odwrót najpierw pod zmienną s podpisujesz false lub true a potem niezależnie od tego co zawiera zmienna podpisujesz pod nią cin.fail() czyli w efekcie zmienna s zawiera to co zwróci cin.fail() - 1 dla błędnego wczytania, 0 dla poprawnego |
|
snky1987 Temat założony przez niniejszego użytkownika |
» 2010-11-02 23:51:54 Dziękuję za wyjaśnienie ;) Źle zrozumiałem działanie funkcji cin.good(); Zastanawia mnie w tym momencie istota istnienia funkcji cin.fail() jeśli sama funkcja cin.good() wyświetla "1" gdy zmienna jest wczytana i "0" gdy nie jest wczytana. Jednak wiem że niewiele jeszcze umiem i myślę, że w dalszej części kursu zrozumiem dlaczego są dwie funkcje (cin.fail() oraz cin.good() gdy w przypadku wyświetlania poprawności wczytania wystarczy tylko jedna z nich. Program z zadania domowego wygląda tak: #include <iostream> using namespace std; int main() { int a, b, c; bool s, o, p; cout << "podaj pierwsza liczbe: "; cin >> a; s = cin.good(); cin.clear(); cin.sync(); cout << "podaj druga liczbe: "; cin >> b; o = cin.good(); cin.clear(); cin.sync(); cout << "podaj trzecia liczbe: "; cin >> c; p = cin.good(); cin.clear(); cin.sync(); cout << "pierwsza liczba to: " << a << " wczytano? " << s << endl; cout << "druga liczba to: " << b << " wczytano? " << o << endl; cout << "trzecia liczba to: " << c << " wczytano? " << p << endl; return( 0 ); } ...i działa poprawnie. Dziękuję za pomoc i pozdrawiam ;) |
|
Elaine |
» 2010-11-03 14:40:01 cin.good() zwraca false jeśli wczytanie się nie powiodło a true gdy się powiodło cin.fail() na odwrót |
Czytanie się powiodło, został osiągnięty koniec pliku. W takiej sytuacji cin.good() zwróci false (bo ustawiony jest eofbit), cin.fail() również zwróci false (bo ani failbit, ani badbit nie jest ustawiony). Naprawdę na odwrót? |
|
ison |
» 2010-11-03 15:01:00 tak, w powyższym kodzie Czytanie się powiodło, został osiągnięty koniec pliku. W takiej sytuacji cin.good() zwróci false
|
mógłbyś podać przykład? main.cpp: #include <iostream>
int main() { int a; while( std::cin >> a ) std::cout << std::cin.good() << " "; }
echo 5 6 4 7 | main.exe output: 1 1 1 1 |
|
Elaine |
» 2010-11-03 15:17:48 No właśnie problem w tym, że nie, może się zdarzyć, że już był eof, ale jeszcze nie fail. Proszę bardzo: ~ >> cat a.cpp #include <iostream>
int main() { int a; while( std::cin >> a ) std::cout << std::cin.good() << " "; } ~ >> cat a.txt 123 456 ~ >> g++ a.cpp ~ >> ./a.out < a.txt 1 0 |
|
« 1 » |