Was funktioniert hier nicht?



  • Schönen Mittag zusammen,

    Bin grad bei einem ganz lästigen Programm (für mich jedenfalls 😉 ).

    Nur irgendwie geht es auf einmal nach der Schleife mit dem "Schaltjahr-Check" nicht mehr weiter... Vor ein paar Minuten ist es noch wunderbar zum nachkommenden "cout" gehüpft. Hab schon alles mögliche probiert, aber im Grunde hab ich nicht viel geändert, nur weiter gearbeitet...

    #include <cstdlib>
    #include <iostream>
    #include <string>
    #include <iomanip>
    #include <sstream>
    
    using namespace std;
    
    int main()
    {   
        string tag, monat;
        int jahr;
    
        cout << "tag eingeben" << endl;
    
        while (getline(cin,tag))
        {
              if(tag.size()<2||tag.size()>2)
              {
                              cout << "bitte im Format TT ein geben" << endl;
                              continue;
              }
              else if(tag.size()==2)
              {
                   cout << tag << endl;
                   break;
              }
        }
    
        cout << "monat eingeben" << endl;
    
        while (getline(cin,monat))
        {
              if(monat.size()<2||monat.size()>2)
              {
                                  cout << "bitte im Format MM eingeben" << endl;
                                  continue;
              }
              else if(monat.size()==2)
              {
                   cout << monat << endl;
                   break;
              }
        }
    
        cout << "jahr eingeben" << endl;
    
        while (cin>>jahr)
        {
              if(jahr<1901||jahr>2099)
              {
                                cout << "ungueltiger Zeitraum" << endl;
                                continue;
              }
              else if(((jahr%4==0)&&(jahr%100!=0))||jahr%400==0)
                         {
                                                  cout << "Schaltjahr" << endl;
    
                         }  
    
        }
        cout << "Das eingegebene Datum ist\n" << tag << "." << monat << "." << jahr << endl;
    
        stringstream m;
        m << monat;
        int mo1;
        m >> mo1;
        cout << mo1;
    
        if(mo1==01)
        {
                   cout << "Jaenner - 31Tage" << endl;
        }
        if(mo1==11)
        {
                     cout << "November - 30Tage" << endl;
        }
    
        system("PAUSE");
        return 0;
    }
    

    Vielen Dank schonmal
    V



  • Wenn du nach einer unendlichen Eingabe von Werten fragst, dann bekommst du auch eine unendliche Eingabe. "break;" hilft dir, aber schön ist es nicht.



  • vankitz schrieb:

    ...

    Hast du schon mal den Debugger benutzt? Wenn nein, solltest du dies dringend nachholen, es ist jedenfalls nicht unsere Aufgabe den Code komplett nach einem Logikfehler zu durchsuchen (z.B. etwas fehlendem...), du solltest uns jedenfalls schon nennen können an welcher Stelle in etwa der Fehler liegt.

    Ich gehe schlicht und ergreifend mal davon aus, das die Schleife nie verlassen wird...

    Zudem würde ich den Tag und Monat ebenso wie das Jahr als Ganzzahl einlesen.



  • asc schrieb:

    vankitz schrieb:

    ...

    du solltest uns jedenfalls schon nennen können an welcher Stelle in etwa der Fehler liegt.

    Hat er doch nur kryptisch 😃

    Nur irgendwie geht es auf einmal nach der Schleife mit dem "Schaltjahr-Check" nicht mehr weiter...



  • Wann sollte denn (cin>>jahr) false werden?

    Edit: Oh, ich war viel zu lahm. 😉



  • Dobi schrieb:

    Wann sollte denn (cin>>jahr) false werden?

    Edit: Oh, ich war viel zu lahm. 😉

    z.B. wenn er fälschlicherweise einen String anstelle einer Zahl eingibt.



  • Ich denke, dass alles gesagt wurde, was zu sagen ist.
    Ich würde aber an deiner Stelle auf die Strings verzichten.

    Mein Ansatz:

    #include <iostream>
    
    //Prototyp von wait():
    //Wait soll das Schließen der Konsole unterdrücken
    //
    void wait();
    
    int main() {
    
    	//Eingabe des Tages
    	//
    	std::cout << "Bitte Tag eingeben (TT):" << std::endl;
    	int nTag = 0;
    
    	do {
    		std::cin >> nTag;
    	} while((nTag <= 0) || (nTag > 31));
    	std::cout << "Tag: " << nTag << std::endl;
    
    	//Eingabe des Monats
    	//
    	std::cout << "\nBitte Monat eingeben(MM):" << std::endl;
    	int nMonat = 0;
    
    	do {
    		std::cin >> nMonat;
    	} while((nMonat <= 0) || (nMonat > 12));
    	std::cout << "Monat: " << nMonat << std::endl;
    
    	//Eingabe des Jahrs
    	//
    	std::cout << "\nBitte Jahr eingeben (1901 - 2099):" << std::endl;
    	int nJahr = 0;
    
    	do {
    		std::cin >> nJahr;
    	} while((nJahr < 1901) || (nJahr > 2099));
    	std::cout << "Jahr: " << nJahr << std::endl;
    
    	//Prüfen auf Schaltjahr
    	//
    	if((nJahr % 4 == 0) && (nJahr % 100 != 0) || (nJahr % 400 == 0)) {
    		std::cout << "\nDas Jahr " << nJahr << " ist ein Schaltjahr" << std::endl;
    	}
    
    	//Ausgabe des gesamten Datums
    	//
    	std::cout << "Das eingegeben Datum lautet:" << std::endl;
    	std::cout << nTag << "." << nMonat << "." << nJahr << std::endl;
    
    	//Konsole offen lassen
    	//
    	wait();
    }
    
    //Prozedur um das Schließen der Konsole zu unterdrücken
    //
    void wait() {
    	std::cout << "\nZum Beenden ENTER druecken...";
    
    	std::cin.clear();
    	std::cin.sync();
    	std::cin.get();
    }
    


  • vielen dank für eure zahlreichen Antworten.

    Das Problem mit dem String ist, dass ich die Eingabe von Tag und Monat genau formatieren muss (laut Angabe). Das heisst: wenn 1 (für Jänner) eingegeben wurde ist es flasch, es muss 01 heissen. Deshalb die umständliche Sache mit dem String.

    Werde auf jeden Fall die Schleifen nochmal überarbeiten. Danke nochmal!:)



  • Mit dem code von cooter ist das doch kein Problem die Ausgabe dahingehend zu manipulieren.



  • Für eine formatierte Ausgabe eignet sich natürlich auch printf:
    http://www.cplusplus.com/reference/clibrary/cstdio/printf/

    Hier noch ein kleines Beispiel:

    printf("%0.2d.%0.2d.%d", nTag, nMonat, nJahr);
    

    Ich habe dafür cstdio eingebunden 😉

    LG
    Cooter



  • HighLigerBiMBam schrieb:

    Mit dem code von cooter ist das doch kein Problem die Ausgabe dahingehend zu manipulieren.

    Hab mich da gestern mit jm im Forum unterhalten, der meinte ich solls mit string versuchen, deshalb mein Ansatz mit string:)

    aber egal, man lernt ja nur durch probieren, werd mir mal das "printf" genau ansehen, schaut auf jeden fall viel-versprechend aus...

    danke für die antwort

    lg v



  • printf gehört zu den C-Bibliotheken. Du kannst es auch mit stringstreams bewerkstelligen:

    std::ostringstream strMonat; 
    	if(nMonat < 10)
    		strMonat << "0" << nMonat; 
    	else
    		strMonat << nMonat; 
    
    	std::ostringstream strTag; 
    	if(nTag < 10)
    		strTag << "0" << nTag; 
    	else
    		strTag << nTag; 
    
        std::cout << "Das eingegeben Datum lautet:" << std::endl; 
        std::cout << strTag.str() << "." << strMonat.str() << "." << nJahr << std::endl;
    

    benötigt #include <sstream>. Kann man auch beliebig zusammenfassen etc.



  • Stimmt genau, was HighLigerBiMBam sagt.
    Nutze lieber seine Lösung 😉 Hier ist auch noch ein netter Thread zu dem Thema:

    http://www.c-plusplus.net/forum/231007



  • mein programm funktioniert wieder:)) juhu

    hab es soweit fertig, muss noch einen "wochentags-berechner" einbauen. ich meld mich wieder, wenn ich darf, sollte ich probleme damit haben.
    bis dahin, einen wunderschönen nachmittag

    v



  • wollte nur Bescheid geben, dass ich alles soweit geschafft habe und dieser Thread geschlossen werden kann.
    Vielen Dank für Eure Hilfe
    Vanessa


Anmelden zum Antworten