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

Zadanie domowe poziom 1 rozdział 9 - Obsługa strumienia wejściowego

Ostatnio zmodyfikowano 2016-11-30 17:58
Autor Wiadomość
Teamek
Temat założony przez niniejszego użytkownika
Zadanie domowe poziom 1 rozdział 9 - Obsługa strumienia wejściowego
» 2016-11-30 16:45:42
Witam ,
Mam problem z rozwiązaniem zadania
Treść zadania :
Zadanie domowe
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.
Wskazówka
Informacje o poprawnym (albo niepoprawnym) wczytaniu danych należy przechować w dodatkowych zmiennych typu bool.



Pisze w CodeBlocks 13.12 zainstalowany na ubuntu 16


================  Przebieg  działania mojego kodu  : ==================

Podaj liczbe rzeczywistą  A :: 
13.3
Podaj liczbe rzeczywistą  B :: 
tak 123
Podal liczbę rzeczywistą  C :
33.22nie

=====Wynik Działania Programu=====
### liczba pierwsza to : 13.3
Czy wczytano poprawnie ? :1
Czy wystąpił błąd ? :0
### liczba druga to :0
Czy wczytano poprawnie ? :1
Czy wystąpił błąd ? :00x6021e8
### liczba trzecia to :33.22
Czy wczytano poprawnie ? :1
Czy wystąpił błąd ? :0



     >> Mój problem
- Jak uzyskać efekt :
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.

Chodzi mi o wyświetlenie tylko wyniku ze albo wczytano albo nie a nie 2 naraz jak w moim programie
Wiedział bym jak to zrobić z poleceniem IF ale do niego zostało mi jeszcze 4 rozdziały
 
Kolejny problem to przy 2 liczbie pokazuje mi 00x6021e8 zamiast 0



===== KOD =====

#include <iostream>
#include <cstdio>
#include <limits>
using namespace std;

int main()

{
float a = 0;
float b = 0;
float c = 0;
bool wczytaniepoprawne = cin.good() ;
bool wczytanieblad = cin.fail() ;

cout << "Podaj liczbe rzeczywistą  A ::  \n";
 cin >> a;
 cin.clear();
 cin.sync();
 cin.ignore(numeric_limits < streamsize >::max(), '\n'  );


cout << "Podaj liczbe rzeczywistą  B ::  \n" ;
 cin >> b;
cin.clear();
cin.sync();
cin.ignore(numeric_limits < streamsize >::max(), '\n' );

 cout << "Podal liczbę rzeczywistą  C :: \n" ;
 cin >> c ;
 cin.clear();
 cin.sync();
 cin.ignore(numeric_limits < streamsize >::max(), '\n');

printf ("\n\t=====Wynik Działania Programu=====\n");

cout << "### liczba pierwsza to : " << a ;  cout << endl ;
       cout << "Czy wczytano poprawnie ? :" ; cout << wczytaniepoprawne ; cout << endl ;
       cout << "Czy wystąpił błąd ? :" ; cout << wczytanieblad ; cout << endl ;
cout << "### liczba druga to :" ; cout << b ;  cout << endl ;
       cout << "Czy wczytano poprawnie ? :" ; cout << wczytaniepoprawne ; cout << endl ;
       cout << "Czy wystąpił błąd ? :" ; cout << wczytanieblad ; cout << cout << endl ;

 cout << "### liczba trzecia to :" ; cout << c ;  cout << endl ;
        cout << "Czy wczytano poprawnie ? :" ; cout << wczytaniepoprawne ;cout << endl ;
       cout << "Czy wystąpił błąd ? :" ; cout << wczytanieblad ; cout << endl ;



return 0;
}
P-154346
karambaHZP
» 2016-11-30 16:51:04
cin.sync();
 jest tutaj zbędne. Wystarczy
