AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Umsetzung eines erweiterten Taschenrechners
Thema durchsuchen
Ansicht
Themen-Optionen

Umsetzung eines erweiterten Taschenrechners

Ein Thema von aaaaaaaaaa1 · begonnen am 15. Mär 2017 · letzter Beitrag vom 16. Mär 2017
Antwort Antwort
Seite 1 von 2  1 2      
aaaaaaaaaa1

Registriert seit: 15. Mär 2017
2 Beiträge
 
#1

Umsetzung eines erweiterten Taschenrechners

  Alt 15. Mär 2017, 17:05
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:
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.
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

Geändert von Luckie (16. Mär 2017 um 00:45 Uhr) Grund: Titel aussagekräftig umformuliert.
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Anfänger braucht Hilfe XD

  Alt 15. Mär 2017, 17:10
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.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
aaaaaaaaaa1

Registriert seit: 15. Mär 2017
2 Beiträge
 
#3

AW: Anfänger braucht Hilfe XD

  Alt 15. Mär 2017, 17:33
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.
Wie ändern man den Beitrags Titel den?
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Anfänger braucht Hilfe XD

  Alt 15. Mär 2017, 17:43
Wenn du deinen ersten Beitrag änderst gibt es über dem Textfeld noch ein Eingabefeld für den Titel.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

AW: Anfänger braucht Hilfe XD

  Alt 15. Mär 2017, 17:46
Da wirst du wohl einen Matheparser brauchen. Weiteresdazu solltest du mit der Forensuche finden.
Michael
Ein Teil meines Codes würde euch verunsichern.

Geändert von TBx (15. Mär 2017 um 17:53 Uhr) Grund: Tipselfehler korrigiert
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.737 Beiträge
 
Delphi 6 Enterprise
 
#6

AW: Anfänger braucht Hilfe XD

  Alt 15. Mär 2017, 18:15
Als weitere Erleichterung könntest du allen Button dasselbe Onclick-Event zuweisen und in diesem dann ungefähr wie folgt vorgehen:

Delphi-Quellcode:
procedure TForm1.UniversellerButtonClick(Sender: TObject);
begin
  if Sender is TButton then
    begin
    if TButton(Sender).Caption='Cthen
      rechenzeileE.Caption:=''
    else
      rechenzeileE.Caption := rechenzeileE.Caption + TButton(Sender).Caption;
    end;
end;
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.
Ralph
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#7

AW: Anfänger braucht Hilfe XD

  Alt 15. Mär 2017, 18:33
Frage nebenbei:
Zitat:
und ich wollte jetzt mal wissen wie ich das machen kann damit delphi die zeichenketten umwandeln kann.
Warum machen eigentlich alle Anfänger einen Taschenrechner, obwohl das eher, sagen wir mal, ein "schwieriges" Ding ist (bzgl. Parser etc) ?

Zitat:
if TButton(Sender).Caption='C' then
Oder jeder Button bekommt einen Tag und man unterscheidet so
Delphi-Quellcode:
case TButton(Sender).Tag of
 0: tue_etwas;
 1: tue_etwas_anderes;
end;

Geändert von a.def (15. Mär 2017 um 18:37 Uhr)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.737 Beiträge
 
Delphi 6 Enterprise
 
#8

AW: Anfänger braucht Hilfe XD

  Alt 15. Mär 2017, 18:43
Warum machen eigentlich alle Anfänger einen Taschenrechner, obwohl das eher, sagen wir mal, ein "schwieriges" Ding ist (bzgl. Parser etc) ?
Man muss das ja nicht unbedingt als Parser realisieren. Wenn man sich mal einen richtigen ganz einfachen 2,90€ Taschenrechner anschaut, wird da ja auch keine Formel erstellt o.ä.

Da braucht man drei Variablen als Speicher für Zahlen und zwei als Speicher für Operatoren und das war's dann auch schon.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

AW: Anfänger braucht Hilfe XD

  Alt 15. Mär 2017, 22:07
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. 1+2*3 = 1+(2*3) statt nacheinander (1+2)*3 ) und Klammern wird es schwerer und man braucht einen Stack.

Eine Eingabe in Postfix ( https://de.wikipedia.org/wiki/Umgeke...ische_Notation ) würde in der einfachsten Variante nur eine Variable für die letzte Zahl benötigen, den den Operator braucht man nicht speichern, da er ja zuletzt eingegeben wird.
$2B or not $2B

Geändert von himitsu (15. Mär 2017 um 22:23 Uhr)
  Mit Zitat antworten Zitat
BrightAngel

Registriert seit: 13. Mär 2007
130 Beiträge
 
#10

AW: Anfänger braucht Hilfe XD

  Alt 15. Mär 2017, 23:28
Warum machen eigentlich alle Anfänger einen Taschenrechner, obwohl das eher, sagen wir mal, ein "schwieriges" Ding ist (bzgl. Parser etc) ?
Wobei so ein "Minimalinterpreter" für +*/- auch eine gute Übung sein kann, wenn man sich für sowas interessiert. Ist immernoch "einfach" im Vergleich zu einer vollen "Pipeline" für Quellcodeverarbeitung. Es gibt immerhin nur überschaubare Präzendenzregeln zu beachten.

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...

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

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
Do you have the email of god??? --- I have to tell him that I'm happy to be born!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 21:58 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