Hallo.
Ich bin gerade dabei, testweise einen kleinen UPN-Rechner auf die Beine zu stellen. Dabei soll ein Term ( z.b. 123+456-678 ) in ein Editfeld geschrieben werden ( "Eingabe" ). Ein klick auf das Gleichheitszeichen bewirkt nun, dass der Term aufgespaltet wird, und die Zahlen auf den einen Stack ( Zahlenstack ), also 123, 456 und 678 und die Rechenzeichen auf einen Rechenzeichenstack gelegt werden , also + und -. Dies funktioniert bei mir auch schon, doch ich bekomme die Rechenprozedur einfach nicht hin. Er soll dann die Zahlen aus dem Stack nehmen, dann das Rechenzeichen auslesen, dann berechnen - und das, solange bis die Stacks leer sind und dann das Ergebnis ausgeben. Punkt vor Strichrechnung soll dabei berücksichtigt werden, und nun fangen bei mir die Probleme an. Zunächst habe ich nur + und - Rechnungen eingebnunden, aber selbst die funktionieren nicht so richtig.
Könnt ihr evtl. einmal drüberschauen?
Hier wird der Term auseinandergezogen und aufgeteilt.
Delphi-Quellcode:
procedure tform1.berechne;
var i,iPos:integer;
ausrechnen:boolean;
rechenz:string;
stapelz,ergebnis:real;
begin
eingabe:=edit1.text;
iPos:=1;
ausrechnen:=false;
for i:=2 to length(eingabe) do begin
if not (eingabe[i] in ['0','1','2','3','4','5','6','7','8','9']) then begin
zwischenergebnis:=copy(eingabe,iPos,i-ipos);
rmerker:=trmerker.create;
rmerker.zeichen:=copy(eingabe,i,1);
rechenzeichenstack.Push(rmerker);
listbox2.items.add(rmerker.zeichen);
zmerker:=tzmerker.create;
zmerker.zahl:=strtofloat(copy(eingabe,ipos,i-ipos));
zahlenstack.Push(zmerker);
edit2.text:=edit2.text+' | '+zwischenergebnis;
listbox1.Items.add(zwischenergebnis);
ipos:=i+1;
end;
end;
zwischenergebnis:=copy(eingabe,ipos,length(eingabe));
zmerker:=tzmerker.create;
zmerker.zahl:=strtofloat(copy(eingabe,ipos,i-ipos));
zahlenstack.Push(zmerker) ;
listbox1.items.add(zwischenergebnis);
edit2.text:=edit2.text+' | ' +zwischenergebnis
end;
Und hier soll berechnet werden :
Delphi-Quellcode:
procedure TForm1.Button19Click(Sender: TObject);
var stapelzahl,zahloben:real;
rzeichen:string;
zergebnis:real;
s:integer;
begin
zergebnis:=0;
zahloben:=tzmerker(zahlenstack.peek).zahl;
repeat until zahlenstack.count=0
zahlenstack.Pop;
rzeichen:=trmerker(rechenzeichenstack.peek).zeichen;
if rzeichen='+' then begin
zergebnis:= tzmerker(zahlenstack.peek).Zahl+zahloben;
end
else if rzeichen='-' then begin
zergebnis:= tzmerker(zahlenstack.peek).Zahl-zahloben;
end;
end;
showmessage(floattostr(zergebnis));
end;
Doch das Berechnen läuft einfach nicht.
Bin schon fast am verzweifeln
PS: Sorry für die Unübersichtlichkeit!
Danke,
Huppi
[edit=Christian Seehase]Delphi-Tags gesetzt. Bitte künftig selber machen. Danke. Mfg, Christian Seehase[/edit]