Datum abfrage und Zeichenausgabe



  • Also nach langem hin und her läuft das Programm nun endlich. War eine schwere Geburt 😃 .

    Programm:

    {
    	int zahl = 0;
    
    	cout << "Bitte geben Sie eine positive Zahl ein:" << endl;
    	cin >> zahl;
    	for (int i = 1; i <= zahl; i++)// Spalte	
    	{
    		{
    			for (int l = zahl - i; l >= 0; l--)
    			{
    				cout << " ";
    			}
    
    			for (int s = 1; s <= 2 * i - 1; s++)
    			{
    				cout << "*";
    			}
    			cout << "\n"; 
    		}
    	}
    	// Untere Hälfte
    	for (int i = zahl - 1; i>= 0; i--)
    		{		
    				for (int l = zahl - i; l >= 0; l--)
    				{
    					cout << " ";
    				}
    
    				for (int s = 1; s <= 2 * i - 1; s++)
    
    				{
    					cout << "*";
    				}
    			cout << "\n"; 
    		}
    }
    

    Das Programm läuft zwar habe aber eine Frage bezüglich der Veränderung in der for-Schleife

    for (int i = 1; i <= zahl; i++) // Spalte
    	{
    		{
    		for (int l = zahl - i; l >= 0; l--)//Leerzeichen
    

    z.B Zahl = 4
    1.Rundgang: i wird mit 1 initialisiert und aufgezählt solange es kleiner gleich 4 ist.
    Anschließend wird i an die nächste Schleife übergeben => 4-1 = 3 => 3 Leerzeichen werden ausgegeben.
    Nun müsste doch unabhängig vom i Wert im nächsten Rundgang 3 um 1 reduziert werden und wir würden die 2 erhalten.
    Da aber l abhängig von i ist und im nächsten Rundgang i++ = 2 ist, erhalten wir für l ebenfalls 2.

    Was passiert hier mit l-- ?
    Wird dies wegen dem in jedem Rundgang neu initialisiert wert von i einfach ausgelassen, weil "zahl-i" ist im Grunde eigentlich auch ein l--.





  • Falls möglich bitte in ihren Worten wiedergeben 🙂

    Habe mich in der Zeit mit dem Menüpunkt Datum beschäftigt. Ist noch nicht komplett. Jedoch hab ich jetzt schon Fehler im Programm.

    {
    	int tag = 0;
    	int monat = 0;
    	int jahr = 0;
    	char s = '.';
    	int datum = 0;
    	cout << " Bitte geben Sie ein Datum in der Form [TT.MM.JJJJ] ein " << endl;
    	cin >> tag >> s >> monat >> s >> jahr;
    
    	if (tag <= 31)
    	{
    		if (monat = 1, 3, 5, 7, 8, 10, 12)
    		{
    			cout << "Datum ist korrekt";
    		}
    		else
    		{
    			cout << "Datum falsch";
    		}
    	}
    
    	if (tag <= 30)
    	{
    		if (monat = 4, 6, 9, 11)
    		{
    			cout << "Datum ist korrekt";
    		}
    		else
    		{
    			cout << "Datum falsch";
    		}
    	}
    
    	if (tag <= 0 ||tag >= 31 && monat <= 0 || monat > 12 || jahr < 1582)
    			{
    				cout << "Datum falsch";
    			}
    

    Hoffe ihr könnt mir da weiterhelfen.

    Mfg



  • Dein Test auf mehrere Bedingungen gibt es so nicht in C++. Ich schlage vor ein array mit der Anzahl der Tage pro Monat zu verwenden. Und warum ist ein Datum vor dem Jahr 1582 überhaupt ungültig?



  • Wegen der Aufgabenstellung :

    /*Unter dem Menüpunkt „Datum“ kann der Benutzer ein beliebiges Datum in der Form 
    „32.13.1581“ eingeben und bekommt dann gesagt, ob das Datum korrekt ist, d. h. zu einem 
    Tag passt. 
    Der gregorianische Kalender gilt seit dem 15. Oktober 1582. Die Schaltjahrregelung wurde 
    seitdem auch geändert: In allen Jahren, die nach Division durch vier eine natürliche Zahl 
    ergeben, wird der 29. Februar als Schalttag eingefügt. Ausgenommen sind volle Jahrhunderte, 
    die nicht glatt durch 400 teilbar sind.*/
    

    Ich habe das mit dem l-- von der for-Schleife leider immernoch nicht so ganz verstanden.

    mc52 schrieb:

    Das Programm läuft zwar habe aber eine Frage bezüglich der Veränderung in der for-Schleife

    for (int i = 1; i <= zahl; i++) // Spalte
    	{
    		{
    		for (int l = zahl - i; l >= 0; l--)//Leerzeichen
    

    z.B Zahl = 4
    1.Rundgang: i wird mit 1 initialisiert und aufgezählt solange es kleiner gleich 4 ist.
    Anschließend wird i an die nächste Schleife übergeben => 4-1 = 3 => 3 Leerzeichen werden ausgegeben.
    Nun müsste doch unabhängig vom i Wert im nächsten Rundgang 3 um 1 reduziert werden und wir würden die 2 erhalten.
    Da aber l abhängig von i ist und im nächsten Rundgang i++ = 2 ist, erhalten wir für l ebenfalls 2.

    Was passiert hier mit l-- ?
    Wird dies wegen dem in jedem Rundgang neu initialisiert wert von i einfach ausgelassen, weil "zahl-i" ist im Grunde eigentlich auch ein l--.

    Mfg



  • Ich nehme mal die Bezeichnungen aus den Wikipediaartikel auf, den ich verlinkt hatte.

    Es ist für die Fortsetzung sche..egal, was in der Initialisierung steht.
    Da gibt es keine Sonderbehandlung.

    Der gregorianische Kalender worde aber nicht überall zum selben Zeitpunkt eingeführt.
    Die Umstellung/Einführung zog sich bis 1949 hin.
    Deswegen befand man sich nach Weihnachten auch "Zwischen den Jahren"



  • /*Unter dem Menüpunkt „Datum“ kann der Benutzer ein beliebiges Datum in der Form 
    „32.13.1581“ eingeben und bekommt dann gesagt, ob das Datum korrekt ist, d. h. zu einem 
    Tag passt. 
    Der gregorianische Kalender gilt seit dem 15. Oktober 1582. Die Schaltjahrregelung wurde 
    seitdem auch geändert: In allen Jahren, die nach Division durch vier eine natürliche Zahl 
    ergeben, wird der 29. Februar als Schalttag eingefügt. Ausgenommen sind volle Jahrhunderte, 
    die nicht glatt durch 400 teilbar sind.*/
    

    Hallo, hier ein link zum Umrechnen:
    Umrechnung zwischen julianischem Datum und gregorianischem Kalender. Und wenn ich mir das und und den Quelltext zu std::mktime angucke scheint das doch etwas arbeit zu sein 😉
    Hier noch ein link zu std::mktime, das scheinen ältere Versionen zu sein. kannst ja nach neueren goggeln...

    Leider hab ich keine Ahnung wie weit std::mktime zurückrechnen kann. Für den 15.10.1582 gibt die Funktion aber korrekt Freitag zurück. Sie springt auch nicht vor dem 15.10.1582 auf dem julianischen zurück, zumindest kommt hier für den 4.10.1582 nicht Donnerstag zurück 😃 wäre aber auch seltsam...

    Hier ein link zur cppreference.com,
    wenn du den gcc vor Version 5 benutzt funktionieren std::get_time und std::put_time nicht. Alternativen gibts aber auch dafür (std::time_get).

    Die Beispiele auf cppreference.com sind ganz nützlich...

    Einen schönen Tag noch...



  • Das julianisches Datum ist etwas anderes als der julianische Kalender (der galt in den meisten Ländern vor dem gregorianischen Kalender).



  • dirkski schrieb:

    [...]

    Einen schönen Tag noch...

    Du füllst dir also eine std::tm aus <ctime>, am besten mit std::get_time.
    Dann prüfst Du ob das Datum vor dem 15.10.1582 liegt (falls das als falsch angenommen wird). Dann machst Du dir eine Kopie von der gefüllten std::tm.
    Dann eine von den beiden mit std::mktime aufrufen, der Rückgabewert vom Typ std::time_t ist uninteressant. mktime korrigiert dann die Felder, auch den Wochentag. Anschließend prüfst du noch ob in beiden std::tm-structs die Felder für Tag/Monat/Jahr gleich geblieben sind...

    Bsp: Wenn du 29.2.2013 eingibst kommt 1.3.2013 raus (Kein Schaltjahr)

    hth
    dirkski

    Edit: Mann sollte bei solchen Sachen immer wissen was der Dozent etc. eigentlich will. Will er sehen das ihr sowas selber könnt (Eine Datumsberechnungs-Funktion schreiben) oder ob er testen will ob ihr euch mittlerweile mit der std-lib auskennt. Beides ist möglich. Ich meine damit das meine Version auch als falsch aufgefasst werden kann... Oder als genau das was gewünscht ist... Aber das sind Dinge die nur Du uns sagen kannst, also wo steht ihr im Kurs, was habt ihr gerade durchgenommen, was davor etc...



  • DirkB schrieb:

    Das julianisches Datum ist etwas anderes als der julianische Kalender (der galt in den meisten Ländern vor dem gregorianischen Kalender).

    Jep, hab selbst keine Ahnung davon und bin gerade über den Wikiartikel
    zu Umrechnungen gekommen. Mal abgesehen das es ja auch nur um den gregorianischen ging. Sollte mit dem Hinweis auf die Quelle von std::mktime auch nur ein Wink mit dem Zaunpfahl sein 🙂 und das es nicht ganz so einfach ist...



  • Guten Abend

    also ich habe nun versucht den Menüpunkt Datum mal grob zu realisieren.

    int main()
    /*Unter dem Menüpunkt „Datum“ kann der Benutzer ein beliebiges Datum in der Form
    „32.13.1581“ eingeben und bekommt dann gesagt, ob das Datum korrekt ist, d. h. zu einem
    Tag passt.
    Der gregorianische Kalender gilt seit dem 15. Oktober 1582. Die Schaltjahrregelung wurde
    seitdem auch geändert: In allen Jahren, die nach Division durch vier eine natürliche Zahl
    ergeben, wird der 29. Februar als Schalttag eingefügt. Ausgenommen sind volle Jahrhunderte,
    die nicht glatt durch 400 teilbar sind.*/
    {
    	int tag = 0;
    	int jahr = 0;
    	int monat = 0;
    
    		cout << " Bitte geben Sie ein Datum in der Form [TT.MM.JJJJ] ein " << endl;
    		cin >> tag;
    		cin >> monat;
    		cin >> jahr;
    
    		int monat31[7] = { 1, 3, 5, 7, 8, 10, 12 }; // monate für 31 Tage
    
    		if (tag >0 && tag<=31 && monat31 && jahr >=1582)
    		{
    			cout << "Datum korrekt" << endl;
    		}
    		else 
    		{
    			cout << "Datum falsch" << endl;
    		}
    
    		int monat30[4] = { 4, 6, 9, 11 }; // monate für 30 Tage
    		if (tag >0 && tag <= 30 && monat30 && jahr >= 1582)
    		{
    			cout << "Datum ist korrekt" << endl;;
    		}
    		else
    		{
    			cout << "Datum ist falsch" << endl;;
    		}
    

    Ist es Ansatzweise richtig ?
    Ich habe die Monate mit 30 und 31 Tage in eineme Array definiert und will nun wenn zb 31 als tag eingegeben wurde und ein monat im array monat30 gewählt wird die ausgabe datum falsch erscheint.

    Aber leider will das nicht so ganz funktionieren

    Mfg


  • Mod

    mc52 schrieb:

    Ist es Ansatzweise richtig ?

    Nicht wirklich. Es sind ein paar Ideen da, die für die nicht-Februar Monate eventuell Erfolg haben könnten, wenn sie nur richtig umgesetzt würden. Aber die momentane Umsetzung ist ungenügend. Und für den einzig interessanten Fall, den Februar, hast du überhaupt gar keinen Ansatz.



  • Was soll denn deiner Meinung nach bei diesem Test heraus kommen?

    int monat31[7] = { 1, 3, 5, 7, 8, 10, 12 }; // monate für 31 Tage
    if(monat31)
    {
      ...
    }
    

    Mindestens sollte dir hier auffallen, das der zu testende Monat nirgendwo eingeht.



  • @mc52
    Du kannst dir nicht einfach irgend eine Syntax ausdenken, hinschreiben und dann hoffen dass es funktioniert.
    Weil es so eben nicht funktioniert.

    Ich würde dir empfehlen statt dessen lieber C++ zu lernen.


Anmelden zum Antworten