Schaltjahrprogramm funzt net
-
hoffe ich hab die op-precedence noch richtig in erinnerung;)
int isLeapYear(int year){ return year%400 || year%4 && year%100; }
lg lolo
-
funktioniert danke, ich mach erstmal pause mit C für heute
-
da kann man ja nur den kopf schütteln
int isLeapYear(int year){ return year%400==0 || year%4==0 && year%100!=0; }
-
Also ich bin jetzt nicht so der C-Freak(keine Beleidigung!)und hab mal sowas gemacht. Ich glaub anfänger sehen da besser durch!
#include <stdio.h> int main() { int jahr=0; printf("Jahr: "); scanf("%ld", &jahr); if (jahr%4 == 0&& jahr%100 != 0 || jahr%400== 0) printf("Schaltjahr\n"); else printf("kein Schaltjahr"); return 0; }
-
boonLolo schrieb:
da kann man ja nur den kopf schütteln
war natürlich bezogen auf
noobLolo schrieb:
return year%400 || year%4 && year%100;
-
boonLolo schrieb:
da kann man ja nur den kopf schütteln
int isLeapYear(int year){ return year%400==0 || year%4==0 && year%100!=0; }
und nicht mal das kompiliert ohne warnung... das ja ein trauer spiel heute
int isLeapYear(int year){ return year%400==0 || (year%4==0 && year%100!=0); }
-
Wenn die Jahre gleichverteilt erwartet werden (will sagen, wenn jedes Jahr mit der gleichen Wahrscheinlichkeit erwartet wird wie jedes andere) ist es wegen lazy evaluation sorum sinnvoller:
bool is_leap_year(unsigned year) { return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0); }
Auf die Art erschlägt man 75% der möglichen Fälle mit einer Überprüfung, 24,75% mit 2 und braucht nur für 0,25% den gesamten Code.
Bevor jemand fragt: Der Parameter ist unsigned, weil diese spezielle Schaltjahrregelung erst seit 1582 gilt. Ganz korrekt könnte man die Funktion etwa so implementieren:
bool is_leap_year(int year) { return year % 4 == 0 && (year < 1700 || year % 100 != 0 || year % 400 == 0); }
...jedenfalls korrekt ab -45. Ich bin jetzt nicht sicher, wie das mit dem Jahr 0 ist.
-
Es gibt kein Jahr 0. Es wurde mit 1 begonnen und alle vorherigen Jahre waren dann -1, -2, -3, ...
(das Jahr 1 wurde nachträglich festgesetzt, da es sich ja auf das Geburtsjahr von JC (oder Gottes Sohn oder so ähnlich) bezieht).
-
Reicht kein Rest bei durch 4 nicht aus?
#include <stdio.h> #define Schaltjahr(x) !(x%4) int main(void) { int jahr; printf("Jahr: "); scanf("%d", &jahr); printf((Schaltjahr(jahr) ? "Schaltjahr" : "Kein Schaltjahr") "\n"); return 0; }
-
naja kommt ein bischen darauf an wie lang das programm laufen soll;) also der nächste fehler vom heutigen datum wär doch dann das jahr 2100 oder?
btw. frag mich ja wiso immer mein name verhonepipelt wird...
lg lolo
-
mein prog funktioniert, danke für die hilfe!
#include <stdio.h> int isLeapYear(int year); int main() { int year; printf("Jahr: "); scanf("%d", &year); if (isLeapYear(year) == 1) puts("Schaltjahr"); else puts("Kein Schaltjahr"); return 0; } int isLeapYear(int year){ return year%400==0 || (year%4==0 && year%100!=0); }
-
seldon schrieb:
return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
ist besser, da der selten auftretende fall year%400 == 0 der ja nur alle 400 jahre auftritt nur alle 100 jahre getestet...
evtl. könnte man für sprachen die nicht gut optimieren (altes js?) folgendes verwenden
seldon schrieb:
return (year&0x3) == 0 && (year % 100 != 0 || year % 400 == 0);
lg lolo
-
boonLolo schrieb:
da kann man ja nur den kopf schütteln
int isLeapYear(int year){ return year%400==0 || year%4==0 && year%100!=0; }
Deine Version ist hässlicher. Seine hatte nur eine fehlende Negation und keine Klammern.