.tomtom Geschrieben 15. Juni 2011 Geschrieben 15. Juni 2011 Hallo, ich will ein Programm schreiben welches durch Eingabe des Monats und Jahr die Anzahl der Tage ermittelt und dabei auch erkennt ob es sich um ein Schaltjahr handelt oder nicht. Für die Umsetzung verwende ich folgenden Code aus dem Buch "C Programmieren von Anfang an": #include <stdio.h> main () { int jahr, monat, tage printf("\n\tK a l e n d e r\n "); printf("\nBitte Jahr eingeben: "); scanf("%i", &jahr); printf("\Bitte Monat eingeben: "); scanf("%i" ,&monat); if (monat>=1 && monat <=12 && jahr > 1582) { switch (monat) { case 2: if (!((jahr%100)%4) && (jahr%100) || !(jahr%400)) tage=29; else tage=28 breake; case 2*2: case 6: case 9: case 11: tage=30 breake; default: tage=31; } printf("\n%i hat der Monat %i %i Tage" , jahr ,monat,tage); } else printf("\nFalsche Datumsangaben!"); } Den Ablauf des Programms konnte ich soweit nachvollziehen, jedoch verstehe ich die Berechnung des Schaltjahres nicht if (!((jahr%100)%4) && (jahr%100) || !(jahr%400)) Es handelt sich hier um eine Verschachtelung von UND, ODER und NICHT Operatoren. Wenn ich nun für das Jahr "2012" einsetze dann bekomme ich folgende Aussagen: falsch UND falsch ODER richtig Wenn ich nun die Aussagen mit vergleiche komme ich auf "falsch ODER richtig" was somit "richtig" ergibt. Da die Bedingung WAHR ist, hat der Monat Februar 29 Tage. Wenn ich nun aber das ganze mit dem Jahr "2011" durchführe bekomme ich wieder eine Wahre Bedingung, jedoch war das Jahr 2011 kein Schaltjahr und somit hätte ich doch eine Falsche Bedingtung haben müssen und somit der Februar nur 28 Tage. Da ich selbst noch blutiger Anfänger bin und im Buch der Code schlecht erklärt wird weiss ich nicht wo mein Fehler ist. Vielleicht kann mir jemand von euch auf die Sprünge helfen. ich bedanke mich schon mal im vorraus .tomtom Zitieren
Klotzkopp Geschrieben 15. Juni 2011 Geschrieben 15. Juni 2011 Wenn ich nun aber das ganze mit dem Jahr "2011" durchführe bekomme ich wieder eine Wahre BedingungDas stimmt nicht. !((2011%100)%4) && (2011%100) || !(2011%400) = !(11%4) && (11) || !(11) = falsch und wahr oder falsch = falsch oder falsch = falsch Zitieren
.tomtom Geschrieben 15. Juni 2011 Autor Geschrieben 15. Juni 2011 Danke für die schnelle Antwort. Ein Fehler in meinem Gedankengang ist mir aufgefallen, ich hab nicht daran gedacht dass das % eine Divisionsrest Berechnung ausführt. ich war immer bei einer Division, aber ich versteh das noch immer nicht. Ich weiss nicht ob es daran liegt das ich seit zwölf Jahren aus der Schule raus bin oder ob ich einfach nur zu blöd bin. Im Buch steht folgendes: Die Formulierung nutz aus, dass C den Wert 0 als falsch und alles andere als wahr interpretiert. Wenn sich also die letzten zwei Stellen der Jahreszahl (jahr%100) durch 4 teilen lassen (!(jahr%100)%4) UND das Jahr sich nicht durch hundert teilen läßt ODER es durch 400 teilbar ist (!(jahr%400), dann wird die Bedingung wahr. Ich interpretiere es so: !(2011%100) =2000/100=20 Rest 11 !(11%4) =8/4=2 Rest 3 11 ist also nicht durch 4 teilbar und somit ist die Bedingung falsch, da durch, das aber das Ausrufezeichen davor steht wird sie doch zu wahr, oder irre ich mich da jetzt. (2011%100) =2000/100=20 Rest 11 Die bedingung ist wahr !(2011%400) =2000/400=5 Rest 11 Die Bedingung ist falsch also wird sie aufgrund des ! zu wahr. Und somit habe ich doch alles wahr. Zitieren
Klotzkopp Geschrieben 15. Juni 2011 Geschrieben 15. Juni 2011 11 ist also nicht durch 4 teilbar und somit ist die Bedingung falschHier ist ein Denkfehler. 11%4 ergibt 3, und 3 ist wahr. Als Wahrheitswert interpretiert, heißt % soviel wie "ist nicht teilbar durch". Zitieren
.tomtom Geschrieben 16. Juni 2011 Autor Geschrieben 16. Juni 2011 Ich danke Dir für deine Hilfe, ich weiss jetzt zumindest wie du auf "falsch" kommst. Ob ich es jedoch verstanden habe, weiss ich noch nicht so genau. Wenn ich das jetzt am Jahr 2008 teste, sieht es bei mir wie folgt aus: !(2008%100)%4) && (2008%100) || !(2008%400) tage=29; (2008%100)%4) = !falsch weil der Rest 8 durch 4 teilbar ist (2008%100) = richtig (2008%400) = !richtig Im Vergleich würde es dann so aussehen; richtig && richtig || falsch d.h. Die Bedingung ist richtig und somit ist case 2: 29 Tage Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.