Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

24.09.2014, 11:44

Problem mit einer If Abfrage

Hallo Liebe Mitglieder

Ich habe ein Problem und zwar habe ich einen kleinen Taschenrechner programmiert. Ich versuche schon seit 2 Tagen einen Bug zu beheben und habe auch das Problem im Internet gesucht. Und zwar wenn man beim dividieren keine Zahl sondern ein Buchstabe/Zeichen eingibt stürzt es ab.

C-/C++-Quelltext

1
2
3
4
float Dividend; 

cout << "Geben Sie nun ihren Dividend ein:" << endl; 
cin >> Dividend;


Und ich kann keine else if abfrage machen da es ein Buchstabe ist und die Variable ein float. Ich hoffe ihr habt eine Lösung.

Freundliche Grüsse SlyGamer


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

24.09.2014, 11:49

Guck mal hier. Das sollte denke ich weiter helfen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

3

24.09.2014, 11:59

Funktioniert auch nicht. Wenn man keine Zahl eingibt läuft die Schleife und hört nie wieder auf. Steht sogar dort in den Kommentaren

Phil239

Frischling

Beiträge: 79

Beruf: Student

  • Private Nachricht senden

4

24.09.2014, 13:23

So hier zum Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
float fDividend = 1.0f;

{
    std::string strDividend;
    std::cin >> strDividend;

    try
    {
        fDividend = std::stof(strDividend);
    }
    catch (std::invalid_argument& e)
    {
        // Konvertierung fehlgeschlagen, fDividend bleibt 1.0f
        std::cerr << e.what();
    }
}


Steht auch beim Link von Schorsch:

Zitat

Another way would be to get the input as a string and convert it to an integer with std::stoi or some other method that allows checking the conversion.
Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral.

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

5

24.09.2014, 16:24

Naja Phils Variante bricht ja dann trotzdem ab(wenn es kein string wäre), ich denke mal sinnvoller wäre einfach ungültige Eingaben in einer Schleife abzufangen.

Sieht ungefähr so aus:

C-/C++-Quelltext

1
2
3
4
5
while(!(cin>>dividend)) {
    std::cerr << "Ungueltige eingabe. Bitte erneut eingeben." << std::endl;
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}


Wenn dividend hier also ein int ist und jemand ein char eingibt(was übrigens keinen Bug erzeugt sondern genau so gewollt ist; ein int ist kein char) wird der puffer geleert und alles weitere ignoriert damit die Eingabe von Neuem beginnen kann.

Auf diese Art und Weise kannst du falsche Eingaben abfangen ohne jedesmal den User das Programm neu starten zu lassen.
WIP Website: kevinheese.de

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »KeksX« (24.09.2014, 16:31)


6

26.09.2014, 12:07

Funktioniert leider auch nicht KeksX. Es passiert nichts egal wenn ich die Enter Taste drücke.

7

26.09.2014, 12:13

Bei mit funktioniertes super. Wie sieht denn dein Code aus?

8

26.09.2014, 14:37

Du hast vermutlich mehr Spaß, wenn du getline anstelle des Stream operators von cin nutzt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <string>

// sollte auch s.empty() abfangen, da ein leerer String keine Zahl sein kann!
bool isNumber(const std::string& s);

std::string userInput;
for (;;)
{
  std::cout << "Dividend: ";
  std::getline(std::cin, userInput);
  if (is_number(userInput))
    break;
  else
    std::cout << "Eingabe ist keine Zahl!" << std::endl;
}
...


Für eine Implementierung von is_number wirst du durch einfaches Googlen fündig:
http://stackoverflow.com/a/4654718
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Werbeanzeige