studyklar
GdI 1 · Übungsblatt 8 · Aufgabe 2

Taschenrechner mit Startparametern: java A8_2 10.1 + 2.54

Ein Taschenrechner als Java-Programm: Zahl, Rechenzeichen und Zahl stehen schon im Befehl, mit dem man das Programm startet. Das Programm wandelt die Zahlen aus Text um, sucht das Rechenzeichen heraus und gibt das Ergebnis aus. Rechts steht das ganze Programm, die Zeilen zum Schritt sind hervorgehoben. Mit Weiter geht es Schritt für Schritt voran.

Die Aufgabe

Aufgabe 8.2

Schreiben Sie ein Java-Programm A8_2, das die Grundrechenarten Addition, Subtraktion, Multiplikation und Division für Gleitkommazahlen (Double) ausführen kann. Das Programm soll als „Taschenrechner“ implementiert werden und drei Parameter in der sog. Infix-Notation verwenden, die beim Programmstart übergeben werden.

Beispiel:Aufruf:java A8_2 10.1 + 2.54
Ausgabe:12.64

Zur Eingabe verwenden Sie demnach die parse-Methoden, die von den entsprechenden Hüllklassen der primitiven Datentypen angeboten werden. Die Ausgabe soll auf dem Bildschirm erfolgen.

Das Programm liest nichts von der Tastatur. Die Werte stehen hinter dem Programmnamen im Startbefehl: java A8_2 10.1 + 2.54. Diese Werte heißen Startparameter. Infix-Notation heißt: Das Rechenzeichen steht zwischen den beiden Zahlen, so wie man es von Hand schreibt.

Die Aufgabe nennt nur den Normalfall. Ein Programm, das auch andere Leute starten, muss aber mit Fehlern umgehen. Zur Division gehört darum der Schutz vor 0. Als Ergänzung (nicht verlangt) behandeln wir drei weitere Sonderfälle: ein unbekanntes Rechenzeichen, zu viele oder zu wenige Parameter und das Sternchen *, das die Konsole verändert.

Merke: Startparameter kommen immer als Text an. Zahlen muss das Programm erst umwandeln, Texte vergleicht es mit equals.
  1. Wo die Startparameter ankommen.
  2. Die Zahlen mit parseDouble umwandeln.
  3. Plus, Minus und Mal am Rechenzeichen erkennen.
  4. Die Division mit Schutz vor 0.
  5. Ergänzung: ein unbekanntes Rechenzeichen.
  6. Ergänzung: zu viele oder zu wenige Parameter.
  7. Ergänzung: das Sternchen in der Konsole.
  8. Alle Probeläufe.

Wo die Startparameter ankommen

    public static void main(String[] args) {
Platzargs[Platz]Typ
0"10.1"String
1"+"String
2"2.54"String
$ java Show 10.1 + 2.54
args.length = 3
args[0] = 10.1
args[1] = +
args[2] = 2.54

Jedes Java-Programm beginnt in main. In ihrem Kopf steht String[] args: ein Array aus Strings, also aus Texten. Java legt dort alles ab, was im Startbefehl hinter dem Programmnamen steht. Getrennt wird an den Leerzeichen.

Bei java A8_2 10.1 + 2.54 ist args.length = 3. Auf Platz 0 steht der Text "10.1", auf Platz 1 "+", auf Platz 2 "2.54". Die Leerzeichen um das + sind darum Pflicht: 10.1+2.54 wäre nur ein einziger Parameter.

Aus Skript 5, Folie 5-35 („Kommandozeilen-Parameter“): Bei java Sample Anton /a 10 enthält args[0] den Text „Anton“, args[1] den Text „/a“ und args[2] den Text „10“: Die Parameter werden als String-Array an main übergeben. (Die Folie nennt das Array arg; der Name ist frei wählbar.)

Ausgegeben wird mit Out.println. Out ist eine Hilfsklasse der Vorlesung, keine Standardklasse von Java: Out.java muss im selben Ordner liegen wie A8_2.java. Wer sie nicht hat, schreibt System.out.println; die Ausgabe ist dieselbe.

Ein kleines Hilfsprogramm, das nur args ausgibt, zeigt das (echter Lauf):

Die Zahlen mit parseDouble umwandeln

        double x = Double.parseDouble(args[0]);        String op = args[1];        double y = Double.parseDouble(args[2]);

Mit dem Text "10.1" kann Java nicht rechnen. Erst muss er in eine Gleitkommazahl vom Typ double umgewandelt werden. Das macht Double.parseDouble. Double ist die Hüllklasse (englisch wrapper class) zum einfachen Typ double: eine Klasse, die Hilfsmethoden für diesen Typ anbietet. „parse“ heißt zerlegen, also Text lesen und deuten.

So wird x = 10.1 und y = 2.54. Das Rechenzeichen args[1] bleibt Text und kommt in den String op (kurz für Operator, das Rechenzeichen).

Aus Skript 5, Folien 5-36 und 5-38 („Kommandozeilen-Parameter“, „String-Konversionen“): Wrapper-Klassen wie Integer und Double wandeln Text um: Integer.parseInt(args[0]) liefert ein int, Double.parseDouble("1.2E40") ein double.
Noch 7 Schritte bis zum Ergebnis
Den ganzen Lösungsweg sehen Studierende und Lehrende der HS KL. Registriere dich mit deiner Adresse @stud.hs-kl.de oder @hs-kl.de, dann geht es hier direkt weiter.

Abbildung 1

public class A8_2 {     public static void main(String[] args) {        if (args.length != 3) {            Out.println("Bitte genau drei Parameter angeben: Zahl Operator Zahl");            Out.println("Beispiel: java A8_2 10.1 + 2.54");            return;        }         double x = Double.parseDouble(args[0]);        String op = args[1];        double y = Double.parseDouble(args[2]);         if (op.equals("+")) {            Out.println(x + y);        } else if (op.equals("-")) {            Out.println(x - y);        } else if (op.equals("*")) {            Out.println(x * y);        } else if (op.equals("/")) {            if (y == 0) {                Out.println("Fehler: Division durch 0");            } else {                Out.println(x / y);            }        } else {            Out.println("Fehler: unbekannter Operator " + op);        }    }}
LegendeDas Gerüst des Programms: Klasse A8_2 und main. Der Rest wird Schritt für Schritt erklärt.