Brauche hilfe bei menu



  • Hallo ich bin ein totakler Anfänger in c bzw. programmieren. Da ich das grade in der Schule habe (It-Elektrotechnik) habe ich versucht ein simples programm für Schaltjahre zu schreiben nur am Menü hats dann gescheitert. Irgend ein Problem wird mir mit if angezeigt und ich hab einfach nicht herausgefunden was das Problem ist.
    Code:int main(int argc, char *argv[])
    {
    int menupunkt;
    printf("\nWaehlen sie nun aus was Sie moechten:\n");
    printf("\nFuer -Ueberpruefung des Jahres- druecken Sie die 1\n");
    printf("\nFuer -Beispiel eines Schaltjahres- druecken Sie die 2\n");
    scanf("%d", &menupunkt);

    //switch
    switch(menupunkt)
    {
    case 1: printf("test 1\n");
    break;
    case 2:

    //hier wird die eingegebene Zahl geprüft
    int jahreszahl;

    int rest4, rest100, rest400;

    printf("\nDieses Programm prüft ob das eingegebene Jahr ein Schaltjahr ist oder nicht\n");
    printf("\nDafür wird die Zahl durch erst durch 4 dann durch 100 und dann durch 400 geteilt\n");
    printf("\nBitte fueg ein Jahr ein: \n");
    scanf("%d", &jahreszahl);
    printf("Wir pruefen %d\n", jahreszahl);

    /*wir berechnen jetzt die divisionsreste.
    der Operator = transportiert das Ergebenis
    auf der rechten seite in die variable auf der linken seite */
    rest4 = jahreszahl % 4;
    rest100 = jahreszahl % 100;
    rest400 = jahreszahl % 400,
    printf("Die eErgebnisse sind: \n");
    printf(":4= %d\n:100= %d\n:400= %d\n", rest4, rest100, rest400 );
    if(rest4==0, rest100==0, rest400==0)
    {
    printf("Dieses Jahr ist ein Schaltjahr\n");
    }
    else
    {
    printf("Dieses Jahr ist kein Schaltjahr\n");
    } ;
    break;
    default: printf("Menueingabe wiederholen\n"); break;
    }
    return 0;
    }

    [code="c"]



  • Erstens: Codetags nicht gesetzt.
    So geht's:

    int main(void)
    {
        return 0;
    }
    

    Zweitens: du verwendest printf , bindest aber stdio.h nicht ein.
    Wenn du Code postest, dann immer Copy+Paste. Sonst machst du garantiert Fehler. Immer.

    Drittens: Wenn du argc und argv nicht verwendest, dann lass sie ganz raus und nimm void - siehe oben.

    Viertens: Ich weiß nicht, welchen Compiler du verwendest, aber meiner meint, "eine Marke kann nur Teil einer Anweisung sein, und eine Deklaration ist keine Anweisung" - deine Variablendeklarationen dürfen nicht im Switch-Block sein.

    Fünftens:

    if(rest4==0, rest100==0, rest400==0)
    

    Ist Blödsinn, wenn du auf alle Fälle prüfen willst, brauchst du den &&- (AND) und den ||-Operator (OR). Die Prüfung auf ein Schaltjahr packt man dann am besten gleich in seine eigene Funktion:

    int is_leap_year(uint64_t year)
    {
        return (!(year % 4) && ((year % 100) || !(year % 400)));
    }
    

    Und dann mach einfach:

    if(is_leap_year(jahreszahl))
        puts("Dieses Jahr ist ein Schaltjahr");
    else
        puts("Dieses Jahr ist kein Schaltjahr");
    

    Für uint64_t brauchst du noch stdint.h .



  • Das macht mich alles so verzweifelt und traurig wenn Leute nicht einmal ihren code markieren und auf [C] drücken können.
    Was soll denn dabei rauskommen wenn die erst mit noch anspruchsvolleren Aufgaben konfrontiert werden?



  • Das geht auch alles viel einfacher als von "dachschaden" beschrieben:
    400+100+4 addieren = 504
    Danach das Ganze mit >> 17 << 13 in das Hexaposimalsystem konvertieren und einfach nur mit 1 ANDen. Zu 99% zuverlässig.
    Setzt natürlich fundierte Kenntnisse des Hexaposimalsystems voraus. Aber das kann man sich ja aneignen,



  • EOP-hat-wiedermal-nen-Clown-gefrühstückt?
    EOP-hat-wiedermal-tierische-Langeweile?
    EOP-hat-wiedermal-falsche-Pilze-konsumiert?



  • Die Menüauswahl braucht niemand, die kann man ganz weglassen.

    Die Divisonen, die langsam sind, und problematisch (nicht durch 0 teilen usw.) kann man umgehen, in dem man logische Operationen nutzt.

    Sinnvollere Menüauswahl (wenn überhaupt): unterschiedliche Berechnungsverfahren bzw. Kalender.

    Außerdem: Module können helfen, die lassen sich einzeln testen. Das Programm könnte z.B. aus drei Modulen bestehen, die Textausgabe, das Menü mit Zeichen (y,n, 1,2,3 usw.) eingescannten Tasten und als drittes die Berechnung.


Anmelden zum Antworten