Den "darauffolgenden" Tag in C++ berechnen?

3 Antworten

Ja. Dein Programm soll eine Eingabe entgegennehmen, die einem Datum entspricht. Du sollst für dieses Datum den Folgetag berechnen und ausgeben.

Beispiel:

01.01.1987 // Eingabe
02.01.1987 // Ausgabe

Dabei musst du natürlich aufpassen, dass das Datum valid ist. Es wäre ungünstig, für den 28.02 eines Jahres den 01.03. auszugeben, obwohl das Datum sich im Schaltjahr befindet.


xoticcounter 
Fragesteller
 06.11.2019, 23:02

Das verstehe ich, aber die Umsetzung nicht :(

0
regex9  06.11.2019, 23:04
@xoticcounter

Die sollst du dir ja auch überlegen, wenn auch schon ein paar Vorgaben gemacht wurden. Wo liegt hier das konkrete Verständnisproblem? Bei dem switch-case?

1

Wie gehen wir vor?

Zuerst prüfen, ob das Datum ok ist. Dafür würde ich zuerst das eingegebene Jahr nehmen und checken, ob es ein Schaltjahr ist. Wenn Ja, dann setze ein unsigned integer schaltjahr auf 1, sonst auf 0. Dann prüfe, ob der Tag in Ordnung ist einerseits > 0 für die Untergrenze und für die Obergrenze (28,29,30,31) mit switch(Monat)-case. Bei Februar einfach 28 + schaltjahr. Für Monat die Range 1 - 12 checken, für Jahr 1600 bis 2600. Einfach. Wenn Datum gültig, dann Zweitens. Ansonsten Ausgabe von Tag=99, Monat=99 und Jahr=9999.

Zweitens: Einfach den Tag hochsetzen: Tag++. Und jetzt wieder switch(Monat), ob die Obergrenze überschritten ist. Wenn ja, dann Monat++ und Tag=1, ansonsten nichts machen. Jetzt checken, ob Monat > 12. Wenn Ja, dann Jahr++ und Monat=1, ansonsten nichts machen.

Ausgabe<<Tag<<Monat<<Jahr (steht schon im Code).

Tipp: ich würde das switch(Monat) als Function mit boolean-Rückgabe schreiben. Dann musst Du es nur einmal schreiben und kannst es mehrfach verwenden.

Woher ich das weiß:eigene Erfahrung – Hobby und teilweise beruflich

Ja, ich verstehe die Aufgabe. Und nun?

Vergiss mal für einen Moment das C++-Gedöns - wie würdest du im Kopf "ausrechnen", welches zum Beispiel der Tag nach dem 28.02.2016 ist?


xoticcounter 
Fragesteller
 06.11.2019, 23:01

Na ja, 28+1 würde 29 ergeben, das würde sogar noch passen: 29.02.2016

0
bluebird5  06.11.2019, 23:12
@xoticcounter

Siehste, gehen wir das Ding mal durch.

Ein Jahr hat 12 Monate, wenn die eingegeben Monatszahl kleiner 1 oder größer 12 ist, dann hast du ein ungültiges Datum -> 99.99.9999

Wie viele Tage ein Monat ist, weißt du. Der Januar hat 31 Tage, der Februar 28 (außer im Schaltjahr! - wie du ermittelst, was ein Schaltjahr ist, steht ja in der Aufgabe), der März 31 Tage, der April 30, usw. Wenn die eingegebenen Tage kleiner 1 sind oder größer als die im Monat erlaubten Tage -> 99.99.9999

Noch kurz zu den Schaltjahren: das ist eine Reihe von Abfragen. Wenn die Jahreszahl durch 400 teilbar ist, dann ist es auf alle Fälle ein Schaltjahr. Wenn die Jahreszahl durch 100 teilbar ist, dann ist es auf alle Fälle kein Schaltjahr, Ansonsten ist es ein Schaltjahr, wenn die Jahreszahl durch 4 teilbar ist. 1996, 2000 und 2016 sind Schaltjahre, 1900, 2100 und 1993 sind keine Schaltjahre.

Wenn das eingegeben Jahr kleiner als 1600 oder größer als 2600 ist -> 99.99.9999

So, nun haben wir die ungültigen Tage abgefrühstückt. Der nächste Tag ist einfach nur der Tageszähler hochgezählt, so wie in dem kleinen Beispiel eben. Wenn der Tag die Anzahl der Tage im entsprechenden Monat überschreitet, dann ist der neue Tag der 1. des nächsten Monats. Also Tag = 1 und Monat = Monat + 1.Das Jahr bleibt das gleiche.

Ein letzter Sonderfall ist nun noch der Jahreswechsel. Wenn der eingegebene Tag 31 und der Monat 12 ist, dann sind der neue Tag = 1 und der neue Monat = 1, das Jahr ist Jahr + 1.

Das müsste es schon sein, nun musst du diese Beschreibung nur noch in Code gießen.

1
xoticcounter 
Fragesteller
 07.11.2019, 16:35
@bluebird5

Ja also ich verstehe auch wie das in der Theorie sein sollte, aber dieses "in Code gießen" kann ich schlecht umsetzen. Ich mache das nicht so lange. Ich müsste quasi Ihren Text einfach in die Programmiersprache C++ umwandelt, leider ist das das Problem. Ich hoffe, dass es nicht zu viel verlangt ist, Sie haben sich jetzt schon sehr viel Mühe gegeben und ich bin Ihnen sehr dankbar dafür, aber können Sie mir ein Codeexeplar schreiben (evtl. mit Kommentaren) sodass ich dass irgendwie nachvollziehen kann/versuche.

0