Tage eines Monats zählen
-
Hallo
Habe folgendes Problem.
Hab ein Programm geschrieben, das mir die Tage eines Monats zählt.
Ich kann den Monat und das Jahr selber eingeben.
Nur werden mir beim 1,3,5,7,8,10,12 Monat falsche Tage ausgegeben.Beim 2,4,6,9,11 Monat wird mir ein richtiges resultat geliefert.
Code:
#include <stdio.h> /*********************************************/ /* Author mu */ /* Datum 28.01.2008 */ /* */ /* Datei SwitchBeispiel.c */ /* Ermittelt Tagesanzahl eines Monats */ /*********************************************/ int main() { int jahr, tage, monat; printf("Tagesanzahl im Monat berechnen\n"); printf("\nJahr eingeben: "); scanf("%i", &jahr); printf("\nMonat 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; break; case 2*2: case 6: case 9: case 11: tage = 30; break; default: tage = 31; } printf("\n%i hat der Monat %i %i Tage", jahr,monat,tage); } else { printf("\nFalsche Datumsangaben!"); } return 0; }
Bin über jede antwort dankbar
-
Bei mir liefert dein Programm (fast)immer das richtige Ergebnis.
Du hast einen Fehler in der Schaltjahrberechnung gemacht. Wenn du
die Klammern richtig setzt, funktioniert es auch.if ((!(jahr % 4) && (jahr % 100)) || !(jahr % 400))
Beachte das Klammerpaar ((!(jahr % 4 ... 100)) ...
Übrigens:
((jahr % 100) % 4) == (jahr % 4)
Aber warum das jetzt bei dir nicht funktioniert, weiß ich nicht.
Gruß mcr
-
hmm, habs eben genaustens überprüft, wie es halt in meinem buch steht.
und da stehts so
if(!((jahr%100)%4) && (jahr%100) || !(jahr%400))
strange oO
-
kPt schrieb:
if(!((jahr%100)%4) && (jahr%100) || !(jahr%400))
So ist es dann dem Compiler überlassen, die Reihenfolge festzulegen.
Der gcc gibt sogar eine Warning, dass die Reihenfolge nicht eindeutig ist:a.c:26: Warnung: Klammern um && innerhalb von || empfohlen
Die Frage ist, wie ist das zu interpretieren:
!a && b || !c
Es gilt:
(!a && b) || !c != !a && (b || !c)
Warum in deinem Buch jetzt
!((jahr%100)%4)
steht, weiß ich
nicht, aber es ist das selbe wie!(jahr%4)
Gruß mcr
-
Stimmen denn deine Ergebnisse immer noch nicht?
-
dachte eigentlich immer, dass && stärker bindet als || oder? aber keine ahnung, mag auch anders sein
-
Vorden schrieb:
dachte eigentlich immer, dass && stärker bindet als || oder? aber keine ahnung, mag auch anders sein
Ich glaube, so sollte es auch sein, aber ich weiß es nicht genau.
Was ich aber sagen kann: bei mir berechnet der Code, mit der einen
geänderten Zeile, stets das richtige Ergebnis.Gruß mcr
-
&& und and binden stärker als || und or.
-
bgdnoy schrieb:
&& und and binden stärker als || und or.
ich sign das mal spontan
kanns an meiner entwicklungsumgebung liegen?
benutze eclipse cdt?
bekomme nähmlich ne warnung, jedoch steht nicht was für eine.programm läuft immer noch nicht richtig. arr..
-
Funktioniert nun einwandfrei
If-Abfrage im Buch ist falsch, oder sonst ein Fehler.
Mitif ((!(jahr % 4) && (jahr % 100)) || !(jahr % 400))
funktioniert es.
obwohl im buch stehtif (!((jahr % 4) && (jahr % 100)) || !(jahr % 400))
danke für eure hilfe
-
Hallo Leute,
So geht das ganze etwas übersichtlicher, diese switch case Verschachtelung ist ja wirlich nichts fürs Auge:1 int days_of_month(int month, int year){ 2 // Monat: 1 2 3 4 5 6 7 8 9 10 11 12 3 char months[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 4 return month == 2 && is_leap_year(year) ? 29 : month[i]; 5 }
-
Naja, was fürs Auge ist sie sicher nicht.
Aber dafür doch mal besonders kreativ
kPT schrieb:
case 2*2: case 6: case 9: case 11: tage = 30; break;
-
toller gast, da gast verg schrieb:
Hallo Leute,
So geht das ganze etwas übersichtlicher, diese switch case Verschachtelung ist ja wirlich nichts fürs Auge:1 int days_of_month(int month, int year){ 2 // Monat: 1 2 3 4 5 6 7 8 9 10 11 12 3 char months[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 4 return month == 2 && is_leap_year(year) ? 29 : month[i]; 5 }
<error detected>
month[i]<starting auto reparation routine>
... SUCCESS<showing reparation result>
month[i] replaced by months[month]