cin.ignore();
.
Sprawdzenie strumienia należy w tym zadaniu wykonać po każdym wczytywaniu,
a w tym kodzie jest na początku przy deklarowaniu
C/C++
bool wczytaniepoprawne = cin.good();
bool wczytanieblad = cin.fail();
i w dalszej części kodu nie są aktualizowane, więc pokazują to co
zostało im przypisane na początku.
P-154347
Teamek
Temat założony przez niniejszego użytkownika
» 2016-11-30 17:05:54
cin.sync() zostawiłem na wypadek kompilacji pod windowsem

Myślę że teraz dobrze zdefiniowałem zmienne z przypisanym  cin.good() oraz cin.fail() ?
Jednak nadal przy 2 liczbie mam błąd



Przebieg działania kodu po zmianie :

Podaj liczbe rzeczywistą  A :: 
13.3
Podaj liczbe rzeczywistą  B :: 
tak 123
Podal liczbę rzeczywistą  C :
33.22nie

=====Wynik Działania Programu=====
### liczba pierwsza to : 13.3
Czy wczytano poprawnie ? :1
Czy wystąpił błąd ? :0
### liczba druga to :0
Czy wczytano poprawnie ? :0
Czy wystąpił błąd ? :10x6021e8
### liczba trzecia to :33.22
Czy wczytano poprawnie ? :1
Czy wystąpił błąd ? :0

KOD

#include <iostream>
#include <cstdio>
#include <limits>
using namespace std;

int main()

{
float a = 0;
float b = 0;
float c = 0;


cout << "Podaj liczbe rzeczywistą  A ::  \n";
 cin >> a;
bool wczytaniepoprawnea = cin.good() ;
bool wczytanieblada = cin.fail() ;
 cin.clear();
 cin.sync();
 cin.ignore(numeric_limits < streamsize >::max(), '\n'  );


cout << "Podaj liczbe rzeczywistą  B ::  \n" ;
 cin >> b;
bool wczytaniepoprawneb = cin.good() ;
bool wczytaniebladb = cin.fail() ;
cin.clear();
cin.sync();
cin.ignore(numeric_limits < streamsize >::max(), '\n' );

 cout << "Podal liczbę rzeczywistą  C : \n" ;
 cin >> c ;
bool wczytaniepoprawnec = cin.good() ;
bool wczytaniebladc = cin.fail() ;
 cin.clear();
 cin.sync();
 cin.ignore(numeric_limits < streamsize >::max(), '\n');

printf ("\n\t=====Wynik Działania Programu=====\n");

cout << "### liczba pierwsza to : " << a ;  cout << endl ;
       cout << "Czy wczytano poprawnie ? :" ; cout << wczytaniepoprawnea ; cout << endl ;
       cout << "Czy wystąpił błąd ? :" ; cout << wczytanieblada ; cout << endl ;
cout << "### liczba druga to :" ; cout << b ;  cout << endl ;
       cout << "Czy wczytano poprawnie ? :" ; cout << wczytaniepoprawneb ; cout << endl ;
       cout << "Czy wystąpił błąd ? :" ; cout << wczytaniebladb ; cout << cout << endl ;

 cout << "### liczba trzecia to :" ; cout << c ;  cout << endl ;
        cout << "Czy wczytano poprawnie ? :" ; cout << wczytaniepoprawnec ;cout << endl ;
       cout << "Czy wystąpił błąd ? :" ; cout << wczytaniebladc ; cout << endl ;



return 0;
}
P-154348
karambaHZP
» 2016-11-30 17:58:47
cout << "Czy wystąpił błąd ? :"; cout << wczytaniebladb; cout << cout << endl;
Ten kod nie powinien się skompilować, więc wnoszę, że uruchamiasz jakąś wcześniej skompilowaną wersję.
printf( "\n\t=====Wynik Działania Programu=====\n" );
?
 Skoro korzystasz ze strumieni, to po co to
printf();
?

cin.sync() zostawiłem na wypadek kompilacji pod windowsem
To jest funkcja, której efektem ubocznym jest czyszczenie strumienia i nie wszędzie działa w ten sposób.
Do tego służy
std::cin.ignore();
.
P-154350
« 1 »
  Strona 1 z 1