Abbruchbedingung beendet ganzes Programm?



  • Ich lasse derzeit in einer Funktion Mitgliederdaten wie name,vorname und geburtsdatum eingeben. Das Geburtsdatum wird einer prüfung unterzogen, ob das überhaupt gültig ist. Sollte die ersten Eingabe des Datums falsch sein soll man in einem loop die Möglichkeit haben solange neu einzugeben bis das Datum korrekt ist.

    Diesen Loop soll man verlassen können, wenn man einfach etwas eingibt, das keine Zahl ist(überprüfe ich micht isdigit(int) ). Nur leider klappt das nicht so richtig. Wird im Loop ein Buchstabe eingegeben, verlasse ich die schleife zwar, aber auch das ganze Programm. Aus irgendeinem Grund klappt mir das Programm zusammen.

    if(!checkDatum(tg, mn, jr))
        {
    		do
    		{
    			std::cout<<"\n\nDatum fehlerhaft, bitte gültiges Datum eingeben\n";
    			std::cout<<"Geben Sie das Geburtsdatum der Person im Format TT.MM.JJ an"<<std::endl;
    			std::cin>>tg>>pkt>>mn>>pkt>>jr;
    		}while(!checkDatum(tg,mn,jr) && isdigit(tg));
    	}
    

    Sobald isdigit false ist, wenn man ein Buchstabe eingibt, soll einfach do-schleife verlassen werden. Allerdings wird derzeit das ganze Programm beendet. Wird die Schleife beendet, in dem man ein korrektes Datum eingibt, läuft das Programm zurück in das Menu das darüber hängt. Wieso bewirkt die break Anweisung das mein Programm abgebrochen wird?

    Hier mal die komplette Funktion in der sich das ganze abspielt, diese wird betreten durch eine switch-Anweisung:

    void createMember()
    {
    	std::cout<<"Geben Sie bitten den Vornamen des anzulegenden Mitglieds an"<<std::endl;
        std::getline(std::cin, vorname);
    
    	std::cout<<"Geben Sie bitten den Nachnamen des anzulegenden Mitglieds an"<<std::endl;
        std::getline(std::cin, nachname);
    
        std::cout<<"Geben Sie das Geburtsdatum der Person im Format TT.MM.JJ an"<<std::endl;
    	//Einlesen des Datums von der Tastatur
        char pkt;
    	std::cin>>tg>>pkt>>mn>>pkt>>jr;
    
    	//Prüfen ob Datum ok
        if(!checkDatum(tg, mn, jr))
        {
    		do
    		{
    			std::cout<<"\n\nDatum fehlerhaft, bitte gültiges Datum eingeben\n";
    			std::cout<<"Geben Sie das Geburtsdatum der Person im Format TT.MM.JJ an"<<std::endl;
    			std::cin>>tg>>pkt>>mn>>pkt>>jr;
    		}while(!checkDatum(tg,mn,jr) && isdigit(tg));
    	}
    
    	if(checkDatum(tg,mn,jr))
    	{
    		Member *pMitglied = new Member(vorname, nachname, tg, mn, jr);
    		member.push_back(pMitglied);
    		//Status des Vektors auf gefüllt setzen
    		vectorStatus = true;
    	}
    
    	std::cout<<"Schleifenende erreicht"<<std::endl;
    	_getch();
    }
    


  • Was für einen Typ hat denn "tg"? Wenn das char ist, kannst du damit keine zweistelligen Tagesangaben eingeben - bei einem int macht das isdigit wenig Sinn.

    PS: Und wo ist da ein "break"?



  • Sry, mein Fehler, hab zwischenzeitlich weiter probiert und dann die Änderung noch mit hierrein kopiert. Hier ist die Variante mit der break-Anweisung.

    Wegen dem isdigit(), tg ist ein int und das ganze soll abgebrochen werden wenn der benutzer ein buchstabe eingibt. Deswegen dachte ich, ich lass den user einfach ein char eingeben und prüfe dann ob das eingegeben wurde eine zahl ist. Der Returnwert sollte dann ja false sein und ich verlasse den Loop.

    void createMember()
    {
        std::cout<<"Geben Sie bitten den Vornamen des anzulegenden Mitglieds an"<<std::endl;
        std::getline(std::cin, vorname);
    
        std::cout<<"Geben Sie bitten den Nachnamen des anzulegenden Mitglieds an"<<std::endl;
        std::getline(std::cin, nachname);
    
        std::cout<<"Geben Sie das Geburtsdatum der Person im Format TT.MM.JJ an"<<std::endl;
        //Einlesen des Datums von der Tastatur
        char pkt;
        std::cin>>tg>>pkt>>mn>>pkt>>jr;
    
        //Prüfen ob Datum ok
        if(!checkDatum(tg, mn, jr))
        {
            while(!checkDatum(tg,mn,jr))
            {
                std::cout<<"\n\nDatum fehlerhaft, bitte gültiges Datum eingeben\n";
                std::cout<<"Geben Sie das Geburtsdatum der Person im Format TT.MM.JJ an"<<std::endl;
                std::cin>>tg>>pkt>>mn>>pkt>>jr;
                if(!isdigit(tg))
                {
                    std::cout<<"Abbruch durch Benutzer"<<std::endl;
                    break;
                }
            }
        }
    
        if(checkDatum(tg,mn,jr))
        {
            Member *pMitglied = new Member(vorname, nachname, tg, mn, jr);
            member.push_back(pMitglied);
            //Status des Vektors auf gefüllt setzen, sofern er noch auf false ist
            if(!vectorStatus)
                vectorStatus=true;
            std::cout<<"Vector erzeugt"<<std::endl;
            _getch();
        }
    }
    


  • wenn tg ein int ist, weigert sich cin schon selber, dort etwas anderes als Ziffern reinzupacken (und wechselt nebenbei in "Fehlermodus" - d.h. solange du es nicht zurücksetzt, wird es GAR NICHTS mehr einlesen).
    Statt dort per isdigit() zu prüfen (das würde dir nur verraten, ob die eingegebene Zahl zwischen 48 und 57 liegt), solltest du eher den Status von cin abfragen:

    if(!checkDatum(tg, mn, jr))
    {
        while(!checkDatum(tg,mn,jr))
        {
            std::cout<<"\n\nDatum fehlerhaft, bitte gültiges Datum eingeben\n";
            std::cout<<"Geben Sie das Geburtsdatum der Person im Format TT.MM.JJ an"<<std::endl;
            std::cin>>tg>>pkt>>mn>>pkt>>jr;
            if(!std::cin)//Fehler bei Eingabe?
            {
                std::cout<<"Abbruch durch Benutzer"<<std::endl;
                std::cin.clear();//Fehlerstatus zurücksetzen
                break;
            }
        }
    }
    

    (PS: Sagt dir der Begriff "lokale Variable" zufällig etwas?)



  • (PS: Sagt dir der Begriff "lokale Variable" zufällig etwas?)[/quote]

    Ja schon, aber lokale Variable existerien doch nur in Funktionen oder gibts das auch beim erstellen von while schleifen? oder worauf willst du hinaus?



  • Souljumper schrieb:

    (PS: Sagt dir der Begriff "lokale Variable" zufällig etwas?)

    Ja schon, aber lokale Variable existerien doch nur in Funktionen oder gibts das auch beim erstellen von while schleifen?
    [/quote]Lokale Variablen existieren in dem Bereich, in dem sie angelegt wurden - und das kann in C++ (fast?)jeder in {...} eingeschlossene Abschnitt sein.

    oder worauf willst du hinaus?

    Vor allem darauf, daß die in deiner Funktion verwendeten Variablen (vorname,nachname,tg,mn,jr) offenbar global sind (außer du hast Teile der Funktion unterschlagen) - da sie nur IN dieser Funktion benötigt werden, reichen dort lokale Variablen völlig aus.



  • CStoll schrieb:

    Souljumper schrieb:

    (PS: Sagt dir der Begriff "lokale Variable" zufällig etwas?)

    Ja schon, aber lokale Variable existerien doch nur in Funktionen oder gibts das auch beim erstellen von while schleifen?

    Lokale Variablen existieren in dem Bereich, in dem sie angelegt wurden - und das kann in C++ (fast?)jeder in {...} eingeschlossene Abschnitt sein.

    oder worauf willst du hinaus?

    Vor allem darauf, daß die in deiner Funktion verwendeten Variablen (vorname,nachname,tg,mn,jr) offenbar global sind (außer du hast Teile der Funktion unterschlagen) - da sie nur IN dieser Funktion benötigt werden, reichen dort lokale Variablen völlig aus.[/quote]

    Ahso, das meinst du. Die variablen sind global,weil damit später ein Datumsobjekt erzeugt wird, das ist auch nur ein Teil des Codes der Funktion.

    Aber der Lösungsansatz mit dem !std::cin funzt auch nicht. Hier mal der derzeite Ist-Zustand als komplette Funktion. Die createMember() wird in einer switch-Anweisung aufgerufen.

    void createMember()
    {
    	std::cout<<"Geben Sie bitten den Vornamen des anzulegenden Mitglieds an"<<std::endl;
        std::getline(std::cin, vorname);
    
    	std::cout<<"Geben Sie bitten den Nachnamen des anzulegenden Mitglieds an"<<std::endl;
        std::getline(std::cin, nachname);
    
        std::cout<<"Geben Sie das Geburtsdatum der Person im Format TT.MM.JJ an"<<std::endl;
    	//Einlesen des Datums von der Tastatur
        char pkt;
    	std::cin>>tg>>pkt>>mn>>pkt>>jr;
    
    	//Prüfen ob Datum ok
        if(!checkDatum(tg, mn, jr))
        {
    		while(!checkDatum(tg,mn,jr))
    		{
    			std::cout<<"\n\nDatum fehlerhaft, bitte gültiges Datum eingeben\n";
    			std::cout<<"Geben Sie das Geburtsdatum der Person im Format TT.MM.JJ an"<<std::endl;
    			std::cin>>tg>>pkt>>mn>>pkt>>jr;
    			if(!std::cin)//Fehler bei Eingabe?
    			{
    				std::cout<<"Abbruch durch Benutzer"<<std::endl;
    				std::cin.clear();//Fehlerstatus zurücksetzen
    				break;
    			}
    		}
    	}
    
    	if(checkDatum(tg,mn,jr))
    	{
    		Member *pMitglied = new Member(vorname, nachname, tg, mn, jr);
    		member.push_back(pMitglied);
    		//Status des Vektors auf gefüllt setzen
    		vectorStatus = true;
    	}
    
    	std::cout<<"Schleifenende erreicht"<<std::endl;
    	_getch();
    }
    

Log in to reply