Funktionen ? Problem mit Programmiervorgang



  • Guten Tag alle miteinander,

    ich habe ein Problem. Also folgendes ich soll folgendes Programm schreiben. Diese lautet so:

    Schreiben Sie ein Geometrieprogramm zur Berechnung eines Quaders.

    Schreiben Sie jeweils für die Oberflächenberechnung
    und die Volumenberechnung, eine Funktion. / void OF( ) und void V( ) /
    Die Auswahl der Funktionen soll mit switch and case erfolgen.

    Zusatz: Die Eingabe der Werte sowie die Ausgabe der Ergebnisse soll ebenfalls als Funktion
    erstellt werden.

    Die erstellten Funktionen sollen lediglich im Programm aufgerufen werden (noch) keine Wertübergabe vornehmen.

    Ich habe auch schon angefangen aber ich denke ich habe einen Denkfehler.

    Hier mein Quelltext:

    __________________________________________________________________________

    #include<stdio.h>
    #include<conio.h>
    #include<math.h>
    
    void OF (void)
      {
          O=2*(a*b+a*c+b*c);
      }
    
      void V (void)
      {
          V=a*b*c;
      }
    
    void  main ( )
    {
    int cat,d;
    float a,b,c,O,V;
    
    printf("Geometrie Programm\n");
    printf("\n");
    printf("Das Geometrie Programm ermoeglicht es das Volumen oder die Oberflaeche eines Quaders zu berechnen.");
    printf("\n");
    printf("\n");
    printf("Bitte geben Sie die Kanten längen ein!");
    printf("Kante (a): ");
    printf("%f",&a);
    printf("Kante (b): ");
    printf("%f",&b);
    printf("Kante (c): ");
    printf("%f",&c);
    
    printf("Waehlen Sie\nVolumen   (1)\nOberflaeche   (2)\nBeides  (3)");
    scanf("%d",&cat);
    
    if (cat>3)
    printf ("\nSie muessen eine Zahl von 1-3 eingeben");
    else
    switch (cat)
    	{
       case 1:
       	V ()
       	printf (" Das Volumen betraegt %f, V");
          break;
       case 2:
      	OF ()
       	printf (" Die Oberflaeche betraegt %f, O");
          break;
       case 3:
      	V ()
       	printf (" Das Volumen betraegt %f, V");
            OF ()
       	printf (" Die Oberflaeche betraegt %f, O");
    	break;
       }
    
    getch();
    }
    

    _____________________________________________________________________________

    Fehler von Dev ++

    ___________________________________________-

    Compiler: Default compiler
    Building Makefile: "C:\Users\Arbeit\Desktop\Schule\Programmierung\C\C Home\S32\2\Makefile.win"
    Führt make... aus
    make.exe -f "C:\Users\Arbeit\Desktop\Schule\Programmierung\C\C Home\S32\2\Makefile.win" all
    gcc.exe -c main.c -o main.o -I"e:/Dev-Cpp/include"

    main.c: In function OF': main.c:7: error:O' undeclared (first use in this function)
    main.c:7: error: (Each undeclared identifier is reported only once
    main.c:7: error: for each function it appears in.)
    main.c:7: error: a' undeclared (first use in this function) main.c:7: error:b' undeclared (first use in this function)
    main.c:7: error: `c' undeclared (first use in this function)

    main.c: In function V': main.c:12: error:a' undeclared (first use in this function)
    main.c:12: error: b' undeclared (first use in this function) main.c:12: error:c' undeclared (first use in this function)
    main.c: In function main': main.c:42: error: called object is not a function main.c:43: error: syntax error before "printf" main.c:47: error: syntax error before "printf" main.c:50: error: called object is not a function main.c:51: error: syntax error before "printf" main.c:53: error: syntax error before "printf" main.c:16: warning: return type of 'main' is notint'

    make.exe: *** [main.o] Error 1

    Ausführung beendet

    _____________________________________________________________________

    Wo liegt mein Fehler? Ich würde mich freuen, wenn mit jemand helfen könnte. Danke schonmal im Voraus.

    Mit freundlichen Grueßen

    Christian Rehbein



  • ChristianRehbein schrieb:

    Wo liegt mein Fehler?

    Gegenfrage: was funktioniert denn nicht? Üblicherweise sollte man eine Fehlerbeschreibung (Fehlverhalten, Compiler-Errors, Runtime-Errors...) zum Code mitliefern. 😉



  • ChristianRehbein schrieb:

    Wo liegt mein Fehler? Ich würde mich freuen, wenn mit jemand helfen könnte. Danke schonmal im Voraus.

    z.b, die funktionen OF und V kennen die variablen nicht. nimm sie aus der 'main' raus und tu sie ganz nach oben.
    🙂



  • Ausserdem fehlt hinter jedem Funktionsaufruf das Semikolon

    OF();
    


  • Kleine Anmerkung: deinen Code solltest du in Code-Tags packen, damit Syntax-Highlighting angewendet wird und er lesbarer ist. Dazu musst du den Code mit [cpp] und [/cpp] umschließen.



  • Habe das jetzt so geändert, aber es funktioniert immer noch nicht, ich bin Anfänger tut mir leid wenn ich mich zu dumm anstelle.

    ________________________________________________

    #include<stdio.h> 
    #include<conio.h> 
    #include<math.h> 
    
    float OF,V;
    void OF (void);
    { 
    O=2*(a*b+a*c+b*c); 
    } 
    
    void V (void);
    { 
    V=a*b*c; 
    } 
    
    void main ( ) 
    { 
    int cat,d; 
    float a,b,c; 
    
    printf("Geometrie Programm\n"); 
    printf("\n"); 
    printf("Das Geometrie Programm ermoeglicht es das Volumen oder die Oberflaeche eines Quaders zu berechnen."); 
    printf("\n"); 
    printf("\n"); 
    printf("Bitte geben Sie die Kanten längen ein!"); 
    printf("Kante (a): "); 
    printf("%f",&a); 
    printf("Kante (b): "); 
    printf("%f",&b); 
    printf("Kante (c): "); 
    printf("%f",&c); 
    
    printf("Waehlen Sie\nVolumen (1)\nOberflaeche (2)\nBeides (3)"); 
    scanf("%d",&cat); 
    
    if (cat>3) 
    printf ("\nSie muessen eine Zahl von 1-3 eingeben"); 
    else 
    switch (cat) 
    { 
    case 1: 
    V ();
    printf (" Das Volumen betraegt %f, V"); 
    break; 
    case 2: 
    OF (); 
    printf (" Die Oberflaeche betraegt %f, O"); 
    break; 
    case 3: 
    V ();
    printf (" Das Volumen betraegt %f, V"); 
    OF (); 
    printf (" Die Oberflaeche betraegt %f, O"); 
    break; 
    } 
    
    getch(); 
    }
    

    ___________________________________________________________________

    Fehlerlog:

    Compiler: Default compiler
    Building Makefile: "C:\Users\Arbeit\Desktop\Schule\Programmierung\C\C Home\S32\2\Makefile.win"
    Führt make... aus
    make.exe -f "C:\Users\Arbeit\Desktop\Schule\Programmierung\C\C Home\S32\2\Makefile.win" all
    gcc.exe -c main.c -o main.o -I"e:/Dev-Cpp/include"

    main.c:6: error: 'OF' redeclared as different kind of symbol
    main.c:5: error: previous declaration of 'OF' was here
    main.c:7: error: syntax error before '{' token
    main.c:11: error: 'V' redeclared as different kind of symbol
    main.c:5: error: previous declaration of 'V' was here
    main.c:12: error: syntax error before '{' token

    main.c: In function main': main.c:17: warning: return type of 'main' is notint'

    make.exe: *** [main.o] Error 1

    Ausführung beendet



  • ChristianRehbein schrieb:

    float OF,V;    //OF kann nicht Bezeichner für eine Variable UND eine Funktion sein. Überleg dir einfach andere Namen.
    void OF (void);  //Das Semikolon ist hier falsch, da du keinen Funktionsprototyp notieren willst, sondern die Implementation der Funktion (also mit Body).
    { 
    O=2*(a*b+a*c+b*c); 
    }
    

    EDIT: Übrigens wird er auch hier wieder die Variablen nicht kennen. Innerhalb der Funktion gibt es keine Variablen a, b oder c. Eine Möglichkeit wäre, die einfach global zu machen (wie fricky schon erwähnt hat). Die andere (aufwendiger, aber besser) wäre, Parameter und einen Rückgabewert für die Funktion festzulegen und entsprechend aufzurufen. Aber damit du erstmal was kompiliert kriegst, mach sie ruhig global.



  • Wie kann ich sie global machen ?

    Grüße

    Chris



  • ChristianRehbein schrieb:

    Wie kann ich sie global machen ?

    Grüße

    Chris

    Wie fricky sagte, einfach oben (über die main) notieren. Das hast du ja mit

    float OF,V;
    //...
    int main() {
    

    bereits gemacht.

    Informier dich im Anschluss (wenn du das Teil zum Laufen gekriegt hast) aber mal, wie man es besser machen sollte. Also Funktion mit Parametern füttern und Wert zurückgeben. Globale Variablen sind (zu Recht) verschrien und nur in bestimmten Fällen sinnvoll.



  • "Also Funktion mit Parametern füttern und Wert zurückgeben. Globale Variablen sind (zu Recht) verschrien und nur in bestimmten Fällen sinnvoll."

    damit fangen wir im nächsten Arbeitsblatt an, Hier sollen wir es noch so machen kA..... Aber trotzdem vielen Dank



  • Hier mal ein Beispiel mit Kommentaren im Quelltext:

    #include<stdio.h>
    #include<conio.h>
    #include<math.h>
    
    void Dr (float g, float h)  // Datenübergabe an Funktion
    {
        float erg;
        erg = g * h / 2;
        printf("Die Fläche des Dreiecks beträgt %f \n", erg);
    }
    
    void Re (float l, float b)  // hier kein Semikolon
    {
        float erg;
        erg = l * b;
        printf("Die Fläche des Rechtecks beträgt %f \n", erg);
    }
    
    int main ( ) // int main ist hier die richtigere Variante
    {
        char e = 'n';
        int cat,d;
        float a,b,c;
    
        printf("Geometrie Programm\n\n");
    
        printf("Das Geometrie Programm ermoeglicht Flaechenberechnungen.\n\n");
        printf("Achtung: Komma sind als Punkt einzugeben\n\n");
    
        do
        {
            printf("Bitte geben Sie die Seitenlängen ein!\n");
            printf("Seite (a) oder Grundseite: ");
            scanf("%f",&a);    // hier hattest du was verwechselt ;)
            printf("Seite (b) oder Höhe: ");
            scanf("%f",&b);
    
            printf("Waehlen Sie\nDreieck (1)\nRechteck(2)\nBeenden(3)\n");
            scanf("%d",&cat);
    
            switch (cat)
            {
            case 1:
                Dr (a, b);  // Funktionsaufruf mit Daten
                break;
            case 2:
                Re (a, b);  // hier Semikolon
                break;
            case 3:   // sollte noch optimiert werden
                printf (" Wollen Sie das Programm beenden j/n");
                scanf("%c", &e);
                break;
            default:
                printf("Falsche Eingabe");
            }
        }
        while ( e=='n');
    }
    

    Die Abfrage zum Beenden sollte noch anders gelöst werden 😃

    Ich weiß nicht was dein Wissensstand ist?

    ChristianRehbein schrieb:

    Zusatz: Die Eingabe der Werte sowie die Ausgabe der Ergebnisse soll ebenfalls als Funktion
    erstellt werden.

    Die erstellten Funktionen sollen lediglich im Programm aufgerufen werden (noch) keine Wertübergabe vornehmen.

    Ob der Quelltext den Zusatz erfüllt 😕

    MfG f.-th.



  • Eine Sache ist mir aufgefallen: bei den späteren printf-Anweisungen. Wenn du willst, dass der Inhalt der Variablen ausgegeben werden soll musste du den Namen der Variablen hinter die Anführungszeichen schreiben und zwar so:

    printf (" Das Volumen betraegt %f", V);
    break;
    case 2:
    OF ();
    printf (" Die Oberflaeche betraegt %f", O);
    break;
    case 3:
    V ();
    printf (" Das Volumen betraegt %f", V);
    OF ();
    printf (" Die Oberflaeche betraegt %f", O);
    

    Viel Erfolg!



  • Das allein reicht bei dem gegebenen Quelltext des Beitragserstellers nicht:

    case 1:
    printf (" Das Volumen betraegt %f", V);
    break;
    

    Da muss in seinem Code noch mehr angepasst werden 😃

    MfG f.-th.



  • Zur Dateneingabe - habt kennst du so ähnliche Sachen aus dem Unterricht?

    float Kante_a ()
    {
        float erg;
        printf("Bitte geben sie die Daten von a ein:");
        scanf("%f", &erg);
        return erg;
    }
    

Log in to reply