C++ If Schleife - Problem

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
MacOwenna
Beiträge: 3
Registriert: Sa Nov 16, 2013 1:03 pm

C++ If Schleife - Problem

Beitrag von MacOwenna » Sa Nov 16, 2013 1:12 pm

Hallo lieber Community,

ich habe ein kleines Problem und hoffe das mir hier jemand helfen kann den Fehler zu entdecken bzw. mich aufzuklären.
Und zwar möchte ich, dass der Benutzer mit Zahlen sich im Menu fortbewegt. Sollte der Benutzer sich vertippen soll die Abfrage wiederholt werden. Dies funktioniert auch soweit, sollt er eine falsche Zahl eingeben. Wenn der Benutzer aber nun einen Buchstaben statt einer Zahl eingibt, hängt sich das Programm in einer Dauerschleife auf. Wie kann ich es also bewerkstelligen, falls der Benutzer ausversehen einen Buchstaben eingibt, der Programm wieder bei einer Falsch zahl die Abfrage noch einmal stellt?

Beste Grüße und Danke im voraus.

Hier ein Auszug aus dem Quellcode:

Code: Alles auswählen

#include <iostream>
#include <windows.h>

using namespace std;

[......]

int main (void)
{
    //////////////////////////
    // Console Farbeinstellung
    system ("color 1F");

    ///////////////////
    // Variablen main()
    int menu_auswahl;


    cout << "  1. Starten" << endl;
    cout << "  2. Credits" << endl;
    cout << "  3. Beenden" << endl;
    cout << "\n\n" << endl;
    cout << "  Eingabe: ";
    cin >> menu_auswahl;

    if (menu_auswahl == 1)
    {
        start_game();
    }
    if (menu_auswahl == 2)
    {
        credits();
    }
    if (menu_auswahl == 3)
    {
        exit_prg();
    }
    else
    {
        cout << " Keine Korrekte Eingabe." << endl;
        main();
    }
    return 0;
}
Edit by Xin: Code-Tags hinzugefügt

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: C++ If Schleife - Problem

Beitrag von canlot » Sa Nov 16, 2013 1:46 pm

Zuerst mal ist dein Programm komplett falsch, um es mal höfflich zu sagen ;)
Warum sich dein Programm aufhängt kann ich nicht nachvollziehen, aber das Programm mittels einen Aufruf der main Funktion zu wiederholen habe ich noch nie gesehen ist auch falsch, benutz dafür bitte eine Schleife. Das was du versuchst zu machen ist ein rekursiver Funktionsaufruf das braucht man eher selten.
Des weiteren hast du 2 if-Abfragen die nichts mit der else Abfrage zu tun haben. Wenn du zum Beispiel eine 1 eingegeben hast wird die Funktion start_game() aufgerufen, wenn sie fertig ist werden die nachfolgenden Abfragen abgearbeitet, sprich menu_auswahl wird geprüft ob es die 2 ist wenn nicht dann weiter dann wird es geprüft ob es die 3 ist-> nein also geht sie in den else Zweig und obwohl du eine richtige Eingabe betätigt hast, kriegst du das falsche Ergebnis.
Also die Abfrage in if... else if ... else aufteilen.
Unwissenheit ist ein Segen

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C++ If Schleife - Problem

Beitrag von Xin » Sa Nov 16, 2013 3:30 pm

Moin Moin!
MacOwenna hat geschrieben:Und zwar möchte ich, dass der Benutzer mit Zahlen sich im Menu fortbewegt. Sollte der Benutzer sich vertippen soll die Abfrage wiederholt werden. Dies funktioniert auch soweit, sollt er eine falsche Zahl eingeben.
Hmm... main rekursiv aufzurufen ist aber nicht gerade schön. Bitte schau Dir Schleifen an: Hier klicken.

Rekursion solltest Du in solchen Fällen vermeiden.
MacOwenna hat geschrieben: Wenn der Benutzer aber nun einen Buchstaben statt einer Zahl eingibt, hängt sich das Programm in einer Dauerschleife auf. Wie kann ich es also bewerkstelligen, falls der Benutzer ausersehen einen Buchstaben eingibt, der Programm wieder bei einer Falsch zahl die Abfrage noch einmal stellt?
Ich mag diese "Gib eine Zahl ein"-Menüs nicht sonderlich. Wenn Du einen Buchstaben eingibst, will cin einen Integer lesen (also eine Zahl), da ist aber keine. Also hakt's. Ich halte von cin und dem C-Pendant scanf() nichts. Sie sind Fehleranfällig, wenn der Benutzer nicht tut, was das Programm erwartet.

Nimm zur Eingabe einen String:

Code: Alles auswählen

// nicht getestet!

string input;
cin >> input;

if( !isdigit( input[0] ))
  cout << "Eingabe ist nicht in Zahl konvertierbar";
else
{
  int menu_auswahl = atoi( Input.c_str() );

  ...
}
canlot hat geschrieben:Zuerst mal ist dein Programm komplett falsch, um es mal höfflich zu sagen ;)
Warum sich dein Programm aufhängt kann ich nicht nachvollziehen, aber das Programm mittels einen Aufruf der main Funktion zu wiederholen habe ich noch nie gesehen ist auch falsch, benutz dafür bitte eine Schleife. Das was du versuchst zu machen ist ein rekursiver Funktionsaufruf das braucht man eher selten.
"Falsch" ist es deswegen an der Stelle aber nicht... Es ist nur kein guter Stil.
canlot hat geschrieben:Des weiteren hast du 2 if-Abfragen die nichts mit der else Abfrage zu tun haben. Wenn du zum Beispiel eine 1 eingegeben hast wird die Funktion start_game() aufgerufen, wenn sie fertig ist werden die nachfolgenden Abfragen abgearbeitet, sprich menu_auswahl wird geprüft ob es die 2 ist wenn nicht dann weiter dann wird es geprüft ob es die 3 ist-> nein also geht sie in den else Zweig und obwohl du eine richtige Eingabe betätigt hast, kriegst du das falsche Ergebnis.
Also die Abfrage in if... else if ... else aufteilen.
An der Stelle muss ich Dir aber zustimmen. Gut aufgepasst - ich hatte es übersehen.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

MacOwenna
Beiträge: 3
Registriert: Sa Nov 16, 2013 1:03 pm

Re: C++ If Schleife - Problem

Beitrag von MacOwenna » Sa Nov 16, 2013 5:20 pm

Zuerst einmal danke für die Antworten. :)
Ok ich werde deinen Rat mal befolgen und es ohne Zahlen versuchen. Ich sollte vielleicht erwähnen das ich noch ein Anfänger bin und daher für jeden Rat dankbar bin.

Mich würde sehr interessieren warum das derzeitigen Programm komplett falsch bzw. Einen schlechten Stil hat. Abgesehen das ich jetzt main noch einmal aufgerufen habe. Würde gern verstehen wieso das Programm so falsch/ schlechten Stil hat, damit ich das zukünftig beachten bzw. Verändern kann.

Gruß und danke. :)

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C++ If Schleife - Problem

Beitrag von Xin » Sa Nov 16, 2013 5:52 pm

MacOwenna hat geschrieben:Zuerst einmal danke für die Antworten. :)
Dafür ist das Forum da. :-)
MacOwenna hat geschrieben:Ok ich werde deinen Rat mal befolgen und es ohne Zahlen versuchen. Ich sollte vielleicht erwähnen das ich noch ein Anfänger bin und daher für jeden Rat dankbar bin.
Ich denke, solche Programme schreibt man nicht mehr, wenn man nicht mehr Anfänger ist. ^^
Wie schon gesagt, bergen cin und scanf gewisse Gefahren, die man vermeiden sollte. Gleichzeitig bekommt man eine einfache hin, wenn man diese Gefahren mal ignoriert.
Ich bringe meinen Schülern bei, Eingaben mit Übergabeparametern zu machen. Das hat auch den Vorteil, dass die Eingaben beim testen beim Programmaufruf bereits bekannt sind - man also nur den Aufruf wiederholen muss, statt immer wieder die gleichen Eingaben zu machen.
MacOwenna hat geschrieben:Mich würde sehr interessieren warum das derzeitigen Programm komplett falsch bzw. Einen schlechten Stil hat. Abgesehen das ich jetzt main noch einmal aufgerufen habe.
main ist eine besondere Funktion. Hier steht der Programmablauf drin. Mit dem Aufruf von main startest Du Dein Programm gewissermaßen immer wieder auf's Neue.
main sollte so unique sein, wie eine globale Konfiguration.

Weiterhin gehst Du das Risiko ein, dass irgendwann kein Speicher mehr da wäre, um main() neu zustarten, da jeder Aufruf einer Funktion Speicher benötigt. Dafür müsste der Benutzer SEEEEHR viele falsche Eingaben machen, aber es ist eben nicht unmöglich. Mit einer Schleife gehst Du das Risiko nicht ein: Der Benutzer kann beliebig viele falsche Eingaben machen, bis der Computer den Geist aufgibt. Darum ist die Schleife guter Stil, die Rekursion eben nicht.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
oenone
Beiträge: 223
Registriert: Do Sep 01, 2011 2:42 pm
Wohnort: Bremen
Kontaktdaten:

Re: C++ If Schleife - Problem

Beitrag von oenone » Fr Nov 22, 2013 2:59 pm

Nur ein kleiner Hinweis: Ein "If" ist keine "Schleife", also "If-Anweisung" oder "If-Statement", aber niemals "If-Schleife". Das würde implizieren, dass es etwas öfters ausführen kann.

MacOwenna
Beiträge: 3
Registriert: Sa Nov 16, 2013 1:03 pm

Re: C++ If Schleife - Problem

Beitrag von MacOwenna » Do Nov 28, 2013 10:28 am

Alle klar, vielen Dank für die Hilfe bzw. die lehrreichen Hinweise. :)

Gruß Mac

Antworten