kleines prob damit
-
pitchy schrieb:
if(g==25) && (b>11) || if(g==24)
g++;so ähnlich die syntax für das erste falls? :I
her:
if (((g == 25) && (b > 11)) || (g == 24)) g++;
Das gesamte if-Statement muß in Klammern stehen. "|| if" ist so ebenfalls nicht richtig. Sieh das ganze als eine einzelne Funktion.
-
@Machine
Also ich kanns nachvollziehen. Wenn ich damals ne so gigantische Möglichkeit wie das Internet gehabt hätte, dann hätte ich mir alle Aufgaben machen lassen.pitchy schrieb:
.....
es geht mir vielmehr darum, dass mir bißchen auf die sprunge geholfen wird. ein teil der if schleife, habe ich ja mal gepostet.Bitte schreibe das 1000 mal:
**************** ES GIBT KEINE IF SCHLEIFE ****************
**************** ES GIBT KEINE IF SCHLEIFE ****************
**************** ES GIBT KEINE IF SCHLEIFE ****************
**************** ES GIBT KEINE IF SCHLEIFE ****************
-
Habe das mal soweit geschrieben, das letzte verstehe ich nicht ganz, hab den satz mal als kommentar gekennzeichnet. danke schonmal, für die ersten hilfen von euch!
int main() { int a,b,c,d,e,f,g,h; printf("Geben sie gewuenschte Jahreszahl ein:\t"); scanf("i%",&a); b=(a %19)+1; c=(a/100)+1; d=(3*c/4)-12; e=((8*c+5)/25)-5; f=(5*a/1)-d-10; g=(11*b+20+e-d)&30; if (((g == 25) && (b > 11)) || (g == 24)) g++; h=44-g; if(h<21); h=h+30; h=h+7-((f+h)%7); printf("TAGE %i",h); // für h>31 fällt der Ostersonntag auf den (h-31), April sonsst auf den h. März return 0; }
-
if(h<21); h=h+30;
Das Semikolon hinter dem if wegnehmen. "h=h+30" für die Übersichtlichkeit einrücken. Etwa so:
if (h < 21) h = h + 30; /* oder: "h += 30;" */
g=(11*b+20+e-d)&30;
der Modulo-Operator ist "%", wie weiter oben schon benutzt, nicht "&".
für h>31 fällt der Ostersonntag auf den (h-31), April sonsst auf den h. März
Wenn h größer ist als 31 (z.B. 35), ist der gesuchte Tag der "(h - 31).April" (z.B. 35 - 31 = 4 -> 4.April).
Wenn h kleiner oder gleich 31 (sonst -> else) ist, z.B. 25, dann ist es der "h.März" (z.B. h = 25 -> 25.März).printf("TAGE %i",h);
Zur Ausgabe von integern als Dezimalzahl wird "%d" benutzt, nicht "%i", wie bei der Eingabe.
-
vielen dank! das mit dem modulo war einfach ein tippfehler
also baue ich einfach noch eine if else, ans ende?
werde ich gleich mal probieren und dann nochmal posten
-
if(h>31) { printf("April %d", h-31); } else{ if(h<=31){ printf("Maerz%d",h); } }
scheint aber irgendwie nicht richtig zu funktionieren
-
else{ if(h<=31){
Das "if(h<=31){" kannst du rausnehmen (und dann natürlich auch noch die letzte schließende geschweifte Klammer im Text).
Du hast ja im Klartext schon
"Wenn h > 31: Schreibe "(h-31).April"
"Sonst: Schreibe "(h).Maerz" (Hier braucht keine weitere if-Abfrage rein. Die Bedingung ist mit "sonst" festgelegt.)Wenn die erste Bedingung nicht erfüllt ist, also h größer als 31 ist, dann ist h auf jeden Fall kleiner oder gleich 31. Deshalb brauchst du außer dem "else" (sonst) keine weitere Abfrage. Der Compiler erkennt automatisch, daß die beiden zusammengehören.
Das "else if" aus z.B. Pascal wird in c "elif" geschrieben.
Ansonsten dürfte der Compiler noch bei allen scanf/printf-Aufrufen meckern. Die findet er in der stdio.h:
#include <stdio.h>
Du kannst deinem Lehrer (ich gehe mal davon aus, daß das ein Informatikkurs in der Schule ist) auch mal vorschlagen, erst mit Struktogrammen und Pseudocode zu arbeiten, bevor ihr euch gleichzeitig mit grundlegenden Strukturen UND der Syntax von c rumschlagen müßt...
-
hey danke, dass du dir soviel mühe gibst! sehr nett!
also ich hatte, es auch erst so
if(h>31) { printf("April %d", h-31); } else{ printf("Maerz%d",h); }
aber es scheint, nicht das richtige rauszukommen. mit printf und scanf gibt es keine probleme. hast du das ganze mal compiliert?
-
#include <stdio.h> #include <stdlib.h>
die beiden bibliotheken habe ich drin.
-
Habs mal kompiliert.
scanf("i%",&a);
ist noch falsch, aber das hast du anscheinend schon korrigiert.
Das Ergebnis ist bei mir auch falsch: 25. März für 2008.
stdlib.h brauchst du für das Programm nicht.Bis kurz vor Anpfiff habe ich noch Zeit, ich kann ja mal gucken. Ist ja auch immer eine gute Übung.
-
#include <stdio.h> int main() { int a,b,c,d,e,f,g,h; printf("Geben sie gewuenschte Jahreszahl ein:\t"); scanf("d%",&a); b=(a %19)+1; c=(a/100)+1; d=(3*c/4)-12; e=((8*c+5)/25)-5; f=(5*a/1)-d-10; g=(11*b+20+e-d)%30; if (((g == 25) && (b > 11)) || (g == 24)) g++; h=44-g; if(h<21) h=h+30; h=h+7-((f+h)%7); if(h>31) { printf("April %d", h-31); } else{ printf("Maerz%d",h); } return 0; }
so sieht mein komplettes programm aus. das komische ist, dass die werte sich immer unterschieden, obwohl die gleiche eingabe erfolgt, bin grad auch am testen.
ist ja gut noch eine stunde !
was ist denn dein tipp ?
-
Bei mir läufts.
f=(5*a/1)-d-10;
Du teilst durch 1.
scanf("d%",&a);
"%d", nicht "d%"
-
Nagila Hawa schrieb:
Bei mir läufts.
f=(5*a/1)-d-10;
Du teilst durch 1.
scanf("d%",&a);
"%d", nicht "d%"
oh man nur blöde tippfehler
garnet gesehen, dass ich durch 4 muss! hattest du es von mir übernommen?
vielen dank, warst mir echt ne große hilfe! kann jetzt gleich fußball in ruhe genießen, hoffe du auch ! meint tipp ist 3:1
-
5:0!
Ich würde vorher noch die Ausgabe etwas schöner machen und etwas an der Form arbeiten.
if (((g == 25) && (b > 11)) || (g == 24))
Da sieht man zu auffällig, daß die Zeile eine ganz andere Form als der restliche code hat.
Ich habe neu geschrieben und dabei immer verglichen. und ein bischen sinnlos rumgespielt...
#include <stdio.h> int main(void) { char *pMonat[] = {"", "Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"}; int monat; int jahr; int ergebnis; int b, c, d, e, f, g, h; printf ("\nGeben sie die Jahreszahl an: "); scanf ("%d", &jahr); b = (jahr % 19) + 1; c = (jahr / 100) + 1; d = ((c * 3) / 4) - 12; e = (((c << 3) + 5) / 25) - 5; f = ((5 * jahr) / 4) - d - 10; g = ((11 * b) + 20 + e - d) % 30; if (((g == 25) && (b > 11)) || (g == 24)) g++; h = 44 - g; if (h < 21) h += 30; h = h + 7 - ((f + h) % 7); if (h > 31) { ergebnis = h - 31; monat = 3; } else { ergebnis = h; monat = 4; } printf ("\nIm Jahr %d ist der Ostersonntag am %d.%s.\n\n", jahr, ergebnis, pMonat[monat]); return 0; }
-
leider nur 1:0
also gegen portugal, muss mehr gehen!
naja back to topic
deine überarbeitung sieht sehr gut aus.
eine frage dazu,wieso hast dieses hier abgeändert:
e = (((c << 3) + 5) / 25) - 5;
-
Das ist keine sinnvolle Überarbeitung... nur Spielerei. So würde ich das Programm nicht stehen lassen.
Interessantere Überarbeitungen wären z.B. eine Überprüfung der Eingabe und die Möglichkeit das Jahr direkt über Parameter beim Aufruf mitzugeben.
Das Shiften ist auch nur Spielerei. In der Regel kann man so zeitaufwändige Multiplikationen und Divisionen beschleunigen. Das sollte der Compiler aber eigentlich selbst können.
http://www.cs.uiowa.edu/~jones/bcd/divide.html
-
Nagila Hawa schrieb:
Das "else if" aus z.B. Pascal wird in c "elif" geschrieben.
ja, als preprozessor-code. sonst bleibts beim 'else if'.
-
Ja, hast Recht... habe gerade mal ein paar alte Codes angeschaut. Überall "else if" benutzt.
Habe zu viel mit Python rumgespielt.
-
[/quote]
ja, als preprozessor-code. sonst bleibts beim 'else if'.
:)[/quote]
präprozessor!!