Funktion addieren



  • hallo,

    weiß einer jetzt wo der fehler liegt. jetzt hab ich das mal so gemacht das man eine eingabe hat, indem man ein Datum eingeben soll. Bei der einer falschen eingabe funktioniert es jedoch wenn die Bedingung true ist der Compiler ebenfalls das gleiche aus...

    Ich hab mir das so vorgestellt, dass wenn er eine 0 zurückgibt das bedingung nicht erfüllt ist und die Meldung angezeigt bekommt. und bei einer 1 die Bedingung erfülllt ist.

    #include <stdio.h>
    #include <stdlib.h>
    
    int pruefung(int summand1, int summand2, int summand3,int summand4); // Dekleration
    
    int main()
    {
    
    int tag,monat,jahr,schaltjahr;
    
    printf("\nBitte geben Sie das Datum in der Form TT.MM.JJJJ ein!\n");
    
    printf("Eingabe:");scanf("%2u.%2u.%4u", &tag, &monat, &jahr );
    
    pruefung(tag,monat,jahr,schaltjahr);
    printf("\nBitte ueberpruefen Sie ihre Eingabe\nKeine %i. Tage in Monat %i. Jahr %i \n",tag,monat,jahr); 
    }
    
    int pruefung(int tag, int monat, int jahr,int schaltjahr)
    printf("\nBitte ueberpruefen Sie ihre Eingabe\nKeine %i. Tage in Monat %i. Jahr %i \n",tag,monat,jahr); 
    {
    
    if ( (monat ==01) &&( tag <=31)||   // Solange Bedingungen war wird das Datum ausgegeben!
    (monat ==02) && (tag <=28) ||
    (monat ==03) && (tag <=31) || 
    (monat ==04) && (tag <=30) ||
    (monat ==05) && (tag <=31) ||
    (monat ==06) && (tag <=30) ||
    (monat ==07) && (tag <=31) ||
    (monat ==8)  && (tag <=31) ||
    (monat ==9)  && (tag <=30) ||
    (monat ==10) && (tag <=31) ||
    (monat ==11) && (tag <=30) ||							
    (monat ==12) && (tag <=31) ||
    ((monat ==02) && (tag ==29)&& (schaltjahr))||
    (jahr>1583))						// Beginn des gregorianischen Kalender!
    	{
    		return 1;
    	}
    else
    	{
    
              printf("\nBitte ueberpruefen Sie ihre Eingabe\nKeine %i. Tage in Monat %i. Jahr %i \n",tag,monat,jahr); 
    		return 0;
    
    	}
    
    }
    


  • hasso schrieb:

    weiß einer jetzt wo der fehler liegt.

    MSVC v9.0 schrieb:

    Fehler 2 error C2061: Syntaxfehler: Bezeichner 'printf' d:\home\swordfish\documents\engineering\projects\codefun\c\main.c 23 C
    Fehler 3 error C2059: Syntaxfehler: ';' d:\home\swordfish\documents\engineering\projects\codefun\c\main.c 23 C
    Fehler 4 error C2059: Syntaxfehler: 'Zeichenfolge' d:\home\swordfish\documents\engineering\projects\codefun\c\main.c 23 C
    Fehler 5 error C2449: '{' auf Dateiebene gefunden - fehlt der Funktionsheader? d:\home\swordfish\documents\engineering\projects\codefun\c\main.c 24 C
    Fehler 6 error C2059: Syntaxfehler: '}' d:\home\swordfish\documents\engineering\projects\codefun\c\main.c 53 C

    cheers, Swordfish

    BTW: Der wievielte Thread zu deiner Datumsprüfung ist das jetzt? Der fünfte? Was soll das?



  • das ganze beeinhaltet doch eine Funktion. Das trifft doch zu dem thread zu.
    bei mir gibt er keine fehlermeldung an. funktioniert einwandfrei nur das der halt wie eben beschrieben ist ein interner fehler drin ist.

    lg hasso



  • hasso schrieb:

    bei mir gibt er keine fehlermeldung an.

    Dann entspricht der gepostete Code nicht dem, den du compilierst!

    hasso schrieb:

    funktioniert einwandfrei nur das der halt wie eben beschrieben ist ein interner fehler drin ist.

    Was heißt interner fehler? Bis auf die Kleinigkeit, dass schaltjahr uninitialisiert an pruefung( ) übergeben wird, lässt sich dein Code ohne Fehler ausführen.

    Wahrscheinlich willst du

    /* ... */
    
    if( !pruefung( tag, monat, jahr, schaltjahr ) ) {
    
        printf( "\nBitte ueberpruefen Sie ihre Eingabe\nKeine %i. Tage in Monat %i. Jahr %i \n", tag, monat, jahr );
    }
    

    cheers Swordfish



  • hi sowrdfish

    ich wollt das so haben:

    if (pruefung == 0)
    {
     printf("\nBitte ueberpruefen Sie ihre Eingabe\nKeine %i. Tage in Monat %i. Jahr %i \n",tag,monat,jahr);
    }
    

    meinst du das so, geht nicht ganz... ?

    #include <stdio.h>
    #include <stdlib.h>
    
    int pruefung(int summand1, int summand2, int summand3,int summand4); // Dekleration
    
    int main()
    {
    
    int tag,monat,jahr,schaltjahr;
    
    printf("\nBitte geben Sie das Datum in der Form TT.MM.JJJJ ein!\n");
    
    printf("Eingabe:");scanf("%2u.%2u.%4u", &tag, &monat, &jahr );
    
    pruefung(tag,monat,jahr,schaltjahr);
    
    if( !pruefung( tag, monat, jahr, schaltjahr ) ) { 
    
    printf( "\nBitte ueberpruefen Sie ihre Eingabe\nKeine %i. Tage in Monat %i. Jahr %i \n", tag, monat, jahr ); 
    } 
    
    }
    
    int pruefung(int tag, int monat, int jahr,int schaltjahr)
    {
    
    if ( (monat ==01) &&( tag <=31)||   // Solange Bedingungen war wird das Datum ausgegeben!
    (monat ==02) && (tag <=28) ||
    (monat ==03) && (tag <=31) || 
    (monat ==04) && (tag <=30) ||
    (monat ==05) && (tag <=31) ||
    (monat ==06) && (tag <=30) ||
    (monat ==07) && (tag <=31) ||
    (monat ==8)  && (tag <=31) ||
    (monat ==9)  && (tag <=30) ||
    (monat ==10) && (tag <=31) ||
    (monat ==11) && (tag <=30) ||							
    (monat ==12) && (tag <=31) ||
    ((monat ==02) && (tag ==29)&& (schaltjahr))||
    (jahr>1583))						// Beginn des gregorianischen Kalender!
    	{
    		return 1;
    	}
    else
    	{
    		printf("\nBitte ueberpruefen Sie ihre Eingabe\nKeine %i. Tage in Monat %i. Jahr %i \n",tag,monat,jahr); 
    		return 0;
    
    	}
    
    }
    

    lg hasso



  • Warum rufst du pruefung( ) zweimal auf? schaltjahr ist immer noch uninitialisiert!? "Funktioniert nicht ganz..." ist keine Fehlerbeschreibung.

    cheers, Swordfish



  • Swordfish schrieb:

    Warum rufst du pruefung( ) zweimal auf? schaltjahr ist immer noch uninitialisiert!? "Funktioniert nicht ganz..." ist keine Fehlerbeschreibung.

    cheers, Swordfish

    upss meine augen neigen sich für heut fast dem ende... hehe...

    Das else der Funktion gibt ja beim return (else) 0 bei einer falschen eingabe .. würde das dann nicht so funktionieren wenn ich beim hauptorogramm :

    if (pruefung == 0)
    {
     printf("\nBitte ueberpruefen Sie ihre Eingabe\nKeine %i. Tage in Monat %i. Jahr %i \n",tag,monat,jahr);
    }
    

    schreiben würde?

    jedoch passiert nichts.

    Warum nicht.?



  • fliesskomma-freak schrieb:

    hab' grad mal nachgeschaut, im C-standard steht, dass %f zum ausgeben von 'double' da ist. da steht auch nirgends, dass man ein l davor schreiben soll, denn l ist nur bei integer-typen erlaubt. kann aber auch sein, dass ich was übersehen habe.
    🙂

    Du hast nichts übersehen. Die Ellipse (...) bei printf bewirkt, dass alle Argumente nach dem Formatstring der "default argument promotion" unterzogen werden. Das heißt u.a. float wird zu double, char wird zu int. Zwischen %f und %lf muss nur bei scanf unterschieden werden.



  • hasso schrieb:

    würde das dann nicht so funktionieren wenn ich beim hauptorogramm :

    if( pruefung == 0 )
    {
     printf("\nBitte ueberpruefen Sie ihre Eingabe\nKeine %i. Tage in Monat %i. Jahr %i \n",tag,monat,jahr);
    }
    

    schreiben würde?

    Nein. Der Name einer Funktion alleine (ohne Argumentliste zum Aufruf) entspricht der Adresse der Funktion. Die Adresse ist niemals gleich 0. Du musst die Funktion aufrufen.

    cheers, Swordfish



  • hi

    bitte zeig mal wie das geht .. möcht schlafen gehen ...kein nerven mehr 🙄

    gruß hasso



  • Deine Augen scheinen diese Uhrzeiten wirklich nicht zu vertragen ^^

    Swordfish schrieb:

    Wahrscheinlich willst du

    /* ... */
    
    if( !pruefung( tag, monat, jahr, schaltjahr ) ) {
    
        printf( "\nBitte ueberpruefen Sie ihre Eingabe\nKeine %i. Tage in Monat %i. Jahr %i \n", tag, monat, jahr );
    }
    

    pruefung( ) gibt bei einem ungültigen Datum (sofern schaltjahr endlich initialisiert ist) 0 zurück. 0 entspricht false . !false ist true . Du kannst natürlich auch == 0 verwenden.

    cheers Swordfish



  • Am besten makierst du das Schaltjahr mal so dick wie möglich das ich instalieren soll , weil so geht nichts........

    #include <stdio.h>
    #include <stdlib.h>
    
    int pruefung(int summand1, int summand2, int summand3,int summand4); // Dekleration
    
    int main()
    {
    
    int tag,monat,jahr,schaltjahr;
    
    printf("\nBitte geben Sie das Datum in der Form TT.MM.JJJJ ein!\n");
    
    printf("Eingabe:");scanf("%2u.%2u.%4u", &tag, &monat, &jahr );
    
    if( !pruefung( tag, monat, jahr, schaltjahr ) ) { 
    
        printf( "\nBitte ueberpruefen Sie ihre Eingabe\nKeine %i. Tage in Monat %i. Jahr %i \n", tag, monat, jahr ); 
    }
    
    system("pause");
    
    }
    
    int pruefung(int tag, int monat, int jahr,int schaltjahr)
    {
    
    schaltjahr =((jahr%400==0) || (jahr%4==0 && jahr % 100 !=0)); // so habs installiert geht komischer weise nicht .
    
    if ( (monat ==01) &&( tag <=31)||   // Solange Bedingungen war wird das Datum ausgegeben!
    (monat ==02) && (tag <=28) ||
    (monat ==03) && (tag <=31) || 
    (monat ==04) && (tag <=30) ||
    (monat ==05) && (tag <=31) ||
    (monat ==06) && (tag <=30) ||
    (monat ==07) && (tag <=31) ||
    (monat ==8)  && (tag <=31) ||
    (monat ==9)  && (tag <=30) ||
    (monat ==10) && (tag <=31) ||
    (monat ==11) && (tag <=30) ||							
    (monat ==12) && (tag <=31) ||
    ((monat ==02) && (tag ==29)&& (schaltjahr))||
    (jahr>1583))						// Beginn des gregorianischen Kalender!
    	{
    		return 1;
    	}
    else
    	{
    
    		printf("\nBitte ueberpruefen Sie ihre Eingabe\nKeine %i. Tage in Monat %i. Jahr %i \n",tag,monat,jahr);
    		return 0;
    
    	}
    
    }
    


  • Guckst du hier Zeilen 64-77. Das kommt von deinen tausenden Threads zum gleichen Thema...

    Wenn du _in_ pruefung( ) ermittelst, ob jahr ein Schaltjahr ist, ist schaltjahr als Parameter für pruefung( ) überflüssig. Weiters passen die Parameternamen bei der deklaration von pruefung( ) nicht zur Definition.

    cheers, Swordfish



  • Swordfish schrieb:

    Guckst du hier Zeilen 64-77. Das kommt von deinen tausenden Threads zum gleichen Thema...

    Wenn du _in_ pruefung( ) ermittelst, ob jahr ein Schaltjahr ist, ist schaltjahr als Parameter für pruefung( ) überflüssig. Weiters passen die Parameternamen bei der deklaration von pruefung( ) nicht zur Definition.

    cheers, Swordfish

    Wie die passen nicht zusammen..wie passen die denn zusammen ? zeig doch mal bitte lösung dazu .

    Komischerweise klappt es ja außer wenn ich :

    if( !pruefung( tag, monat, jahr, schaltjahr ) ) { 
    
        printf( "\nBitte ueberpruefen Sie ihre Eingabe\nKeine %i. Tage in Monat %i. Jahr %i \n", tag, monat, jahr );
    

    einfüge.

    ohne dem nicht funktionierts einwandfrei nur halt das der Compiler bei einer ricchtigen eingabe ebenfalls fehlermeldung anzeigt.



  • hasso schrieb:

    Wie die passen nicht zusammen..wie passen die denn zusammen ?

    hasso schrieb:

    int pruefung(int summand1, int summand2, int summand3,int summand4); // Dekleration
    
    /* ... */
    
    int pruefung(int tag, int monat, int jahr,int schaltjahr)
    

    Noch fragen!?

    hasso schrieb:

    zeig doch mal bitte lösung dazu.

    Schön langsam hab' ich keine Lust mehr...

    hasso schrieb:

    Komischerweise klappt es ja außer wenn ich

    [...]

    ohne dem nicht funktionierts einwandfrei nur halt das der Compiler bei einer ricchtigen eingabe ebenfalls fehlermeldung anzeigt.

    ...weil es dir nicht mal die Mühe wert ist, deutsche Sätze zu schreiben: Was soll "ohne dem nicht funktionierts" bedeuten? Soll ich raten, was nicht Funktioniert? Soll ich in meine Kristallkugel gucken?

    cheers, Swordfish



  • Bashar schrieb:

    ...Die Ellipse (...) bei printf bewirkt, dass alle Argumente nach dem Formatstring der "default argument promotion" unterzogen werden. Das heißt u.a. float wird zu double, char wird zu int. Zwischen %f und %lf muss nur bei scanf unterschieden werden.

    ach tatsächlich ... nagut 🙂


Anmelden zum Antworten