Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi UPN Rechner (https://www.delphipraxis.net/60883-upn-rechner.html)

Blacklady124 13. Jan 2006 14:58


UPN Rechner
 
Hallo, wir programmieren gerade im Unterricht einen UPN Rechner.
Die Vorgehensweise habe ich bis auf weiteres verstanden usw.
Aber ich habe nicht so recht die Ahnung, wie ich den Rechner mithilfe eines Stacks programmieren soll.
Hat jemand von euch Erfahrung mit UPN Rechnern und könnte mir sagen wie ich da anfangen muss?
Bin mir übrigens nicht sicher, ob ich mit Delphiwin32 oder Delphi.NET arbeite, wo liegt der Unterschied??

Khabarakh 13. Jan 2006 15:25

Re: UPN Rechner
 
Wo genau kommst du nicht weiter? Du musst eigentlich nur den String von links nach rechts parsen. Falls du ein Literal(z.B. "13") / eine Konstante (z.B. "Pi") unter der Nase hast, pushst du sie auf den Stack. Bei einem Operator holst du so viele Argumente vom Stack herunter, wie der Operator Operanden hat, und pushst das Ergebnis wieder auf den Stack. Wenn alles funktioniert hat, ist genau ein Wert auf dem Stack, das ist das Endergebnis.

PS: .NET und natives Win32 sind zwei paar Schuhe, benutzt ihr in der Schule Win32, solltest du dieses unbedingt auch benutzen (und dein Profil auf den neuesten Stand bringen :wink: ).

marabu 13. Jan 2006 15:31

Re: UPN Rechner
 
Herzlich Willkommen in der Delphi-PRAXiS, blacklady124.

Es wird mir nicht so richtig klar, was du schon verstanden hast und wo du noch ein Verständnisproblem hast. Weil die Umgekehrte Polnische Notation (UPN) eine Postfix Notation ist (erst die Operanden, dann der Operator) musst du dir immer mindestens ein Zwischenergebnis merken. Ich vermute, dass die wesentliche Lernleistung bei dir darin bestehen soll den abstrakten Datentyp Stack zu implementieren. Dazu musst du dir einfach eine neue Klasse TStack entwerfen, die eine einfach verkettete Liste als Gedächtnis benutzt. Jedes Listen-Item hat dann einen Zeiger auf das nachfolgende Item und ein Datenfeld vom Typ Extended. Dann brauchst du mindestens noch Methoden um ein Item auf den Stapel zu legen (Push) und es wieder herunter zu nehmen (Pop). Mal sehen wie weit du kommst.

Freundliche Grüße vom marabu

PS: Delphi7 hat nichts mit .NET zu tun.

Blacklady124 13. Jan 2006 15:41

Re: UPN Rechner
 
Also ich bin jetzt so weit:
Die Unit TStack ist fertig soweit ich das nachvollziehen kann.
Es geht also um die eigentliche Funktion und Vorgehensweise des Rechners.
Mir ist klar, dass ich mindestens einen Speicher brauche, dachte eigentlich, man bräuchte 3, 2 für die jeweiligen Zahlen und einen für das rechenzeichen, ist das richtig oder eher unnötig? Ausserdem wollte ich trennen nach +- und */ um das mit der punkt vor strich rechnungirgendwie in den griff zu bekommen? ist der ansatz überhaupt richtig?
Und...ich überleg gerad...hätte ich die speicher schon in tStack anlegen müssen? ja oder?
Stehe also ziemlich hilflos am anfang der sache, denke wenn ich ein mal den einstig hab, dann wird es auch einfacher...

Khabarakh 13. Jan 2006 16:15

Re: UPN Rechner
 
Zitat:

Mir ist klar, dass ich mindestens einen Speicher brauche, dachte eigentlich, man bräuchte 3, 2 für die jeweiligen Zahlen und einen für das rechenzeichen, ist das richtig oder eher unnötig?
Du brauchst nur einen Stack. Auf diesen kommen die Zwischenergebnisse, wie ich es oben beschrieben habe.
Zitat:

Ausserdem wollte ich trennen nach +- und */ um das mit der punkt vor strich rechnungirgendwie in den griff zu bekommen? ist der ansatz überhaupt richtig?
Nicht wirklich, bei UPN gibt es keine Operatorrangfolge :wink: .

Am Besten gebe ich mal ein kleines Beispiel:
1 2 + 3 *

Zuerst muss dein Parser die "1" als Zahl erkennen und wirft sie auf den Stack (PUSH):
Delphi-Quellcode:
(Stack) 1
Als nächstes wird die 2 gepusht:
Delphi-Quellcode:
(Stack) 1 2
Da der "+"-Operator zwei Operanden hat, werden nun zwei Werte vom Stack geholt (POP):
Delphi-Quellcode:
(Stack)
Der Operator addiert die zwei Werte und PUSHt das Ergebnis wieder auf den Stack:
Delphi-Quellcode:
(Stack) 3
Stack.Push(StrToFloat(Copy(...)));
Delphi-Quellcode:
(Stack) 3 3
Stack.Push(Stack.Pop * Stack.Pop);
Delphi-Quellcode:
(Stack) 9

Blacklady124 13. Jan 2006 17:05

Re: UPN Rechner
 
Okay, das habe ich soweit verstanden.
Aber auf die Gefahr, dass es noch peinlicher wird (Ich hab noch nie mit einem Stack gearbeitet)
wenn ich will, dass die Zahl aus "Eingabe" in den Stack gepusht wird, schreibe ich das dann Stack.push(Eingabe.Text); Sicher nicht, oder?
Und wenn ich will, dass er die zwei Elemente aus dem Stack nimmt, um sie zu addieren, wie mache ich das?
Und gibt das nicht Probleme bei der Subtraktion, wenn das letzte Element vom vorletztem abgezogen wird?
Oder muss ich dann mit neg. Vorzeichen arbeiten?

marabu 13. Jan 2006 17:50

Re: UPN Rechner
 
Zitat:

Zitat von Blacklady124
wenn ich will, dass die Zahl aus "Eingabe" in den Stack gepusht wird, schreibe ich das dann Stack.push(Eingabe.Text); Sicher nicht, oder?

Das kommt auf deine Stack-Implementierung an. Ich würde gleich Rechenwerte (Typ Extended) auf dem Stack ablegen und nicht Text, den ich dann ständig konvertieren müsste.

Zitat:

Zitat von Blacklady124
Und wenn ich will, dass er die zwei Elemente aus dem Stack nimmt, um sie zu addieren, wie mache ich das?

Delphi-Quellcode:
with Stack do
  Push(Pop + Pop);
Zitat:

Zitat von Blacklady124
Und gibt das nicht Probleme bei der Subtraktion, wenn das letzte Element vom vorletztem abgezogen wird?

Du musst die Werte in der richtigen Reihenfolge auf den Stack schieben - oder du musst eine Methode Swap() implementieren.

marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz