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

Ciekawy problem po rozwiązaniu zdania domowego nr.9.

Ostatnio zmodyfikowano 2010-11-03 15:17
Autor Wiadomość
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:

C/C++
#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:

C/C++
o = cin.fail();
o = cin.good();

na:

C/C++
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?"

P-23510
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.
P-23512
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.
P-23513
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
P-23514
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:

C/C++
#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 ;)
P-23515
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?
P-23518
ison
» 2010-11-03 15:01:00
Naprawdę na odwrót?
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:
C/C++
#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
P-23519
Elaine
» 2010-11-03 15:17:48
tak, w powyższym kodzie
No właśnie problem w tym, że nie, może się zdarzyć, że już był eof, ale jeszcze nie fail.

mógłbyś podać przykład?
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
P-23521
« 1 »
  Strona 1 z 1