![]() |
Taschenrechner mit Zwischenergebnis programmieren
Servus ! Hab mir vorgenommen einen TR zu programmieren, als Vorbild den Windwos TR. Habe einen Stack erstellet auf den ich mit Pop Push usw zugreifen kann. Einen Num Stack für die Zahlen und einen Operatorstack. Habe in einer Hirarchie festgelegt welcher Operator am stärksten bindet , am zweistärksten usw. 0 bekommen die stärksten mit auf den Stack , 1 die zweitstärksten usw. So wollte ich dann vergleichen ob das Object von der Operatorzahl auf dem Stack höhe rist als das neue usw, um Punkt- vor- Strich-Rechnung zu realisieren. Habe aber ein Problem: wenn man 1+ eingibt und dann wieder eine Zahl, dann wird das Editfeld gelöscht und die neue Zahl steht da, alles richtig, solange bis er das erste Zwischenregebnis anzeigt, dann muss man jedoch zweimal auf den Plus button klicken damit er mit dem Zwischenregebnis weiterrechnet. Bei einem Klick bleibt es stehen und es passiert nichts. Hier mal der Code:
Code:
Vielleicht sieht jemand wo mein Fehler liegt.
procedure TForm1.EAusgabeKeyPress(Sender: TObject; var Key: Char);
var OpPosition: integer; OpAltPosition: integer; Zahl,ZahlAlt: extended; OpAlt : String; begin inc(anz); if (Op <> '') and (anz = 1) then EAusgabe.Text := ''; if Key in [',','0','1','2','3','4','5','6','7','8','9'] then exit; if OpPos(Key,OpPosition)= true then {Wenn key ein Operator ist} begin Label1.Caption:= Key; Zahl:= StrToFloat(EAusgabe.Text); if OpStack.IsEmpty= false then begin OpStack.PopObject(TObject(OpAltPosition)); if OpAltPosition <= OpPosition then begin ZahlAlt:= StrToFloat(NumStack.Pop); OpAlt:= OpStack.Pop; case OpAlt[1] of '+': begin ZahlAlt:= ZahlAlt + Zahl; EAusgabe.Text:= FloatToStr(ZahlAlt); NumStack.Push(FloatToStr(ZahlAlt)); Anz:= 0; end; '-': begin ZahlAlt:= ZahlAlt - Zahl; EAusgabe.Text:= FloatToStr(ZahlAlt); NumStack.Push(FloatToStr(ZahlAlt)); Anz:= 0; end; end; end; end else begin Op := Key; Anz:= 0; OpStack.Push(key); OpStack.PushObject(key,TObject(OpPosition)); NumStack.Push(FloatToStr(Zahl)); exit; end; end; Key:= #0; end; Gruß Flo |
Re: Taschenrechner mit Zwischenergebnis programmieren
Kann mir da niemand weiterhelfen?
|
Re: Taschenrechner mit Zwischenergebnis programmieren
Servus !
Was sind OpStack und NumStack für Typen ? |
Re: Taschenrechner mit Zwischenergebnis programmieren
OpStack und NumStack sind vom Typ Stringlist.
Gruß Flo |
Re: Taschenrechner mit Zwischenergebnis programmieren
Isses zu wenig Code oder hat niemand ne Idee?
Gruß Flo |
Re: Taschenrechner mit Zwischenergebnis programmieren
warum exit wenn key zahlen etc sind?
|
Re: Taschenrechner mit Zwischenergebnis programmieren
Weil nur bei Eingabe eines Operators eine Aktion durchgeführt werden soll. Bei Eingabe einer Zahl soll sie lediglich zur Zeichenkette im Eingabefeld hinzugefügt werden.
Gruß Flo |
Re: Taschenrechner mit Zwischenergebnis programmieren
Hallo Flo,
auf den ersten Blick glaube ich, dass es an folgendem liegt: im else-Fall (wenn also der Stack am Anfang leer ist), schreibst du Key zweimal auf den Stack!
Delphi-Quellcode:
Push(Key) schreibt den Operator auf den Stack.
Anz:= 0;
OpStack.Push(key); OpStack.PushObject(key,TObject(OpPosition)) Anschließend schreibt PushObject noch einmal Key auf den Stack und merkt sich zusätzlich die Stufe des Operators. Damit steht aber der Operator zweimal auf dem Stack. Lösche einmal den ersten Push Call. Wenn es dann noch nicht funktioniert, guck ich mir den Rest auch noch an. Übrigens gefällt mir der Code schon ganz gut! :zwinker: |
Re: Taschenrechner mit Zwischenergebnis programmieren
Hi MrSpock,
Wenn ich die Zeile lösche, kommt nun die exception 'Stack is empty', woran das liegt finde ich aber noch raus. Danke für die schnelle Antwort. Gruß Flo |
Re: Taschenrechner mit Zwischenergebnis programmieren
Hallo Flo,
das liegt daran, dass du in dem anderen Teil der if Anweisung auch zweimla pop aufrufst. Pop löscht ja das obere Element vom Stack. Ich hatte deshalb damals neben pop und popObjects ja auch noch die Funktionen:
Delphi-Quellcode:
implementiert, die wie Pop arbeiten, aber ohne das Element zu löschen! Damit kannst du das obere Element prüfen.
function ShowTop: String;
function ShowTopObject(var obj: TObject): String; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:40 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-2025 by Thomas Breitkreuz