Hilfe bei C Hausarbeit

Schnelle objektorientierte, kompilierende Programmiersprache.
Gesperrt
DeadsGames
Beiträge: 6
Registriert: Do Apr 24, 2014 5:11 pm

Hilfe bei C Hausarbeit

Beitrag von DeadsGames » Do Apr 24, 2014 5:15 pm

Hallo Leute ich brauche eure hilfe bei meiner C Hausarbeit.
Ich muss die Gaußsche Osterformel in C Programmieren.
Wenn ich das Jahr EIngebe soll das Datum fürn Ostersonntag erscheinen.
Ich darf printf und scanf nur einmal verwenden und die Umrechnung des Oster-Datums bezogen auf März darf nur mit Ausdrücken erfolgen, Verzweigungen(if, if-else, switch-case, ternarer Operator) sind nicht erlaubt.
Also nur mit < oder >.

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Hilfe bei C Hausarbeit

Beitrag von mfro » Do Apr 24, 2014 5:35 pm

Hier wird gern geholfen, aber ein klein bißchen mehr als bloß die Aufgabenstellung wirst Du schon selbst mitbingen müssen...
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

DeadsGames
Beiträge: 6
Registriert: Do Apr 24, 2014 5:11 pm

Re: Hilfe bei C Hausarbeit

Beitrag von DeadsGames » Do Apr 24, 2014 5:49 pm

Das Problem ist ja, das ich keinen Ansatz finde.
Bis jetzt habe ich nur das hier:

int a, b, c, k, p, q, M, d, N, e, Ostern, x, y, z; //x=Jahr y=Monat z=Tag

scanf ("%d", &x);

a = x % 19;
b = x % 4;
c = x % 7;
k = x / 100;
p = (8*k + 13) / 25;
q = k / 4;
M = (15 + k - p - q) % 30;
d = (19*a + M) % 30;
N = (4 + k - q) % 7;
e = (2*b + 4*c + 6*d + N) % 7;
Ostern = (22 + d + e);

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Hilfe bei C Hausarbeit

Beitrag von mfro » Do Apr 24, 2014 6:01 pm

und dein Problem ist?

(überleg' mal, was Du von deinen Vorgaben noch nicht verwendet hast)
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

DeadsGames
Beiträge: 6
Registriert: Do Apr 24, 2014 5:11 pm

Re: Hilfe bei C Hausarbeit

Beitrag von DeadsGames » Do Apr 24, 2014 6:08 pm

Es funktioniert einfach nicht, da ich das Programm ohne If und Else schreiben muss.
Da unten ist mein Programm. Ich darf das If und Else halt nicht verwenden und weiß nicht wie ich es ohne Ausdrücken kann. So würde das Programm richtig laufen.

#include <stdio.h>

int main ()
{
int a, b, c, k, p, q, M, d, N, e, Ostern, x, y, z;

scanf ("%d", &x);

a = x % 19;
b = x % 4;
c = x % 7;
k = x / 100;
p = (8*k + 13) / 25;
q = k / 4;
M = (15 + k - p - q) % 30;
d = (19*a + M) % 30;
N = (4 + k - q) % 7;
e = (2*b + 4*c + 6*d + N) % 7;
Ostern = (22 + d + e);

if (Ostern <= 31){
z = Ostern;
y = 3;
}
else {
z = Ostern - 31;
y = 4;
}

printf ("%02d.%02d.%04d\n", z, y, x);

return 0;
}

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Hilfe bei C Hausarbeit

Beitrag von cloidnerux » Do Apr 24, 2014 6:44 pm

Da unten ist mein Programm. Ich darf das If und Else halt nicht verwenden und weiß nicht wie ich es ohne Ausdrücken kann. So würde das Programm richtig laufen.
Das funktioniert schon, dazu muss man aber etwas Mathematik und Rundung anwenden:

Code: Alles auswählen

y = 3 + Ostern/32;
Ostern -= 1;
z = 1 + Ostern % 31;
Was passiert hier?
Bei der y-Zuweisung prüfst du, ob du im Monat April gelandet bist. Das passiert, wenn du mehr als 31, also mindestens 32 Tage hast. Wie es so will, werden in C die ganzzahligen Divisionen abgerundet. Solange du also unterhalb von 32 bist, ist das Ergebnis der Divison 0. Sobald du darüber bist, ist es 1.

Bei der z-Zuweisung willst du nach der 31 wieder mit 1 beginnen. Das macht Modulo: Ganzzahliger Divionsrest.
Nun ist es aber so, dass man hier nicht einfach Modulo 31 oder 32 rechnen könnte, da sonst einmal 0 heraus kommt.
Daher subtrahiere ich 1 von Ostern, sodass die Monate nun 0-Basiert sind(im Gegensatz zu 1 Basierten Monaten), kann nun den Modulo 31 nehmen, der mir für den 32 Tag(31 nach Abzug) 0 ausgibt, Plus 1 ergibt das den ersten April.

Voila, ohne if oder else
Redundanz macht wiederholen unnötig.
quod erat expectandum

DeadsGames
Beiträge: 6
Registriert: Do Apr 24, 2014 5:11 pm

Re: Hilfe bei C Hausarbeit

Beitrag von DeadsGames » Do Apr 24, 2014 7:03 pm

Danke Danke Danke.
Auf die Idee bin ich einfach nicht gekommen obwohl es so simpel ist xD.
Wirklich vielen Dank dieses Forum ist wirklich Klasse.
Ich sitze seit einer Woche an dieser Aufgabe und schäme mich etwas das ich auf die Lösung nicht gekommen bin.

Gesperrt