Version 0
- Auf einem Formular werden implementiert:
- 1 Edit-Objekt e_anzeige zur Anzeige der Eingabe und des Ergebnisses
- 10 Button-Objekte b_1, ... , b_9, b_0 für die Eingabe
der Ziffern - 1 Button-Objekt b_clear zum Löschen der
Anzeige (0 wird angezeigt) - 4 Button-Objekte b_plus, b_minus,
b_mal und b_durch für die Wahl des Operators - 1 Button-Objekt
b_gleich zur Ausgabe des Endergebnisses - 1 Button-Objekt
b_komma für spätere Dezimaleingabe. Der Button
b_komma soll noch nicht aktiv sein (Eigenschaft enabled auf
false setzen!). Das Edit-Objekt soll nur anzeigen, keine
Angaben annehmen (Eigenschaft ReadOnly). Die Caption-Eigenschaft
des Formulars f_rechner kann z. B. Mein Taschenrechner sein,
es soll beim Start in der Mitte des Bildschirms angezeigt werden
(Eigenschaft Position).
- Erzeugen Sie zum Projekt ein Verzeichnis
Taschenrechner und speichern Sie dieses Roh-Formular eines Taschenrechners
in einem neuen Unterverzeichnis (z.B. RechnerV0) als Unit uRechner
und Projekt pRechner ab.
- Kopieren Sie dieses Unterverzeichnis
als neues Unterverzeichnis (z. B. RechnerV1) für die weitere
Version 1.
|
|
Version 1
- Öffnen Sie nun im neu erzeugten
Unterverzeichnis RechnerV1 das dortige Projekt,
um es weiter
auszubauen:
- Erstellen Sie erste Methoden für
den Taschenrechner:
Durch Doppelklick auf einen Button wird
ein Methodenrumpf erzeugt: z. B. procedure Tf_rechner.b_1Click (Sender: TObject);
begin end;
- Füllen Sie diesen Rumpf jeweils
mit den notwendigen Anweisungen;
Es sollen die gedrückten
Zahlen erscheinen (nicht nur jeweils 1 Ziffer!), Die C-Taste
erzeugt wieder die Anzeige '0', danach darf nach neuer Zifferneingabe
nicht '01', sondern muss '1' erscheinen.
- Nach Drücken einer Operatortaste
- muss die bisher eingegebene Zahl gespeichert werden (globale
Variable nutzen: hilfsspeicher : Real) -
muss der Operator gemerkt werden (globale Variable operator
: Char)
- Nach Drücken der '='-Taste muss
das Ergebnis ermittelt und angezeigt werden.
- Testen Sie Ihre Version 1 ausführlich.
Mögliche Rechenterme hierzu:
2 x 3 = , 3
- 5 = , 4 : 9 = , 4 : 0 = , 2
x 3 = + 4 = , 2 x 3 + 4 = , 2 + 3 x 4 =
- Implementieren Sie auch zusätzlich
Button-Objekte b_quadrat, b_qwurzel und b_potenz.
Hinweis:
Die Funktion SQRT() liefert in Delphi die Quadratwurzel (siehe
Delphi-Hilfe). Für die Potenz nutzen Sie eine Zählschleife;
testen Sie z. B., ob 3 ^ 4 = das korrekte Ergebnis 81 liefert.
Nach Eingabe von 3 x² sollte sofort - auch ohne '='
- das Ergebnis 9 erscheinen.
|
|
Version 2
- Kopieren Sie das Unterverzeichnis RechnerV0
als neues Unterverzeichnis RechnerV2.
- Öffnen Sie nun im neu erzeugten
Unterverzeichnis RechnerV2 das dortige Projekt,
um das Rohformular
erneut weiter auszubauen.
- In der bisherigen Version 1 führten
Kettenrechnungen meist zu falschen Ergebnissen, da die Punkt-Vor-Strich-Logik
nicht beachtet wird: 2 + 3 x 4 = ergibt 20 statt 14.
Im
Unterricht wurde daher über den Einsatz einer globalen
Variablen stapel : String diskutiert, die jede gedrückte
Taste (Ziffer oder Operator) zwischenspeichert, bis ein weiterer
Operator mit niedrigerer Priorität als der gespeicherten,
bereits eingegebenen erfasst wird. Auch diese Operatorprioritäten
müssen global gespeichert werden in den Variablen alte_prioritaet,
neue_prioritaet : Byte (für Zahlen zwischen 0 und 255).
Strichrechnungs-Operatoren (+ und -) erhalten die Priorität
1, Punktrechnungen die 2. Welche Priorität sollte dann
das '='-Zeichen erhalten?
- Im Unterricht wurde an einem Flussdiagramm der
Ablauf für jeden einzelnen Tastendruck behandelt. Hier
fehlte die detaillierte Darstellung zu
- Term aus Stapel
auslesen und bearbeiten - Zahl als Ergebnis einstapeln
- Zahl aus Stapel auslesen Notieren Sie zu diesen Aktionen
eigene Flussdiagramme. Vergeben Sie für alle Buttons
außer der C-Taste zum Ereignis OnClick dieselbe Methode
und benennen Sie diese im Objektinspektor um (z. B. zu TastenDruck).
Kontrollieren Sie dies im Objektinspektor. Füllen Sie dann
die erzeugte Rumpfmethode anhand des Flussdiagrammes.
- Hier werden als Wiederholungsstrukturen
die Zählschleife (FOR...TO...DO...) und die vorprüfende
Schleife (WHILE...DO...) einzusetzen sein. Lesen Sie hierzu
auch in der Delphi-Hilfe.
- Um festzustellen, welcher Button gedrückt
wurde, dient der Inhalt des Parameters Sender: Er enthält
den NAMEN des sendenden Buttons. Dies könnte so genutzt
werden:
IF Sender
= b_1 then zeichen := '1'; IF Sender = b_2 then
zeichen := '2'; ... IF Sender
= b_plus then zeichen := '+'; ...
- Es werden eine Reihe von Hilfsvariablen
LOKAL in dieser Methode benötigt.
Diese werden deshalb
IN der Prozedur LOKAL deklariert: procedure Tf_rechner.Tastendruck(Sender: TObject);
var zeichen : Char;
neue_zahl :
Boolean; operatoren :
SET OF Char; // Mengen aus Zeichen; ziffern
: SET OF Char; //
werden noch festgelegt temp :
String; op1, op2, erg : Real;
op :
Char; i :
Byte; begin // Operator- und Ziffern-Mengen
festlegen: operatoren := ['*','+','-','/'];
ziffern := ['0','1','2','3','4','5','6','7','8','9','.'];
... end;
- Nur hilfsweise - nachdem Sie es selbst
ausreichend versucht haben, können Sie weiter unten eine
Rumpfmethode TastenDruck laden. Diese ist an den markierten
Stellen zu ergänzen.
|
|