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

Kurs 1.9 Obsługa strumienia wejściowego - Zadanie domowe

Ostatnio zmodyfikowano 2020-11-04 22:12
Autor Wiadomość
CriSio
Temat założony przez niniejszego użytkownika
Kurs 1.9 Obsługa strumienia wejściowego - Zadanie domowe
» 2020-11-04 16:34:36
Cześć, niestety trochę ten temat (http://cpp0x.pl/kursy/Kurs-C++/Poziom-1/Obsluga-strumienia-wejsciowego/12) mi namieszał w głowie i pogubiłem się już w pisaniu tego kodu. Jest ktoś w stanie rzucić na niego okiem i powiedzieć mi co jest nie tak tutaj? Po kompilacji niby wszystko pokazuje okej, ale bool nie reaguje. Dzięki wielkie!

C/C++
#include <iostream>
#include <limits>

int main()
{
    float a;
    float b;
    float c;
    bool aczyBlad = std::cin.fail();
    bool bczyBlad = std::cin.fail();
    bool cczyBlad = std::cin.fail();
   
    std::cout << "Podaj liczbe 13.3 :";
    std::cin >> a;
    aczyBlad = std::cin.fail();
    std::cin.clear();
    std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
   
    std::cout << "Podaj liczbe tak 123 :";
    std::cin >> b;
    bczyBlad = std::cin.fail();
    std::cin.clear();
    std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
   
    std::cout << "Podaj liczbe 33.22nie :";
    std::cin >> c;
    cczyBlad = std::cin.fail();
    std::cin.clear();
    std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
   
    std::cout << "Liczba pierwsza to: " << a << " Blad? " << std::cin.fail() << std::endl;
    std::cout << "Druga liczba to: " << b << " Blad? " << std::cin.fail() << std::endl;
    std::cout << "Trzecia liczba to: " << c << " Blad? " << std::cin.fail() << std::endl;
   
    return 0;
}
P-177675
pekfos
» 2020-11-04 18:36:31
Niczego nie robisz z tym boolem. Przypisujesz do nich wartości i co dalej mają zrobić?
P-177676
CriSio
Temat założony przez niniejszego użytkownika
» 2020-11-04 18:44:56
Właśnie użyłem go podczas wpisywania liczb
  cczyBlad   =   std::cin.fail();
 i próbowałem tez dodać go na końcu w wyświetlaniu liczb wcześniej, ale niestety nic mi to nie dało. Ciezko mi trochę zrozumiec ten temat
P-177677
pekfos
» 2020-11-04 19:32:45
Samo przypisywanie nie jest pomocne. Jest sens trzymać dane w pamięci tylko jeśli zamierzasz ich użyć. Powinieneś wypisywać wartość z tych 3 zmiennych bool na końcu, zamiast wypisywać std::cin.fail(). Wartość jaką dostajesz z std::cin.fail() jest ściśle zależna od kontekstu, na 9 wywołań tylko 3 są w dobrych miejscach.
P-177678
CriSio
Temat założony przez niniejszego użytkownika
» 2020-11-04 20:33:27
Hmmm, nie mogę chyba zatrybić tego tematu :/ . Przypisałem bool do wartości std::cin.fail() i zamieniłem trochę końcówkę, aby ich ponownie nie wypisywać. Cały czas problem się rozchodzi o to, że w konsoli wyskakuje mi za każdym razem to 0.

Podaj liczbe 13.3 :13.3
Podaj liczbe tak 123 :tak 123
Podaj liczbe 33.22nie :33.22nie
Liczba pierwsza to: 13.3 Blad? 0
Druga liczba to: 0 Blad? 0
Trzecia liczba to: 33.22 Blad? 0

C/C++
#include <iostream>
#include <limits>

int main()
{
    float a;
    float b;
    float c;
    bool aczyBlad = std::cin.fail();
    bool bczyBlad = std::cin.fail();
    bool cczyBlad = std::cin.fail();
   
    std::cout << "Podaj liczbe 13.3 :";
    std::cin >> a;
    std::cin.clear();
    std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
   
    std::cout << "Podaj liczbe tak 123 :";
    std::cin >> b;
    std::cin.clear();
    std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
   
    std::cout << "Podaj liczbe 33.22nie :";
    std::cin >> c;
    std::cin.clear();
    std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
   
    std::cout << "Liczba pierwsza to: " << a << " Blad? " << aczyBlad << std::endl;
    std::cout << "Druga liczba to: " << b << " Blad? " << bczyBlad << std::endl;
    std::cout << "Trzecia liczba to: " << c << " Blad? " << cczyBlad << std::endl;
   
    return 0;
}
P-177681
pekfos
» 2020-11-04 20:53:21
C/C++
std::cin >> a;
std::cin.clear();
Pierwsza linia może ustawić informację o błędzie, druga linia niszczy informację o błędzie. Żeby sprawdzić czy operacja się powiodła, musisz to zrobić po tej operacji (inaczej próbujesz przewidywać przyszłość) i przed wyczyszczeniem stanu strumienia.
P-177683
CriSio
Temat założony przez niniejszego użytkownika
» 2020-11-04 21:13:27
Nie wiem, czy o to chodzi ale próbuje bool wpuścić między dwie linie które udostępniłeś:

C/C++
std::cout << "Podaj liczbe 13.3 :";
std::cin >> a;
aczyBlad;
std::cin.clear();
std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );

Nadal mam ten problem ze sprawdzeniem błedu i wyskakuje mi 0. Powinienem iść w tym kierunku czy w ogóle od złej strony się za to zabieram?
P-177684
pekfos
» 2020-11-04 21:49:30
Miałeś dobrze na samym początku
C/C++
std::cin >> b;
bczyBlad = std::cin.fail(); // zapisz w bczyBlad wynik fail *w tym momencie*
std::cin.clear();
Zmienna przechowuje wyłącznie wartość, taką jaka była obliczona w momencie przypisania do tej zmiennej. Na wynik fail() wpływają operacje jakie wykonujesz na strumieniu, więc nie możesz tego odczytać byle gdzie.
P-177685
« 1 » 2
  Strona 1 z 2 Następna strona