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

[C/C++] Kontrola nieprawidłowych danych wejściowych

Ostatnio zmodyfikowano 2017-07-22 13:50
Autor Wiadomość
kombatdavid123
Temat założony przez niniejszego użytkownika
[C/C++] Kontrola nieprawidłowych danych wejściowych
» 2017-07-22 13:20:16
Witam, moim zadaniem było napisanie programu, który wczytuje oceny z poszczególnych przedmiotów, a na końcu wyświetla ich średnią. Jeżeli wprowadzono cyfrę "0" to program kończy wczytywanie danego przedmiotu. I teraz pojawia się problem z niepoprawnymi danymi wejściowymi, a mianowicie kiedy wprowadzam np. "3j", to jest to traktowane jako zwykła "3" i nie wyskakuje błąd. Jestem pewien, że chodzi o funkcję sprawdzającą lecz nie wiem co w niej zmienić, dlatego prosiłbym o jakieś wskazówki :/

C/C++
#include <iostream>
#include <cmath>
#include <string>
#include <istream>

using namespace std;

struct Przedmiot
{
    string nazwa;
    double ocena;
    double suma;
    double srednia;
};

bool Sprawdz( double * a );

float Srednia( float S, int i );

int main()
{
    Przedmiot przedmioty[ 3 ];
    przedmioty[ 0 ].nazwa = "Analiza matematyczna";
    przedmioty[ 1 ].nazwa = "Algebra";
    przedmioty[ 2 ].nazwa = "Obwody i sygnaly";
   
    int licznik = 0;
    float suma = 0;
    int i = 0;
   
    for( int k = 0; k <= 2; k++ )
    {
        cout << przedmioty[ k ].nazwa << endl << endl;
       
        while( 1 )
        {
            cout << "Podaj ocene: ";
            if( !Sprawdz( &( przedmioty[ i ] ).ocena ) )
            {
                cout << "Wprowadziles zle dane, podaj jeszcze raz..." << endl;
                continue;
            } //if
           
            else
            if( przedmioty[ i ].ocena == 0 )
            {
                i++;
                break;
            }
            else
            {
                przedmioty[ i ].suma += przedmioty[ i ].ocena;
                licznik++;
                continue;
            }
        } //while
        cout << endl;
    } //for
   
    for( int j = 0; j <= 2; j++ )
         suma += przedmioty[ j ].suma;
   
    cout << "Srednia twoich ocen wynosi: " << Srednia( suma, licznik ) << endl;
   
    return 0;
}

bool Sprawdz( double * a )
{
    cin.clear();
    cin.sync();
    cin >> * a;
    if( !cin.good() )
         return false;
    else
    if( cin.fail() )
         return false;
    else
   
         return true;
   
}

float Srednia( float S, int x )
{
    return S / x;
}
P-163485
pekfos
» 2017-07-22 13:37:52
Wczytywanie działa do pierwszej niepoprawnej liczby, a więc "3j" jest "poprawne", bo 3 jest poprawne. "j" nie jest wczytane i wywoła błąd przy próbie wczytania następnej liczby. Jeśli chcesz żeby każde słowo musiało być w całości liczbą, żeby przeszło, musisz wczytać je jako napis i skonwertować ręcznie, np funkcją std::stoi. Ta funkcja również działa na zasadzie "do pierwszego błędnego znaku", ale daje ci informację, ile znaków przetworzyła. To w połączeniu z ilością znaków w napisie pozwala ci stwierdzić, czy była tam tylko liczba.
P-163486
kombatdavid123
Temat założony przez niniejszego użytkownika
» 2017-07-22 13:50:16
No tak, mogłem spróbować od razu :D Dzięki za pomoc

P-163487
« 1 »
  Strona 1 z 1