großes Problem mit Datum



  • Hallo zusammen und Schönes Neues Jahr:)

    Folgende Aufgabe hab ich zu bewältigen:

    Schreiben Sie ein Programm, das von der Benutzerin/dem Benutzer ein Datum in der Schreibweise TT.MM.JJJJ (also z.B. 05.01.2011) erfragt und berechnet, wie viele Tage dieses Datum vor oder nach dem 01.01.2000 liegt. Anschließend soll der zugeh¨orige Wochentag berechnet und ausgegeben werden.

    Mein Code sieht bis jetzt so aus:

    #include <cstdlib>
    #include <iostream>
    #include <iomanip>
    
    using namespace std;
    
    int main()
    {
    	int tage = 0, monat = 0, jahr = 0;
    	int jahrneu, jahrTage, monatneu, tageneu, result;
    
    	cout << "Bitte geben Sie das Datum im Format TT MM JJJJ (ohne Punkte) ein." << endl; 
        cout << "Das Datum soll zwischen 1901 und 2099 liegen." << endl;
    
    	cin >> tage; 
    
    	cout.width(2); cout << tage << endl;
    	while (cin.width(3)||cin.width(1))
    	{
    		cout << "Ungueltige Eingabe, bitte neu starten" << endl;
    	}
    
    	cin >> monat;
    
    	cout.width(2); cout << monat << endl;
    	while (cin.width(3)||cin.width(1))
    	{
    		cout << "Ungueltige Eingabe, bitte neu starten" << endl;
    		break;
    	}
    
    	cin >> jahr;
    
    	cout.width(4); cout << jahr << endl;
    	while (cin.width(3)||cin.width(2)||cin.width(1))
    	{
    		cout << "Ungueltige Eingabe, bitte neu starten" << endl;
    		break;
    	}
    
        if (jahr<1901||jahr>2099)
        {
            cout << "Falscher Zeitraum" << endl;
        }
    
    	cout << "Folgendes Datum wurde eingegeben:\n" << tage << "." << monat << "." << jahr << endl;
    
    	switch(monat)
    	{
    	case 1:
    		0;
    		break;
    	case 2:
    		if((jahr%4 == 0 && jahr%100 != 0)||jahr%400 == 0)
    			31 + 29;
    		else
    			31 + 28;
    		break;
    	case 3:
    		if((jahr%4 == 0 && jahr%100 != 0)||jahr%400 == 0)
    			31 + 29 + 31;
    		else
    			31 + 28 + 31;
    		break;
    	case 4:
    		if((jahr%4 == 0 && jahr%100 != 0)||jahr%400 == 0)
    			31 + 29 + 31 + 30;
    		else
    			31 + 28 + 31 + 30;
    		break;
    	case 5:
    		if((jahr%4 == 0 && jahr%100 != 0)||jahr%400 == 0)
    			31 + 29 + 31 + 30 + 31;
    		else
    			31 + 28 + 31 + 30 + 31;
    		break;
    	case 6:
    		if((jahr%4 == 0 && jahr%100 != 0)||jahr%400 == 0)
    			31 + 29 + 31 + 30 + 31 + 30;
    		else
    			31 + 28 + 31 + 30 + 31 + 30;
    		break;
    	case 7:
    		if((jahr%4 == 0 && jahr%100 != 0)||jahr%400 == 0)
    			31 + 29 + 31 + 30 + 31 + 30 + 31;
    		else
    			31 + 28 + 31 + 30 + 31 + 30 + 31;
    		break;
    	case 8:
    		if((jahr%4 == 0 && jahr%100 != 0)||jahr%400 == 0)
    			31 + 29 + 31 + 30 + 31 + 30 + 31 + 31;
    		else
    			31 + 28 + 31 + 30 + 31 + 30 + 31 + 31;
    		break;
    	case 9:
    		if((jahr%4 == 0 && jahr%100 != 0)||jahr%400 == 0)
    			31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30;
    		else
    			31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30;
    		break;
    	case 10:
    		if((jahr%4 == 0 && jahr%100 != 0)||jahr%400 == 0)
    			31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31;
    		else
    			31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31;
    		break;
    	case 11:
    		if((jahr%4 == 0 && jahr%100 != 0)||jahr%400 == 0)
    			31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30;
    		else
    			31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30;
    		break;
    	case 12:
    		if((jahr%4 == 0 && jahr%100 != 0)||jahr%400 == 0)
    			31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31;
    		else
    			31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31;
    		break;
    
    	default:
    		cout << "Ungueltige Eingabe" << endl;
    	}
    
    	if (jahr > 2000)
    	{
    		jahrneu = (jahr-1) - 2000;
    		jahrTage = jahrneu * 365;
    
    		monatneu = (monat - 1);
    
    	}
    	if (jahr < 2000)
    	{
    		jahrneu = 2000 - (jahr + 1);
    		jahrTage = jahrneu * 365;
    
    		monatneu = 12 - (monat + 1);
    
    		tageneu = monat - tage;
    	}
    
    	result = tageneu + monatneu + jahrneu;
    
    	cout << result << endl;
    
    	system("PAUSE");
    	return 0;
    }
    

    Ich verzweifle an der Formatierung des eingegebenen Datums. Es soll genau im Format TT MM JJJJ eingegeben werden, ansonsten soll eine Fehlermeldung erscheinen, aber irgendwie haut das nicht so recht hin.

    Ich bin mir bewusst, dass der Code umständlich ist, bin noch Anfänger:)
    Danke
    v



  • Du bist im falschen (Sub-)Forum gelandet, dies hier ist C++/CLI. Du hast aber nativen C++ Code...

    Und zu deinem konkreten Problem:
    Mittels 'cin.width(3)' setzt du nur das Ausgabeformat.
    Um ein konkretes Format abzufragen, müßtest du schon das Datum komplett als 'string' einlesen und dann die einzelnen Werte auslesen (parsen).

    Außerdem sind deine Zeilen

    31 + 29;
    // etc.
    

    sinnlos, da sie nur etwas berechnen, aber das Ergebnis nirgendwo in einer Variablen gespeichert wird 😉

    Ich weiß nicht, ob du schon Schleifen (while, for) kennst :), aber dann könntest du deine switch-Anweisung um einiges verkürzen...

    Such einfach mal im richtigen C++ Forum nach "Schaltjahr" o.ä., da findest du dann schon entsprechenden Code.



  • Danke für Deine Antwort:) werd mich mal schlau machen. Bis zum nächsten Mal im richtigen Forumsteil



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ (auch C++0x) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten