![]() |
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?? |
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: ). |
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. |
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... |
Re: UPN Rechner
Zitat:
Zitat:
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:
Als nächstes wird die 2 gepusht:
(Stack) 1
Delphi-Quellcode:
Da der "+"-Operator zwei Operanden hat, werden nun zwei Werte vom Stack geholt (POP):
(Stack) 1 2
Delphi-Quellcode:
Der Operator addiert die zwei Werte und PUSHt das Ergebnis wieder auf den Stack:
(Stack)
Delphi-Quellcode:
Stack.Push(StrToFloat(Copy(...)));
(Stack) 3
Delphi-Quellcode:
Stack.Push(Stack.Pop * Stack.Pop);
(Stack) 3 3
Delphi-Quellcode:
(Stack) 9
|
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? |
Re: UPN Rechner
Zitat:
Zitat:
Delphi-Quellcode:
with Stack do
Push(Pop + Pop); Zitat:
marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz