Calculator: Eingabe von Buchstaben verhindern?

  • Hallo alle zusammen!

    Bin neu hier und beschäftige mich neuerdings mit C++ habe mir nen Buch über C++ von Martk und Technik gekauft, habe es mir durchgelesen und möchte meine Kenntnisse noch gerne bis zum geht nicht mehr erweitern ^^.
    Aber darum geht es jetzt nicht :)

    Also um mich ans Coden zu gewöhnen und mit den Strukturen klarzukommen, habe ich erstmal mit etwas kleinem angefangen, und zwar einen Taschenrechner, der die Grundrechenarten + - * / wiedergibt.

    Er funktioniert soweit echt super :), nur müsste noch ne Regel festgelegt werden, wie ich die Eingabe von Buchstaben bei std::cin in meinem code verhindere, denn wenn ich nen Buchstabe eintippe, kommt dann immer sowas hier:

    <----Taschenrechner---->
    (0) Addition
    (1) Subtraktion
    (2) Multiplikation
    (3) Division

    Bitte waehlen sie ihre Rechenart und bestätigen sie mit Enter!
    s
    Sie haben Addition gewählt
    Bitte geben sie die erste Zahl ein
    Bitte zweite Zahl eingeben
    5.32943e-3968 + -1.05116e-4095 = nan

    Wenn man schon nen Programm schreibt, dann sollte es auch perfekt sein ;)
    hoffe ihr könnt mir bei dem Problem behilflich sein!?
    Danke schon mal im Voraus!

  • #include <iostream>

    using namespace std;

    int main()
    {

    int schluss;
    unsigned short int i;
    long double a, b;


    cout << "<----Taschenrechner---->\n";
    cout << "(0) Addition\n";
    cout << "(1) Subtraktion\n";
    cout << "(2) Multiplikation\n";
    cout << "(3) Division\n";
    cout << "\nBitte waehlen sie ihre Rechenart und bestätigen sie mit Enter!\n";
    cin >> i;

    if (i < 0 || i > 3)
    { cout << "Nicht zulässige Eingabe\n\n";

    return main();
    }


    switch (i)
    {
    case 0:
    cout << "Sie haben Addition gewählt\n";
    cout << "Bitte geben sie die erste Zahl ein\n";
    cin >> a;
    cout << "Bitte zweite Zahl eingeben\n";
    cin >> b;
    cout << a << " + " << b << " = " << a + b << endl;
    break;

    case 1:
    cout << "Sie haben Subtraktion gewählt\n";
    cout << "Bitte geben sie die erste Zahl ein\n";
    cin >> a;
    cout << "Bitte zweite Zahl eingeben\n";
    cin >> b;
    cout << a << " - " << b << " = " << a - b << endl;
    break;

    case 2:
    cout << "Sie haben Multiplikation gewählt\n";
    cout << "Bitte geben sie die erste Zahl ein\n";
    cin >> a;
    cout << "Bitte zweite Zahl eingeben\n";
    cin >> b;
    cout << a << " * " << b << " = " << a * b << endl;
    break;

    case 3:
    cout << "Sie haben Division gewählt\n";
    cout << "Bitte geben sie die erste Zahl ein\n";
    cin >> a;
    cout << "Bitte zweite Zahl eingeben\n";
    cin >> b;
    cout << a << " / " << b << " = " << a / b << endl;
    break;
    }

    return 0;

    }

  • sieht so aus als würdest du direkt in eine integerzahl einlesen würdest.
    lies lieber in einen string ein und wandel den in eine zahl um.

    Something big is coming. And there will be pirates and ninjas and unicorns...

  • Bin ja noch ziemlich neu in der Sache, also die ganzen Tricks kenne ich noch nicht so :) wenn du nen kleines Beispiel geben könntest, wie das so aussehen sollte, dann würdeste mir damit sehr helfen ^^.
    Schlage dann mal mein Buch auf und lese die Stellen noch Mal durch und probiere rum, bis es funktioniert.

    Oder nen paar Referenzen dazu im Internet, kennt ihr nicht irgendwelche Seiten, wo mich sich am besten Infos zur Sprache herholen könnte ?

    Einmal editiert, zuletzt von GetMahony (15. Januar 2010 um 23:38)

  • Code
    #include<string>
    ...
    string eingabe;
    int zahl;
    ...
    cout << "\nBitte waehlen sie ihre Rechenart und bestätigen sie mit Enter!\n";
        cin >> eingabe;
    zahl = eingabe.at(0) - 48;
    switch(zahl)
    ...

    Something big is coming. And there will be pirates and ninjas and unicorns...

  • Muss ich da am Anfang #include <string> schreiben, oder geht das auch einfach mit <iostream> ?

    Und ich verstehe diese Zeile nicht so ganz, was bewirkt die ?
    zahl = eingabe.at(0) - 48

  • du benötigst beide libraries ;)
    iostream für cin, cout
    string für strings

    also die eingabe steht jetzt in einem string (einer zeichenkette)
    char.at(0) liefert den ersten buchstaben der zeichenkette, also der eingabe
    jedoch ASCII-Codiert. Da 0 als Zahl dem ASCII-Wert 48 entspricht, musst du dies noch abziehen.
    dann bekommst du eine ganze zahl zwischen 0 und 9 ;)

    Something big is coming. And there will be pirates and ninjas and unicorns...

  • kein problem ;)
    bei weiteren fragen meld dich ruhig wieder :)

    Das kommt aber alles von ganz allein bei genug programmiererfahrung. ich hab viel gelernt indem ich einfach mal moorhuhn nachprogrammiert hab^^

    Something big is coming. And there will be pirates and ninjas and unicorns...

  • Also das mit dem in String Einlesen halte ich für nicht so eine tolle Sache.
    Lies lieber direkt in die Zahl ein und prüfe dann, ob ein Fehler aufgetreten ist, mit if(!cin). Dann kannst du entweder das Programm beenden, oder aber nach Aufruf von cin.clear(istream::failbit) die Eingabe wiederholen.

  • Ich bin total verwirrt im Moment wie und wo genau ich das in meinen Code unterbringen soll, wie gesagt, ich bin nen Leihe, :(
    könnt ihr mir nen Beispiel geben anhand meines codes auf der ersten Seite ?
    Habe das gestern mit dem String probiert, in der int main() funktion drin, aber es gab nur Fehler die ganze Zeit, dann habe ich den string versucht woanders hinzuverschieben, habe irgendwie keine Ahnung was genau ich falsch mache.
    Ich kenne die Abhängikeiten von den neuen Befehlen die ihr mir gegeben habt nicht, deshalb weiß ich nicht ganz genau wie ich die in meinen code unterbringen soll.

  • Also was ich noch mal genau erreichen möchte ist, das die Eingabe von Buchstaben bei abfrage von Zahlen unterbunden wird.

    HIer noch mal der COde

    Der Code lässt sich compilieren aber wenn ich dann nen Buchstaben eingabe anstatt die abgefragte Zahl, dann verheddert der sich irgendwie in einer Endlosschleife und man kann nichts mehr machen außer abbrechen und von neuem beginnen.

    Einmal editiert, zuletzt von GetMahony (17. Januar 2010 um 17:54)

  • main sollte nicht aufgerufen werden!

    Entsprechend dann für die anderen Zahlen... (da aber nur nach !cin prüfen)