AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

UPN Rechner

Ein Thema von Blacklady124 · begonnen am 13. Jan 2006 · letzter Beitrag vom 13. Jan 2006
Antwort Antwort
Blacklady124

Registriert seit: 13. Jan 2006
3 Beiträge
 
Delphi 7 Enterprise
 
#1

UPN Rechner

  Alt 13. Jan 2006, 15:58
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??
J
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#2

Re: UPN Rechner

  Alt 13. Jan 2006, 16:25
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 ).
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: UPN Rechner

  Alt 13. Jan 2006, 16:31
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.
  Mit Zitat antworten Zitat
Blacklady124

Registriert seit: 13. Jan 2006
3 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: UPN Rechner

  Alt 13. Jan 2006, 16:41
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...
J
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#5

Re: UPN Rechner

  Alt 13. Jan 2006, 17:15
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 .

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):
(Stack) 1 Als nächstes wird die 2 gepusht:
(Stack) 1 2 Da der "+"-Operator zwei Operanden hat, werden nun zwei Werte vom Stack geholt (POP):
(Stack) Der Operator addiert die zwei Werte und PUSHt das Ergebnis wieder auf den Stack:
(Stack) 3 Stack.Push(StrToFloat(Copy(...)));
(Stack) 3 3 Stack.Push(Stack.Pop * Stack.Pop);
(Stack) 9
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Blacklady124

Registriert seit: 13. Jan 2006
3 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: UPN Rechner

  Alt 13. Jan 2006, 18:05
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?
J
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: UPN Rechner

  Alt 13. Jan 2006, 18:50
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 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 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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:18 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