Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Taschenrechner Speicher Problem (https://www.delphipraxis.net/60978-taschenrechner-speicher-problem.html)

Penelopee 15. Jan 2006 12:39


Taschenrechner Speicher Problem
 
Habe die Suche benutzt , komm aber nicht wirklich weiter!!
Mein Problem ist , dass mein Taschenrechner nur 1 edit feld besitzen soll.Bracuhe ich jetzt fpr jede Zahl einen eigenen Speicher??
Hier mein Quelltext:
Delphi-Quellcode:
procedure TForm1.B1Click(Sender: TObject);
begin
Edit1.Text:=Edit1.Text + '1';
end;

procedure TForm1.B2Click(Sender: TObject);
begin
Edit1.Text:=Edit1.Text + '2';
end;

procedure TForm1.B3Click(Sender: TObject);
begin
Edit1.Text:=Edit1.Text + '3';
end;

procedure TForm1.B4Click(Sender: TObject);
begin
Edit1.Text:=Edit1.Text + '4';
end;

procedure TForm1.B5Click(Sender: TObject);
begin
Edit1.Text:=Edit1.Text + '5';

end;

procedure TForm1.B6Click(Sender: TObject);
begin
Edit1.Text:=Edit1.Text + '6';

end;

procedure TForm1.B7Click(Sender: TObject);
begin
Edit1.Text:=Edit1.Text + '7';
end;

procedure TForm1.B8Click(Sender: TObject);
begin
Edit1.Text:=Edit1.Text + '8';
end;

procedure TForm1.B9Click(Sender: TObject);
begin
Edit1.Text:=Edit1.Text + '9';
end;

procedure TForm1.BPlusClick(Sender: TObject);
begin
Edit1.Text := Edit1.Text + '+';

end;

procedure TForm1.BMinusClick(Sender: TObject);
begin
Edit1.Text:=Edit1.Text + '-';
end;

procedure TForm1.BTeilenClick(Sender: TObject);
begin
Edit1.Text:=Edit1.Text + '/';
end;

procedure TForm1.BMalClick(Sender: TObject);
begin
Edit1.Text:=Edit1.Text + '*';
end;

procedure TForm1.BKommaClick(Sender: TObject);
begin
Edit1.Text:=Edit1.Text + ',';
end;

procedure TForm1.B0Click(Sender: TObject);
begin
Edit1.Text:=Edit1.Text + '0';
end;

procedure TForm1.BClearClick(Sender: TObject);
begin
Edit1.Clear;
end;
danke!

SirThornberry 15. Jan 2006 12:45

Re: Taschenrechner Speicher Problem
 
es geht auch einfacher wenn alles TButtons sind:
Delphi-Quellcode:
procedure TForm1.B1Click(Sender: TObject);
begin
  if Sender = BClear then
    Edit1.Text := ''
  else
    Edit1.Text := Edit1.Text + TButton(Sender).Caption;
end;
und dann natürlich allen buttons diese procedure zuweisen.

marabu 15. Jan 2006 14:05

Re: Taschenrechner Speicher Problem
 
Hallo Penelopee,

wahrscheinlich soll dein Taschenrechner ein Infix-Rechner sein - ähnlich dem aus dem Windows-Zubehör? Dann brauchst du einen Speicher für den Anzeigewert und mindestens einen (mehrere bei Klammerebenen) für das Zwischenergebnis.

Wenn du den Buttons mit Ziffern drauf einen entsprechenden Tag-Wert (0 bis 9) zuweist, und den Buttons mit Operatoren bzw. Funktionen einen negativen Wert gibst, dann kannst du deinen Rechner - in Verbindung mit event sharing (Yes Sir) - sehr elegant programmieren.

Grüße vom marabu

Propeller 29. Jan 2006 11:35

Re: Taschenrechner Speicher Problem
 
Bin relativer Delphianfänger und arbeite auch an der Programmierung eines Taschenrechners.
Nun hab ich ihn in soweit schon fertig, was mir lediglich noch fehlt ist die Klammerrechnung.
Dafür trage ich die einzelnen Rechenschritte in ein Memofeld ein. Nun soll das Programm jedoch die Klammern erkennen und alles was dazwischen liegt in einen Hilfsspeicher (Edit3) tun. Mein Problem ist, dass ich nicht weiß, wie man in das Editfeld alles reinschrieben kann, was in dem Memofeld zwischen beispielsweise der vierten und achten Zeile liegt, so wie man das bei dem Memofeld über den 'Add-Befehl' machen kann. So wie ich es programmiert habe, zeigt er nämlich nur die letzte Zeile des Memofeldes in der Edit3 an. Hoffe auf Hilfe! Dankeschön!!!

Hier mein Quellcode:

Code:
for Zeile:=0 to memo1.Lines.Count-1
do begin
if memo1.Lines[Zeile][1]='(' then Klammerbefehl:=1;
if memo1.Lines[Zeile][1]=')' then Klammerbefehl:=0;

if Klammerbefehl=1
       then begin
               for Buchstabe:=1 to length (memo1.Lines[Zeile])
               do edit3.text:=memo1.Lines[Zeile]

       end;


       end;

marabu 29. Jan 2006 12:53

Re: Taschenrechner Speicher Problem
 
Hallo Propeller,

ein einziger Zwischenspeicher wird dir nicht genügen:

Code:
  ( 5 * ( 10 + 3 / 5 ) - 4 ) / 7 =
Was du bei deiner Vorgehensweise brauchst ist ein Stack (mein Sohn hat mir erzählt, dass der in der Schule Kellerspeicher genannt wird). Da du gerade nach eigener Aussage erst anfängst zu programmieren, kannst du deinen Stack etwa so implementieren:

Delphi-Quellcode:
type
  // Platz für 100 Zwischenergebnisse
  TStack = array [1..100] of Double;

var
  Stack: TStack;
  iStack: Integer; // Mit 0 initialisieren

procedure Push(d: Double)
begin
  Inc(iStack);
  Stack[iStack] := d;
end;

function Pop: Double;
begin
  Result := Stack[iStack];
  Dec(iStack);
end;
Mit der infix-Notation hast du dir aber auch gleich die schwierigere ausgesucht. Üblicherweise wird ein infix-Ausdruck so analysiert, dass zum Schluss ein gültiger expression tree existiert, der dann nur noch aufgelöst wird:

Code:
Ebene
0:                   /
1:          -                   7
2:     *         4
3: 5       +
4:     10     /
5:          3  5
Die beiden Knoten einer Ebene in meinem Beispiel sind immer die Kinder des Knotens der in der Mitte obendrüber steht. An den inneren Knoten des Baumes finden sich die Operatoren, an den Blättern die Operanden. Durch eine in-order Traversierung des Baumes rechnest du die Ausdrücke dann aus. Die Anzahl der Ebenen ist übrigens die Anzahl der benötigten Zwischenspeicher bei deiner Vorgehensweise.

Grüße vom marabu

Propeller 29. Jan 2006 13:29

Re: Taschenrechner Speicher Problem
 
Hmm... ich merke gerade, dass ich wirklich ein blutiger Anfänger bin :wink: , weil ich Informatik erst seit August in der Schule habe.
Leider habe ich noch nie von diesem Stack gehört und weiss nicht, wie der zu benutzen ist. Alles was ich nun weiss, ist, dass es scheinbar eine Speicherfunktion besitzt und man es mit arrays in Verbindung setzen muss. Ich weiss leider auch nicht, was die Deklaration "Double" bedeutet oder was ein infix ist... :pale:

Mit anderen Worten: was wäre denn die einfachere Methode zur Lösung meines Klammerproblems?

Freue mich über jede Hilfe!! Dankeschön nochmal!!!

marabu 29. Jan 2006 16:06

Re: Taschenrechner Speicher Problem
 
Ein Stack bzw. Stapel bzw. Kellerspeicher ist ein Zwischenspeicher für mehrere Items, bei dem du das zuletzt hinzugefügte Item zuerst wieder wegnimmst. Vielleicht läuft dir in diesem Zusammanhang noch das Akronym LIFO über den Weg - Last In First Out.

Benutzen kannst du den von mir skizzierten (extrem primitiven) Stack so:

Delphi-Quellcode:
// (2 * 9 + 3) * 2
Push(2);
Push(Pop * 9);
Push(Pop + 3);
Push(Pop * 2);
ShowMessage(Format('%.2f', [Pop]));
Double ist einer der Fließkomma-Typen aus Delphi, so wie Integer ein Ganzzahl-Typ ist. Da solltest du mal in der Online Hilfe unter Typen nachlesen.

Infix ist einfach die dir geläufige Notation (1 + 1) für eine mathematische Operation, so benannt, weil der Operator zwischen den Operanden steht.

Das bringt uns zu deiner Frage, was denn die einfachste Lösung für dein Klammernproblem wäre. Das dürfte die Lösung sein, bei der die Klammern einfach vermieden werden. Die zugehörige Notation heißt postfix und ist von den HP Taschenrechnern her in der Schule auch als UPN (Umgekehrte Polnische Notation) bekannt. Die obige Rechenaufgabe würde da so notiert:

Code:
 2 9 * 3 + 2 * =
Wie du siehst - keine Klammern, weil unnötig.

Freundliche Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:04 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