variable Mengen in C++



  • Hallo erstmal.

    Das hier ist (hoffentlich" meine Rettung "im letzten Moment"...

    ich muss in ein paar Tagen einen Programmentwurf schaffen mit folgender Problematik:

    Ein Anwender soll in ein Programm 2 Mengen eingeben (Menegnelemente ganze Zahlen also INTEGER)
    Und dann sollen ein paar Funktionen durchgeführt werden: Schnittmenge, Teimenge, Mengenvergleich.
    Soweit sogut. Ich würde das ja mit Feldern machen aber das Problem ist das man vorher nicht weiß wieviele Elemente die Felder haben... Also ein dynamisches Feld, jeder Anwender kann also festlegen wie viele Elemente er eingeben will (pro Menge).
    Ich habe keine Ahnung wie ich das auf die Reihe bekommen soll.

    Das ganze soll in Form von Klassen passieren.
    Und ein Konstruktor soll beim Eingeben der Feldelemente behilflich sein.

    Irgendwelche Lösungsvorschläge, Anmerkungen, Quelltexte oder Programmbeispiele für die Lösung meiner Probleme?

    Ich wäre sehr dankbar, ich weiß noch nichtmal wieviele Klassen ich überhaupt brauche.

    Man man man, ich verzweifel hier noch...

    Vielen vielen Dank schonmal im Voraus!

    Ciao, Jerome.....



  • siehe std::vector



  • also mit vektoren wird das nix, ich soll das in form einer klasse machen, wie oben beschrieben...

    vektoren haben wir auch nie behandelt und es wäre nicht der aufgabe entsprechend wenn ich das verwende was nie dran war...

    sorry, aber so wirds nix...



  • Du hast 2 Möglichkeiten:

    1. std::vector<DeineKlasse>

    Damit kannst Du beliebig viele Elemente halten.

    Ein Array aufmachen und wenn nicht genug reinpasst das machen was vector auch macht: Neuen Speicher auftreiben und alles umkopieren.

    Der std::vector soll Dir ja nur helfen beliebig viele Deiner Klassen zu halten.



  • also ein feld zu erzeugen ist nicht der sinn der aufgabe, denn die haben ja immer feste feldgrößen...

    es geht ja eben um dynamische speicherverwaltung und zwar objektorientiert...

    erklär mir doch mal einer die zeile std::vector<DeineKlasse>
    was bedeutet das im einzelnen???



  • Jerome83 schrieb:

    also ein feld zu erzeugen ist nicht der sinn der aufgabe, denn die haben ja immer feste feldgrößen...

    es geht ja eben um dynamische speicherverwaltung und zwar objektorientiert...

    ja, aber man kann in c++ auch dynamische speicher allockieren...
    so z.B.

    int size = 124;
    int* array = new int[size];
    
    for(int i=0; i<size; ++i)
        array[i] = 0;
    

    die größe lässt sich zwar nicht mehr ändern aber man kann den ganzen
    müll ja in ein größeres array kopieren und das alte wieder freigeben...

    und genau das macht std::vector...

    "std" is ein namespace und "vector<...>" ist ne template klasse.
    also entweder du benutzt std::vector oder du machst das selbst...

    mfg
    Plassy



  • Jerome83 schrieb:

    erklär mir doch mal einer die zeile std::vector<DeineKlasse>
    was bedeutet das im einzelnen???

    http://www.schornboeck.net/ckurs/vector.htm
    die Seite sagt eigentlich alles...



  • Jerome83 schrieb:

    also ein feld zu erzeugen ist nicht der sinn der aufgabe, denn die haben ja immer feste feldgrößen...

    es geht ja eben um dynamische speicherverwaltung und zwar objektorientiert...

    erklär mir doch mal einer die zeile std::vector<DeineKlasse>
    was bedeutet das im einzelnen???

    http://www.hrz.uni-dortmund.de/computerPostille/Juni1992/9)Objektorientierung.html

    Objektorientiert wird dein Programm _nicht_, indem du Speicher dynamisch
    allokierst.

    Klar hat ein Feld eine bestimmte groesse, aber du sagtest:

    Also ein dynamisches Feld, jeder Anwender kann also festlegen wie viele
    Elemente er eingeben will (pro Menge).

    was bedeutet, das es gar keine Probleme macht, entsprechend Speicher zu
    reservieren, da du den User vorher eingeben laesst, wieviel Elemente er
    pro Menge eingeben will.

    Ich sehe in deiner Aufgabenstellen wirklich kein Problem.

    mfg
    v R



  • @Plassy: naja, also mit vector wird das nix. das ist ne template klasse wie du sagtest. da das aber nie bei mir drangenommen wurde werd ich es nicht verwenden, dann weiß der sofort das das program nicht von mir ist. ich mein, es wär schön wenn ichs allein hinbekommen würde, aber ich peils halt einfach nicht so gut wie andere...

    @virtuell Realisticer: ja, so wäre das kein thema. aber dann bräuchte ich auch eine klassen wenn ich den benutzer vorher frage wieviele elemente seine mengen haben, das wäre ja dann einfach, das würd ich wohl hinbekommen. aber in dem fall würde der speicher ja in dem moment für sämtliche elemente die der anwender eingeben würde, schon vorher reserviert. es gfeht hier aber darum das der speicher für jedes einzelne element der menge in dem moment den speicher freigibt wenn es erzeugt wird. das muss irgendwie mit dem operator "new" gehen.
    bin jetzt soweit in meiner überlegung das ich für jede der mengen eine eigene klasse definieren muss und die elemente der menge in einer einfach verketteten liste eingeben lasse. und da ist die speicherverwaltung ja dynamisch, oder? denn immer wenn ein eölement hinten rangehängt wird wird in dem moment vorher sein speicher reserviert, oder?

    hat jemand mal ein beispiel für so ne verk. liste anzubieten, denn das zu programmieren schaff ich wohl nie alleine.....

    ciao und danke für die mühen, jerome.....



  • bei euch gilt es als betrug, wenn man sich ausserhalb des unterrichts mehr zu einem thema aneignet?
    diese schule wuerde ich anzuenden.



  • lieber mal alle streichhölzer verstecken, sonst gibts ein unglück



  • naja, was heißt betrug.

    es ist nicht inhalt der aufgabe dinge zu verwenden die nicht behandelt wurden. wir sollen ja das problem mit dem gelernetn umsetzen und nicht mit anderen dingen...

    also, hat jemand solch ein programm mit einer einfach verketteten liste???



  • Hm, habt ihr denn schon Zeiger dranngenommen ?

    struct foo
    {
     foo * prev;
     foo * next;
     T     Daten;
    };
    

    Dazu schreibst Du Dir eine Methode die neue Elemente Eintragen und entfernen kann. Du mußt halt immer dafür sorgen das die Zeiger prev und next auf das richtige Element zeigen.

    Wir wissen nicht was Du bereits an wissen durch die Schule hast und Du daher anwenden kannst.



  • mh, logisch hatten wir zeiger, haben ja auch verkettete listen besprochen.

    aber den zeiger auf den vorgänger halte ich für überflüssig, da ich ja nix löschen will in der liste...

    kannst du mir mal ne klasse MENGE definieren???



  • Hier mal eine schnelle Klasse
    Header

    class CFileliste  
    {
    public:
    	CFileliste *m_pNext;
    	CFileliste(CFileliste *pNext);
    	virtual ~CFileliste();
    	int m_listid;
    };
    

    CPP-Datei

    #include "Fileliste.h"
    
    CFileliste::CFileliste(CFileliste *pNext)
    {
    	m_pNext=pNext;
    	m_listid = 0;
    }
    
    CFileliste::~CFileliste()
    {
    
    }
    

    Die Implementierung

    Header

    CFileliste *m_pfilelist;
    	void addfiletolist();
    

    Cpp-Datei

    void CProgrammeDlg::addfiletolist()
    {
    	CFileliste *pdatenzeiger;
    	pdatenzeiger=new CFileliste(m_pfilelist);
    	m_pfilelist=pdatenzeiger;
    }
    
    ProgrammeDlg::CProgrammeDlg(CWnd* pParent /*=NULL*/)
    	: CDialog(CProgrammeDlg::IDD, pParent)
    {
    	m_pfilelist=NULL; 
    
    }
    
    CProgrammeDlg::~CProgrammeDlg()
    {
    	CFileliste *temp;
    	while(m_pfilelist!=NULL)
    	{
    		temp=m_pfilelist->m_pNext;
    		delete m_pfilelist;
    		m_pfilelist=temp;
    	}
    }
    


  • elises lanchrichten sind einfach immer wieder gut. Das wollte ich einfach mal loswerden.

    aber den zeiger auf den vorgänger halte ich für überflüssig, da ich ja nix löschen will in der liste...

    Es geht nicht ums löschen, sondern darum von einem Element wieder zu seinem Vorgänger zu kommen.



  • helium logged out schrieb:

    Es geht nicht ums löschen, sondern darum von einem Element wieder zu seinem Vorgänger zu kommen.

    Vielleicht will er das ja auch nicht.



  • Also wenn ich den von mir Zitierteen Text so ansehe, scheint er der meinung zu sin, dass man nur zum Vorgänger möchte um irgendwas zu löschen. Mir fällt da Spontan aber noch den Wert auszulesen und ihn zu verändern ein.



  • Mir faellt dazu ganz einfach ein, sich einfach nur vor und zurueck zu bewegen.

    mfg
    v R



  • Vielleicht will er das gar nicht. Ich nehm mal stark an, dass es offensichtlich ist, dass man in einer einfach verketteten Liste nicht rückwärts gehen kann. Was nicht ganz so offensichtlich ist, ist, dass man das aktuelle Element nicht in O(1) entfernen kann. Deshalb hat er nur gesagt, dass er das nicht will, weil das andere ja eh klar ist.


Anmelden zum Antworten