Schaltjahrprogramm funzt net



  • ich soll folgemde aufgabe lösen,

    erstellen sie ein programm das berechnet, ob die eingebene jahreszahl ein schaltjahr ist.

    Hinweis: Ein Schaltjahr ist alle 4 Jahre, jedoch alle 100 Jahre nicht, dann aber alle 400 Jahre doch.

    nur funzt mein prog nicht, ich dreh so langsam ab ich teste immer mit 1804 welches ein schaltjahr ist und jedesmal kommt "kein schaltjahr" 😡 😮

    #include <stdio.h>
    
    int main()
    {
    int jahr;
    
    printf("Jahr:  ");
    scanf("%d", &jahr);
    
    if (jahr%4 == 0)
    
    	if (jahr%100 != 0)
    
    		if (jahr%400 == 0)
    		printf("Schaltjahr\n");
    
    		else
    		printf("Kein Schaltjahr\n");
    	else
    	printf("Kein Schaltjahr\n");
    else
    printf("Kein Schaltjahr\n");
    return 0;
    }
    


  • ichDrehAb schrieb:

    #include <stdio.h>
    
    int main()
    {
    int jahr;
    
    printf("Jahr:  ");
    scanf("%d", &jahr);
    
    if (jahr%4 == 0)
    
    	if (jahr%100 != 0)
    
    		if (jahr%400 == 0)
    		printf("Schaltjahr\n");
    
    		else
    		printf("Kein Schaltjahr\n");
    	else
    	printf("Kein Schaltjahr\n");
    else
    printf("Kein Schaltjahr\n");
    return 0;
    }
    

    auch wenn da jetzt das halbe forum kotzt

    int isLeapYear(int year){
      if(jahr%400 == 0){
        return 1;
      }else{
        if(jahr%4 == 0)
          if(jahr%100 != 0){
            return 1;
          }
        }
      }
      return 0;
    }
    


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


Anmelden zum Antworten