Eingabefehler - Buchstaben in Zahlen verhindern?

freak_xyz

Grünschnabel
Hi, wir haben die Aufgabe ein Programm zu programmieren, welches mit Matrizen rechnen kann. Da wir das gerne perfekt machen wollen, suchen wir schon den ganzen Nachmittag nach irgendeinem Ansatz eine solche Fehleingabe

12342g1343 zu vermeiden, bzw. die Eingabe wieder neu aufzurufen.

Unser letzter Ansatz war:
int main() {
char beenden;double zahl=0;
cin>>zahl;
if (!(cin >> zahl)){
cout<< "Fehler\n";}

cout<<"Sie haben die Zahl "<<zahl<<" eingegeben\n";
getch();
return 0;
}
Diese variante "merkt" zwar , dass dies 12342g1343 ein tippfehler ist, doch leider muss man "korrekte Zahlen" doppelt eingeben.

Ich hoffe jemand kann uns weiterhelfen.
 
Hi.
Hi, wir haben die Aufgabe ein Programm zu programmieren, welches mit Matrizen rechnen kann. Da wir das gerne perfekt machen wollen, suchen wir schon den ganzen Nachmittag nach irgendeinem Ansatz eine solche Fehleingabe

12342g1343 zu vermeiden, bzw. die Eingabe wieder neu aufzurufen.

Unser letzter Ansatz war:

Diese variante "merkt" zwar , dass dies 12342g1343 ein tippfehler ist, doch leider muss man "korrekte Zahlen" doppelt eingeben.

Ich hoffe jemand kann uns weiterhelfen.
Naja, ihr lest ja auch zweimal ein, allerdings prüft ihr nur die zweite Eingabe auf Fehler?! Der erste Wert wird einfach gelesen und ihr überprüft nicht ob die Eingabe erfolgreich war.

C++:
double zahl;

if (cin >> zahl) {
  // zahl wurde korrekt eingelesen
} else {
  // Fehler bei der Eingabe.
  string tmp;
  cin.clear();
  getline(cin, tmp); // komplette Zeile einlesen und verwerfen.
  cerr <<  "Fehler: Gleitkommazahl erwartet.\n";
}
Das ganze solltet ihr dann natürlich in einer Schleife machen (und in eine Funktion packen).

Übrigens wird bei der Eingabe "999.4fff" die Zahl 999.4 eingelesen. Erst wenn danach nochmal versucht wird eine Zahl einzulesen schlägt die Eingabe fehl.

Gruß
 
Hi, das hat so, wie ihr vorgeshclagen habt, nicht ganz funktioniert.
Ich möchte hier aber der Vollständigkeit halber mal unsere version posten. Gibt ja bestimmtnoch mehr Leute die das Problem haben und verzweifelt eine Lösung suchen.

Code:
#include <iostream>
#include <sstream>
#include <iomanip>
#include <conio.h>
using namespace std;

double eingabe();

int main(){
    double e;
    e=eingabe();
    cout.precision(4);
    cout << setiosflags(ios_base::fixed);
    cout<<"\n"<<e;
    getch();
    return 0;
}

double eingabe(){
       double z, n;                    //Zähler, Nenner
       bool a=0, b=0;
       string zaehler(""), nenner("");
       char c;                         //einzugebenden Zeichen
       c=getch();
       while(!(c==13 && zaehler!=""))  //bricht ab bei Enter und wenn zahl eingegeben
       {if(c=='/' && b==0 && zaehler!="")    //erkennt Eingabe von Bruch
         {b=1;                     //fortfahren mit Eingabe von nenner
          a=0;                     //Dezimalpkt. in nenner wieder möglich
          cout<<c;}                //Ausgabe des Bruchstrichs
        if(c=='-' && zaehler=="" && b==0)    //negatives Vorzeichen
          {zaehler+=c;            //Zeichen an string anfügen
           cout<<c;}
        if((c==',' || c=='.') && a==0 && b==0) //erkennt Dezimalpkt. in zaehler
          {zaehler+='.';            //Zeichen an string anfügen
           cout<<".";
           a=1;}                    //kein weiterer Dezimalpkt. in zaehler möglich
        if(c>='0' && c<='9' && b==0)         //Zifferneingabe für zaehler
          {zaehler+=c;              //Zeichen an string anfügen
           cout<<c;}
        if(c=='-' && nenner=="" && b==1)    //negatives Vorzeichen
          {nenner+=c;            //Zeichen an string anfügen
           cout<<c;}
        if((c==',' || c=='.') && a==0 && b==1) //erkennt Dezimalpkt. in nenner
          {nenner+='.';             //Zeichen an string anfügen
           cout<<".";
           a=1;}                    //kein weiterer Dezimalpkt. in nenner möglich
        if(c>='0' && c<='9' && b==1)         //Zifferneingabe für nenner
          {nenner+=c;               //Zeichen an string anfügen
           cout<<c;}
           c=getch();                  //Eingabe nächstes Zeichen
       }
       istringstream inStream(zaehler);   //Umwandlung zaehler in Zahl
       inStream >> z;
       if(b==1)                        //falls Bruchstrich eingegeben
         {istringstream inStream(nenner); //Umwandlung nenner in Zahl
          inStream >> n;
          if(n==0 || nenner=="")       //falls nenner 0 Eingabe wiederholen
            {cout<<"\nNenner darf nicht 0 sein! ";
             return eingabe();}
          z=z/n;}                      //Zahl wird zaehler/nenner
       return z;                       //Rückgabe der Zahl
       }
 
Zurück