Przemek978 Temat założony przez niniejszego użytkownika |
Poziom 1 Obsługa strumienia wejściowego » 2018-08-05 15:08:28 Napisz program, który wczyta trzy liczby rzeczywiste, a na końcu programu je wszystkie wypisze. Zadbaj o to, by bufor strumienia wejściowego był za każdym razem czyszczony. Wynik końcowy powinien również zawierać informacje czy wczytanie danej liczby się powiodło. Przykładowe dane wejściowe 13.3 tak 123 33.22nie
Przykładowe dane wyjściowe Liczba pierwsza to: 13.3. Wczytano? 1. Liczba druga to: 0. Wczytano? 0. Liczba trzecia to: 33.22. Wczytano? 1.
co zrobić by po podaniu drugiej zmiennej z błędem tak jak powyżej nie kończyło programu
#include <iostream> #include <limits>
int main () { float a; bool b = std::cin.fail(); float c;
std::cout << "Podaj dana: "; std::cin >> a; std::cout << "Podaj dana: "; std::cin >> b; std::cout << "Podaj dana: "; std::cin >> c;
std::cout << "Liczba pierwsza to: " << a << std::endl; std::cout << "Wczytano?" << std::cin.fail() << std::endl;
std::cout << "Liczba druga to: " << b << std::endl; std::cout << "Wczytano?" << std::cin.ignore( 1000, '\n') << std::endl;
std::cout << "Liczba trzecia to: " << c << std::endl; std::cout << "Wczytano?" <<std::cin.fail() <<std::endl; std::cin.clear(); return 0; }
|
|
pekfos |
» 2018-08-05 17:37:28 Całkowicie zignorowałeś punkt "Czyszczenie zawartości strumienia wejściowego" w tej lekcji, oraz wskazówkę do zadania. |
|
Przemek978 Temat założony przez niniejszego użytkownika |
Odpowiedź pekfos » 2018-08-06 22:27:30 Nie zignorowałem tylko tam nie ma dokładnie opisanego gdzie użyć tych komend |
|
pekfos |
» 2018-08-06 22:51:33 Jest dokładnie opisane ich działanie i jest podany przykład. Jeśli zrozumiałeś działanie, przykład nie jest nawet potrzebny. |
|
Przemek978 Temat założony przez niniejszego użytkownika |
» 2018-08-09 13:06:28 Zrozumiałem i używałem tych komend na wiele sposobów i dalej ten sam problem mógłbyś zobaczyć gdzie zrobiłem błąd |
|
pekfos |
» 2018-08-09 13:22:55 Zadbaj o to, by bufor strumienia wejściowego był za każdym razem czyszczony. |
std::cout << "Podaj dana: "; std::cin >> a; std::cout << "Podaj dana: "; std::cin >> b; std::cout << "Podaj dana: "; std::cin >> c; |
Nie ma tu nic 'za każdym razem'. Inaczej byłoby to widoczne między wczytywaniem a i b, oraz b i c. co zrobić by po podaniu drugiej zmiennej z błędem tak jak powyżej nie kończyło programu |
Kilka fragmentów z lekcji: Jeżeli coś zakończy się niepowodzeniem, strumień przechodzi w stan błędu i dalsze operacje na strumieniu są ignorowane. |
w pierwszej kolejności trzeba wyczyścić flagi błędów w strumieniu, ponieważ stan sprawi, że inne operacje po prostu nie zadziałają. Służy do tego metoda std::cin.clear(). Gdy już możemy wykonywać operacje na strumieniu, należy odrzucić dane które wywołały błąd. |
No i był jeszcze ten przykład int liczba; std::cin >> liczba; bool bCzyBlad = std::cin.fail(); std::cin.clear(); std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); Tak wygląda wczytanie jednej liczby, z wyczyszczeniem strumienia i zachowaniem informacji, czy był błąd. Jak chcesz wczytać 3 liczby, to zapewne chcesz ten kod mieć 3 razy, na trzech zmiennych int i trzech bool, o czym też mówi wskazówka do zadania Informacje o poprawnym (albo niepoprawnym) wczytaniu danych należy przechować w dodatkowych zmiennych typu bool. |
Wydaje się, że wszystkie potrzebne informacje są podane, ale: niedawno ta lekcja została przerobiona i część o obsłudze błędów była pisana od nowa. Niewykluczone, że coś może być niezbyt zrozumiałe, biorąc pod uwagę, że ta lekcja jest bardzo wcześnie w kursie. Konstruktywna krytyka jest mile widziana. |
|
Przemek978 Temat założony przez niniejszego użytkownika |
» 2018-08-12 13:11:21 A mógłbyś jeszcze napisać gdzie w kodzie to wstawić bo wyskakuje mi błąd bool bCzyBlad |
|
pekfos |
» 2018-08-12 13:15:29 Jak nie podajesz kodu, to o błędach nie masz po co wspominać. |
|
« 1 » 2 |