Nur INT zulassen



  • Bitte lass mich auch zu.



  • Hallo.

    Ich weiss, dass ich als Noob euch nerve. Aber was solls ^^

    Zu meinem Anfänger Taschenrechnerprogramm habe ich vieles versucht. Aber leider habe ich kein Endprodukt.
    In meinem ANSI C++ Buch von Markt & Technik habe ich bei den Schleifen nachgeschaut. Mit IF habe ich Versuche gemacht. Aber habs nicht geschafft.
    Mit while habe ich es auch versucht. Auch mit do - while. Aber wenn ich einen String eingebe entsteht eine Endlosschleife.

    Ich komm leider nicht weiter.

    Auf der ersten Seite von diesem Thema findet ihr den Code von meinem Taschenrechner.
    Ich möchte nur, dass bei Eingaben von String eine Meldung kommt und das Programm wiederholt wird. Also wieder die Erste Zahl zum Addieren verlangt.

    mit cin.fail() habe ich es auch nicht geschafft. Weil ich bei meinem Programm nicht nur einmal cin >> verwende, sondern öfterst. Ich glaub deswegen funzt es nicht.

    Dann habe ich mit cin.fail() versucht:

    int a,b;
    cin >> a;
    if (cin.a.fail()) {
    cout << "Fehler" endl;
    } else { // else damit er die zweite Zahl zum addieren eingibt
    cin >> b;
    if (cin.b.fail()) {
    cout << "Fehler" endl;
    }
    

    So habe ich es auch versucht. Vielleicht würds ja gehn. Aber ging auch nicht.

    Paar Fragen hätte ich noch 😞

    Wie ich schon oben erwähnt habe habe ich ein Buch von Markt und Technik (ANSI C++)
    Bei den Programmen wird über #include <iostream.h> verwendet.
    Und wieso verwendet ihr nur #include <iostream>? Ich verstehe den Unterschied leider noch immer nicht 😞
    Und bei Ausgaben ist es glaube ich egal ob ich

    cout << "Test" endl;
    // oder
    cout << "Test";
    

    verwende oder?

    Danke im Voraus.

    MfG
    Technology



  • int a,b;
    cin >> a;
    if (cin.a.fail()) {
    cout << "Fehler" endl;
    } else { // else damit er die zweite Zahl zum addieren eingibt
    cin >> b;
    if (cin.b.fail()) {
    cout << "Fehler" endl;
    }
    

    Vielleicht hast du die auch nur vergessen mit einzutippen, aber am Ende fehlt noch eine geschweifte Klammer. Ich kenne mich mit der Methode fail() nicht aus, aber eigentlich müsste sich diese Methode immer auf das letzte cin beziehen. Also einfach nur cin.fail() und nicht cin.a.fail().

    cout << "Test" endl;
    // oder
    cout << "Test";
    

    Kommt drauf an: Wenn du nach der letzten Variante ein neues cout-Objekt einfügst, würde der Text aneinander gereiht werden:

    cout << "Text1";
    cout << "Text2";
    

    würde die Ausgabe

    Text1Text2
    

    ergeben. Hingegen

    cout "Text1" << endl;
    cout << "Text2" << endl;
    

    die Ausgabe

    Text1
    Text2
    

    ergeben würde. Du siehst: endl beendet die Zeile (du könntest auch stattdessen \n in den String mitreinnehmen).

    Mfg Ominion





  • Dr. Prof schrieb:

    Schau dir das an http://www.parashift.com/c++-faq-lite/input-output.html#faq-15.3

    Dr.Prof vielen Dank für den Link. Hat mir sehr geholfen.

    Endlich habe ich es Dank euch geschafft.
    Hier mein fertiger Code.

    #include <iostream>
    int main()
    {
    using namespace std;
    int x, y, z;
    char ende, funktion;
    
    do
    {
            cout << "Addition: +\nSubtraktion: -\n\nRechnungsart: ";
            cin >> funktion;
            switch (funktion)
            {
                    case '+':
                    while ((cout << "Erste Zahl: ") && !(cin >> x)) {
                            cout << "Das ist keine Zahl! ";
                            cin.clear();
                            cin.ignore(numeric_limits<streamsize>::max(), '\n');
                    }
                    while ((cout << "Zweite Zahl: ") && !(cin >> y)) {
                            cout << "Das ist keine Zahl! ";
                            cin.clear();
                            cin.ignore(numeric_limits<streamsize>::max(), '\n');
                    }
                    z = x + y;
                    cout << "\nErgebnis: "<< z << endl;
                    break;
    
                    case '-':
                    while ((cout << "Erste Zahl: ") && !(cin >> x)) {
                            cout << "Das ist keine Zahl. ";
                            cin.clear();
                            cin.ignore(numeric_limits<streamsize>::max(), '\n');
                    }
    
                    while ((cout << "Zweite Zahl: ") && !(cin >> y)) {
                            cout << "Das ist keine Zahl. ";
                            cin.clear();
                            cin.ignore(numeric_limits<streamsize>::max(),'\n');
                    }
                    z = x - y;
                    cout << "Ergebnis: " << endl;
                    break;
    
                    default:
                    cout << "Falsche Eingabe";
                    break;
            }
            cout << "\nWenn Sie weiterrechnen wollen tippen Sie auf E: ";
            cin >> ende;
            getchar();
    }
    while (ende == 'e'); {
            cout << "Das Programm wird beendet" << endl;
            }
    return 0;
    }
    

    Fragen:
    **1.**Ich verstehe leider diese while Schleife nicht 😞 Kann sie mir jemand erklären?

    while ((cout << "Erste Zahl: ") && !(cin >> x)) {
                            cout << "Das ist keine Zahl. ";
                            cin.clear();
                            cin.ignore(numeric_limits<streamsize>::max(), '\n');
                    }
    

    Wieso wird hier !(cin >> x) verwendet?

    2.

    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    

    Was wird hier eigentlich gemacht? Wenn ich den Code bei C++ Builder 6 eingebe bekomme ich jedesmal eine Fehlermeldung.

    Code-Parameter kann nicht aufgerufen werden, da der Quelltext Fehler enthält

    3. Wie ihr sieht enthält mein Programm sehr viele while Schleifen? Könnte ich diese irgendwie verringern? Besser gefragt, das Programm irgendwie anders programmieren?

    4. Wie findet ihr meinen Programmierstil als Anfänger.

    Vielen Dank im Voraus.

    MfG
    Technology



  • technology schrieb:

    **1.**Ich verstehe leider diese while Schleife nicht 😞 Kann sie mir jemand erklären?

    while ((cout << "Erste Zahl: ") && !(cin >> x)) {
    

    (cout << "Erste Zahl: ") ist immer true. !(cin >> x) ist solange true, wie du keine Ganzzahlen eingibst.

    cin.clear();
                            cin.ignore(numeric_limits<streamsize>::max(), '\n');
                    }
    

    Leert dir deinen Buffer.

    Angenommen, das Ausgabefenster sieht folgendermaßen aus:

    Erste Zahl: 23 blubbs
    

    Ich habe zwei "Wörter" eingegeben, die 23 wird in x gespeichert, das "blubbs" bleibt allerdings noch im Buffer, d. h. das nächstfolgende cin liest dieses "blubbs" ein, egal, was du eingibst. Das ist sicherlich nicht im Sinne des Erfinders, deshalb wird der Buffer geleert.

    Wieso wird hier !(cin >> x) verwendet?

    cin liefert einen Fehlerstatus, wenn in x nix Ordentliches eingelesen wurde.

    2.

    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    

    [...] Wenn ich den Code bei C++ Builder 6 eingebe bekomme ich jedesmal eine Fehlermeldung.

    Uff, wie mans beim Builder 6 machen muss, weiß ich auch nicht.

    3. Wie ihr sieht enthält mein Programm sehr viele while Schleifen? Könnte ich diese irgendwie verringern? Besser gefragt, das Programm irgendwie anders programmieren?

    Natürlich. Geh zuerst mal davon aus, dass der User nur richtige Eingaben macht, und bau die Fehlerüberprüfung erst nachträglich ein. Dadurch erhälst du Code, den du auch noch selbst verstehst.



  • Du kannst auch die Tatsache ausnutzen, daß alle while()-Schleifen gleich aufgebaut sind und das in eine Funktion einpacken:

    int lese_zahl(const string& Eingabe)
    {
      int val;
      while ((cout << Eingabe) && !(cin >> val)) {
        cout << "Das ist keine Zahl! ";
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
      }
      return val;
    }
    
    ...
    switch(funktion)
    {
    case '+':
      x=lese_zahl("Erster Summand: ");
      y=lese_zahl("Zweiter Summand: ");
      z=x+y;
      cout<<"Summe: "<<z<<endl;
    ...
    }
    


  • CStoll schrieb:

    int lese_zahl[...]
    

    nein! es heißt "lies" ⚠



  • Ist doch egal - ich "lese" halt eine "zahl" 🙂



  • Hallo,

    Zu 2.
    Auch beim BCB6 kommen da keine Fehlermeldungen, wenn man

    #include <limits>
    

    mit einbindet.



  • 1. Vielen vielen dank für eure Hilfen.
    2. Habe jetzt dank euch gelernt wie man nur für INT die Eingabe zulassen kann.
    Wie könnte ich so etwas mit den Strings realisieren?
    Genauso?

    MfG
    Technology

    EDIT: Wenn ich meinem Freund das Programm schicke z.b. unter dem Namen "f.exe" bekommt er so eine Meldung.
    http://img249.imageshack.us/img249/224/fehler8xu.jpg



  • probieren geht über studieren



  • @technology
    Schau dir mal das hier
    http://www.c-plusplus.net/forum/viewtopic.php?t=39164 aus der C++Builder FAQ an. Das könnte helfen.


Anmelden zum Antworten