Wie kann ich aus einer Tageszahl heraus entscheiden in welchem Monat der Tag liegt

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Joloboso97
Beiträge: 2
Registriert: Fr Mär 29, 2019 3:15 pm

Wie kann ich aus einer Tageszahl heraus entscheiden in welchem Monat der Tag liegt

Beitrag von Joloboso97 » Fr Mär 29, 2019 3:25 pm

Hallo,

Ich bin ganz neu beim C Programmieren und schreibe ein Programm das den Osterfeiertag berechnen soll ausgehend von der Jahreszahl.
Die Formel und alles habe ich eingesetzt und er spuckt auch ein Datum aus, aber nur den Tag, welcher auch mal über die 31 hinausgehen kann, da Ostern auch im April liegen kann ( Wie dieses Jahr).
Nun ist meine Frage wie ich ohne Verzweigungen den Monat berechnen lasse und die Tageszahl auf 31 begrenze, keine komplette Lösung aber ein Anschub wäre schön.

Danke im Voraus :)

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8500
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Wie kann ich aus einer Tageszahl heraus entscheiden in welchem Monat der Tag liegt

Beitrag von Xin » Fr Mär 29, 2019 3:53 pm

Das kommt ein wenig drauf an, was Du da als Zahl hast, was die bedeutet?
Wenn Du den x. März herausbekommst und jetzt feststellst, dass Ostern am 52. März stattfindet, dann weißt Du, dass der März immer 31. Tage hat. Mittels Modulo kannst Du also den Tag im Monat bestimmen und den Monat mit der Frage, ob Ostern nach dem 31. liegt.

Code: Alles auswählen

int tag = 52;   // 52. März
printf( "Ostersonntag ist am %d. %s\n", (tag % 31), (tag >31) ? "April" : "März" );
Falls ich die Frage richtig verstanden habe...?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Joloboso97
Beiträge: 2
Registriert: Fr Mär 29, 2019 3:15 pm

Re: Wie kann ich aus einer Tageszahl heraus entscheiden in welchem Monat der Tag liegt

Beitrag von Joloboso97 » Fr Mär 29, 2019 4:20 pm

Ja so hätte ich es auch gemacht aber es muss ja ohne verzweigung gehen :/ und der ternäre operator ist ja iwie n if else ersatz, der darf also auch nicht drin sein

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8500
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Wie kann ich aus einer Tageszahl heraus entscheiden in welchem Monat der Tag liegt

Beitrag von Xin » Fr Mär 29, 2019 4:44 pm

Du musst eine Entscheidung treffen, ob es sich um März oder April handelt. Wie auch immer.

Code: Alles auswählen

int tag = 52;   // 52. März

char const monatsname[]={ "März", "April" };

printf( "Ostersonntag ist am %d. %s\n", (tag % 31), monatsname[tag > 31] );
Das ist aber getrickst, weil die Entscheidung hier dadurch zu stande kommt, dass das Boolean als 0 (falsch) oder 1 (wahr) interpretiert wird und dieser Wert dann als Index für das Array Monatsname missbraucht wird.

Ohne diesen Hack

Code: Alles auswählen

int tag = 52;   // 52. März

char const monatsname[]={ "März", "April" };

printf( "Ostersonntag ist am %d. %s\n", (tag % 31), monatsname[ tag / 31 ] );
ist das semantisch sauber, aber sollte Ostern auf den 63. März fallen, dann ist das der 2. Monat nach März und den gibt's nicht. Ergo fliegt das Programm Dir um die Ohren. Das kann man akzeptieren, wenn man der Shit-In-Shit-Out-Philosophie folgt: Wer behauptet, Ostern liegt im Mai muss sich nicht wundern, wenn die Welt untergeht.
Mit tag/31 einen Index zu berechnen und demzufolge eine Adresse zu bestimmen ist aber am Ende eine Entscheidung, die dem ?:-Operator gleichwertig ist.
Auch beim If geht es am Ende nur darum, eine von zwei Adressen zu bestimmen. Dann nicht um den Beginn des Strings "März" oder "April", sondern wo das Programm fortgesetzt wird.
Der ternäre Operator ist kein If-Ersatz, denn er verändert nicht den Ablauf des Programms. Es findet keine Verzweigung statt, es geht immer hinter dem ?:-Operator weiter. Ob er vergleichbar zu if implementiert wird, oder vergleichbar damit, den boolischen Wert als Index zu sehen, ist Sache des Compilers.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten