[Erledigt] Übungsklausur: Array Klasse mit Funktionalität eines Vektors implemetieren
-
Hallo allerseits!
Wie dem Titel des Themas zu entnehmen geht es wieder um eine Übungklausur, der ich ratlos gegenüber stehe.
Hier mal das Dokument mit den allgemeinen Vorgaben:
https://www.fbi.h-da.de/fileadmin/personal/r.nitsch/Download/PG1-UebungsLNe/PG1-07SS-UebungsKlausur.pdfDie einzelnen Aufgabenpunkte gab es diesmal in Form einer CPP-Datei (erstmal ein kleiner Teil davon):
#include "ArraySS07.h" #include <iostream> using namespace std; int main() { // Unmittelbar hinter der Aufgabenstellung finden Sie jeweils Platz für Ihre Anweisungen! // Wenn Anweisungen vorgegeben sind, dürfen Sie diese nicht ändern. // *** :rage: VIEL ERFOLG *** // Implementieren Sie die Klasse so, dass sie folgende Anweisungen versteht. // Zunächst wird ein C-Array für Ganzahlen definiert const int MAX_SIZE = 20; int carray[MAX_SIZE]; // Füllen Sie die 10 Elemente mit den Werten 0 bis 9 [Dafür gibt es noch keine Punkte :-(]Und hier schon das erste Verständnisproblem: MAX_SIZE wird mit dem Wert 20 initalisiert, später heißt es aber "die 10 Elemente"..
Meine momentane Implementierung:
for(int i=0; i< MAX_SIZE;i++) { carray[i] = i; } //-------Nächste Teilaufgabe------------------------- // Deklarieren und Implementieren Sie nun class Array // Beachten Sie folgendes Implementationsdetail: Der Datentyp Array soll intern ein statisches C-Array // mit MAX_SIZE=100 Elementen vom Typ int verwalten // Nun erzeugen wir ein Array-Objekt a mit 100 Elementen vom Typ int die alle den Wert 0 haben [Max. 5(10) Pkt] ArraySS07 a(100,0);Header-Datei
#pragma once #include <iostream> class ArraySS07 { private: enum {MAX_SIZE=100}; int Array[MAX_SIZE]; int value; public: ArraySS07(int MAX_SIZE, int value=0); ~ArraySS07(); ...**
CPP-Datei**ArraySS07::ArraySS07(int MAX_SIZE, int value) { this->value=value; for(int i=0;i<MAX_SIZE;i++) this->Array[i]=value; }Ich nehm an, dass diese Aufgabe so stimmt (hoffentlich
)//---------Nächste Teilaufgabe------------- /* Nun erzeugen wir ein Array-Objekt b, das mit den Elementen mit Index im Bereich [0,10) (Achtung: Index 10 bezeichnet das one-past-the-end-Element) von carray initialisiert wird. [Max. 5(15) Pkt]*/ ArraySS07 b(carray,0,10);Dazu habe ich meiner Klasse einen weiteren Konstruktor hinzugefügt, bin mir aber nicht sicher, ob das so stimmt, jedenfalls funktioniert es nicht ganz richtig, warum sieht man gleich an der Ausgabe der Arrays..
//------Header---------- public: ArraySS07(int MAX_SIZE, int value=0); ArraySS07(int carray[] , int min, int max); ~ArraySS07(); //-----------CPP------------------ ArraySS07::ArraySS07(int carray[], int min, int max) { for(int i=min;i<max;i++) this->Array[i] = carray[i]; } //-----------Vorab eine Ausgabe der beiden Arrays-------- // So sollte der Bildschirm (später) aussehen (natürlich ohne Kommentarzeichen) // [ 0]...[ 9]: 0 0 0 0 0 0 0 0 0 0 // [ 10]...[ 19]: 0 0 0 0 0 0 0 0 0 0 // [ 20]...[ 29]: 0 0 0 0 0 0 0 0 0 0 // [ 30]...[ 39]: 0 0 0 0 0 0 0 0 0 0 // [ 40]...[ 49]: 0 0 0 0 0 0 0 0 0 0 // [ 50]...[ 59]: 0 0 0 0 0 0 0 0 0 0 // [ 60]...[ 69]: 0 0 0 0 0 0 0 0 0 0 // [ 70]...[ 79]: 0 0 0 0 0 0 0 0 0 0 // [ 80]...[ 89]: 0 0 0 0 0 0 0 0 0 0 // [ 90]...[ 99]: 0 0 0 0 0 0 0 0 0 0 // // [ 0]...[ 9]: 0 1 2 3 4 5 6 7 8 9Hier ist dann das Problem. Mein Array b beinhaltet nicht nur die Ziffern 0-9 sondern noch weitere 90 Random Werte, was ja nicht weiter verwunderlich ist, da mein Klassen-Array ja aus 100 Elementen besteht.
Bis hierin reichts vorerst.. hab zwar noch einige weitere Probleme, aber erstmal der Reihe nach.
Ein dickes Danke schonmal für eure Hilfe

MfG
Sorex
-
Bei der ersten Frage zum C-Array mußt du deinen Professor/Lehrer/Betreuer fragen, was damit gemeint sein soll. Aber die übrigen Aufgaben sehen eher so aus, als ob die Größe bzw. der Index-Bereich per Konstruktor vorgegeben werden soll und du dann entsprechend viel Platz zur Verfügung stellen mußt.
-
Seh ich das richtig, dass das so dann nur über Pointer geht?
-
Ich denke, dass du das member "value" der Klasse ArraySS07 anders verwendest, als dein Prof es von dir erwartet. Es macht ja wenig Sinn der variable den Wert 0 zuzuweisen, wenn das Array 100 0-initialisierte Elemente halten soll.
Ich würde den Wert als one-past-the-end Marke verwenden.Im ersten Fall erstellst du ein array, welches 100 int-Werte fassen soll (alle mit Wert 0), also ist der letzte valide Index 99 und ich würde value den Wert 100 zuweisen.
Im zweiten Fall sollen lediglich 10 Elemente gespeichert werden -> letzter valide Index ist 9, also erhält value den Wert 10 (bzw. max-min).
Warum brauchst du solch eine Marke? Weil das Array nicht dynamisch erstellt wird, sondern statisch und immer eine feste Grösse hat. Trotzdem möchtest du ja irgendeine Möglichkeit haben abzufragen, wieviele Werte im array stehen, bzw. dessen Grösse abfragen.
-
inter2k3 schrieb:
Ich denke, dass du das member "value" der Klasse ArraySS07 anders verwendest, als dein Prof es von dir erwartet. Es macht ja wenig Sinn der variable den Wert 0 zuzuweisen, wenn das Array 100 0-initialisierte Elemente halten soll.
Ich würde den Wert als one-past-the-end Marke verwenden.Im ersten Fall erstellst du ein array, welches 100 int-Werte fassen soll (alle mit Wert 0), also ist der letzte valide Index 99 und ich würde value den Wert 100 zuweisen.
Ich hatte das so aufgenommen, dass die 0 hinten den Wert angibt, mit denen das Array gefüllt werden soll. Wenn ich jetzt zb die 0 mit einer 5 austausche, würde das bedeuten, dass meine 100 Felder mit dem Wert 5 gefüllt werden.
Kann jetzt auch nicht ganz nachvollziehen wie du das gemeint hast, denn ich darf am Aufruf a(100,0) nichts ändern -> war vom Prof so vorgegeben.
inter2k3 schrieb:
Im zweiten Fall sollen lediglich 10 Elemente gespeichert werden -> letzter valide Index ist 9, also erhält value den Wert 10 (bzw. max-min).
Warum brauchst du solch eine Marke? Weil das Array nicht dynamisch erstellt wird, sondern statisch und immer eine feste Grösse hat. Trotzdem möchtest du ja irgendeine Möglichkeit haben abzufragen, wieviele Werte im array stehen, bzw. dessen Grösse abfragen.
Im 2. Teil habe ich das MAX als meine maximale Größe des Arrays gesehen, wobei 10 das one-past-the-end Element ist.
Das Problem ist aber jetzt, dass ich in meiner Implementierung mein carray[] dem Array meiner ArraySS07 Klasse zuweise, welches ja einen statischen Index von 100 hat. Deshalb werden die ersten 10 Felder richtig gefüllt, die anderen 90 haben aber irgendwelche random Werte. Weiß aber auch nicht genau wie ich das ohne Pointer anders realisieren könnte.
-
Sorex schrieb:
Ich hatte das so aufgenommen, dass die 0 hinten den Wert angibt, mit denen das Array gefüllt werden soll. Wenn ich jetzt zb die 0 mit einer 5 austausche, würde das bedeuten, dass meine 100 Felder mit dem Wert 5 gefüllt werden.
Kann jetzt auch nicht ganz nachvollziehen wie du das gemeint hast, denn ich darf am Aufruf a(100,0) nichts ändern -> war vom Prof so vorgegeben.
Richtig. ArraySS07 a(100,0) soll laut Aufgabe ein Objekt erzeugen, das 100 Elemente umfasst, die alle den Wert 0 haben sollen. Also würde beispielsweise ArraySS07 nocheins(34,211) ein Objekt ertellen, dass 34 Elemente verwalten soll, die alle den Wert 211 haben. Soweit ist denke ich alles klar.
Die Frage ist nun, warum du dem member value den Wert 211 zuweisen solltest (respektive 0 im ersten Fall)? Den Wert weist du den Elementen des intern arrays zu, also Array[0]-Array[33], nicht aber value. Damit du aber im zweiten Fall auch später immernoch weisst, dass dein Objekt eben 34 Elemente umfasst, muss das ja irgendwo gespeichert werden - und diesen Wert würde ich nun in value speichern (auch wenn mir der Variablenname irgendwie eigenartig vorkommt).Der zweite Fall verhält sich ähnlich. Du musst wiederum nur abspeichern, wieviele Elemente des internen Array verwendet werden. Einfach den dritten Parameter zu verwenden ist allerdings eine schlechte Idee, da man ja irgendeine Range nehmen könnte, z.B.:
ArraySS07 b(carray,4,9);Es sollen also in deinem Objekt b nur 5 Elemente gespeichert werden, nämlich carray[4] bis carray[8]. Würdest du nun den dritten Parameter verwenden um zu speichern, wieviele Elemente intern verwaltet werden würdest du mit 9 einen falschen Wert eintragen. Daher mein Vorschlag (max-min), in dem Fall also (9-4), was 5 sind. Du könntest also über eine später zugefügte Funktion size() beispielsweise abfragen, wie gross dein array ist - und lieferst einfach value zurück (in dem Fall also 5). Gleichzeitig ist dies auch der index für das "one-past-the-end-element". Das letzte verwaltete Element hat nämlich den index 4.
-
Mit
#pragma once #include <iostream> class ArraySS07 { private: enum {MAX_SIZE=100}; int Array[MAX_SIZE]; int value; public: ArraySS07(int MAX_SIZE, int value=0); ~ArraySS07(); ... };wird das wohl nicht gehen, du brauchst zwei Änderungen:
-
Da dein Array eine feste Größe hat musst du dir irgendwo merken, wie viele Elemente tatsächlich benutzt werden. Außerdem musst du sicherstellen, dass niemals mehr als 100 Elemente benutzt werden, weil du sonst auf ungültigen Speicher zugreifst.
-
value als Element wird nicht benötigt, das brauchst du nur, um das Array im Konstruktor mit dem richtigen Initialwert zu füllen.
-
-
Danke an euch

Hab alles hinbekommen.