-
Forum: Object-Pascal / Delphi-Language
Delphi
by Macci,
1. Mär 2008
In welcher Klasse bist du denn?
Naja vielleicht hilft dir mein Code ja trotzdem ein bisschen, wenn du irgndwo nicht weiter weist ;-)
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Macci,
1. Mär 2008
Hatte grad nix besseres zu tun, also hab ich dir mal so ein Ding programmiert ;-)
Kannst du gerne so oder abgeändert verwenden.
Viel Spass damit :-D
Macci
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Macci,
1. Mär 2008
Hab das jetzt mal für dich gemacht.
Hier der interface-Teil:
type
TExpression = class
public
function eval:Extended; virtual; abstract;
end;
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Macci,
1. Mär 2008
Wieso verwendest du dann überhaupt "char" ? Ich würde an deiner Stelle eine eigene Klasse, z.B. TExpression mit der abstrakten Funktion eval() als Nachfahre von TObject anlegen. Und die Nachfahren dieser Klasse sind dann TZahl, TAdd, TSub, TMul und TDiv (ggf. noch weitere Rechenoperationen).
Dann verwendest du statt char einfach TExpression und du kannst wunderbar damit arbeiten.
PS:...
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Macci,
1. Mär 2008
Also Freigeben ist das Gegenteil von Reserverien (was du z.B. mit "new(zhilf)" machst). Wenn du das Element aus dem Keller holst, ist es nicht nötig, selbiges Element noch weiter im Speicher zu behalten. Deswegen gibt man diesen Speicher dann mit Dispose frei. Würde man auf dieses Freigeben verzichten, würde das Programm zwar trotzdem ganz normal funktionieren aber unter Umständen Unmengen an...
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Macci,
1. Mär 2008
@praesident:
Zeig doch bitte mal den restlichen Quelltext, wo du die Push und Pop Methoden verwendest. Würde mich persönlich mal interessieren. Freut mich natürlich, dass es klappt ;-)
@alzaimar:
Joa genau so isses. Ich hoffe du kannst mir verzeihen, dass ich diesen Code nur schnell schnell hingerotzt hab und an das Freigeben des Speichers zunächst gar nicht dachte. War halt schon spät. ...
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Macci,
1. Mär 2008
Dann versuchst du einmal irgendwo von einem leeren Stack zu poppen. Das geht natürlich nicht ;-)
Zeig doch mal den restlichen Code.
Mir fällt grade auf: Etwas sauberer wäre es natürlich, bei der POP-Funktion mit Dispose den verwendeten Speicher freizugeben.
edit: Also so:
FUNCTION pop(VAR zkopf:tzeiger):char;
var zhilf:tzeiger;
BEGIN
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Macci,
1. Mär 2008
Joa, dann benutze sowohl meine PUSH als auch meine POP Funktion.
Hier nochmal:
PROCEDURE push(VAR zkopf:tzeiger;inhalt:Char);
var zhilf:tzeiger;
BEGIN
new(zhilf);
zhilf^.inhalt:=inhalt;
zhilf^.next:=zkopf;
zkopf:=zhilf
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Macci,
29. Feb 2008
Wenn du bei meiner Funktion
push a
push b
push c
machst, und darauf hin 3 pop's folgen, liefern diese in dieser Reihenfolge: c b a (!)
Also immer das LETZTE Element wird ZUERST entfernt.
Genau das erwartet man von einem Keller auch.
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Macci,
29. Feb 2008
Der Sinn eines Kellers ist es ja gerade, möglichst schnell den Kram reinschmeissen zu können (Aufwand O(1)) und möglichst schnell an des LETZTE eingelagerte Element dranzukommen (Aufwand O(1)).
Diese beide Punkte würdest du zunichte machen, wenn du immer absichtlich den Keller bis zum Ende hin durchforstest (jeweils Aufwand O(n)). Kannst du deinem Lehrer auch so sagen ;-)
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Macci,
29. Feb 2008
Schau mal, so klappts:
PROCEDURE push(VAR zkopf:tzeiger;inhalt:Char);
var zhilf:tzeiger;
BEGIN
new(zhilf);
zhilf^.inhalt:=inhalt;
zhilf^.next:=zkopf;
zkopf:=zhilf
END;
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Macci,
29. Feb 2008
Achso, nein würde es nicht, weil du ja keine FIFO-Schlage sondern einen LIFO-Keller willst. Sorry ;-)
Allerdings würde mein Vorschlag passen, wenn du für das Push auch eine entsprechende Prozedur verwenden würdest, die das neue Element am Anfang einfügt, die übrigens viel einfacher wäre.
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Macci,
29. Feb 2008
Würde statt
FUNCTION pop(VAR zkopf:tzeiger):char;
VAR zhilf1,zhilf2:tzeiger;
z:char;
BEGIN
zhilf1:=zkopf;
zhilf2:=zkopf^.next;
WHILE NOT(zhilf2^.next = NIL) DO
BEGIN
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Macci,
29. Feb 2008
Stimmt, daran dass zkopf schon mit nil übergeben wird, habe ich gar nicht gedacht ;-)
@DeddyH:
Hier
while (zhilf <> nil) and (zhilf^.next <> nil) do
zhilf:=zhilf^.next;
ist die erste Abfrage (zhilf<>nil) unnötig ;-)
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Macci,
29. Feb 2008
Komisch... gib doch bitte mal die Definiton von TZeiger
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Macci,
29. Feb 2008
Warum nicht einfach so?
PROCEDURE push(VAR zkopf:tzeiger;inhalt:char);
VAR zhilf,zneu:tzeiger;
BEGIN
zhilf:=zkopf;
WHILE NOT (zhilf^.next=NIL) DO zhilf:=zhilf^.next;
new(zneu);
zneu^.inhalt:=inhalt;