Malte 2
23.03.2004, 19:44
Guten Tach!
Ich hab da mal eine Frage bezüglich einem Weg zum Rechnen mit Daten. Zuerst muss ich mal etwas ausholen:
Ich habe eine Art Wecker für den Computer erstellt, in dem man Termine eingibt, die mit einem Zeitpunkt verbunden werden. Dieser besteht aus einem Datum und der Uhrzeit (die allerdings für meine Frage nicht wichtig ist). Es lassen sich auch regelmäßige Termine erstellen. Eine dieser Regelmäßigkeiten sind Schritte zwischen beliebig vielen Monaten. Ich muss also zum Datum einfach x Monate addieren (1<=x<=120). Im Prinzip ist das ja einfach. Ich addiere x zum Monat des Datums und ziehe, solange die Monatszahl größer als 12 ist, 12 vom Monat ab und addiere 1 zur Jahreszahl. Soweit so gut.
Jetzt kann sich da ja ein Problem ergeben: Wenn ich den Zeitpunkt eines Termins auf den 31 Januar setze und diesen Termin alle 2 Monate haben will, kommt danach der 31.3, dann der 31.5, der 31.7 und dann würde der 31.9 kommen. Dieses Datum gibt es aber nicht.
Nun will ich eine Funktion schreiben, die als Parameter das Datum und die monatlichen Schritte erfahren (wie gesagt zwischen 1 und 120 Monatsschritten) soll, und die zurückgibt, ob das Datum bei der Einstellung JEMALS ein nicht existierendes Datum annehmen will oder nicht.
Ich hab das bis jetzt einfach mit einer Schleife gemacht. Ich addiere die x Monate tausend mal zum Datum und wenn innerhalb dieser Zeit kein falsches Datum auftritt, dann wird spontan gesagt: "Da kommt niemals ein falsches Datum". Allerdings ist das ja ein relativ langsamer Algorithmus. Ich hätte gerne einen Weg, der 1) möglichst zeitlich unbeschränkt arbeitet (also nicht einfach 1000 Schritte durchgehen und wenn immer okay, dann wirklich IMMER okay) und 2) schneller ist.
Zuerst würde man mal prüfen, wie groß die Tageszahl des Startdatums ist (denn das ist ja das potentielle Problem). Wenn diese nicht größer als 28 ist, wird niemals ein falsches Datum auftreten, da jeder Monat des Jahres mindestens 28 Monate hat. Aber wenn nicht, dann muss halt irgendwie bestimmt werden, ob einmal so ein Datum auftritt. Schaltjahre müssen beachtet werden, alles!
Falls es darauf ankommt: Ich progge in C und hätte (für eventuelle Codeschnippsel eurerseits) schon eine fertige Funktion, der ich eine Jahreszahl übergebe, und die zurückgibt, ob es ein Schaltjahr ist oder nicht.
Also nochmal:
Gegeben: Ein Datum bestehend aus Tageszahl, Monatszahl und Jahreszahl und eine Schrittgröße von x Monaten (1<=x<=120, zum Beispiel x=12 für einem Termin, der jedes Jahr eintreten soll).
Gesucht: Wird jemals ein nicht existierendes Datum erreicht werden, schlicht ja oder nein.
Gelöste Teilprobleme:
Ich habe zuerst geprüft, ob beim Teilen von x durch 12 ein Rest bleibt. Wenn nicht, haben wir eine Schrittweite von x/12 Jahren. NUR wenn dann der Tag=29 und der Monat=2 ist, wird unabhängig vom Wert x/12 irgendwann ein falsches Datum auftreten (liegt daran, dass Schaltjahre Jahre sind, die durch 4 aber NICHT durch 100 teilbar sind. Allerdings sind sie es doch, wenn sie durch 4, 100 UND 400 teilbar sind).
Für das Teilproblem, für das ich von euch hiermit Vorschläge erfragen will, ist der Quotient aus x/12 also KEINE ganze Zahl.
Ich hab da mal eine Frage bezüglich einem Weg zum Rechnen mit Daten. Zuerst muss ich mal etwas ausholen:
Ich habe eine Art Wecker für den Computer erstellt, in dem man Termine eingibt, die mit einem Zeitpunkt verbunden werden. Dieser besteht aus einem Datum und der Uhrzeit (die allerdings für meine Frage nicht wichtig ist). Es lassen sich auch regelmäßige Termine erstellen. Eine dieser Regelmäßigkeiten sind Schritte zwischen beliebig vielen Monaten. Ich muss also zum Datum einfach x Monate addieren (1<=x<=120). Im Prinzip ist das ja einfach. Ich addiere x zum Monat des Datums und ziehe, solange die Monatszahl größer als 12 ist, 12 vom Monat ab und addiere 1 zur Jahreszahl. Soweit so gut.
Jetzt kann sich da ja ein Problem ergeben: Wenn ich den Zeitpunkt eines Termins auf den 31 Januar setze und diesen Termin alle 2 Monate haben will, kommt danach der 31.3, dann der 31.5, der 31.7 und dann würde der 31.9 kommen. Dieses Datum gibt es aber nicht.
Nun will ich eine Funktion schreiben, die als Parameter das Datum und die monatlichen Schritte erfahren (wie gesagt zwischen 1 und 120 Monatsschritten) soll, und die zurückgibt, ob das Datum bei der Einstellung JEMALS ein nicht existierendes Datum annehmen will oder nicht.
Ich hab das bis jetzt einfach mit einer Schleife gemacht. Ich addiere die x Monate tausend mal zum Datum und wenn innerhalb dieser Zeit kein falsches Datum auftritt, dann wird spontan gesagt: "Da kommt niemals ein falsches Datum". Allerdings ist das ja ein relativ langsamer Algorithmus. Ich hätte gerne einen Weg, der 1) möglichst zeitlich unbeschränkt arbeitet (also nicht einfach 1000 Schritte durchgehen und wenn immer okay, dann wirklich IMMER okay) und 2) schneller ist.
Zuerst würde man mal prüfen, wie groß die Tageszahl des Startdatums ist (denn das ist ja das potentielle Problem). Wenn diese nicht größer als 28 ist, wird niemals ein falsches Datum auftreten, da jeder Monat des Jahres mindestens 28 Monate hat. Aber wenn nicht, dann muss halt irgendwie bestimmt werden, ob einmal so ein Datum auftritt. Schaltjahre müssen beachtet werden, alles!
Falls es darauf ankommt: Ich progge in C und hätte (für eventuelle Codeschnippsel eurerseits) schon eine fertige Funktion, der ich eine Jahreszahl übergebe, und die zurückgibt, ob es ein Schaltjahr ist oder nicht.
Also nochmal:
Gegeben: Ein Datum bestehend aus Tageszahl, Monatszahl und Jahreszahl und eine Schrittgröße von x Monaten (1<=x<=120, zum Beispiel x=12 für einem Termin, der jedes Jahr eintreten soll).
Gesucht: Wird jemals ein nicht existierendes Datum erreicht werden, schlicht ja oder nein.
Gelöste Teilprobleme:
Ich habe zuerst geprüft, ob beim Teilen von x durch 12 ein Rest bleibt. Wenn nicht, haben wir eine Schrittweite von x/12 Jahren. NUR wenn dann der Tag=29 und der Monat=2 ist, wird unabhängig vom Wert x/12 irgendwann ein falsches Datum auftreten (liegt daran, dass Schaltjahre Jahre sind, die durch 4 aber NICHT durch 100 teilbar sind. Allerdings sind sie es doch, wenn sie durch 4, 100 UND 400 teilbar sind).
Für das Teilproblem, für das ich von euch hiermit Vorschläge erfragen will, ist der Quotient aus x/12 also KEINE ganze Zahl.