Stack
Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
Aufgabe 9.1
Bitte schoen zur besseren Uebersicht
was wollen die bei KellerTest.java von mir
ich hab kein plan was ich da alles testen soll und in welchem ausmaß
ich bekomm auch nur 10% obwohls richtig ausschaut
public Keller add(Object o) {
Object appendedKeller[] = new Object[this.keller.length+1];
if (this.keller.length>256) {System.err.println("Der Keller ist voll!!!");}
appendedKeller = (Object[])this.keller.clone();
appendedKeller[appendedKeller.length-1] = o;
this.keller = appendedKeller;
return this;
}
dürfte doch eigentlich stimmen oder
raistlin, was machst du denn da?
Warum kopierst du dein Array?
Lege dir am Anfang doch einfach ein Array mit 256 Plaetzen an und fuelle das bei jedem add auf.
Bei top gibste das zuletzt einfuegte wieder her und bei pop loeschste das zuletzt eingefuegte aus dem Array wieder raus.
Was du da gemacht hast, verdreht einem den Kopf.
Das mag zwar fuer die imperative Lsg. (also, dass add einen neuen Keller liefert stimmen) aber fuer die OO-variante ist das nicht sinnvoll.
“return this;” sollteste allerdings drin lassen. Denn sowas soll moeglich sein:
Keller stack = new KellerImplementierung();
Object c = stack.add(new Integer(3)).add(new String("hallo")).top().pop();
// na was ist jetzt in "c" drin?
@KellerTest.
Na was sollst du da wohl machen?
Teste deinen Keller.
Was passiert wenn du mehr als 256 Elemente reinpackst.
Was macht top oder pop auf einen leeren Keller…
Lauter solche Sachen eben.
Wie ersetze ich die Methode create durch den Konstruktor von KellerImplementierung?
ich mache das derzeit so:
public Keller create() {
Keller cellar = new KellerImplementierung();
return cellar;
}
Aber ich bin mir ganz und gar nicht sicher, ob das so richtig ist oder ueberhaupt funktioniert. o_o
Wie in der Aufgabe beschrieben, soll es eigentlich keine Methode namens create() geben.
Der Keller soll durch deinen Konstruktor der Klasse KellerImplementierung erstellt werden.
public KellerImplementierung()
{
kellerarray = new Object[256];
}
… und wenn du [m]kellerArray[/m] gleich bei der Deklaration initialisiert, könntest du den Konstruktor auch noch über Bord werfen.
Bei der imperativen Sichtweise braucht es einer Funktion welche deinen Keller erstellt.
Und welche Methode erstellt deine KellerImplementierung?
Genau, der Konstruktor.
Ich hab mir das mal eingebaut, aber das kann doch gar nicht klappen, oder seh ich das falsch? Schliesslich liefert „pop()“ kein object zurück. Aber davon mal abgesehen, wenn ich das einem Keller liefern will, sagt er immer dass die Methode „pop()“ nicht gefunden wurde.
Eine Idee warum?
wenn ich den pop-aufruf an andere Stelle bastel (zum Beispiel zwischen die beiden „adds“) klappt es ganz normal…
Da hat sich ein kleiner Tippfehler eingeschlichen. Gemeint hat hehejo vermutlich, dass erst [m]pop()[/m] kommt und dann [m]top()[/m].
achso , na dann klappts…
Hab aber trotzdem nur 20%… Gibt es irgendwelche Sachen, die man mit Sicherheit abfragen muss? Irgendwas bekannt?
mfg
Wegen dem 20%:
Kann des sein, dass deine pop Methode eine Kopie des Stacks erstellt, halt mit einem Element weniger, und diese zurückgibt?
Wenn ja, gemeint ist, dass du deinen internen Stack einfach um seinen “Kopf” (oberstes Element) kürzt und per this zurück gibst.
Kann nen Sprung von 20% auf 100% bedeuten…
Wegen dem 20%:
Kann des sein, dass deine pop Methode eine Kopie des Stacks erstellt, halt mit einem Element weniger, und diese zurückgibt?
Wenn ja, gemeint ist, dass du deinen internen Stack einfach um seinen „Kopf“ (oberstes Element) kürzt und per this zurück gibst.
Kann nen Sprung von 20% auf 100% bedeuten…
Ich hab’s auch so gemacht, dass ich einfach ein neues Objekt erstelle und das zurückgebe, weil ich keine Ahnung hatte, ob es ausreicht das letzte Element des Arrays, den ich zum zwischenspeichern benutze, auf null zu setzen.
Danke!
Danke TheChip, genau das war mein Fehler!
Kann mir jemand mal bitte eine kleine Hilfestellung geben. Mit den ADTs bin ich leider nicht so ganz glücklich.
Ich wollte einfach nur wissen, da der Keller ja im Prinzip eine verkette Liste darstellt, wo ich denn meine Klasse deklarieren muss, von der ich dann meine Keller-Objekte erstelle die ich verknüpfe … wie in der VL diese class Element { …}.
Tut mir leid für die alberne Frage, aber es liegt einfach am Durchblick. Dann komm ich sicherlich weiter.
Vielen Dank,
Gruß simple
@ simple
du denkst viel viel zu kompliziert den keller sollst fur über ein array mit der größe 256 lösen. und in deiner KellerTest.java erstellest du eine Instanz von KellerImplementierung. Hoffe ich hab dir etwas weiterhelfen können :finger:
hab 0 plan echt, hab sowas:
public class KellerImplementierung implements Keller {
int stelle;
keller K;
public Keller add(Object t, Keller s) {
s[stelle]=t;
stelle++;
return s;
}
public Keller pop(Keller s) {
s[stelle]=0;
stelle--;
return s;
}
public Object top(Keller s) {
return s[stelle];
}
public boolean empty(Keller s) {
for(int i=0; i < s.length; i++) {
s[i]=0;
}
}
public KellerImplementierung() {
K = new Object[256];
stelle=0;
}
}
aber es scheint bloedsinn zu sein
Ich hänge mal mein Interface an, damit du weißt, wie die Signaturen der Methoden ausehen müssen.
Attachment:
Keller.java: https://fsi.cs.fau.de/unb-attachments/post_30612/Keller.java
Kellertester???
also ich hab keine Ahnung funktioniert so ein Test???
KellerImplementierung Tester = new KellerImplementierung();
Tester.empty();
Tester.top();
Tester.pop();
Tester.add( new String ("xyz"));
if (Tester.empty() == false){
System.out.println("yeah it works!!!");
}
System.out.println(Tester.top());
Tester.pop();
Tester.pop();
for (int i=0; i<260;i++){
Tester.add(new Integer(i));
Mein Test sieht folgendermasen aus.
Ich lege einen Keller an, versuche ihn mit 257 elementen zu fuellen, somit habe ich beim letzten add vorgang einen fehler, dann schaue ich ob er empty ist, was natuerlich zu false fuehrt. dann poppe und toppe ich wieder 257 elemente, was 256 funktioniert und beim letzten pop wieder ein fehler bringt. dann nochmal empty ich den keller, bekomme als ausgabe true und ich bin gleucklick hoffe konnte dir helfen.