Taschenrechner ohne Buttons ?
-
Gerade habe ich meinen Taschenrechner (Borland C++ 5) mit Buttons (für die Zahlen)
fertig programmiert und würde es gerne etwas komfortabler für die Nutzer
gestalten.Also einfach im Edit-Feld Zahlen eintippen und Enter drücken und 'schwupp' erscheint
das Ergebnis in Edit-2Ich werde zwar morgen beginnen, aber kann mir jemand ein paar Hinweise geben,
wie sich das am besten lösen lässt (Bitte keine vollständigen Lösungen).
Vorschläge bzgl. des Designs nehme ich auch gerne an.Danke
lg
Martin
-
Wenn du damit meinst, sowas wie '5+8*2' als String einzugeben und anschliessend zu berechnen, dann brauchst einen sogenannten math parser.
Alternativ könntest du vielleicht auch dein vorhandenes Programm einfach so umstricken, dass bei jeder Eingabe im Edit die passende ButtonClick-Routine aufgerufen wird. Ein nachträgliches Editieren des Strings (z.B. Korrektur einer Fehleingabe) ist dabei natürlich nicht möglich.
-
Hi,
für das Parsen empfiehtlt sich vorher eine postfix-infix Umwandlung. Umgekehrt polnische Notation ist wesentlich einfacher zu verarbeiten.
Wenn man die alte Regelung Punktrechnung vor Strichrechnung ignoriert (was heute leider auch die meisten Taschnrechner tun) ist es aber auch so ohne parsen recht einfach zu bewerkstelligen.
Ich habe eine zentrale Verarbeitungsfunktion, die abhängig vom übergebenen Char-Wert verschieden reagiert. bei Ziffern oder Komma wird an die aktuelle Zeile hinten dran geschrieben (komma natürlihc nur, wenn noch keins da ist). Bei Operationszeichen wird das Zifferngebilde in ne Zahl verwandelt und wenn schon eine vorhanden ist mit der kombiniert und gemerkt (addiert, multipliziert...), sonst einfach nur gemerkt. Wenn am Ende '=' oder Enter gegeben wird wird ausgerechnet und angezeigt.
Die Editzeile ist bei mir enabled = False, wird also gar nicht betreten. Es kann nur hinten dran geschrieben oder von hinten gelöscht werden.
Angesteuert wird das ganze sowohl von den Tasten als auch aus der KeyDown und KeyPressed-Funktion des Formulars. Da ich das ganze aus Ziffeneingabefeldern mit ? aufrufen kann, habe ich noch vorgesehen, dass bei Eingaben von INS das Ergebnis in das aufrufende Element zurück geschrieben wird.Gruß Mümmel
-
Hallo,
ich hab in einem kleinen spiel für die steuerung folgendes gemacht:
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { if (dice>0) { switch (Key) { case 'o' : case 'O' : dice = random(50)+1; Label1->Caption = dice; break; case 'a' : case 'A' : dice--; links_blau(); Label1->Caption = dice; break; case 'w' : case 'W' : dice--; hoch_blau(); Label1->Caption = dice; break;
usw.
ABER ob dies auch mit zahlen funktioniert kann ich dir nicht sagen.
du könntest ja ein label machen wo alle zahlen eingaben angezeigt werden plus die rechenzeichen. halt nur zur anzeige für den benutzer und die rechnung findet im hintergrund statt.vielleicht hilft es ja weiter
-
Saphir, hier geht es um das Parsen von Mathe-Ausdrücken.
-
Hi,
_matze schrieb:
Saphir, hier geht es um das Parsen von Mathe-Ausdrücken.
warum muss man die unbedingt parsen? Man kann auch einfach jedes zeichen einzeln auswerten und sofort verarbeiten. Parsen macht erst Sinn, wenn man höhere Ansprüche stellt und kompliziertere Ausdrücke auswerten will.
Wie man das genau macht, ob man das Editfeld nimmt und dort in der OnKeyPress-Routine Operationszeichen und sonstiges auffängt und statt sie einzutragen abarbeitet, oder ob man das Editfeld ganz für Betreten sperrt und statt dessen KeyPreview auf True setzt und es an "übergeordneter Stelle" behandelt, dass ist recht egal.Gruß Mümmel
-
muemmel schrieb:
Hi,
_matze schrieb:
Saphir, hier geht es um das Parsen von Mathe-Ausdrücken.
warum muss man die unbedingt parsen? Man kann auch einfach jedes zeichen einzeln auswerten und sofort verarbeiten. Parsen macht erst Sinn, wenn man höhere Ansprüche stellt und kompliziertere Ausdrücke auswerten will.
Naja wenn man einzelne Rechnungen (x+y oder xy) machen will geht das natürlich.
Aber sobald es gemischt wird (z.b. x+y+za), wird es schon wieder scheitern.Sprichwort Punkt vor Strich. :xmas1: