Programm zur Kreisberechnung



  • Hy Leute,

    ich habe ein Problem. Und zwar habe ich ein Programm zur Kreisberechnung geschrieben das aber leider nicht läuft. Ich finde aber die Fehler nicht. Könnt Ihr mir da weiterhelfen.

    #include <iostream.h>
    #include <conio.h>
    #define PI 3.14159

    /*---------------------------- Basisklasse ----------------------------*/

    class KUGEL_GEO
    {
    private:
    float durchmesser;
    float umfang;
    float oberflaeche;
    float volumen;
    public:
    KUGEL_GEO(void);
    KUGEL_GEO(float);
    void errechne_geo (void);
    void print(void);
    float get_volumen(void) {return volumen;};
    };
    /*------------------- abgeleitete Klasse - Vererbung -------------------*/

    class KUGEL_MAT: public KUGEL_GEO
    {
    private:
    float artgewicht;
    float gewicht;
    public:
    KUGEL_MAT(void);
    KUGEL_MAT(float,float);
    void errechne_gewicht (void);
    void print(void);
    };
    /@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/
    /* Elementfunktionen der Basisklasse hier: KUGEL_GEO /
    /
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

    KUGEL_GEO::KUGEL_GEO (void)
    {
    durchmesser = 1.0;
    errechne_geo();
    }
    /---------------------------------------------------------------------/

    KUGEL_GEO::KUGEL_GEO (float d)
    {
    durchmesser = d;
    errechne_geo();
    }
    /---------------------------------------------------------------------/

    void KUGEL_GEO::errechne_geo (void)
    {
    umfang = PI * durchmesser;
    oberflaeche = umfang * durchmesser;
    volumen = oberflaeche * durchmesser / 6 ;
    }
    /---------------------------------------------------------------------/

    void KUGEL_GEO::print (void)
    {
    cout << "\n Die Kugel hat folgende geometrische Daten: "
    << "\n -------------------------------------------"
    << "\n Durchmesser : " << durchmesser
    << "\n Umfang : " << umfang
    << "\n Oberflaeche : " << oberflaeche
    << "\n Volumen : " << volumen
    << "\n -------------------------------------------";
    }
    /@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/
    /* Elementfunktionen der abgeleiteten Klasse hier: KUGEL_MAT /
    /
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

    KUGEL_MAT::KUGEL_MAT (void)
    : KUGEL_GEO()
    {
    artgewicht = 1.0;
    errechne_gewicht();
    }
    /---------------------------------------------------------------------/

    KUGEL_MAT::KUGEL_MAT (float d, float a)
    : KUGEL_GEO( d )

    artgewicht = a;
    errechne_gewicht();
    }
    /---------------------------------------------------------------------/

    void KUGEL_MAT::errechne_gewicht (void)
    {
    errechne_geo();

    gewicht = get_volumen() * artgewicht;
    }
    /---------------------------------------------------------------------/

    void KUGEL_MAT::print (void)
    {
    KUGEL_GEO:print();

    cout << "\n\n"
    << "\n Die Kugel hat folgende Gewichts-Daten: "
    << "\n -------------------------------------------"
    << "\n Artgewicht : " << artgewicht
    << "\n Gewicht : " << gewicht
    << "\n -------------------------------------------";
    }
    void main( void )
    {
    KUGEL_GEO *kugel_liste[10];
    int i=0;

    kugel_liste[0] = new KUGEL_MAT(1.0);
    kugel_liste[1] = new KUGEL_GEO(2.0);
    kugel_liste[2] = new KUGEL_MAT(2.0,1.0);

    for(i=0; i<=2; i++)
    {
    cout << "\n Kugel " << (i+1) << ":\n";
    kugel_liste[i]->print();
    getch();
    }
    delete kugel_liste[1];
    delete kugel_liste[0];
    delete kugel_liste[2];
    }



  • - Falsches Forum
    - Keine Code-Tags
    - Veraltete C++-Standardheader
    - Fehlermeldung nicht gepostet (siehe meine Signatur)

    Ich finde aber die Fehler nicht.

    Dann solltest du dir vielleicht mal ansehen, an welchen Stellen der Compiler Probleme mit deinem Code hat, und welche Probleme das genau sind. Uns hast du das ja nicht verraten.

    Aber trotzdem zwei Tipps:
    - KUGEL_MAT hat keinen Konstruktor, der einen float-Parameter braucht.
    - Die print-Methode musst du in der Basisklasse als virtual deklarieren.



  • Dieser Thread wurde von Moderator/in CMatt aus dem Forum C# und .NET in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Stormrider1980a schrieb:

    Ich finde aber die Fehler nicht. Könnt Ihr mir da weiterhelfen.

    wie sollen wir dir dann helfen können?
    das hellseher forum ist wo anders, und ohne [cpp] tags wird sich wohl keiner den code ansehen...



  • ohne CPP tags wird sich wohl keiner den code ansehen...

    Ich habs dann mal so gemacht, weil es sonst keiner tut 😛

    #include <iostream.h>
    #include <conio.h>
    #define PI 3.14159
    
    /*---------------------------- Basisklasse ----------------------------*/
    
    class KUGEL_GEO
    {
    private:
    float durchmesser;
    float umfang;
    float oberflaeche;
    float volumen;
    public:
    KUGEL_GEO(void);
    KUGEL_GEO(float);
    void errechne_geo (void);
    void print(void);
    float get_volumen(void) {return volumen;};
    };
    /*------------------- abgeleitete Klasse - Vererbung -------------------*/
    
    class KUGEL_MAT: public KUGEL_GEO
    {
    private:
    float artgewicht;
    float gewicht;
    public:
    KUGEL_MAT(void);
    KUGEL_MAT(float,float);
    void errechne_gewicht (void);
    void print(void);
    };
    /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
    /* Elementfunktionen der Basisklasse hier: KUGEL_GEO */
    /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
    
    KUGEL_GEO::KUGEL_GEO (void)
    {
    durchmesser = 1.0;
    errechne_geo();
    }
    /*---------------------------------------------------------------------*/
    
    KUGEL_GEO::KUGEL_GEO (float d)
    {
    durchmesser = d;
    errechne_geo();
    }
    /*---------------------------------------------------------------------*/
    
    void KUGEL_GEO::errechne_geo (void)
    {
    umfang = PI * durchmesser;
    oberflaeche = umfang * durchmesser;
    volumen = oberflaeche * durchmesser / 6 ;
    }
    /*---------------------------------------------------------------------*/
    
    void KUGEL_GEO::print (void)
    {
    cout << "\n Die Kugel hat folgende geometrische Daten: "
    << "\n -------------------------------------------"
    << "\n Durchmesser : " << durchmesser
    << "\n Umfang : " << umfang
    << "\n Oberflaeche : " << oberflaeche
    << "\n Volumen : " << volumen
    << "\n -------------------------------------------";
    }
    /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
    /* Elementfunktionen der abgeleiteten Klasse hier: KUGEL_MAT */
    /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
    
    KUGEL_MAT::KUGEL_MAT (void)
    : KUGEL_GEO()
    {
    artgewicht = 1.0;
    errechne_gewicht();
    }
    /*---------------------------------------------------------------------*/
    
    KUGEL_MAT::KUGEL_MAT (float d, float a)
    : KUGEL_GEO( d )
    
    artgewicht = a;
    errechne_gewicht();
    }
    /*---------------------------------------------------------------------*/
    
    void KUGEL_MAT::errechne_gewicht (void)
    {
    errechne_geo();
    
    gewicht = get_volumen() * artgewicht;
    }
    /*---------------------------------------------------------------------*/
    
    void KUGEL_MAT::print (void)
    {
    KUGEL_GEO:print();
    
    cout << "\n\n"
    << "\n Die Kugel hat folgende Gewichts-Daten: "
    << "\n -------------------------------------------"
    << "\n Artgewicht : " << artgewicht
    << "\n Gewicht : " << gewicht
    << "\n -------------------------------------------";
    }
    void main( void )
    {
    KUGEL_GEO *kugel_liste[10];
    int i=0;
    
    kugel_liste[0] = new KUGEL_MAT(1.0);
    kugel_liste[1] = new KUGEL_GEO(2.0);
    kugel_liste[2] = new KUGEL_MAT(2.0,1.0);
    
    for(i=0; i<=2; i++)
    {
    cout << "\n Kugel " << (i+1) << ":\n";
    kugel_liste[i]->print();
    getch();
    }
    delete kugel_liste[1];
    delete kugel_liste[0];
    delete kugel_liste[2];
    }
    

    Ich bin selber ein Anfänger, aber der Genauigkeit halber empfehle ich dir statt PI selbst zu definieren die "Konstante?" aus der cmath zu nehmen: M_PI

    Wie gesagt, ich bin Anfänger, daher bitte kontrollieren wenn ich Misst schreibe und mir sageb 😉

    Mir viel aber auf das du geschrieben hast: KUGEL_GEO(void);
    Void steht dafür das kein Wert zurückgegeben wird. Letzendlich schreibst du aber: errechne_geo(); Auch verstehe ich nicht wieso du kein return benutzt (mir wurde es eingebläut das eine Funktion einen Rückgabewert, und sei es 0, haben muss/soll. Und was ich auch nicht verstehe ist wieso du KUGEL_GEO(void); und
    KUGEL_GEO(float); hast. Zweimal eine Funktion mit gleichem Namen? Kompiliert der das überhaupt???



  • #include <iostream>                        //nicht .h
    #include <conio.h>
    #define PI 3.14159
    using namespace std;                        //vergessen
    /*---------------------------- Basisklasse ----------------------------*/
    
    class KUGEL_GEO
    {
    private:
    float durchmesser;
    float umfang;
    float oberflaeche;
    float volumen;
    public:
    KUGEL_GEO(void);
    KUGEL_GEO(float);
    void errechne_geo (void);
    void print(void);
    float get_volumen(void) {return volumen;};
    };
    /*------------------- abgeleitete Klasse - Vererbung -------------------*/
    
    class KUGEL_MAT: public KUGEL_GEO
    {
    private:
    float artgewicht;
    float gewicht;
    public:
    KUGEL_MAT(void);
    KUGEL_MAT(float,float);
    void errechne_gewicht (void);
    void print(void);
    };
    /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
    /* Elementfunktionen der Basisklasse hier: KUGEL_GEO */
    /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
    
    KUGEL_GEO::KUGEL_GEO (void)
    {
    durchmesser = 1.0;
    errechne_geo();
    }
    /*---------------------------------------------------------------------*/
    
    KUGEL_GEO::KUGEL_GEO (float d)
    {
    durchmesser = d;
    errechne_geo();
    }
    /*---------------------------------------------------------------------*/
    
    void KUGEL_GEO::errechne_geo (void)
    {
    umfang = PI * durchmesser;
    oberflaeche = umfang * durchmesser;
    volumen = oberflaeche * durchmesser / 6 ;
    }
    /*---------------------------------------------------------------------*/
    
    void KUGEL_GEO::print (void)
    {
    cout << "\n Die Kugel hat folgende geometrische Daten: "
    << "\n -------------------------------------------"
    << "\n Durchmesser : " << durchmesser
    << "\n Umfang : " << umfang
    << "\n Oberflaeche : " << oberflaeche
    << "\n Volumen : " << volumen
    << "\n -------------------------------------------";
    }
    /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
    /* Elementfunktionen der abgeleiteten Klasse hier: KUGEL_MAT */
    /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
    
    KUGEL_MAT::KUGEL_MAT (void)
    : KUGEL_GEO()
    {
    artgewicht = 1.0;
    errechne_gewicht();
    }
    /*---------------------------------------------------------------------*/
    
    KUGEL_MAT::KUGEL_MAT (float d, float a)
    : KUGEL_GEO( d )
    {                                     //vergessen
    artgewicht = a;
    errechne_gewicht();
    }
    /*---------------------------------------------------------------------*/
    
    void KUGEL_MAT::errechne_gewicht (void)
    {
    errechne_geo();
    
    gewicht = get_volumen() * artgewicht;
    }
    /*---------------------------------------------------------------------*/
    
    void KUGEL_MAT::print (void)
    {
    KUGEL_GEO:print();
    
    cout << "\n\n"
    << "\n Die Kugel hat folgende Gewichts-Daten: "
    << "\n -------------------------------------------"
    << "\n Artgewicht : " << artgewicht
    << "\n Gewicht : " << gewicht
    << "\n -------------------------------------------";
    }
    int main( void )                   //int nicht void!
    {
    KUGEL_GEO *kugel_liste[10];
    int i=0;
    
    kugel_liste[0] = new KUGEL_MAT(1.0, 1.0);             //du hast KUGEL_MAT(float, float)
    kugel_liste[1] = new KUGEL_GEO(2.0);
    kugel_liste[2] = new KUGEL_MAT(2.0,1.0);
    
    for(i=0; i<=2; i++)
    {
    cout << "\n Kugel " << (i+1) << ":\n";
    kugel_liste[i]->print();
    getch();
    }
    delete kugel_liste[1];
    delete kugel_liste[0];
    delete kugel_liste[2];
    
    return 0;									//wenn int, dann auch return
    }
    

    @timon:
    void und die float-werte sind die parameter...
    du kannst funktionen mit dem selben namen, aber verschiedenen parametern, definieren...



  • Ergänzung @timon: Und die "Funktionen" KUGEL_GEO() und KUGEL_MAT() sind sogenannte Konstruktoren - die geben nichts zurück, sondern initialisieren ein neues Objekt.

    @Stormrider: Wenn du dir die Meldungen deines Compilers ansiehst, dürfte das schonmal erste Hinweise geben, wo der Fehler liegt. Und wenn du damit nichts anfangen kannst, stell diese Meldungen mal hier rein (zusammen mit dem Abschnitt, in dem sie aufgetaucht sind).



  • Noch paar dinge, auch wenn man grad mit C++ anfaengt, sollt man doch gleich auf solche probleme geschult werden ....

    - Ist dein konstruktor mit dem standardwert wirklich noetig ? , wenn ja warum dann nicht mit nem default wert ?
    KUGEL_GEO::KUGEL_GEO (float d = 1.0);

    - umfang volumen sind ja eigentlich errechnete werte. wenn man diue expliziet haelt, sind das redundante daten. Macht Sinn wenn man die Berechnung zu nem Zeitpunkt verschieben will wo es nich weh tut. Da hier aber das rechnen bestimmt extrem wenig zeit verheizt, berechne es "on the fly" !
    float get_volumen()
    {
    return PI * durchmesser * durchmesser * durchmesser / 6.0;
    }

    - bei parameterlosen Funktionsaufrufen brauchst in C++ ned (void) schreiben sondern () langt !

    KUGEL_MAT::KUGEL_MAT (float d, float a)
    : KUGEL_GEO( d )
    { //vergessen
    artgewicht = a;

    - Besser initialisierungslisten verwenden, dann kann man konstante Werte auch const machen ...

    KUGEL_MAT::KUGEL_MAT (float d , float a )
    : KUGEL_GEO( d ),artgewicht(a) 
    {                                     
    }
    

    - Vererbung:
    Mit dem Thema wirst dich sicher noch naeher beschaeftigen (muessen) aber schon mal vornweg :
    Du vererbst und hasst keine einzige virtuelle funktion (virtual). Das macht Vererbung eigentlich nicht sinnvoll ^^
    Klassen die fuer vererbung vorgesehen sind, sollten ausserdem unbedingt nen virtuellen Destruktor haben (auch wennd er leer ist).
    Wenn ich nen framework mit klassen habe, entscheide ich anhand des vorhandenseins vom virtuellen Destruktor, ob die klasse fuers ableiten technisch taugt. Anhand vom vorhandensein von anderen virtuellen funktionen, ob die klasse vom entwickler fuers ableiten ueberhaupt vorgesehen war.

    class KUGEL_GEO
    {
    private:
        const float durchmesser;
    public:
        KUGEL_GEO(float d = 1.0);
        virtual ~KUGEL_GEO();   // der iss wichtiger als wie es auf dem ersten blick ausschaut
        float get_volumen();
    };
    
    class KUGEL_MAT: public KUGEL_GEO
    {
    private:
        const float artgewicht;
    public:
        KUGEL_MAT(float d = 1.0,float a = 1.0);
        virtual ~KUGEL_MAT();
        float get_gewicht();
    };
    

    So saehen bei mir die Deklationen der klassen aus ^^ maja ueber die vererbung selber wuerd ich mir noch mal nen kopf machen ...

    Noch was prinzipielles: deine kugel klassen sind definitiv datenklassen, Daten und darstellungsschicht sollte man aber strikt trennen (das macht deine datenschicht flexiebler)
    also so methoden ala void print(); sind designtechnisch sehr kritisch zu betrachten ...

    Ciao ...



  • RHBaum schrieb:

    Klassen die fuer vererbung vorgesehen sind, sollten ausserdem unbedingt nen virtuellen Konstruktor haben (auch wennd er leer ist).

    Einen virtuellen Konstruktor gibt es nicht - richtig wäre Destruktor.



  • Du hasst vollkommen recht, wahrscheinlich hatte ich noch ned genug kaffee getrunken ^^
    Meine natuerlich destruktor ^^

    Ciao ..


Anmelden zum Antworten