[C/C++] Kontrola nieprawidłowych danych wejściowych
Ostatnio zmodyfikowano 2017-07-22 13:50
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 :/ #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; } else if( przedmioty[ i ].ocena == 0 ) { i++; break; } else { przedmioty[ i ].suma += przedmioty[ i ].ocena; licznik++; continue; } } cout << endl; } 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; }
|
|
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. |
|
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
|
|
« 1 » |