Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » While Schleife mit break verlassen beendet Programm

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
12.03.2006, 02:55 Uhr
~Tobias_H
Gast


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 und nicht zufällig ein falsches Datum beinhaltet. 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.

Werden alle Daten richtig eingegeben, ohne die Abbruchbedingung zu erfüllen, klappt alles wunderbar.

Warum wird mein Programm beendet, wenn ich in diesen Teil des Programmes komme?

C++:
//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;
            }
        }
    }


Hier mal der Code der kompletten Funktion, die Funktion wird über ein switch Anweisung aufgerufen:

C++:
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();
    }
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.03.2006, 07:18 Uhr
~Tobias_H
Gast


keiner eine idee?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.03.2006, 08:21 Uhr
~erkan
Gast



Zitat von ~Tobias_H:
keiner eine idee?


Kann ich mal deine Funktion checkDatum() sehen bitte.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.03.2006, 11:06 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
15.03.2006, 18:54 Uhr
~Tobias_H
Gast



Zitat von ~erkan:
[quote ~Tobias_H]keiner eine idee?


Kann ich mal deine Funktion checkDatum() sehen bitte.[/quote]

Sry für die späte Antwort, hier meine Datumsfunktion:


C++:
static bool checkDatum(int tg, int mn, int jr)
{

    if (tg < 1 || tg > 31 || mn < 1 || mn > 12 )
    {
        return false;
    }

    switch(mn)
    {
        case 2:
                if (checkYear(jr))
                {
                    if (tg > 29)
                        return false;
                }
                    else if (tg > 28)
                {
                    return false;
                }
                break;
        case 11:
                if (tg > 30)
                    return false;
                    break;
    }

    return true;

}


Und checkYear:

C++:
bool checkYear(int jr)
{
    if(jr%400 == 0 && jr %4 == 0)
    {
        return true;
    }
    else
        return false;
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
15.03.2006, 20:47 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


guck dir nochmal an was ein schaltjahr ist...

http://de.wikipedia.org/wiki/Schaltjahr

und noch ne anmerkung... April, Juni und September haben auch nur 30 Tage....
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
15.03.2006, 22:38 Uhr
~Tobias_H
Gast


Ok ist noch Ausbaufähig, aber die Datumsklasse verursacht jetzt doch nicht das Verhalten, das wenn der Benutzer einen Buchstaben in ein integer Feld eingibt, das dann das ganze Programm beendet wird?

Oder mal andersrum, ich hab ein integerfeld in das normal eine zahl reingehört(soweit war ich dann auch schon ;-) ). Ich dachte mir das ich den benutzer da dann einfach einen buchstaben eingeben lassen, wenn er die Routine zum Erfassen des Datums verlassen will.

Ob in das integerfeld ein buchstabe eingegeben wurde wollte ich mit !isdigit(int) prüfen, klappt scheinbar auch, nur dann wird das komplette programm beendet anstatt sauber in die aufrufende routine zurückzukehren, wieso?

Woran kann das liegen? Passiert irgendwas böses wenn man einen integer mit einem char befüllt?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
15.03.2006, 22:41 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


isdigt prüft ob ein char (ein zeichen) eine zahl ist (also ob das zeichen zwischen ascii 48 und 57 liegt)... wenn du da eine zahl als integer übergibst ist das was anderes
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: