Unbekannter Fehler



  • also hasso, ich bin erstaunt, wie lernresistent du bist, ehrlich. Hast du denn nichts aus all unseren Antworten zu deinen Datum-Problemen gelernt?

    1. solche rießige if Afragen sind schwer zu debugen. Verwende doch eine lookuptable, vereinfache die if-Anfrage: Du prüfst jedes Mal, dass Jahr größer als 1582 sein soll (warum auch immer), warum prüfst du es in jeder Zeile?

    2. lies mal ein gescheites Buch über C (oder online Tutorial) und schau dir nochmal, wie man Funktionen schreibt. Wieso sollte die Funktion 'pruefung' überhaupt Parameter bekommen? Die Datumeingabe machst du direkt in 'pruefung', d.h. du übergibst an 'pruefung' an sich Müll. Wozu denn Parameter?

    3. Überprüfe nicht dasselbe 2 Mal hintereinander. Du überprüfst obs Datum plausibel ist. Ok, aber dann überprüfst in der while-Bedingung dasselbe. Wieso speicherst du nicht z.B. das Ergebnis der ersten Überpfüfung nicht einfach ab?

    4. Wenn eine Funktion nicht vom Typ void ist, dann musst du auch etwas zurückgeben? Wo ist das return in main???

    5. An deiner Stelle würde ich für die Anzahl der Tagen eine Lookuptable verwenden. Dein Programm könnte so aussehen:

    #include <stdio.h>
    
    /* eine simple lookup-table */
    static int tagen_der_monaten[] =
    {
        31, /* jan */
        28, /* feb */
        31, /* mrz */
        30, /* apr */
        31, /* mai */
        30, /* jun */
        31, /* jul */
        31, /* aug */
        30, /* sep */
        31, /* okt */
        30, /* nov */
        31 /* dez */
    };
    
    int pruefung(void);
    
    int main(void)
    {
        char weiter;
    
        printf("\n\t**********************************"
               "\n\t*****Gregorianischer Kalender*****"
               "\n\t**********************************\n");
    
        do {
    
            if ( pruefung() )
                printf("\nDatum ist Plausibel!\n");
    
            printf("\nProgramm Wiederholen(j/n)?\n");
            weiter=getchar();
        } while(weiter == 'j');
    
        printf("\t...Wir hoffen das Programm hat ihnen trozdem gefallen...\a\n");
    
        return 0;
    }
    
    int pruefung(void)
    {
        int tag, monat, jahr, schaltjahr, c;
    
        printf("\nBitte geben Sie das Datum in der Form TT.MM.JJJJ ein!\n");
        printf("Eingabe: ");
        scanf( "%2u.%2u.%4u", &tag, &monat, &jahr );
    
        /* stdin leeren */
        while( (c=getchar()) != '\n');
    
        schaltjahr = (!(jahr%4 && jahr %100 && jahr%400));
    
        /* am einfachsten ist es zu pruefen, ob die eingegeben Daten
         * ausserhalb der Graenzen sich befinden. */
    
        if(jahr <= 1582 || monat < 1 || monat > 12)
        {
            printf("Falsches Jahr bzw. falscher Monat\n");
            return 0;
        }
    
        if(tag < 1 || tag > tagen_der_monaten[monat - 1])
        {
            /* So vielen Tagen hat einen Monat nicht 
             * Einzige Ausnahme: Schaltjahr, es Feb. und der Tag 29 */
            if( !(schaltjahr && monat == 2 && tag == 29) )
            {
                printf("\t\nBitte ueberpruefen Sie ihre Eingabe\n");
                printf("\tKeine %i. Tage in Monat %i. Jahr %i\a\n",tag,monat,jahr);
                return 0;
            }
        }
    
        printf("\n\t--------------------------------------");
        printf("\n\tTag:%i Monat:%i Jahr:%i Schaltjahr:%i",tag, monat, jahr, schaltjahr);
        printf("\n\t--------------------------------------");
    
        /* datum ist plausibel */
    
        return 1;
    }
    

    edit:
    @ramis:

    wenn die Bedienung monat == 01 wahr ist,
    dann werden die anderen Bedinungen (tag <= 31 ), ( jahr > 1582 ) nicht geprüft,

    nein, wenn die Bedienung monat == 01 wahr ist, müssen (tag <= 31 ), ( jahr > 1582 ) gerade wegen der && geprüft werden 😉



  • hi Supertux

    Zu 1: In dem Fall muss das Jahr immer überprüft werden. Weiß noch nicht warum, aber wenn ich es nur einmal überprüfe klappts nicht. habs versucht.

    ZU 2: Ist mir klar , das wollte ich noch machen der Code ist was alt. habs aber jetzt mal verbessert .

    ZU 3: NEIN. Ich überprüfe nicht 2 mal das SELBE!
    Diese Prüfung soll solange für neu einzugebende Daten wiederholt werden, bis das zuletzt
    eingegebene Datum plausibel ist.

    Das heisst.. solange das datum FLASCH ist soll es mit der mithilfe der do while schleife die eingabe wiederholt werden. Und wenn es dann richtig eingegeben ist soll stehen Datum Plausibel.

    Zu 4: main ist jetzt vom typ void.

    Vielleicht kannst du mir jetzt sagen warum das Programm nicht so läuft wie ich es mir vorstelle. Die genannten Fehler sind ja nicht ursache für mein wirkliches Problem.

    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    
    int pruefung(); // Dekleration der Funktion pruefung
    
    void main (void) {
    
    char weiter ='j'; 
    
    printf("\n\t**********************************"
    	   "\n\t*****Gregorianischer Kalender*****"								  								  
    	   "\n\t**********************************\n");
    
    while(weiter == 'j')										// Programm wiederholt sich solange
    {															//weiter identisch 'j'
    
    		if ( pruefung() )
    		{
    			printf("\nDatum ist Plausibel!\n");
    
    		}
    
    			printf("\nProgramm Wiederholen(j/n)?\n");
    			weiter=getch();
    
    		if (weiter != 'j')
    		{
    		printf("\t...Wir hoffen das Programm hat ihnen trozdem gefallen...\a\n");
    
    	}
    
    }
    	getchar();
    
    }
    
    int pruefung(){
    
    int tag = 0, monat = 0, jahr = 0, schaltjahr = 0;			// Definiere Variablen
    
    do
    { 
    
    printf("\nBitte geben Sie das Datum in der Form TT.MM.JJJJ ein!\n");
    
    printf("Eingabe:");scanf( "%2u.%2u.%4u", &tag, &monat, &jahr );
    
    schaltjahr = (!(jahr%4 && jahr %100 && jahr%400));
    
    if( ( monat == 01) && (tag <= 31 ) && ( jahr > 1582 ) ||		// prüfmodul -> Überprüft Datum auf Plausibilität  
     ( monat == 02 ) && ( tag <= 28 ) && ( jahr > 1582 )  ||
     ( monat == 03 ) && ( tag <= 31 ) && ( jahr > 1582 )  || 
     ( monat == 04 ) && ( tag <= 30 ) && ( jahr > 1582 )  ||
     ( monat == 05 ) && ( tag <= 31 ) && ( jahr > 1582 )  ||
     ( monat == 06 ) && ( tag <= 30 ) && ( jahr > 1582 )  ||
     ( monat == 07 ) && ( tag <= 31 ) && ( jahr > 1582 )  ||
     ( monat ==  8 ) && ( tag <= 31 ) && ( jahr > 1582 )  ||
     ( monat ==  9 ) && ( tag <= 30 ) && ( jahr > 1582 )  ||
     ( monat == 10 ) && ( tag <= 31 ) && ( jahr > 1582 )  ||
     ( monat == 11 ) && ( tag <= 30 ) && ( jahr > 1582 )  ||						
     ( monat == 12 ) && ( tag <= 31 ) && ( jahr > 1582 )  ||
     ( monat ==02  ) && ( tag == 29 ) && ( schaltjahr ) && ( jahr > 1582 )   )
    
    	{
    		printf("\n\t--------------------------------------");
    		printf("\n\tTag:%i Monat:%i Jahr:%i Schaltjahr:%i",tag, monat, jahr, schaltjahr); // Wenn das Datum Plausibel ist,
    		printf("\n\t--------------------------------------");							  // wird das Datum ausgeben	
    		return (1);																		  // Rückgabewert 1
    	}
    
    else
    
    	{
    
    		printf("\t\nBitte ueberpruefen Sie ihre Eingabe\n");
    		printf("\tKeine %i. Tage in Monat %i. Jahr %i\a\n",tag,monat,jahr); 
    		return (0);
    
    	}
    
    }while( ( monat == 01)  && ( tag > 31 ) && ( jahr < 1582 )  ||							  
     ( monat == 02 ) && ( tag > 28 ) && ( jahr < 1582 ) 		||
     ( monat == 02 ) && ( tag == 29 ) && ( !( schaltjahr ) ) 	||
     ( monat == 03 ) && ( tag > 31 ) && ( jahr < 1582 ) || 
     ( monat == 04 ) && ( tag > 30 ) && ( jahr < 1582 )  ||
     ( monat == 05 ) && ( tag > 31 ) && ( jahr < 1582 )  ||
     ( monat == 06 ) && ( tag > 30 ) && ( jahr < 1582 )  ||
     ( monat == 07 ) && ( tag > 31 ) && ( jahr < 1582 )  ||
     ( monat ==  8 ) && ( tag > 31 ) && ( jahr < 1582 )  ||
     ( monat ==  9 ) && ( tag > 30 ) && ( jahr < 1582 )  ||
     ( monat == 10 ) && ( tag > 31 ) && ( jahr < 1582 )  ||
     ( monat == 11 ) && ( tag > 30 ) && ( jahr < 1582 )  ||						
     ( monat == 12 ) && ( tag > 31 ) && ( jahr < 1582 ) );
    
    }
    


  • das letzte mal hab ich mich geirt 🙄

    Aber dieses mal sollte es richtig sein 😃
    In der function pruefung
    return 0; durch continue; ersetzen

    und das hier

    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    
    /* eine simple lookup-table */
    static int tagen_der_monaten[] =
    {
        31, /* jan */
        28, /* feb */
        31, /* mrz */
        30, /* apr */
        31, /* mai */
        30, /* jun */
        31, /* jul */
        31, /* aug */
        30, /* sep */
        31, /* okt */
        30, /* nov */
        31 /* dez */
    };
    
    int pruefung();
    bool nochmal();
    
    int main ()
    {
    	printf("\n\t**********************************"
    			"\n\t*****Gregorianischer Kalender*****"
    			"\n\t**********************************\n");
    
    	while(1)
    	{
            if( pruefung() )
            {
                printf("\nDatum ist Plausibel!\n");
            }
    
            if( !nochmal() )
            {
    			printf("\n\n\t...Wir hoffen das Programm hat ihnen trozdem gefallen...\a\n");
    			getchar();
    			return 0;
    		}
    	}
        return 0;
    }
    
    int pruefung(void)
    {
    while(1)
    {
        int tag, monat, jahr, schaltjahr, c; 
    
    	printf("\nBitte geben Sie das Datum in der Form TT.MM.JJJJ ein!\n");
    	printf("Eingabe:");
    	scanf( "%2u.%2u.%4u", &tag, &monat, &jahr );
    
    	schaltjahr = (!(jahr%4 && jahr %100 && jahr%400));
    
        /* stdin leeren */
        while( (c=getchar()) != '\n');
    
        /* am einfachsten ist es zu pruefen, ob die eingegeben Daten
         * ausserhalb der Graenzen sich befinden. */
    
        if(jahr <= 1582 || monat < 1 || monat > 12)
        {
            printf("Falsches Jahr bzw. falscher Monat\n");
            continue;
        }
    
        if(tag < 1 || tag > tagen_der_monaten[monat - 1])
        {
            /* So vielen Tagen hat einen Monat nicht
             * Einzige Ausnahme: Schaltjahr, es Feb. und der Tag 29 */
            if( !(schaltjahr && monat == 2 && tag == 29) )
            {
                printf("\t\nBitte ueberpruefen Sie ihre Eingabe\n");
                printf("\tKeine %i. Tage in Monat %i. Jahr %i\a\n",tag,monat,jahr);
                continue;
            }
        }
    
        printf("\n\t--------------------------------------");
        printf("\n\tTag:%i Monat:%i Jahr:%i Schaltjahr:%i",tag, monat, jahr, schaltjahr);
        printf("\n\t--------------------------------------");
    
        /* datum ist plausibel */
    
        return 1;
    }
    }
    
    bool nochmal()
    {
    	char weiter;
    
    	printf("\n\nProgramm Wiederholen(j/n)?\n");
    
    	while(1)
    	{
    		weiter = getch();
    
    		if( weiter == 'j' ) return true;
    		else if( weiter == 'n' ) return false;
    		else continue;
    	}
    }
    


  • hasso schrieb:

    Zu 1: In dem Fall muss das Jahr immer überprüft werden. Weiß noch nicht warum, aber wenn ich es nur einmal überprüfe klappts nicht. habs versucht.

    das warum ist simpel. Das gregorianische Kalender gibt es erst seit 1582. Meine Anmerkung liegt aber in der Art, wie du überprüfst.

    Siehe folgende Aussage:

    (A && X) || (B && X) || (C && X) ....
    

    diese Aussage ist äquivalent zu

    X && (A || B || C ...)
    

    In deinem Fall entspricht X die Bediendung "jahr > 1582". Indem du die if-Anweisung veränderst, wird sie kleiner und einfacher zu debuggen.

    D.h. du kannst alles so einfacher überprüfen

    if(X nicht gilt)
      FEHLER MELDUNG, beeden
    
    if(A || B || C ....)
      TUE WAS HIER GELTEN SOLL
    

    das vereinfacht den Code.

    hasso schrieb:

    ZU 2: Ist mir klar , das wollte ich noch machen der Code ist was alt. habs aber jetzt mal verbessert .

    wenn es dir klar, warum machst du es falsch?

    hasso schrieb:

    ZU 3: NEIN. Ich überprüfe nicht 2 mal das SELBE!
    Diese Prüfung soll solange für neu einzugebende Daten wiederholt werden, bis das zuletzt
    eingegebene Datum plausibel ist.

    Das heisst.. solange das datum FLASCH ist soll es mit der mithilfe der do while schleife die eingabe wiederholt werden. Und wenn es dann richtig eingegeben ist soll stehen Datum Plausibel.

    lies dir deine eigene Worte. Du überprüfst dasselbe, nur ein bisschen anders ausgedruckt. Im oberen if übrprüfst du, ob da eingegebe Datum plausibel ist. In der while Schlefe überprüfst du wieder, ob das eingegebe Datum plausibel ist, nur anders geschrieben 🙄 am Ende kommt es auf das selbe hinaus

    do {
      var = is_datum_plausibel();
    
      if (var == TRUE)
        PRINT "JA"
        RETURN 1
      ELSE
        PRINT "NEIN"
    } while(not var)
    

    ich könnte in while noch einmal is_datum_plausibel() aufrufen, muss ich aber nicht. Bei dir ist es genau dasselbe.

    Außerdem wozu willst du das so machen? Die main Funktion ruft ehe sowieso 'pruefung()' wieder auf.

    hasso schrieb:

    Zu 4: main ist jetzt vom typ void.

    iiiiiiiiiii..... nicht nur dass du damit absichtlich einen schweren Fehler machst, sondern du wagst dich den halbwegs korrekten Code durch einen fehlerhaften Code zu erzeten. main darf NIEMALS void sein, das ist (glaub ich) das 3. Mal, dass ich es dir sage.

    hasso schrieb:

    Vielleicht kannst du mir jetzt sagen warum das Programm nicht so läuft wie ich es mir vorstelle. Die genannten Fehler sind ja nicht ursache für mein wirkliches Problem.

    Mein Gott, jemanden wie dich habe ich noch nie gesehen und ich bin schon eine lange Weile hier Mitglied. Jemanden so lernresisten kann es wirklich nicht geben. Kannst du denn nicht die Antworten lesen, die wir schreiben??? Wieso postest du wieder den langen unnötigen Code, wenn ich dir einen sauberen Code gegeben hab, damit du dich damit auseinander setzt und vielleicht etwas daraus lernst. Du bist echt ein hoffnungloser Fall, ich geb's auf, du bist eher nicht mehr zu retten/helfen.



  • Boa junge deine antworten helfen einen wirklich NULL weiter!
    Ich frage dich etwas du du textest mir einen CODE.

    Ich hab ein eigenen der nur ein wenig verbesserungsbedürftig ist.

    Du hast bis jetzt noch immer nicht den SINN der frage verstanden.

    Ich nimm die frage zurück. basta



  • hasso schrieb:

    Du hast bis jetzt noch immer nicht den SINN der frage verstanden.

    cheers, Swordfish

    PS: Bist du eigentlich echt?



  • hasso schrieb:

    Boa junge deine antworten helfen einen wirklich NULL weiter!
    Ich frage dich etwas du du textest mir einen CODE.

    Ich hab ein eigenen der nur ein wenig verbesserungsbedürftig ist.

    Du hast bis jetzt noch immer nicht den SINN der frage verstanden.

    Ich nimm die frage zurück. basta

    je mehr du postest, umso klarer wird es mir, dass du hier nur trollen willst. Ich werd mich in Zukunft aus deinem Threads zurückhalten, hab besseres zu tun. --> don't feed the trolls.



  • Den Sinn Deiner Frage habe ich auch nicht verstanden 🙂

    Hasso, Du aber auch nicht Deine Frage. Hättest Du das, hättest Du auch kein
    Problem. Jo Mei ist das lustig ... Bevor hier noch mehr über Sinn und Unsinn Deiner
    Frage philosophiert wird, formuliere die Frage mal sauber.

    Das ist dann schon fast der Quelltext.



  • supertux schrieb:

    iiiiiiiiiii..... nicht nur dass du damit absichtlich einen schweren Fehler machst, sondern du wagst dich den halbwegs korrekten Code durch einen fehlerhaften Code zu erzeten. main darf NIEMALS void sein, das ist (glaub ich) das 3. Mal, dass ich es dir sage.

    du übertreibst etwas. 'int main' ist nur in einer 'hosted implementation' zwingend. selbst wenn man es falsch macht, wird es auf 99% aller computersysteme der welt keine probleme geben.
    🙂



  • Lieber hasso,
    ich würde Dir drigend empfehlen dieses Dokument zu lesen.

    Da Du die Frage ohnehin zurück gezogen hast und ich nicht will, dass dieser Thread ausartet, schließe ich ihn.


Anmelden zum Antworten