-mOsTwAnTeD- - 35
Profi
(offline)
Dabei seit 07.2006
677
Beiträge
|
|
Geschrieben am: 03.04.2007 um 10:33 Uhr
|
|
Hi@all,
Ich hab ein Problem in c++ (wie immer halt) :confused:
Diesmal lautet die Aufgabe
1. Erstelle eine Klasse CIntAray,die eine beliebige Anzahl von int-Zahlen speichern kann. Es sollen mindestens folgende Methoden implementiert werden:
-CIntArray(Groesse, Blockgroesse)
-Copy-Konstruktor (dieser Würde in diesem Fall dann so aussehen: ? CIntArray(CIntArray) oder?
-Zuweisungsoperator
-Add(Zahl)
-GetSize
-SetAt(Index, Zahl)
-Ausgabe()
Es soll im Konstruktor ein Speicher mit der übergebenen Größe angelegt werden. Reicht dieser Wert nicht mehr aus soll ein größerere angelegt werden und die Zahlen umkopiert werden. Die Blockgroesse gibt vor um wieviel der Speicherbereich wachsen soll.
2. Schiebe eine Funktion Eingabe, mit der eine beliebige Anzahl von Zahlen dem Array hinzugefügt werden kann,ein.
3. Überlade den Operator [] so dass folgendes möglich ist:
CIntArray;
Array.Add(1);
Array.Add(2);
Array.Add(3);
array[2] = 5;
int Zahl = Array[2];
kann mit vielleicht jemand helfen?
mfg MOst
Ich scheiß auf deine Welt voller Arroganz und Geld!
|
|
Polaris
Experte
(offline)
Dabei seit 07.2006
1766
Beiträge
|
Geschrieben am: 03.04.2007 um 10:44 Uhr
Zuletzt editiert am: 03.04.2007 um 10:53 Uhr
|
|
Wo liegt denn das Problem?
Bei welchem Teil der Aufgabe? Womit kommst du nicht klar?
Wie weit bist du schon? Mit so wenig Angaben kann ich dir leider nicht helfen.
/Edit:
Kopierkonstruktor sieht so aus:
CIntArray(const CIntArray& co) {
// Attributwerte kopieren
}
Patriotismus ist die Tugend der Bosheit! (Oscar Wilde)
|
|
x-Schnegge-x - 33
Anfänger
(offline)
Dabei seit 01.2006
1
Beitrag
|
|
Geschrieben am: 03.04.2007 um 10:47 Uhr
|
|
machst du das ganze in C++??
Ich könnte dir in C# helfen ist ähnlich...
|
|
-mOsTwAnTeD- - 35
Profi
(offline)
Dabei seit 07.2006
677
Beiträge
|
|
Geschrieben am: 03.04.2007 um 11:08 Uhr
|
|
Zitat von Polaris: Wo liegt denn das Problem?
Bei welchem Teil der Aufgabe? Womit kommst du nicht klar?
Wie weit bist du schon? Mit so wenig Angaben kann ich dir leider nicht helfen.
/Edit:
Kopierkonstruktor sieht so aus:
CIntArray(const CIntArray& co) {
// Attributwerte kopieren
}
Also das Array hab ich im Konstruktor erzeugt.
Mein Problem ist gerade der CopyKonstruktor. Hab ich das richtig verstanden das da das Array übergeben werden soll und in dem Copy Konstruktor kopiert werden soll damit ich es in dem Normalen Konstruktor löschen kann und wieder neu erzeugen kann (mit Groesse+=Blockgroese)?
Wenn ja wie mach ich das?
Ich scheiß auf deine Welt voller Arroganz und Geld!
|
|
Polaris
Experte
(offline)
Dabei seit 07.2006
1766
Beiträge
|
|
Geschrieben am: 03.04.2007 um 11:19 Uhr
|
|
Wenn du allgemein nicht weißt, wo du anfangen sollst, dann geb' ich dir jetzt einfach mal ein paar allgemeine Tipps.
Was du brauchst ist ein internes Int-Array (also ein "int *"), das du dynamisch verwaltest. Du musst immer, wenn die Add-Methode aufgerufen wird neue Speicherallokation durchführen, du brauchst eine interne Variable Size, damit du weißt, wie groß dein Array aktuell ist. Bei SetAt verwendest du den ganz normalen []-Operator für das interne Array, um zuzugreifen (vorher noch ne Abfrage, ob die Anfrage dem Arrayrahmen entspricht)
Bei GetSize gibst du einfach deine SizeVariable zurück. Und den =-Operator musste halt überladen, wird ganz ähnlich sein, wie der Copykonstruktor.
Patriotismus ist die Tugend der Bosheit! (Oscar Wilde)
|
|
Polaris
Experte
(offline)
Dabei seit 07.2006
1766
Beiträge
|
Geschrieben am: 03.04.2007 um 11:27 Uhr
Zuletzt editiert am: 03.04.2007 um 11:29 Uhr
|
|
Zitat von -mOsTwAnTeD-: Also das Array hab ich im Konstruktor erzeugt.
Mein Problem ist gerade der CopyKonstruktor. Hab ich das richtig verstanden das da das Array übergeben werden soll und in dem Copy Konstruktor kopiert werden soll damit ich es in dem Normalen Konstruktor löschen kann und wieder neu erzeugen kann (mit Groesse+=Blockgroese)?
Wenn ja wie mach ich das?
ich weiß nicht, wie du das meinst
so ungefähr sähe das bei mir aus ...
CIntArray(const CIntArray& co) {
delete[] arr;
arr = new int[co.ArrSize];
arr = co.arr;
}
arr ist bei mir das interne Array (int * arr)
die Addfunktion überladen wird schon spannender, da musst du wahrscheinlich mit memset und memcpy rumspielen ...
Ach ja: arr im Destruktor aufräumen nicht vergessen
Patriotismus ist die Tugend der Bosheit! (Oscar Wilde)
|
|
-mOsTwAnTeD- - 35
Profi
(offline)
Dabei seit 07.2006
677
Beiträge
|
Geschrieben am: 03.04.2007 um 11:39 Uhr
Zuletzt editiert am: 03.04.2007 um 11:41 Uhr
|
|
also soweit bin ich jetzt
[Code]
#include "stdafx.h"
#include
#include
#include
class CIntArray
{
public:
CIntArray();
CIntArray(int Groesse,int Blockgroesse);
CIntArray(const CIntArray& co);
int Zuweisungsoperator();
int Add(int Zahl);
int Getsize();
int SetAt(int Index,int Zahl);
int Ausgabe();
int Eingeben();
int Sortiere();
int Quicksort();
protected:
int m_Len;
int* m_pData; //mein array
int m_Zaehler;
int* m_Groesse;
};
CIntArray::CIntArray()
:m_Len(0),m_pData(0),m_Zaehler(0),m_Groesse(0)
{
}
CIntArray::CIntArray(const CIntArray& co)
{
//?
}
CIntArray::CIntArray(int Groesse,int Blockgroesse)
{
m_Zaehler=0; //wie kann ich den wo anderst auf null setzten? Jetzt wird er //immer auf null gesetzt sobald er ein neues array anlegen soll
m_pData = new int[Groesse];
if(Blockgroesse>0)
{
Groesse=Groesse+Blockgroesse;
}
}
int CIntArray::Eingeben()
{
int Zahl;
cout > Zahl
m_Zaehler++;
return Zahl;
}
int CIntArray::Add(int Zahl)
{
m_pData[m_Zaehler-1] = Zahl;
return 0;
}
int main()
{
int Groesse=10;
int Blockgroesse=0;
int Zahl1=0;
int Index=0;
int Eingabe=1;
CIntArray();
CIntArray CIntArray(Groesse,Blockgroesse);
while(Eingabe!=0)
{
cout
Ich scheiß auf deine Welt voller Arroganz und Geld!
|
|
-mOsTwAnTeD- - 35
Profi
(offline)
Dabei seit 07.2006
677
Beiträge
|
|
Geschrieben am: 03.04.2007 um 11:42 Uhr
|
|
Zitat von -mOsTwAnTeD-: also soweit bin ich jetzt
[Code]
#include "stdafx.h"
#include
#include
#include
class CIntArray
{
public:
CIntArray();
CIntArray(int Groesse,int Blockgroesse);
CIntArray(const CIntArray& co);
int Zuweisungsoperator();
int Add(int Zahl);
int Getsize();
int SetAt(int Index,int Zahl);
int Ausgabe();
int Eingeben();
int Sortiere();
int Quicksort();
protected:
int m_Len;
int* m_pData; //mein array
int m_Zaehler;
int* m_Groesse;
};
CIntArray::CIntArray()
:m_Len(0),m_pData(0),m_Zaehler(0),m_Groesse(0)
{
}
CIntArray::CIntArray(const CIntArray& co)
{
//?
}
CIntArray::CIntArray(int Groesse,int Blockgroesse)
{
m_Zaehler=0; //wie kann ich den wo anderst auf null setzten? Jetzt wird er //immer auf null gesetzt sobald er ein neues array anlegen soll
m_pData = new int[Groesse];
if(Blockgroesse>0)
{
Groesse=Groesse+Blockgroesse;
}
}
int CIntArray::Eingeben()
{
int Zahl;
cout > Zahl
m_Zaehler++;
return Zahl;
}
int CIntArray::Add(int Zahl)
{
m_pData[m_Zaehler-1] = Zahl;
return 0;
}
int main()
{
int Groesse=10;
int Blockgroesse=0;
int Zahl1=0;
int Index=0;
int Eingabe=1;
CIntArray();
CIntArray CIntArray(Groesse,Blockgroesse);
while(Eingabe!=0)
{
cout
Das ist ja echt blöd. Man kann gar keine übergabe Operatoren machen 
Ich scheiß auf deine Welt voller Arroganz und Geld!
|
|
Polaris
Experte
(offline)
Dabei seit 07.2006
1766
Beiträge
|
|
Geschrieben am: 03.04.2007 um 11:54 Uhr
|
|
also ich weiß nicht, aber die Funktion eingeben ist so zu verstehen glaube ich, dass du der ein Array übergibst, das du dann anhängst ...
und deine Addfunktion und das mit dem Zaehler ist so eine nicht so tolle Lösung (glaube nicht, dass das funktioniert), wie soll das mit der Blockgröße eigtl. genau funktionieren?
Ich komme heute abend wieder on, dann habe ich mehr zeit bin etwas im Stress gerade, sorry ...
Patriotismus ist die Tugend der Bosheit! (Oscar Wilde)
|
|
-mOsTwAnTeD- - 35
Profi
(offline)
Dabei seit 07.2006
677
Beiträge
|
|
Geschrieben am: 03.04.2007 um 12:27 Uhr
|
|
Zitat von Polaris: also ich weiß nicht, aber die Funktion eingeben ist so zu verstehen glaube ich, dass du der ein Array übergibst, das du dann anhängst ...
und deine Addfunktion und das mit dem Zaehler ist so eine nicht so tolle Lösung (glaube nicht, dass das funktioniert), wie soll das mit der Blockgröße eigtl. genau funktionieren?
Ich komme heute abend wieder on, dann habe ich mehr zeit bin etwas im Stress gerade, sorry ...
Also ich hab das mit der Blockgröße so verstanden:
Wenn das Array voll ist (anfang größe hab ich einfach auf 10 gesetzt) dann soll das Array vergrößert werden.
D.h. Ich muss das Array kopieren. Ich glaube dafür ist der CopyKonstruktor zuständig. Dann wird das alte Array gelöscht und um die Blockgröße (würde ich einfach auch auf 10 setzten) vergrößert.
Ich scheiß auf deine Welt voller Arroganz und Geld!
|
|
Rifleman - 40
Experte
(offline)
Dabei seit 09.2003
1540
Beiträge
|
Geschrieben am: 03.04.2007 um 14:18 Uhr
Zuletzt editiert am: 03.04.2007 um 14:21 Uhr
|
|
Zitat von -mOsTwAnTeD-: Wenn das Array voll ist (anfang größe hab ich einfach auf 10 gesetzt) dann soll das Array vergrößert werden.
D.h. Ich muss das Array kopieren. Ich glaube dafür ist der CopyKonstruktor zuständig. Dann wird das alte Array gelöscht und um die Blockgröße (würde ich einfach auch auf 10 setzten) vergrößert.
Genau. Das Kopieren ist sehr aufwändig. Deshalb macht es Sinn eine Blockgröße zu definieren. Dazu muss dann eben die Blockgröße, die Größe des Arrays und die Anzahl der tatsächlich enthaltenen ints verwaltet werden.
Ist (beim Hinzufügen) arraygröße == anzahl_werte wird ein neues Array erzeugt, das um blockgröße länger ist und die Werte werden kopiert. Danach kann der Array (blockgröße-1) Mal vergrößert werden, ohne dass kopiert werden muss.
Mit dem Copy-constructor hat das aber nichts zu tun. Du willst ja nicht gleich ein neues Objekt erzeugen sondern einfach einen neuen Array.
Normalerweise gibt es einen Standard-copyconstructor. Dieser erzeugt aber nur eine shallow-copy, was in diesem Fall nicht ausreicht, da sonst furchtbare Sachen passieren können. Beispielsweise könnte ein Objekt den Inhalt eines anderen ändern oder komplett vernichten...
Und zu dieser eingabe-fkt....ich weiss nicht genau, wie das gemeint ist. Man kann zwar schon eine Funktion definieren, die belibig viele Parameter frisst, aber das ist nicht sehr schön und sollte vermieden werden, wenn es geht....
(Ich glaube stdarg.h stelle etwas entsprechendes zur Verfügung...nicht sicher, ob das das Richtige ist...)
Es sind die kleinen Dinge, die einen zum Wahnsinn treiben.
|
|
Polaris
Experte
(offline)
Dabei seit 07.2006
1766
Beiträge
|
Geschrieben am: 03.04.2007 um 21:41 Uhr
Zuletzt editiert am: 03.04.2007 um 22:20 Uhr
|
|
Zitat:
Und zu dieser eingabe-fkt....ich weiss nicht genau, wie das gemeint ist. Man kann zwar schon eine Funktion definieren, die belibig viele Parameter frisst, aber das ist nicht sehr schön und sollte vermieden werden, wenn es geht....
(Ich glaube stdarg.h stelle etwas entsprechendes zur Verfügung...nicht sicher, ob das das Richtige ist...)
Du meinst den "..." oder? Das ist extrem un schöner Code und auch noch langsam (Rekursion), außerdem muss man ein paar Dinge beachten (Funktion muss __cdecl sein), cih dachte eher, dass man der Funktion ein "Array" und eine "Length" Variable übergibt und dieses Array dann hinzugefügt wird ...
/edit:
Wobei die ganze Aufgabe ist aus C++ Sicht eiN Witz, man muss nur 1 Zeile schreiben 
class CIntArray : public std::vector < int > {};
ein paar Sachen vllt. und dann ist fertig
Patriotismus ist die Tugend der Bosheit! (Oscar Wilde)
|
|
-mOsTwAnTeD- - 35
Profi
(offline)
Dabei seit 07.2006
677
Beiträge
|
|
Geschrieben am: 04.04.2007 um 07:59 Uhr
|
|
Zitat von Polaris: Zitat:
Und zu dieser eingabe-fkt....ich weiss nicht genau, wie das gemeint ist. Man kann zwar schon eine Funktion definieren, die belibig viele Parameter frisst, aber das ist nicht sehr schön und sollte vermieden werden, wenn es geht....
(Ich glaube stdarg.h stelle etwas entsprechendes zur Verfügung...nicht sicher, ob das das Richtige ist...)
Du meinst den "..." oder? Das ist extrem un schöner Code und auch noch langsam (Rekursion), außerdem muss man ein paar Dinge beachten (Funktion muss __cdecl sein), cih dachte eher, dass man der Funktion ein "Array" und eine "Length" Variable übergibt und dieses Array dann hinzugefügt wird ...
/edit:
Wobei die ganze Aufgabe ist aus C++ Sicht eiN Witz, man muss nur 1 Zeile schreiben 
class CIntArray : public std::vector < int > {};
ein paar Sachen vllt. und dann ist fertig 
wie jetzt?
Dann schreib ma bitte die paar Zeilen
Ich scheiß auf deine Welt voller Arroganz und Geld!
|
|
Polaris
Experte
(offline)
Dabei seit 07.2006
1766
Beiträge
|
|
Geschrieben am: 04.04.2007 um 14:04 Uhr
|
|
Zitat von -mOsTwAnTeD-: Zitat von Polaris: Zitat:
Und zu dieser eingabe-fkt....ich weiss nicht genau, wie das gemeint ist. Man kann zwar schon eine Funktion definieren, die belibig viele Parameter frisst, aber das ist nicht sehr schön und sollte vermieden werden, wenn es geht....
(Ich glaube stdarg.h stelle etwas entsprechendes zur Verfügung...nicht sicher, ob das das Richtige ist...)
Du meinst den "..." oder? Das ist extrem un schöner Code und auch noch langsam (Rekursion), außerdem muss man ein paar Dinge beachten (Funktion muss __cdecl sein), cih dachte eher, dass man der Funktion ein "Array" und eine "Length" Variable übergibt und dieses Array dann hinzugefügt wird ...
/edit:
Wobei die ganze Aufgabe ist aus C++ Sicht eiN Witz, man muss nur 1 Zeile schreiben 
class CIntArray : public std::vector < int > {};
ein paar Sachen vllt. und dann ist fertig 
wie jetzt?
Dann schreib ma bitte die paar Zeilen
das ist nicht Sinn der Sache, du sollst ja eine eigene solche Klasse programmieren und nicht auf die Container der STL vector, deque, list, ... zurückgreifen
Patriotismus ist die Tugend der Bosheit! (Oscar Wilde)
|
|
Polaris
Experte
(offline)
Dabei seit 07.2006
1766
Beiträge
|
Geschrieben am: 04.04.2007 um 14:29 Uhr
Zuletzt editiert am: 04.04.2007 um 15:26 Uhr
|
|
Damit das hier richtig verstanden wird: wir machen hier keine Hausaufgaben für dich.
Ich schreibe mal 2-3 Dinge rein, was mir an deinem bisherigen Code auffällt.
Deine Addfunktion musst du noch auf Überlauf prüfen.
Die Zählvariable m_Zaehler ist die hinterste, unbeschriebene Position im Array, oder?
Dann musst du ihn bei der Addfunktion natürlich erhöhen.
Blockgroesse muss mindestens 1 sein (sonst das halt in die else-Verzweigung einbauen)!
void CIntArray::AriseArray(int _Blockgroesse) {
int* _Temp = new int[m_Groesse + _Blockgroesse];
memset(_Temp, 0, sizeof(int) * (m_Groesse + _Blockgroesse));
memcpy(_Temp, m_pData, sizeof(int) * m_Groesse);
delete[] m_pData;
m_pData = _Temp;
}
void CIntArray::Add(int Zahl)
{
if(++Zaehler < = m_Groesse)
m_pData[m_Zaehler] = Zahl;
else {
AriseArray(Blockgroesse > 0?Blockgroesse:1);
m_pData[m_Zaehler] = Zahl;
}
}
Weiteres nach dem Essen 
/EDIT:
!Für Syntax-Highlighting im TU-Forum!
Patriotismus ist die Tugend der Bosheit! (Oscar Wilde)
|
|
-mOsTwAnTeD- - 35
Profi
(offline)
Dabei seit 07.2006
677
Beiträge
|
Geschrieben am: 04.04.2007 um 14:40 Uhr
Zuletzt editiert am: 04.04.2007 um 14:42 Uhr
|
|
Hi
Danke für deine Antwort.
Ich hab folgenden code:
Und das Programm läuft so wie es soll...
aber ich hab keinen Kopykonstruktor und auch keinen Übergabeoperator.
ich poste mal meinen code
[quote]
#include "stdafx.h"
#include
#include
#include
#include
#include
#include
int cmpFunc(const void* _a, const void* _b)
{
const float* a = (const float*) _a;
const float* b = (const float*) _b;
if(*a > *b) return 1;
else
if(*a == *b) return 0;
else return -1;
}
class CIntArray
{
public:
CIntArray();
CIntArray(int Groesse,int Blockgroesse);
CIntArray(const CIntArray& co);//?????
int Clear(int Groesse);
int Zuweisungsoperator();//?????
int Add(int Zahl);
int Getsize();
int SetAt(int Index,int Zahl);
int Ausgabe();
int Eingeben();
int Sortiere();
int Quicksort();
protected:
int* m_pData;
int m_Groesse;
int m_Zaehler;
};
CIntArray::CIntArray()
:m_pData(0),m_Groesse(0)
{
}
CIntArray::Quicksort()
{
qsort((void*) m_pData,m_Zaehler,sizeof(m_pData[0]),cmpFunc);
cout
Ich scheiß auf deine Welt voller Arroganz und Geld!
|
|