Schaltjahrprogramm funzt net



  • 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.


Anmelden zum Antworten