Tastaturpuffer prüfen, ohne ihm Zeichen zu entnehmen?
-
Hallo zusammen,
ich stehe vor folgendem Problem:Ein Wert soll in eine Float-Variable per Tastatur eingelesen werden, wenn jedoch ein bestimmtes Zeichen gedrückt wird, soll es die Eingabe abbrechen, anstatt der Float-Variablen irgendwas zuzuweisen. Jetzt stehe ich vor einem Problem.
-
Wenn ich zuerst überprüfen will, ob sich ein Zeichen anstatt einer Zahl im Tastaturpuffer befindet (in char-Variable initialisieren & testen) und der Benutzer jedoch eine (richtige) Gleitkommazahl eingegeben hat, dann zerstückel ich mir diesen Wert natürlich mit der char-Variable....
-
Wenn ich überprüfen möchte, ob das Einlesen in die float-Variable geklappt hat, habe ich bis jetzt keine Möglichkeit gefunden, falls die Eingabe Fehlerhaft war, die Eingabe danach noch irgendwie abzufangen. Normalerweise sollte die Eingabe doch aber im Tastaturpuffer verweilen, bis sie irgendwem/was erfolgreich zugewiesen wurde? Trotzdem ein Beispiel, wie es nicht funktioniert:
float a; char b; void *eingabe_ok; eingabe_ok=(cin >> a); if(eingabe_ok==NULL){cin >> b;) else{cout<< "Eingabe ohne Fehler" << endl;}Hat jemand einen Rat, wie man das am besten anstellen könnte?
Grüße
-
-
Also 2 Fälle: (Zur Veranschaulichung nehme ich einfach '#' als Zeichen zum Abbrechen):
- 1. Du willst die Eingabe sofort nach der Eingabe von # abbrechen, ohne dass der Benutzer danach Enter drücken muss oder so:
Da würde ich Zeichen für Zeichen einlesen, prüfen ob es # ist, dann entweder abbrechen oder das Zeichen in einen vector packen. Wenn das Zeichen '\n' kommt, prüft du ob die Zeichen im vector einen float ergeben und wandelst sie um - oder gibst entsprechen einen Fehler aus und wiederholst die Eingabe. - 2. Es macht dir nichts wenn der Benutzer nach # noch Enter drücken muss:
Du liest einfach einen string ein. Wenn der string nur aus # besteht dann brichst du ab, ansonsten versuchst du ihn in float umzuwandeln oder wiederholst die Eingabe
- 1. Du willst die Eingabe sofort nach der Eingabe von # abbrechen, ohne dass der Benutzer danach Enter drücken muss oder so:
-
Danke dir für die Antwort. Um genau zu sein poste ich mal die Aufgabenstellung:
"Erstellen Sie ein Programm, das im Dialog bis zu 50 Gleitpunktzahlen in einen Vektor mit Elementen vom Typ float einliest (Abbruch der Eingabe mit dem Zeichen 'a'). Das Programm sucht anschließend den größten und kleinsten Wert und berechnet den Durchschnitt aller Vektorenelemente (arithm. Mittel). Die Ergebnisse werden auf dem Bildschirm ausgegeben. Das Auswerten unplausibler Eingaben ist zu integrieren, d.h. unsinnige Eingaben sollen nicht zu einer Fehlfunktion des Programms führen."
Realisiert hab ich das dann, wie du vorgeschlagen hast, mit dem String realisiert. Das ganze schaut nun insgesamt so aus(bestimmt schlägt der ein oder andere bei diesem Code die Hände überm Kopf zusammen - Ich kanns' halt aktuell noch nich' besser.):
#include<iostream> #include<cmath> using namespace std; int arraygroesse1=50; int arraygroesse2=100; // Wert 100 aus der Luft gegriffen float array[50]; char wert[100]; int durchgaenge; void maxmin(float array[], int durchgaenge, float *min, float *max); float mittel(float array[]); bool kontrolle(char array[], int arraygroesse2); void main(void) { for(int r=0; r<5; ++r) { for(int p=0; p<arraygroesse2; ++p) {wert[p]='\0';} cout << "Geben Sie die " << (r+1) << "te Gleitkommazahl ein. Abbruch mit <a>" << endl; cin >> wert; if(wert[0]=='a'){break;} else if(kontrolle(wert, arraygroesse2)==1){cout << "Falscher Wert eingegeben. Bitte nochmal." << endl; --r; continue;} else{array[r]=atof(wert);} durchgaenge=(r+1); } float min=(3.4*(pow(10,38))); float max=((-3.4)*(pow(10,38))); float mittelwert=0; maxmin(array, durchgaenge, &min, &max); mittelwert=mittel(array); cout << "Mittelwert: " << mittelwert << endl << "Minimum: " << min << endl << "Maximum: " << max << endl; system("pause"); } void maxmin(float array[], int durchgaenge, float *min, float *max) { for(int i=0; i<durchgaenge; ++i) { if(array[i]<(*min)){(*min)=array[i];} else{;} if(array[i]>(*max)){(*max)=array[i];} else{;} } } float mittel(float array[]) { float temp1=0; for(int j=0; j<durchgaenge; ++j) { temp1=(temp1+array[j]); } return (temp1/durchgaenge); } bool kontrolle(char array[], int arraygroesse2) { for(int z=0; z<arraygroesse2; ++z) { if(array[z]!='0' && array[z]!='1' && array[z]!='2' && array[z]!='3' && array[z]!='4' && array[z]!='5' && array[z]!='6' && array[z]!='7' && array[z]!='8' && array[z]!='9' && array[z]!='.' && array[z]!='\0') {return 1;} else{;} } }
-
Also Zeile 68 wäre eine Schleife wert.
edit: nee, gar eine Funktion
edit2: nee, ich denke, die Aufgebaenstellung ist viel einfacher gemeint
-
edit2: nee, ich denke, die Aufgebaenstellung ist viel einfacher gemeint
galube ich auch, siehe meine Punkt 2.
So und jetzt noch einige Verbesserungspunkte, wir sind hier übrignends in C++ nicht C:
#include<iostream> #include<cmath> using namespace std; //nimm stat arrays std:.vector //bitt keine globalen varaiblen int arraygroesse1=50; int arraygroesse2=100; // Wert 100 aus der Luft gegriffen float array[50]; char wert[100]; int durchgaenge; void maxmin(float array[], int durchgaenge, float *min, float *max); float mittel(float array[]); bool kontrolle(char array[], int arraygroesse2); void main(void) { for(int r=0; r<5; ++r) { for(int p=0; p<arraygroesse2; ++p) {wert[p]='\0';} // die geschweiften klammern sind überflüssig, aber was soll das hier überhaupt ? cout << "Geben Sie die " << (r+1) << "te Gleitkommazahl ein. Abbruch mit <a>" << endl; cin >> wert; if(wert[0]=='a'){break;} else if(kontrolle(wert, arraygroesse2)==1){cout << "Falscher Wert eingegeben. Bitte nochmal." << endl; --r; continue;} else{array[r]=atof(wert);} durchgaenge=(r+1); } //Würde ich so nicht verwenden. Außerdem sind die maximalen Werte von float schon vordefiniert verwendbar float min=(3.4*(pow(10,38))); float max=((-3.4)*(pow(10,38))); float mittelwert=0; maxmin(array, durchgaenge, &min, &max); mittelwert=mittel(array); cout << "Mittelwert: " << mittelwert << endl << "Minimum: " << min << endl << "Maximum: " << max << endl; system("pause"); } void maxmin(float array[], int durchgaenge, float *min, float *max) //bitte nim referezen statt pointer { for(int i=0; i<durchgaenge; ++i) { if(array[i]<(*min)){(*min)=array[i];} else{;} //Leere Else-Blöcke - wozu ? if(array[i]>(*max)){(*max)=array[i];} else{;} //Leere Else-Blöcke - wozu ? } } float mittel(float array[]) { float temp1=0; for(int j=0; j<durchgaenge; ++j) { temp1=(temp1+array[j]); // temp1 += array[j], sollte man aber auch einfach mit der STL erschlagen können (ein Funktionsaufruf der alle addiert) } return (temp1/durchgaenge); } //Alle Codepfade müssen einen Wert zurückgeben, als Anfänger Warnungen als Fehler betrachten! bool kontrolle(char array[], int arraygroesse2) { for(int z=0; z<arraygroesse2; ++z) { if(array[z]!='0' && array[z]!='1' && array[z]!='2' && array[z]!='3' && array[z]!='4' && array[z]!='5' && array[z]!='6' && array[z]!='7' && array[z]!='8' && array[z]!='9' && array[z]!='.' && array[z]!='\0')//lürzeer wäre was wie "(array[z]>='0' && array[z]<='9' )" {return 1;} else{;} //Leere Else-Blöcke - wozu ? } }