Hallo,
hab da mal wieder eine Frage zu C.
Also es geht um ein Programm, dass die Tage eines Monates ausgeben soll. Hier ist es mal
Soweit ist alles klar, einzig allein diese Zeile
macht mir Probleme. In meinem Buch steht dazu folgende Erklärung:
Soweit so klar. Nur, was machen die "!" jeweils vor den Klammern? Soweit ich es gelernt hab, ist dass das logische nicht, also der Wahrheitsgehalt wird umgedreht. Wenn ich jetzt z.B. für jahr 2008 einsetze, kommt ja dann
raus, die Bedigung ist also falsch. Jetzt versteht ich nicht, warum das als richtig durchgeht und tage=29 angezeigt wird und nicht die else Bedingung?! Oder ist meine Auflösung der if Funktion falsch? Irgendwo muss ich ja da ein "Denkfehler" haben.
Danke schon mal für eure Hilfe,
Gruß casio
hab da mal wieder eine Frage zu C.
Also es geht um ein Programm, dass die Tage eines Monates ausgeben soll. Hier ist es mal
Code:
#include <stdio.h>
main()
{
int jahr,monat,tage;
printf("\n\tKalender\n");
printf("\nBitte Jahr eingeben: ");
scanf("%i",&jahr);
printf("\nBItte 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;
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 Datumsangabe!");
return 0;
}
Code:
if (!((jahr%100)%4) && (jahr%100) || !(jahr%400))
Code:
Dies ist die Bedingung für ein Schaltjahr. Die Formulierung nutzt 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 läßt (!((jahr%100)%4)) UND das Jahr sich
nicht durch 100 teilen läßt (jahr%100) ODER es durch 400 teilbar ist (!jahr%400)), dann
wird die Bedingung wahr.
Code:
(!((2008%100)%4) && (2008%100) || !(2008%400))
(!(true)) && false || (!(false))
false && false || true
false && true
false
Danke schon mal für eure Hilfe,
Gruß casio