C Anfänger - Funktion



  • Moin ich fang grad frisch mit C an und hab bis auf nen "hello world" programm nicht sonderlich viel C erfahrung

    nun lautet eine aufgabenstellung aus diesem programmcode ein funktionsfähiges programm zu konstruieren, dass das kegelvolumen berechnet

    #include <stdio.h>
    /* Funktion zur Berechnung des Kegelvolumens */
    float kegelVolumen(float radius, float hoehe)
    {
    return M_PI*radius*radius*hoehe
    }
    int main()
    {
    /* Aufruf der Funktion kegelVolumen */
    v1 = kegelVolumen(2,7f, 3.1f);
    v2 = kegelVolumen(3.4f, 2.4f);
    /* Ausgabe der Ergebnisse */
    printf("v1 = %d\n", v1 );
    printf("v2 = %f\n", v2);
    printf("v3 = %f\n", kegelvolumen(5.f);
    getchar();
    return 0;
    }
    

    nun hab ich es soweit verändert, dass es lauffähig ist allerdings ist die berechnung falsch ich nehme an, dass irgendwas mit der funktion noch nicht in ordnung ist

    #include "stdio.h"
    
    /* Funktion zur Berechnung des Kegelvolumens */
    float kegelVolumen(float radius, float hoehe, float PI)		// PI wurde als "float" definiert
    {
    PI = 3,141;							// PI muss deklariert und definiert werden
    return PI*radius*radius*hoehe;		// Semikolon vergessen
    }
    int main()
    {
    
    float radius,hoehe,v1,v2;
    
    printf ("Bitte einen Radius eingeben.\n");
    scanf  ("%f",&radius);
    printf ("Bitte eine Hoehe eingeben.\n");
    scanf  ("%f",&hoehe);
    
    /* Aufruf der Funktion kegelVolumen */
    v1 = kegelVolumen(2.7f, 3.1f, 3.7f);		// Einfacher Syntaxfehler anstelle eines Kommatas muss ein Punkt geschrieben werden
    v2 = kegelVolumen(3.4f, 2.4f, 2.7f);
    
    /* Ausgabe der Ergebnisse */
    printf("v1 = %f\n", v1 );    				// hier gehört ein float hin
    printf("v2 = %f\n", v2 );
    printf("v3 = %f\n", kegelVolumen(5.f, 2.5f, 2.6f));
    getchar();
    return 0;
    }
    

    so wenn mir jemand kurz erklären kann wie das genau mit der funktion geht oder andere hilfestellungen hat um das programm korrekt zum laufen zu bekommen wärs sehr nett



  • #include <stdio.h> 
    #include <conio.h>
    
    /* Funktion zur Berechnung des Kegelvolumens */ 
    float kegelVolumen(float radius, float hoehe, float PI)
    {    
    	return PI*radius*radius*hoehe;
    } 
    
    int main() 
    { 
    	float radius, hoehe, v1, v2; 
    
    	printf ("Bitte einen Radius eingeben.\n"); 
    	scanf  ("%f",&radius); 
    	printf ("Bitte eine Hoehe eingeben.\n"); 
    	scanf  ("%f",&hoehe); 
    
    	/* Aufruf der Funktion kegelVolumen */ 
    	v1 = kegelVolumen(2.7f, 3.1f, 3.7f);    
    	v2 = kegelVolumen(3.4f, 2.4f, 2.7f); 
    
    	/* Ausgabe der Ergebnisse */ 
    	printf("v1 = %f\n", v1 );                  
    	printf("v2 = %f\n", v2 ); 
    	printf("v3 = %f\n", kegelVolumen(5.f, 2.5f, 2.6f)); 
    
    	getch();
    }
    


  • #include <conio.h>
    

    Nanu? Was ist denn das?

    float kegelVolumen(float radius, float hoehe, float PI)
    

    Also PI als dritten Parameter. Das ist immerhin kreativ.
    Dann aber bei Kóyaánasqatsi:

    v1 = kegelVolumen(2.7f, 3.1f, 3.7f);
    

    Für hohe Werte von PI.

    v2 = kegelVolumen(3.4f, 2.4f, 2.7f);
    

    Für niedrige Werte von PI.

    Für übliche Werte von PI empfiehlt sich dann doch M_PI aus man: math.h. Nachdem in der Geschichte bis jetzt keine Veränderung von PI beobachtet wurde, entfällt auch die Notwendigkeit, PI als Argument an kegelVolumen() zu übergeben.



  • µngbd schrieb:

    Nachdem in der Geschichte bis jetzt keine Veränderung von PI beobachtet wurde, ...

    Daran wird noch gearbeitet. Aber die Beratungen sind noch nicht abgeschlossen. 🙂



  • @seb123:

    Du berechnest ein Zylindervolumen.

    Gruß,

    Andreas



  • Du berechnest ein Zylindervolumen.

    Hehe. Wenigstens einer hat wirklich mitgedacht. Mir ist das nicht aufgefallen. 🙄



  • war mit klar, dass das erstmal ein zylinder ist aber vom zylinder zum kegel isses ja nicht weit deshalb war mir das erstmal egal 😉

    so hab PI als eigene Variable rausgenommen ich wusste nicht, dass math.h den wert PI schon kennt deshalb hatte ich diesen umweg genommen

    nun schauts so aus

    #include "stdio.h"
    #include "math.h"
    
    /* Funktion zur Berechnung des Kegelvolumens */
    float kegelVolumen(float radius, float hoehe)
    {
    return (1/3)*(M_PI*radius*radius*hoehe);		// Semikolon vergessen
    }
    int main()
    {
    
    float radius,hoehe,v1,v2;
    
    printf ("Bitte einen Radius eingeben.\n");
    scanf  ("%f",&radius);
    printf ("Bitte eine Hoehe eingeben.\n");
    scanf  ("%f",&hoehe);
    
    /* Aufruf der Funktion kegelVolumen */
    
    v1 = kegelVolumen(2.7f, 3.1f);				// Einfacher Syntaxfehler anstelle eines Kommatas muss ein Punkt geschrieben werden
    v2 = kegelVolumen(3.4f, 2.4f);
    
    /* Ausgabe der Ergebnisse */
    printf("v1 = %f\n", v1 );    				// hier gehört ein float hin
    printf("v2 = %f\n", v2 );
    printf("v3 = %f\n", kegelVolumen(5.f, 2.5f));
    getchar();
    return 0;
    }
    

    allerdings gibt er mir jetzt jedes mal 0.00000 als ergebnis aus egal welche werte ich eintippe



  • Ja, weil 1/3==0



  • volkard schrieb:

    Ja, weil 1/3==0

    Wegen der Abschnittsrundung bei der ganzzahligen Division. Das passiert, wenn nur Ganzzahlen im Ausdruck auftreten. Es reicht aber, einen der Operanden zu einer Gleitkommazahl zu machen:

    return (1.0/3)*(M_PI*radius*radius*hoehe);    // 1.0/3 ergibt ein Drittel als Gleitkommazahl
    

    Und dass du die Klammern nicht brauchst, weisst du sicher selbst.



  • µngbd schrieb:

    volkard schrieb:

    Ja, weil 1/3==0

    Wegen der Abschnittsrundung bei der ganzzahligen Division. Das passiert, wenn nur Ganzzahlen im Ausdruck auftreten. Es reicht aber, einen der Operanden zu einer Gleitkommazahl zu machen:

    return (1.0/3)*(M_PI*radius*radius*hoehe);    // 1.0/3 ergibt ein Drittel als Gleitkommazahl
    

    Und dass du die Klammern nicht brauchst, weisst du sicher selbst.

    die klammern dienten der übersicht damit ich direkt sehe was ich verändert habe

    danke soweit auch mit der 1.0

    allerdings gibt er jetzt immer ca. 65 aus egal welche werte ich eintippe also eine wirkliche berechnung findet nicht statt

    den sinn von v1 und v2 hab ich auch noch nicht ganz kapiert wofür brauch ich die in diesem code 😕



  • Du rufst die Funktion ja auch mit Konstanten und nicht mit
    den eingelesenen Werten auf.

    In v1 und v2 speicherst du die Rückgabewerte deiner Fkt.



  • hm okay das war natürlich nicht mein plan aber wie muss ich das jetzt umschreiben, dass der die werte von scanf nimmt ?



  • [code]
    #include <stdio.h>
    #include <math.h>

    int main()
    {
    float h = 0, r = 0, x = 0;
    printf ("Bitte Radius eingeben: ");
    scanf ("%f\n", &r);

    printf ("Bitte Höhe eingeben: ");
    scanf ("%f\n", &h);

    printf("Ergebnis: %f", ((r*r)*h)*M_PI);
    return 0;
    }

    irgendwas stimmt noch ned weil irgendwie nach der ersten eingabe noch eine 2te Eingabe erwartet wird also nach dem Zeilenwechsel...
    btw
    cooles Forum



  • hiaswhans schrieb:

    irgendwas stimmt noch ned weil irgendwie nach der ersten eingabe noch eine 2te Eingabe erwartet wird also nach dem Zeilenwechsel...

    Die \n Dinger müssen aus scanf raus. -
    Den Rückgabewert von scanf sollte man prüfen, falls etwas float inkompatibles eingegeben wird:

    int main() 
    { 
    float h = 0, r = 0; 
    puts("********* KREISFLACHENBERECHNUNG ***********\n\n");
    printf ("Bitte Radius eingeben: ");
    if ( 1 != scanf ("%f", &r) )
    {
    	puts("INPUT ERROR");
    	return 1;
    }
    printf ("Bitte Hoehe eingeben: ");
    if ( 1 != scanf ("%f", &h)) 
    {
    	puts("INPUT ERROR");
    	return 1;
    }
    printf("Ergebnis: %f", ((r*r)*h)* mPI ); 
    return 0; 
    }
    


  • puts("********* KREISFLACHENBERECHNUNG ***********\n\n");
    

    Das würd ich mir nochmal überlegen. 🤡



  • hat das nen Grund wieso Du puts() und ned printf() hernimmst?
    Aha und und bei scanf() brauch ich keine \n? ... cool
    Und return 1 heißt den Schritt wiederholen bis scanf("%f", h) == 1?
    Und nun zum Kegelvolumen...



  • Kardath schrieb:

    Aha und und bei scanf() brauch ich keine \n? ... cool

    jajaja!

    Kardath schrieb:

    Und return 1 heißt den Schritt wiederholen bis scanf("%f", h) == 1?

    nonono!

    🙂



  • ^^ alles klar - hab ich bei IBM, Microsoft und bei der fhtw-berlin
    Ich gebe der if funktion also eine 1 also ein "Wahr" zurück oder verstehe ich das falsch.
    Wozu?



  • ⚠ Der Rückgabewert 1 wird oftmals verwendet, um einen Fehler zu signalisieren ⚠



  • ßsdgß09df0g0 schrieb:

    ⚠ Der Rückgabewert 1 wird oftmals verwendet, um einen Fehler zu signalisieren ⚠

    selten programmintern.


Anmelden zum Antworten