![]() |
Delphi Taschenrechner
Hallo Zusammen,
Ich nutze Delphi 3, bin noch recht neu darin und bin grade dabei einen Taschenrechner zu programmieren. Einen mit zwei Editfeldern (Zahl1 in Edit1 und Zahl2 in Edit2 eingeben) habe ich schon geschafft. Ich würde aber gerne einen erstellen können bei dem ich ein Editfeld benutze und dort z.B. eingebe: 81/9 Nur leider habe ich es seit einer Woche nicht geschafft den richtigen Befehl dafür zu finden dass er mir nicht immer sagt "9+3 ist kein gültiger Wert" Ich brauche also die Unit Befehle, am besten mit Beispiel. Vielen Dank schonmal im Voraus! |
Re: Delphi Taschenrechner
dafür gibt es keinen befehl. du musst die eingabe analysieren (parsen) und dann weiter verarbeiten.
|
Re: Delphi Taschenrechner
Da hast Du Dir aber was vorgenommen, so ein Parser ist nicht einfach zu schreiben.
|
Re: Delphi Taschenrechner
Es gibt aber auch schon fertige Formelparser
|
Re: Delphi Taschenrechner
Das stimmt, habe letztens noch irgendwo hier (Code-Library?) einen gesehen, der auch mit Klammerung zurechtkam.
|
Re: Delphi Taschenrechner
|
Re: Delphi Taschenrechner
Achja, HAM
|
Re: Delphi Taschenrechner
Zitat:
|
Re: Delphi Taschenrechner
Siehe ab #4 ;)
|
Re: Delphi Taschenrechner
Tse, und ich dacht schon, du willst damit was besonderes sagen ;)
|
Re: Delphi Taschenrechner
Naja, für einen Taschenrechner als Anfängerproject wäre ein Formelparser sicher zu happig ;)
Aber (@Dr34m) man sollte sich mal den Ablauf durchdenken: Zahl eingeben (kann auch mehrstellig sein) bei Eingabe eines Operationszeichens Zahl sich irgendwo merken und Edit leer machen, Operator ebenfalls merken, neue Zahl eingeben bei drücken von "=" neue Zahl und gemerkte Zahl mit durch den Operator vergegebener Operation verrechnen, Edit leer machen, Ergebnis reinschreiben. UPN lässt grüßen ;) |
Re: Delphi Taschenrechner
So schwer ist es nicht, nur für Anfänger ist es ziemlich schwierig, vor allem die Vorstellung dahinter wie man es umsetzen kann und vor allem warum ist nicht einfach.
Wenn du es wirklich machen möchtest, solltest du dir eine komplizierte Rechnung aufschreiben und diese Zerlegen, also zB 34+2*9*(39/3+(1+5))^2 Allerdings sollten wir erstmal ohne Klammern anfangen, zB mit 1+5*8+1 Jetzt durchsuchst du wiederholt den string von vorne nach hinten einem * oder / bis keins mehr vorhanden ist, weil es ja punkt vor strich ist. hast du eins gefunden, hier an position4, sucht du ab position 4 rückwärts bis zum Anfang des Strings nach dem nächsten rechenzeichen, klammer oder string-anfang und nimmst den teil als linke seite der rechnung, hier wäre das das + zwischen 1 und 5, die linke seite ist also 5. Das gleiche machst du ab der 4 aufwärts bis Rechenzeichen, Klammer oder Stringende, hier wäre das das + zwischen 8 und 1, also ist die rechte seite die 8. Jetzt hast du die rechenoperation (*) und beide seiten und kannst es ausrechnen, 5*8 ist 4, und den gesamten teil "5*8" mit dem Ergebnis ersetzen. Bleibt noch 1+40+1 Jetzt gibt es weder / noch * und wir gehen weiter, suchen nach + und - von vorne nach hinten wir finden das vordere +, gehen nach links bis zum string-anfang, vorher gibt es kein rechenzeichen: linker teil ist also 1. Rechts weiter, wir finden das +, rechter Teil ist 40. Ausrechnen: kommt 41 raus Bleibt noch 41+1 es ist noch + und - vorhanden, machen das gleiche Spielchen nochmal usw usf. Mit Klammern ist das ganze ein wenig komplexer, das heisst: Zuerst musst du ja die Klammern ausrechen. Eine möglichkeit ist die letzte ( zu finden, hier die vor 1, und den gesamten klammerinhalt zu nehmen und deine Funktion die das ding berechnet damit rekursiv aufzurufen, dann den ganzen teil inklusive der Klammern mit dem ergebnis erstzen. Der von mir beschriebene Lösungsansatz ist auf Verständlichkeit optimiert, das ganze kann man sicher noch Optimieren und ein paar Bugs sind auch drin. Viel glück :) |
Re: Delphi Taschenrechner
Und wie durchsuche ich?!
mit if... then? bitte mal ein beispiel, falls es if... then ist wie das dann in der unit aussieht. |
Re: Delphi Taschenrechner
Benutze mal die Forensuche, Nach Zeichen suchen kannst du mit
![]() ![]() |
Re: Delphi Taschenrechner
Ich weiß nicht, ob in Delphi 3 die Unit StrUtils vorhanden ist, doch dort gibt es nützliche Funktionen wie zum Beispiel LeftStr und RightStr welche du dir mal anschauen könntest :)
Kannst natürlich auch auf ganz normalen Wegen wie im Beitrag darüber geschrieben über Pos und Copy arbeiten. |
Re: Delphi Taschenrechner
Zitat:
|
Re: Delphi Taschenrechner
Argh! What the hell ist "Substr: String" und was "S: String"
wie muss ich das denn da eingeben wenn ich ne rechnung von 18+3 im editfeld hab? ich versteh nur noch bahnhof! |
Re: Delphi Taschenrechner
OMG.... Dr34m, du solltest dich erst mal mit den Grundlagen der Delphi-Programmierung befassen ;)
|
Re: Delphi Taschenrechner
Bei '18+3' wäre das dann ungefähr so:
Delphi-Quellcode:
Zu deiner Frage. Substr bezeichnet den gesuchten String, und s ist der String, in dem nach Substr gesucht wird.
s:= '18+3';
a:= copy(s, 0, pos('+', s)-1); delete(s, 1, pos('+', s)); b:= copy(s, 0, length(s)); |
Re: Delphi Taschenrechner
Zitat:
Dir fehlt noch Basiswissen. Ohne das geht es nicht! Einen Taschenrechner zu programmieren ist relativ einfach, aber für den Anfänger nicht trivial. Es gibt da einiges zu beachten. Meine Praktikanten müssen da auch durch. :shock: Kleiner Tip: Bevor Du dich an den Taschnenrechner machst, solltest Du er paar kleinere Übungen durchziehen. Übung 1 3 Editfelder auf das Form ziehen und 4 Buttons für +,-,*,/ Geplante funktionsweise: In den ersten 2 Editfelder jeweils Zahlen eingeben und nach drücken eines Buttons das Ergebnis im dritten Editfeld anzeigen lassen. Wenn du das selbst gemacht und verstanden hast, weisst Du was ein String und was reele Zahlen sind. Übung 2 Prüfen ob der Benutzer wirklich gültige Zahlen eingibt und keine Texte. Mit dem lässt sich so schwer rechnen! Übung 4 Nur noch 1 Editfeld ist erlaubt! Einen Button für = hinzufügen Erfasse erste Zahl diese in einer Variable merken Button drücken, was gerechnet werden soll und diesen merken Erfasse zweite Zahl und diese in einer Variable merken = Button drücken und das Ergebnis anzeigen Geht schon Richtung Taschenrechner Und wenn du einen richtigen Taschenrechner programmiert hast, solltest Du dich an den Parser wagen. Der ist kniffeliger..... Viel Spaß beim Üben :thumb: Martin |
Re: Delphi Taschenrechner
;) Übung 3 fehlt :)
Zitat:
Wenn du das weisst ;) Dann wird das dir schnell klar sein :) |
Re: Delphi Taschenrechner
mdiehlz, deine Aufgaben haben mir viel geholfen...
Hätte jetzt aber mal ne Frage dazu, versteh den Fehler den mir die Unit sagt nicht :cry: Das hab ich eingegeben: if label2.caption:='+' then edit1.text:=floattostr(zahl1+zahl2) Und die Unit sagt: Ausdruckstyp muss Boolean sein. Was heißt das jetzt für meine Bedingung bzw. wie muss ich sie umschreiben? Nochmals vielen Dank an alle für die viele, aufgebrachte Geduld! |
Re: Delphi Taschenrechner
Ein Vergleich wird mit '=' durchgeführt. ':=' ist eine Zuweisung.
|
Re: Delphi Taschenrechner
Danke euch allen, er funktioniert!
Kann zwar noch keine komplizierten Terme rechnen aber er läuft mit einem Editfeld! |
Re: Delphi Taschenrechner
Lustig wirds doch wenn man -7 + -6 - -8 eingibt :-D
Kommt da bei dir auch -5 raus? :o) |
Re: Delphi Taschenrechner
tut es :)
kleine Frage noch. Wenn ich einen Button anlege, wie kann ich deklarieren dass er mit klick auf diesem Button das Program beendet? (Pascal befehl) |
Re: Delphi Taschenrechner
Close;
|
Re: Delphi Taschenrechner
Wenn du mehrere Forms hast bedenke, dass das Schließen der Hauptform zur Beendigung des gesamten Programmes bedeutet.
Delphi-Quellcode:
zum Beispiel :)
Form1.Close;
|
Re: Delphi Taschenrechner
Zitat:
Achtung, das Thema ist eher nicht für Anfänger geeignet. Viele Anfänger machen den Fehler sich nicht mit grundlegenden Algorithmen zu beschäftigen. Bei der Entwicklung eines Parsers sollte man halt schon ein paar kennen. Es geht dabei weniger um fertigen Quellcode, sondern eher wie man das Problem am geschicktesten mit bewährten Verfahren löst. Ich habe in meinem Bücherregal Algorithmen von R.Sedgewick stehen. Das Buch wurde vor über 15 Jahren geschrieben. Ist zwar nicht mehr ganz zeitgemäß, aber auch nicht wirklich veraltet. Halt alles prozedural und nicht objektorientiert. Wenn Englisch kein Problem ist, schaue dir mal dieses Buch an: ![]() Oder einfach mal nach dem Thema googeln. Martin |
Re: Delphi Taschenrechner
Noch eine Frage: Wenn ich eine Zahl potenzieren will, benutzte ich ja am besten den befehl power. Wenn ich jedoch eingebe
edit1.text:=(power(zahl1,zahl2) sagt er undefinierter Bezeichner 'power'. Weiß keine Lösung dadrauf... |
Re: Delphi Taschenrechner
die Unit math in deine Uses-Klausel mit aufnehmen.
|
Re: Delphi Taschenrechner
Hab Delphi 3.... :( kann die jemand Uppen?
|
Re: Delphi Taschenrechner
Auch bei Delphi 3 gibt es die Unit math.
|
Re: Delphi Taschenrechner
Also ich hab den ganzen Pc durchsucht und nichts gefunden.. oder hat die einen 'Decknamen' und heißt gar nicht math?
|
Re: Delphi Taschenrechner
Schau mal im lib-Verzeichnis, da muss es eigentlich eine math.dcu geben.
|
Re: Delphi Taschenrechner
....lzexpand.dcu, mapi.dcu, mask.dcu, menus.dcu ....
Leider keine math |
Re: Delphi Taschenrechner
Hast Du Delphi 3 Standard?
|
Re: Delphi Taschenrechner
glaub schon
auf jeden ist die math unit net da. Wenn dann bitte jemand so freundlich wäre die zu uppen. |
Re: Delphi Taschenrechner
Zitat:
P.S.: Habe gerade ein ähnliches Buch vom selben Autor bei Amazon entdeckt: ![]() |
Re: Delphi Taschenrechner
Vom gleichen Author: Game-Programming für Kids
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:32 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