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

Brak flagi błędu podczas wczytania + brak rozszerzenia dziesiętnego dla double

Ostatnio zmodyfikowano 2015-01-13 16:20
Autor Wiadomość
seishi00
Temat założony przez niniejszego użytkownika
Brak flagi błędu podczas wczytania + brak rozszerzenia dziesiętnego dla double
» 2015-01-12 16:05:07
Witam,

Poniższy kod ma 2 problemy

C/C++
#include <iostream>
using namespace std;

double wyn;

int ilcz, mian;

template < typename type >
type get()
{
    type liczba;
    while( !( cin >> liczba ) )
    {
        cout << "Podaj poprawna wartosc liczbowa ";
        cin.clear();
        cin.sync();
    }
    return liczba;
};


int main()
{
    char x;
    cout << "Podaj liczbe calkowita, ktora bedzie licznikiem: ";
    ilcz = get < int >();
    cout << "Podaj liczbe calkowita, ktora bedzie mianownikiem (inna od 0): ";
    while(( mian = get < int >() ) == 0 )
    {
        if( mian == 0 )
             cout << "Mianownik nie moze byc rowny 0! Podaj poprawna wartosc liczbowa: ";
       
    }
   
    wyn = ilcz / mian;
    cout << ilcz << "/" << mian << " = " << wyn;
    cin >> x;
    return 0;
}

PROBLEM 1:
Gdy w czasie wykonywania wzorca get<int>() podam wartość 3.3 to nie pojawia się flaga błędu - program wczytuje 3, a .3 pozostaje w buforze powodując błędy w dalszej części programu.

PROBLEM 2:
Wartość zmiennej wyn dla ilcz=1 i mian=2 jest 0 zamiast 0.5

Z góry dziękuję za pomoc.
P-124728
Monika90
» 2015-01-12 22:20:07
1
Wczytuj do std::string i użyj std::istringstream

2
int / int daje int
P-124776
seishi00
Temat założony przez niniejszego użytkownika
» 2015-01-13 16:20:38
Bardzo dziękuję za pomoc.

Dla zainteresowanych zamieszczam poniżej poprawiony kod (nie jest on idealny, ale jest lepszy niż poprzedni).

C/C++
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;

float wyn;
int ilcz, mian;
fstream plik;

template < typename type > //Wzorzec dla sprawdzenia poprawności typu wprowadzonych
type get() //danych przez użytkownika
{
    type wart; // Zawrość, która ma być zwrócona
    string wczyt; // String, ko którego ma zostać wczytana wartość podana przez użytkownika
    bool spr = 1; // Bool przechowujący informację, czy udało się poprawnie wczytać
   
    while( spr == 1 ) // Pętla wczytania danych
    {
        cin >> wczyt;
       
        istringstream isstream( wczyt );
        isstream >> wart;
        spr = isstream.fail();
        if( spr == 1 )
             cout << "Podaj poprawna wartosc: ";
       
    }
   
    return wart;
};


int main() // Początek funkcji main
{
    char x;
    cout << "Wyswietlic zawartosc pliku wyniki.txt czy dodac nowy wpis? [W/D]" << endl;
    x = get < char >();
   
    while( !( x == 'w' || x == 'W' || x == 'd' || x == 'D' ) ) // Sprawdzenie czy została podjęta decyzja i jeśli tak, to jaka
    {
        cout << "Podaj poprawny znak: ";
        x = get < char >();
    }
   
    if( x == 'w' || x == 'W' ) // Odczyt z pliku
    {
        plik.open( "wyniki.txt", ios::in );
        if( plik.good() )
        {
            string linia;
            while( !plik.eof() )
            {
                getline( plik, linia );
                cout << linia << endl;
            }
            plik.close();
        }
    }
    else // Zamiana ułamka zwykłego na dziesiętny
    {
        if( x == 'd' || x == 'D' )
        {
            cout << "Podaj liczbe calkowita, ktora bedzie licznikiem: "; // Początek wczytywania danych
            ilcz = get < int >();
            cout << "Podaj liczbe calkowita, ktora bedzie mianownikiem (inna od 0): ";
            while(( mian = get < int >() ) == 0 )
            {
                if( mian == 0 )
                     cout << "Mianownik nie moze byc rowny 0! Podaj poprawna wartosc liczbowa: ";
               
            } // Koniec wczytywania danych
           
            float filcz = static_cast < float >( ilcz ); // Rzutowanie typów integer na float
            float fmian = static_cast < float >( mian );
           
            wyn = filcz / fmian;
            cout << ilcz << "/" << mian << " = " << wyn << endl << endl; // Wyświetlenie wyniku
           
            cout << "Zapisac wynik do pliku? [T/N]" << endl; // Zapytanie o chęć zapisu wyniku
           
            x = get < char >();
            while( !( x == 't' || x == 'T' || x == 'n' || x == 'N' ) ) // Sprawdzenie czy została podjęta decyzja i jeśli tak, to jaka
            {
                cout << "Podaj poprawny znak: ";
                x = get < char >();
            }
           
            if( x == 't' || x == 'T' )
            {
                plik.open( "wyniki.txt", ios::out | ios::app ); // Zapis wyniku do pliku
                if( plik.good() )
                {
                    plik << ilcz << "/" << mian << " = " << wyn << endl;
                    cout << "Zapisano." << endl;
                    plik.close();
                }
            }
        }
        else
             cout << "Nie otwarto pliku" << endl;
       
    }
   
    cin >> x;
    return 0;
}
P-124799
« 1 »
  Strona 1 z 1