Frage von Ostrong, 24

Brauche dringend Hilfe bei einem C Programm!?

Muss ich für eine Programmier Hausübung programmieren. Jedoch erschafft dieser Code nichts als ständig wieder nach einer Datumseingabe zu fragen. Findet jemand hier den Fehler? //Preprozessoranweisungen #include #include #include

//Prototypen int pruefeDatum(int tag, int monat, int jahr); int leseDatum(int *t,int *m,int *j);

int main() { int t, m, j;

if(leseDatum(&t, &m, &j) == 1)
{
    printf("Eingegebenes Datum:%d.%d.%d", t, m, j);
}

return 0;

} int pruefeDatum(int tag, int monat, int jahr) { leseDatum(&tag, &monat, &jahr);

switch(monat)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
    if(tag>=1 && tag<=31)
    {
        return 1;
    }
    else
    {
        return 0;
    }
case 4:
case 6:
case 9:
case 11:
    if(tag>=1 && tag<=30)
    {
        return 1;
    }
    else
    {
        return 0;
    }
case 2:
    if (jahr%400 == 0 || jahr%4 ==0 && jahr%100 != 0)
    {
        if(tag>=1 && tag <=28)
        {
            return 0;
        }
        else if(tag==29)
        {
            return 1;
        }
    }
    else
    {
        if(tag>=1 && tag<=28)
        {
            return 1;
        }
        else
        {
            return 0;
        }
    }
}
return 0;

} int leseDatum(int t,int m,int j) { printf("Gueltiges Datum eingeben:\n"); scanf("%d.%d.%d", &t, &m, &j);

if(pruefeDatum(*t, *m, *j) == 1)
{
    return 1;
}
return 0;

}

Antwort
von Suboptimierer, 10

Mir fällt da so einiges auf. Das Witzigste vorab:

if(pruefeDatum(*t, *m, *j) == 1)
{
  return 1;
}
return 0;

Das kannst du abkürzen zu:

return pruefeDatum(*t, *m, *j);

_____________

In main übergibst du die Parameter von leseDatum als Adresse, obwohl in der Deklaration der Parameter keine Adresse erwartet wird.

In leseDatum übergibst du die Parameter mit Sternchen, obwohl in der Deklaration nur normale Datentypen stehen.

Also da hast du auf jeden Fall noch irgendwo ein Problem, allein schon weil du die Parameter nicht einheitlich übergibst.

Ich bin schon lange raus da, aber du solltest dich unbedingt einmal mit dem Thema Zeiger und Referenzen beschäftigen.

_____________

Deine Endlosschleife:

main → leseDatum → pruefeDatum → leseDatum → pruefeDatum → ...

leseDatum und pruefeDatum rufen sich permanent gegenseitig auf, ohne dass der Aufruf übersprungen werden kann.

_____________

Die Schaltjahrabfrage ist meiner Meinung nach falsch.

Der 2. Februar 2000 wird z. B. als falsch erkannt, da in den oberen if eingestiegen wird und in den zweiten auch (tag>=1 && tag<=28) und dann 0 zurück gegeben wird.

Im Februar würde ich 1-28 grundsätzlich zulassen und nur falls tag==29 ist, die komplizierte Schaltjahrsregelprüfung durchführen.

Schreib dir am besten noch eine Funktion istSchaltjahr.

_____________


Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten