Probleme mit Volumenberechnung (bzw. allgemein Rechenoperationen)



  • Hey,

    ich studiere Informations- und Elektrotechnik im 1. Semester und bin dort das erste mal auf C gestoßen. Die ersten 2 Wochen ging es hauptsächlich um Grundlagen (Präprozessor, Compiler, Linker usw.), aber bei einer der ersten Aufgaben habe ich bereits Probleme.
    Aufgabe ist es, ein Programm zu schreiben, mit dem man das Volumen eines Quaders berechnen kann. Ist eigentlich unglaublich simpel, aber die Funktion gibt bei mir immer andere Werte aus, obwohl ich die Länge, Breite und Höhe fest vorgeben darf.
    Habe schon viele Themen diesbezüglich angeguckt und verstehe diese Programme auch, aber bei meinem wills trotzdem einfach nicht klappen 😞

    #include <stdio.h>
    
    //Deklaration
    float a = 5,b = 10,c = 8;
    
    //Funktion
    float d (float a, float b, float c)
    {	
    	return (a * b * c);
    }
    
    void main (void)
    {
    	printf("Volumen = %d\n\n\n",d);
    	system("PAUSE");
    	return;
    }
    

    Hoffe ihr könnt mir helfen, ich habe wirklich schon viel ausprobiert. Es kommen als Ergebnis immer nur irgendwelche 7-stelligen Zahlen raus.

    lg Jan



  • Ist nur ein Mini-Fehler: Du benutzt den Qualifier für int (%d), nicht den für float. Deine Aufgabe ist es nun den richtigen Qualifier rauszusuchen 🙂

    man: printf



  • Vielen Dank für die schnelle Antwort, ist einem ja echt peinlich bei so einer Aufgabe. Habe den Qualifier jetzt durch %f ersetzt. Trotzdem habe ich immernoch das Problem, dass ich jetzt 0.000000 als Wert bekomme. Dabei ist kein Faktor gleich 0.



  • Deine Funktion erwartet Parameter.



  • Deine globalen Variablen a,b,c sind nicht die gleichen, die du in der Funktion als Parameter verwendest, auch wenn sie die gleichen Namen tragen! Nimm die globalen Variablen weg und definiere stattdessen lokale in main. Die übergibst du dann deiner Funktion.



  • Ihr habt's jetzt amtlich: Tim hat C verlernt 🤡



  • Tim schrieb:

    Ihr habt's jetzt amtlich: Tim hat C verlernt 🤡

    Vermutlich hast du "d" für eine Variable gehalten. Der Name ist auch denkbar schlecht gewählt. So was solltest du dir lieber gar nicht erst angewöhnen, Jan_K. Lokale Variable, die vllt. über 10 Zeilen gültig sind, darf man unter Umständen so nennen. Aber keine Funktionen.
    Wenn du dich an gewisse Konventionen hältst, tust du nicht nur anderen, sondern auch dir einen Gefallen.



  • Du musst die Funktion auch aufrufen. Funktionen erkennt man an den ().

    #include <stdio.h>
    
    //Funktion
    float qvolumen (float a, float b, float c)
    {   
        return (a * b * c);
    }
    
    void main (void)
    {
    // Definitionen (Deklaration ist anders)
      float a = 5,b = 10,c = 8;
    
      printf("Volumen = %f\n\n\n", qvolumen(a,b,c)); // Hier wird qvolumen mit den Parametern a, b und c aufgerufen. Der Rückgabewert wird gleich an printf weitergegeben
    //  system("PAUSE"); // ist nicht in stdio.h
      return;
    }
    


  • Besser und sicherer erscheint mir die Einführung einer Variable float r für den Rückgabewert der Funktion. Die Funktion ruft man dann erst mit r = function(...) auf und übergibt dann den Rückgabewert an printf, sonst kriegt man eben Null.



  • Ist es jetzt Geschmackssache, ob man mit double oder float arbeitet?

    Für meine bisherigen Aufgaben hat sich double prima bewährt. Man muss halt je nach Rechenoperation und Compiler womöglich math.h includieren und die mathematische lib mit -lm am Ende des Compile-Aufrufs mit verlinken.

    Gerne lasse ich mich aber über große Unterschied (von der "doppelten Genauigkeit" mal abgesehen) aufklären 😃



  • double braucht i.A. doppelt so viel Speicherplatz wie float.
    Aber bei GB-weise Ram braucht man heutzutage darauf keine Rücksicht mehr nehmen. Die Berechnungen laufen alle sowieso in double ab.

    Wenn man (sehr) große Arrays hat kann man evtl. noch mit float arbeiten.
    (oder bei Berechnungen auf der GPU).



  • Wow, vielen Dank für so viele konstruktive Antworten!

    Habe das ganze dann noch fertig bekommen, einmal mit (tut mir sehr leid, wenn ich Fachbegriffe nicht so ganz korrekt anwende) lokaler Funktion, also im Codeblock von main()

    #include <stdio.h>
    
    void main (void)
    {
    	float l = 8,b = 5,h = 6;
    	float multipliziere = l*b*h;
    	printf("L%cnge l = %f\n",132,l);
    	printf("Breite b = %f\n",b);
    	printf("H%che h = %f\n",148,h);
    	printf("Volumen = %f\n\n\n",multipliziere);
    	getchar();
    	return;
    }
    

    Danach dann noch mit globaler Funktion

    #include <stdio.h>
    
    float l = 10,b = 5,h = 7;
    
    int multipliziere() 
    {
    	return (l*b*h);
    }
    
    void main (void)
    {
    
    	printf("L%cnge l = %f\n",132,l);
    	printf("Breite b = %f\n",b);
    	printf("H%che h = %f\n",148,h);
    	printf("Volumen V = %d\n\n\n",multipliziere()); //globale Funktion multipliziere() wird aufgerufen
    	getchar();
    	return;
    }
    

    Klappt auch beides, versuche mich nun noch an einer Unteraufgabe.. Nochmals tausend Dank!



  • Das ist beides Mist.

    Lokale Funktione gibt es in C nicht.
    Ausserdem ist das gar keine Funktion.

    Der Wert von multiplizier wird direkt bei der Definition der Variable ausgerechnet und zugewiesen.

    Und globale Variablen sind böse. Da hast du nichts davon das du eine Funktion hast.

    Einer Funktion übergibt man Werte und bekommt einen Wert zurück.

    Bei meinem Beispiel von gestern kannst du auch schreiben:

    printf("Volumen = %f\n\n\n", qvolumen(1,4.5,3));
    // oder
    multipliziere = qvolumen(l,b,h);
    

    Dabei ist es egal wie die Variablen heissen.


Log in to reply