Hallo! Ich möchte hier einen Taschenrechner basteln, der nur mit Integers rechnen kann (also keine Gleitkommazahlen). Ausgabe der eingegebenen Zahlen und des Ergebnisses erfolgt auf einem 7 Segment Display (multiplexed) und die Eingabe erfolgt über ein Matrix Keyboard. Meine Frage ist nun, ist es gescheiter, die Matrixtastatur mit nem Timer periodisch zu überprüfen und ein "butto pressed" flag zu setzten oder wäre es besser an den Stellen, wo ich eine Eingabe erwarte, auf eine Tastatureingabe zu warten? Derzeit hab ich die Timer Variante, hab das Beispiel noch nicht fertig. Bin jetzt eben ins Grübeln gekommen und hab gedacht ich frag mal nach. An der Hardware kann ich nichts ändern, da es für die Uni auf einem Laborkit mit bestimmter Hardware (7-Segment, Matrixkeyboard, ...) laufen muss. PS: Hat vl wer eine Idee, wie ich "Punkt vor Strich" (Mul und Div vor + und -) am einfachsten implementieren kann? Derzeit habe ich vor, in einem Switch / if-else-Konstrukt den gedrückten Button zu prüfen. Ich lese dann immer ein bis ich zwei Operationsbuttons habe. Falls der Zweite kein + / - ist, dann berechne ich das Ergebnis, sonst weiterlesen bis + / - kommt.
Bei einem Taschenrechner (keine, die eine komplizierte Formelnotation verstehen) wird doch die Eingabe in einen Buffer geschrieben und anschließend nach Drücken einer Funktionstaste ("+","-","="...) der Wert gelesen und mit dem Zwischenspeicher verrechnet. D.h. Berechnen und Eingeben sind zwei unabhängige Programmteile die nacheinander ausgeführt werden. Punkt-vor-strich brauchst du hier garnicht berücksichtigen. Es wird immer nur die eingegebene Zahl mit dem Zwischenspeicher verrechnet. Hier gibt es nur eine Operation zur Zeit.
Hi! Es sieht so aus, ich kann max. 5 stellige Zahlen eingeben (0-99999) jeweils +/-. Nun soll das Programm, wenn ich z.b. 2+3*4 eingebe 14 ausspucken und nicht 20. Punkt vor Strich ist verlangt, kann ich leider nicht umgehen :) Meine Überlegung sieht derzeit so aus: Keyboard wird mittels Timer abgefragt, falls neue Taste gedrückt wurde wird ein globales Flag gesetzt und der Buttonwert in einer globalen Variable gespeichert. In der Endlosschleife von main() prüfe ich das Tastenflag. Wenn keine neue Taste gedrückt wurde (bzw die aktuelle Taste nicht zwischendruch losgelassen wurde), so wird nichts gemacht. Falls doch eine Taste gedrückt wurde, so wird mal geprüft ob es eine für 0-9 ist. Ist es eine Zifferntaste, so multipliziere ich die Variable für die Zahleneingabe mit 10 und addiere den Wert der gedrückten Taste. So weit, so gut. Wenn ich jetzt einen primitiven Tachenrechner machen müsste, wäre ja alles fein. Jetzt kommt jedoch die Punkt vor Strich Geschichte dazu. Da bin ich mir noch nicht ganz sicher, wie ich das mache. Ausserdem würde ich gern eure Meinungen zu meiner Tastenabfrage hören. Also ob es mit dem Timer sinnvoll ist, oder ob ich das in eine Funktion geben soll und händisch aufrufen sollte, wann immer ich eine Eingabe erwarte. LG
Ich würde die Tastenabfrage incl. Entprellung im Interrupt machen. Eine sauber erkannte Taste geht in einen 1-Byte-Buffer. Main schaut seinerseit öfters auf den Buffer und übernimmt die Tasendrücke in einen zweiten Buffer (= Anzeigebuffer). Hier könntest Du auch editieren (Clear, Backspace). Nachdem ein Funktionstaste gedrückt wurde, wird der Anzeigebuffer in einen Formelbuffer geschrieben. Dieser besteht ggf aus einem parametrisierten binären Baum und wird je nach eingegebener Operation umorganisiert. Die abschließende Berechnung ist dann recht einfach. Nur den Baum durchwandern und die gespeicherten Operationen ausführen. Bist Du Informatiker? Hier am besten mal einen Datenstruktur-Prof ansprechen.
Hab das damals so gemacht: - Eingabestring bleibt editierbar bis zum "=" - Zeichenfolge wird zerlegt in Operanden und Operatoren (2 Felder) - auflösen des Operatorvorangs (Klammern vor * vor + ...) Loop: - ausführen der "innersten" Op. danach Felder vereinfachen (kürzen) - rekursiv ausfühen bis kein Operator mehr da ist, sonst -> Loop = Result Quelle in VB60 vorhanden. Z8
edit: - Eingabestring bleibt editierbar bis zum "=" - Zeichenfolge wird zerlegt in Operanden und Operatoren (2 Felder) Loop: - auflösen des Operatorvorangs (Klammern vor * vor + ...) - ausführen der "innersten" Op. danach Felder vereinfachen (kürzen) - rekursiv ausfühen bis kein Operator mehr da ist, sonst -> Loop = Result
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.