3166 Varcalc Variablen belegen
Kategorie:Mathematik
Klasse:schwer
Eingabe:siehe Spezifikation
Ausgabe:siehe Spezifikation
Abzugebende Files: Varcalc.txt, Varcalc.java, *.java , 217.txt, 396.txt

Kurzbeschreibung:

Variablen werden durch Berechnungen mit Werten belegt; der Wert einer dieser Variablen wird abgefragt.

Allgemeine Hinweise:

Aufgabenstellung:

Ihr Programm soll "Variablen" mit Werten füllen. Dazu soll es Strings einlesen, die folgenden Aufbau haben: NAME=WERT. Dabei soll der NAME aus Buchstaben bestehen.

Der WERT ist eine Berechnung, die aus folgenden Zeichen bestehen darf;

Operatoren + - * /
Klammern ( )
Zahlen
Variablennamen

Die Operatoren +, -, * und / stehen wie üblich für Addition, Subtraktion, Multiplikation und Division. Das Zeichen "-" kann auch als negatives Vorzeichen eingesetzt werden. Mit Klammern kann die Bearbeitungsreihenfolge beeinflußt werden; ansonsten gilt "Punktrechnung vor Strichrechnung".

Zahlen bestehen aus Ziffern, wobei auch Dezimalzahlen mit dem Zeichen "." eingegeben werden können (z.B. 3.141).

Variablennamen bezeichnen Variablen, die schon zuvor einen Wert erhalten haben. Dieser Wert wird dann in die Berechnung eingesetzt.

Der Datensatz wird durch eine Abfrage in der Form ?WERT abgeschlossen. WERT steht dabei wiederum eine Berechnung in der oben genannten Form.

Betrachten wir diese Überlegungen an einem Beispiel: Unser Datensatz lautet AA=3.5*2 B=(AA+3)/2 ?B+1

Im ersten Schritt wird der Variable AA der Wert 7 zugewiesen. Dann wird der Variable B der Wert von (AA+3)/2 zugewiesen; B hat also den Wert 5. Zuletzt wird der Wert von B+1 abgefragt; das Ergebnis lautet also 6.000 .

Wenn einer Variablen mehrmals ein Wert zugewiesen ist, so ist der letzte Wert zu speichern (A=3 A=4 ?A liefert 4.000). Der Wert von Variablen, die noch nicht existieren, darf nicht abgefragt oder in einer Zuweisung verwendet werden. (B=C C=1 ?B => "FALSCHE EINGABE").

Programmiertip: Die Auswertung der Berechnungen ist rekursiv am einfachsten und elegantesten zu programmieren.

Eingabedaten:

Lesen Sie Strings in der oben genannten Form NAME=WERT ein. Dabei darf Name aus maximal 10 Zeichen bestehen und nur aus Buchstaben bestehen. Groß- und Kleinbuchstaben sind beide erlaubt und zu unterscheiden. (A=3 a=2 ?A => 3).
Umlaute und sonstige Sonderzeichen sind verboten.

Werte bestehen aus Berechnungen, wie sie oben beschrieben sind.

Der Datensatz wird durch eine Abfrage der Form ?Wert abgeschlossen, wobei für den Wert dieselben Bedingungen gelten wie bei den Zuweisungen.

Es dürfen maximal 10 Variablen angelegt werden.

Eingaben, die zu mathematischen Fehlern führen, sind als unzulässig zu betrachten.

In unseren Testdatensätzen bestehen die Berechnungen aus maximal 4 Operatoren; es kommt nur eine Klammerebene vor. Wir wollen Sie aber nicht davon abhalten, Ihr Programm so zu gestalten, daß es auch komplexere Datensätze verarbeiten kann.

Ausgabedaten:

Bei korrekten Eingabedaten soll Ihr Programm den Wert der Abfrage liefern.
Dieser ist als Float-Zahl mit 3 Nachkommastellen auszugeben, danach ein Zeilenvorschub.

Fehlerbehandlung:

Entsprechen die eingegeben Daten nicht den Bedingungen, so soll Ihr Programm die Meldung "FALSCHE EINGABE", gefolgt von einem Zeilenvorschub, ausgeben.

Lesen Sie auf jeden Fall solange Strings ein, bis die Abfrage (beginnt mit ?) eingegeben wird.

Beispiele:

Eingabedaten
A=3 B=A+A*A ?B

A=7 ?a

Ausgabedaten
12.000

FALSCHE EINGABE


Testen:

Diese Beispiele dienen nur zur Verdeutlichung der Spezifikation und müssen nicht korrekt formatiert sein. Die korrekte Formatierung entnehmen Sie bitte dem mitgelieferten Outputfile. Zum Testen Ihrer Lösung können Sie aus den mitgelieferten Eingabedaten wie folgt eine Ausgabedatei erzeugen:

java Varcalc < Varcalc.i1 > Varcalc.out1

Das erzeugte File Varcalc.out1 können Sie dann mit dem mitgelieferten Outputfile Varcalc.o1 vergleichen.