unexpected token else ???



  • Hallo Leute,

    kann mir jemand sagen wo mein Fehler ist? Bekomme das else in der case anweisung immer rot markiert mit der Fehlermeldung "unexpected token else" lass ich das else weg funktioniert es...

    int main(int argc, char** argv) {
    
        int tag1, monat1, jahr1, tag2,monat2,jahr2;
    
        printf("\nBitte Datum eingeben (tt.mm.jjjj):");
        scanf("%i %i %i",&tag1, &monat1,&jahr1);
    
        if (monat1>=1 && monat1 <=12 && jahr1 > 1582){
            switch (monat1) {
    
                case 28:
                    if (!((jahr1%100)%4) && (jahr1%100) || !(jahr1%400))
                        tag2=tag1+1;
                        monat2=monat1;
                    else 
                        tag2=1;
                        monat2=monat1+1;
    
                    break;
    
        } 
            printf("%i.%i.%.i--->%i.%i.%i",tag1,monat1,jahr1,tag2,monat2,jahr2);
        }
        else 
            printf("Falsche Datumseingabe!");
    
        return (EXIT_SUCCESS);
    }
    


  • Es muss lauten

    if (!((jahr1%100)%4) && (jahr1%100) || !(jahr1%400))
    {
        tag2=tag1+1;
        monat2=monat1;
    }
    else
    {
        tag2=1;
        monat2=monat1+1;
    }
    

    Achte auf die Einrückung deines Codes, das { in Zeile 23 ist irritierend, man sieht kaum dass es zum switch gehört.



  • Das else in Zeile 15 wird dem if in Zeile 8 zugeordnet. Es kann nicht dem if in Zeile 12 zugeordnet werden, weil zwischen if und else nur eine Anweisung stehen darf (oder eben ein Block). Damit kann der Compiler das zweite else nirgendwo zuordnen.



  • meinst du so??

    int main(int argc, char** argv) {
    
        int tag1, monat1, jahr1, tag2,monat2,jahr2;
    
        printf("\nBitte Datum eingeben (tt.mm.jjjj):");
        scanf("%i %i %i",&tag1, &monat1,&jahr1);
    
        if (monat1>=1 && monat1 <=12 && jahr1 > 1582)
        {
            switch (monat1)     
            {
    
                case 28:
                    if (!((jahr1%100)%4) && (jahr1%100) || !(jahr1%400))
                    {
                        tag2=tag1+1;
                        monat2=monat1;
                    }    
                    else
                    {    
                        tag2=1;
                        monat2=monat1+1;
                    }    
                    break;
    
            } 
            printf("%i.%i.%.i--->%i.%i.%i",tag1,monat1,jahr1,tag2,monat2,jahr2);
        }
        else 
            printf("Falsche Datumseingabe!");
    
        return (EXIT_SUCCESS);
    }
    


  • Kann mir jemand sagen wie ich das eleganter lösen kann mit der ersten if-Anweisung???

    Bei meinem Programm soll bei einer Datumseingabe immer der folgende Tag ausgegeben werden...

    case 31: 
    
                    if (monat1 == 1 || monat1 == 3 || monat1 == 5 || monat1 == 7 || monat1 == 8 || monat1 == 10)
                    {
                        tag2=1;
                        monat2=monat1+1;
                        jahr2=jahr1;      
                        printf("\n%02i.%02i.%04i--->%02i.%02i.%04i",tag1,monat1,jahr1,tag2,monat2,jahr2);
                    }
                    else if (monat1==12)
                    {    
                        tag2=1;
                        monat2=1;
                        jahr2=jahr1+1;
                        printf("\n%02i.%02i.%04i--->%02i.%02i.%04i",tag1,monat1,jahr1,tag2,monat2,jahr2);
                    }
                    else 
                    {
                        printf("Fehlerhafte Eingabe"); 
                    }
    
                break;
    


  • Hallo,

    beruht dein letzter Code denn immer noch auf dem vorherigen?
    Denn dort ist

    switch (monat1)    
    {
        case 28:
    

    wohl schon nicht richtig (die Abfrage müßte ja auf tag1 lauten).

    Kennst du denn schon Arrays? Üblicherweise würde man dann für die einzelnen Monate ein Array mit den maximalen Tagen anlegen (Ausnahme natürlich der Februar ;-):

    const int maxDays[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
    

    Und dann entsprechend mittels

    if (tag1 >= 1 && tag1 <= maxDays[monat1-1]) // der Array-Index ist 0-basiert (daher -1)!
    {
      // hierdrin dann die weitere Abfrage auf monat == 12 etc.
    }
    else
    {
      printf("Fehlerhafte Eingabe");
    }
    


  • Th69 schrieb:

    Kennst du denn schon Arrays? Üblicherweise würde man dann für die einzelnen Monate ein Array mit den maximalen Tagen anlegen (Ausnahme natürlich der Februar ;-):

    const int maxDays[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
    

    Oder man lässt es richtig krachen und gönnt sich eine zweite Dimension.
    Und wenn man schon so verschwenderisch unterweg ist, macht man das Array noch 1 basiert, um direkt mit den Monatszahlen indexieren zu können.

    static const int days_in_month[2][13] = {
        { -1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
        { -1, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
      };
    

    Je nachdem, ob man es mit einem Schaltjehr zu tun hat, nimmt man dann die erste oder zweite Reihe.



  • gelöscht


Anmelden zum Antworten