![]() |
Umsetzung eines erweiterten Taschenrechners
Ja Moin, ich hab mich mal so bisschen an delphi versucht und hab auch schon paar einfache sachen geschrieben aber hab trotzdem ein problem. wollte einen 'fortgeschrittenen' Taschenrechner schreiben :
Delphi-Quellcode:
und ich wollte jetzt mal wissen wie ich das machen kann damit delphi die zeichenketten umwandeln kann. das prolem ist das da eben +-*/ drin ist :) danke im vorraus. achso und der text den ich umwandeln will steht in einem label. label.caption umwandeln also
unit taschenrechner01;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) einsE: TButton; zweiE: TButton; dreiE: TButton; vierE: TButton; fuenfE: TButton; sechsE: TButton; siebenE: TButton; achtE: TButton; neunE: TButton; kommaE: TButton; nullE: TButton; cancelE: TButton; plusE: TButton; minusE: TButton; malE: TButton; geteiltE: TButton; rechnenB: TButton; rechenzeileE: TLabel; ergebnisE: TLabel; procedure einsEClick(Sender: TObject); procedure zweiEClick(Sender: TObject); procedure dreiEClick(Sender: TObject); procedure vierEClick(Sender: TObject); procedure fuenfEClick(Sender: TObject); procedure sechsEClick(Sender: TObject); procedure siebenEClick(Sender: TObject); procedure achtEClick(Sender: TObject); procedure neunEClick(Sender: TObject); procedure kommaEClick(Sender: TObject); procedure nullEClick(Sender: TObject); procedure cancelEClick(Sender: TObject); procedure plusEClick(Sender: TObject); procedure minusEClick(Sender: TObject); procedure malEClick(Sender: TObject); procedure geteiltEClick(Sender: TObject); procedure rechnenBClick(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.einsEClick(Sender: TObject); var eins:char; begin rechenzeileE.Caption := rechenzeileE.Caption + '1'; end; procedure TForm1.zweiEClick(Sender: TObject); var zwei:char; begin rechenzeileE.Caption := rechenzeileE.Caption + '2'; end; procedure TForm1.dreiEClick(Sender: TObject); var drei:char; begin rechenzeileE.Caption := rechenzeileE.Caption + '3'; end; procedure TForm1.vierEClick(Sender: TObject); var vier:char; begin rechenzeileE.Caption := rechenzeileE.Caption + '4'; end; procedure TForm1.fuenfEClick(Sender: TObject); var fuenf:char; begin rechenzeileE.Caption := rechenzeileE.Caption + '5'; end; procedure TForm1.sechsEClick(Sender: TObject); var sechs:char; begin rechenzeileE.Caption := rechenzeileE.Caption + '6'; end; procedure TForm1.siebenEClick(Sender: TObject); var sieben:char; begin rechenzeileE.Caption := rechenzeileE.Caption + '7'; end; procedure TForm1.achtEClick(Sender: TObject); var acht:char; begin rechenzeileE.Caption := rechenzeileE.Caption + '8'; end; procedure TForm1.neunEClick(Sender: TObject); var neun:char; begin rechenzeileE.Caption := rechenzeileE.Caption + '9'; end; procedure TForm1.kommaEClick(Sender: TObject); var punkt:char; begin rechenzeileE.Caption := rechenzeileE.Caption + '.'; end; procedure TForm1.nullEClick(Sender: TObject); var null:char; begin rechenzeileE.Caption := rechenzeileE.Caption + '0'; end; procedure TForm1.cancelEClick(Sender: TObject); begin rechenzeileE.Caption :=' '; end; procedure TForm1.plusEClick(Sender: TObject); var plus:char; begin rechenzeileE.Caption := rechenzeileE.Caption + '+'; end; procedure TForm1.minusEClick(Sender: TObject); var minus:char; begin rechenzeileE.Caption := rechenzeileE.Caption + '-'; end; procedure TForm1.malEClick(Sender: TObject); var mal:char; begin rechenzeileE.Caption := rechenzeileE.Caption + '*'; end; procedure TForm1.geteiltEClick(Sender: TObject); var geteilt:char; begin rechenzeileE.Caption := rechenzeileE.Caption + '/'; end; procedure TForm1.rechnenBClick(Sender: TObject); begin end; end. |
AW: Anfänger braucht Hilfe XD
Moin und willkommen in der DP,
sei bitte so gut und ändere den Titel Deines Beitrags. Anfänger waren wir alle mal und je nach Lebenssituation brauchen wir unterschiedlich mehr oder weniger Hilfe. Ein guter Beitrags-Titel vermittelt einen Eindruck, worum es in der Frage geht. Danke Dir, denn damit erleichterst Du es anderen, Dein Thema wieder zu finden, wenn sie ein ähnliches Problem haben. |
AW: Anfänger braucht Hilfe XD
Zitat:
|
AW: Anfänger braucht Hilfe XD
Wenn du deinen ersten Beitrag änderst gibt es über dem Textfeld noch ein Eingabefeld für den Titel.
|
AW: Anfänger braucht Hilfe XD
Da wirst du wohl einen Matheparser brauchen. Weiteresdazu solltest du mit der Forensuche finden.
|
AW: Anfänger braucht Hilfe XD
Als weitere Erleichterung könntest du allen Button dasselbe Onclick-Event zuweisen und in diesem dann ungefähr wie folgt vorgehen:
Delphi-Quellcode:
Das nur mal als eine Anregung. Wenn du mehr programmierst wirst du auch irgendwann feststellen, dass es vllt. sinnvoll ist, die Information, die du z.Zt. in rechenzeileE.Caption (also einer Komponente der GUI) speicherst besser in einer Variablen aufgehoben wäre.
procedure TForm1.UniversellerButtonClick(Sender: TObject);
begin if Sender is TButton then begin if TButton(Sender).Caption='C' then rechenzeileE.Caption:='' else rechenzeileE.Caption := rechenzeileE.Caption + TButton(Sender).Caption; end; end; |
AW: Anfänger braucht Hilfe XD
Frage nebenbei:
Zitat:
Zitat:
Delphi-Quellcode:
case TButton(Sender).Tag of
0: tue_etwas; 1: tue_etwas_anderes; end; |
AW: Anfänger braucht Hilfe XD
Zitat:
Da braucht man drei Variablen als Speicher für Zahlen und zwei als Speicher für Operatoren und das war's dann auch schon. |
AW: Anfänger braucht Hilfe XD
Wieso 3 und 2?
Einmal die letzte Zahl und dann noch den letzten Operator (hier kann man sich einfach das AusgabeEdit als "Variable" nehmen) * Tippt man Zahlen ein, geht das ins Edit * drückt man einen Operator ** wird zuerst die letzte Zahl und der letzte Operator mit der aktuellen Zahl Eingabe-Edit verrechnet (wenn etwas im Zwischenspeicher steht) *** Ergebnis langet dann im AusgabeEdit *** war nichts im Zwischenspeicher, dann landet nur die Eingabe in der Ausgabe ** nun wird noch der gedrückte Operator gespeichert ** und es geht mit der nächsten Zahl weiter ... also ab nach oben Mit "richtiger" Operatorenreihen (z.B.
Delphi-Quellcode:
=
1+2*3
Delphi-Quellcode:
statt nacheinander
1+(2*3)
Delphi-Quellcode:
) und Klammern wird es schwerer und man braucht einen Stack.
(1+2)*3
Eine Eingabe in Postfix ( ![]() |
AW: Anfänger braucht Hilfe XD
Zitat:
Also wenn dich sowas wirklich interessiert, kannst du das fürs Erste auch direkt interpretieren. Man kann da auch entsprechend Datenstrukturen aufbauen, aber das dürfte vielleicht wirklich ein wenig weit führen... :cyclops: Beim direkten interpretieren gehst du einfach die Zeichenkette von Vorne nach Hinten durch und nach jedem Zeichen musst du entscheiden, ob du was verrechnest, oder weiter liest. Kommt eine Ziffer (0-9) dann weißt du sicher, dass du in einer Zahl bist. Das merkst du dir in einer lokalen Variable und erweiterst das, bis ein Rechenzeichen oder das Ende auftaucht. Je nachdem, ob eine Punkt- oder eine Strichoperation auftaucht musst du die jeweilig Entscheidung treffen und in der Funktion verzweigen. Das ist vom Aufwand überschaubar. Versuche es dir einfach Stück für Stück vorzustellen. Im Zweifel ist Stift und Papier dabei auch ganz handlich :thumb: Wenn du das hinbekommst, kannst du auch noch Klammern einführen, in dem du bei öffnenden Klammern durch Rekursion (erneutes Aufrufen einer der beteiligten Funktionen) "in die Verschachtelung hinabsteigst" und bei schließenden Klammern das "Zwischenergebnis" (= den Wert der Klammerung) die Rekursion wieder "nach oben" zurückgibst. Mache dir einfach mal ein, zwei, zehn Beispiele. Fange vielleicht erstmal mit dem reduzierten Problem (nur Strich- oder nur Punktrechnung) an und arbeite dich von da an weiter. Das hier von mir Vorgestellte ist nur ein möglicher Ansatz. Viel Spaß dir beim Ausprobieren! Brighty |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:56 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