AGB  ·  Datenschutz  ·  Impressum  







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

Taschenrechner Speicher Problem

Ein Thema von Penelopee · begonnen am 15. Jan 2006 · letzter Beitrag vom 29. Jan 2006
Antwort Antwort
Penelopee

Registriert seit: 7. Okt 2005
69 Beiträge
 
#1

Taschenrechner Speicher Problem

  Alt 15. Jan 2006, 12:39
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!
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Taschenrechner Speicher Problem

  Alt 15. Jan 2006, 12:45
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
marabu

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

Re: Taschenrechner Speicher Problem

  Alt 15. Jan 2006, 14:05
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
  Mit Zitat antworten Zitat
Propeller

Registriert seit: 18. Nov 2005
Ort: Berlin
9 Beiträge
 
#4

Re: Taschenrechner Speicher Problem

  Alt 29. Jan 2006, 11:35
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;
  Mit Zitat antworten Zitat
marabu

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

Re: Taschenrechner Speicher Problem

  Alt 29. Jan 2006, 12:53
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
  Mit Zitat antworten Zitat
Propeller

Registriert seit: 18. Nov 2005
Ort: Berlin
9 Beiträge
 
#6

Re: Taschenrechner Speicher Problem

  Alt 29. Jan 2006, 13:29
Hmm... ich merke gerade, dass ich wirklich ein blutiger Anfänger bin , 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...

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

Freue mich über jede Hilfe!! Dankeschön nochmal!!!
  Mit Zitat antworten Zitat
marabu

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

Re: Taschenrechner Speicher Problem

  Alt 29. Jan 2006, 16:06
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
  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 22:39 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