Überprüfung mit Typecast
-
Hallo!
Meine Fragen sind noch ziemliche Anfängerfragen ich hoffe, dass ihr mir trotzdem helfen wollt!
Die auskommentierte dritte Bedingung sollte ein Versuch sein zu prüfen ob es sich um eine ganze Zahl handelt. Diese Überprüfung will ich auch nur mit einem Typecasting machen. 1. Frage: Irgendetwas stimmt nicht und bei der Eingabe einer Kommazahl befinde ich mich in einer Dauerschleife. Woran liegt das?
2. Frage: Wenn ich dieses Typecasting mache und es funktioniert, dann habe ich dadurch auch alle anderen ungültigen Eingaben ausgeschlossen oder?#include <iostream> using namespace std; int main (void) { /*deklaration*/ int eingabe[10]; int i = 0; do { cout << "Eingabe: \n"; cin >> eingabe[i]; if(eingabe[i]>=10 && eingabe[i]<=20) // && (eingabe[i]-int(eingabe[i])==0)) { cout <<eingabe[i]<<" wurde hinzugefügt \n"; i=i+1; } else if(eingabe[i]<10) { cout<<"Zahl zu klein \n"; } else if(eingabe[i]>20) { cout<<"Zahl zu gross \n"; } }while(i<10); cout<<"Inhalt des Arrays:\n"; for (int i=0; i!=10; i++) { cout <<eingabe[i]<<", "; cin.ignore(); cin.get(); } }Grüße
Sahnepudding
-
1.- du musst den puffer deines in streams löschen
2.- nicht unbedingt
-
Ist das Problem nicht eher, dass hier beides
(eingabe[i]-int(eingabe[i])==0)integer Werte sind und der Vergleich somit immer stimmt?
Müsste ich vielleicht gleich von Anfang an, in double casten und nach int casten und wenn die differenz 0 ist, muss es ein Integer sein?
Ich komme allerdings nicht darauf, wie ich das schreiben muss.Wenn mit Puffer leeren cin.clear(); gemeint war, dann hat das auf mein Problem keine Auswirkungen gehabt.
Grüße
-
z.T. Endlosschleife guck mal da, schätze das wird der Grund sein:
http://www.cplusplus.com/reference/iostream/ios/fail/Was das Eingeben von Integern angeht: ich würde da nicht mit float/double arbeiten wollen.
Was du statt dessen machen könntest: lies eine Zeile als std::string ein, und dann versuche diesen std::string mit z.B. boost::lexical_cast in einen Integer zu konvertieren.
boost::lexical_cast überprüft dabei ob der Input-String beim Konvertieren in einen Integer vollständig "konsumiert" wird. Wenn der String eine Kommazahl enthält, dann stoppt die Konvertierung beim "." bzw. ",", und boost::lexical_cast wirft einen Fehler.
(Da schliesst natürlich auch Dinge wie "1.0" als gültige Eingabe aus, was aber in den meisten Fällen akzeptabel sein sollte)
-
Danke ersteinmal für die Antwort!
Am liebsten würde ich das auch anders machen, mir wurde aber vorgegeben die Überprüfung auf Ganzzahligkeit mit einem Typecasting durchzuführen.
Und, dass die Eingabe zunächst in ein int-Array erfolgen soll.
Wenn ich eine Kommazahl in ein Int-Array schreibe wird sie sowieso abgeschnitten. D.h. die Überprüfung müsste davor schon stattfinden.
Mir ist das jetzt von der Logik nicht ganz klar, was ich in welcher Reihenfolge tun muss.
-
Soweit bin ich jetzt
#include <iostream> using namespace std; int main (void) { /*deklaration*/ int eingabe[10]; int i = 0; double check; do { cout << "Eingabe: \n"; cin >> check; if(check>=10 && check<=20 && check-((int)check)==0) { cout <<(int)check<<" wurde hinzugefügt \n"; eingabe[i]=(int)check; i=i+1; } else if(check<10) { cout<<"Zahl zu klein \n"; } else if(check>20) { cout<<"Zahl zu gross \n"; } else if(check-((int)check)!=0) { cout<<"ungueltige Eingabe \n"; } }while(i<10); }Soweit ich das sehe, können keine falschen Eingaben ins Array geschrieben werden. 11.5 ist ungültig; 1.1 zu klein und 20.5 zu groß. Das ist für mich so eigentlich OK. Nur wenn ich jetzt Sachen wie " 11.1.1 " oder Buchstaben eingebe, kommt es zu Endlosschleifen oder ungewollten mehrfacheingaben.
Hat dazu vielleicht noch Jemand einen Tipp?Grüße
:xmas1:
-
sahnepudding schrieb:
Soweit bin ich jetzt
#include <iostream> using namespace std; int main (void) { /*deklaration*/ int eingabe[10]; int i = 0; double check; do { cout << "Eingabe: \n"; cin >> check; if ( !cin ) { cin.clear(); cin.ignore(cin.rdbuf()->in_avail()); } if(check>=10 && check<=20 && check-((int)check)==0) { cout <<(int)check<<" wurde hinzugefügt \n"; eingabe[i]=(int)check; i=i+1; } else if(check<10) { cout<<"Zahl zu klein \n"; } else if(check>20) { cout<<"Zahl zu gross \n"; } else if(check-((int)check)!=0) { cout<<"ungueltige Eingabe \n"; } }while(i<10); }
-
Skym0sh0 schrieb:
cin.rdbuf()->in_avail());Im Allgemeinen bekommst du hier fei immer 0 zurück.
-
dann eben std::numeric_limits<unsigned int>::max
-
std::streamsize wenn schon.