Operatoren und Arithmetik
Kurz gesagt: Die arithmetischen Operatoren +, -, *, / und % rechnen mit Zahlen; wenn beide Seiten von / ganze Zahlen sind, ist die Division eine Ganzzahldivision und der Nachkommateil wird abgeschnitten.
Problem
Die Rechnung am Tisch
Du hast drei Kaffees zu 2,50 € und zwei Croissants zu 1,50 € bestellt. Du zahlst mit einem 20-€-Schein. Wie hoch ist die Rechnung, und wie viel Rückgeld bekommst du?
Im Kopf geht das. Aber die Kasse im Café macht so eine Rechnung hunderte Male am Tag, mit anderen Preisen und Mengen. Das Programm muss selbst rechnen.
Die Idee
Die arithmetischen Operatoren
Du rechnest wie auf Papier: + addiert, - subtrahiert, * multipliziert, / dividiert. Diese Zeichen heißen Operatoren.
double coffee = 2.5;double croissant = 1.5;double total = 3 * coffee + 2 * croissant;double change = 20 - total;System.out.println("Gesamt: " + total + " €");System.out.println("Rückgeld: " + change + " €");Gesamt: 10.5 €Rückgeld: 9.5 €Die Reihenfolge ist wie in der Mathematik: zuerst * und /, dann + und -. Deshalb ist 3 * coffee + 2 * croissant gleich 7,5 + 3. Willst du eine andere Reihenfolge, setzt du Klammern: (2 + 3) * 4 ist 20.
Es gibt noch einen fünften Operator, %. Um ihn geht es in der nächsten Idee.
Genauer, für Neugierige
- Operatoren mit gleichem Vorrang werden von links nach rechts berechnet:
20 - 5 - 3ist 12, nicht 18. -vor einer Zahl macht sie negativ:-total.
- Bei Text addiert
+nicht, sondern hängt an. Sobald links Text steht, wird alles danach als Text angehängt. Das ist die Falle in der nächsten Karte.
Probier es aus
Konzertkarten
Drei Karten zu 8 € und 5 € Bestellgebühr.
Was gibt das Programm aus?
int tickets = 3;int fee = 5;System.out.println("Gesamt: " + tickets * 8 + fee);* wird zuerst berechnet: tickets * 8 ist 24. Dann von links nach rechts: „Gesamt: “ + 24 ist der Text „Gesamt: 24“, und daran wird die 5 angehängt. Damit 29 herauskommt, muss die Rechnung in Klammern stehen: "Gesamt: " + (tickets * 8 + fee).Problem
Ein Notendurchschnitt von 5, nicht 5,67
Du hast die Noten 5, 6 und 6. Der Durchschnitt ist 17 / 3 = 5,67. Das Programm sagt etwas anderes:
int math = 5;int physics = 6;int english = 6;double average = (math + physics + english) / 3;System.out.println("Notendurchschnitt: " + average);Notendurchschnitt: 5.0Du speicherst das Ergebnis in einem double, und der Nachkommateil fehlt trotzdem. Wo ist er geblieben?
Die Idee
Ganzzahl durch Ganzzahl ergibt Ganzzahl
Wenn beide Seiten von / ein int sind, ist die Division eine Ganzzahldivision: Das Ergebnis ist eine ganze Zahl, und der Nachkommateil wird abgeschnitten. 17 / 3 ist 5. Erst danach wird die 5 im double gespeichert und wird zu 5.0.
Hier ist der Notendurchschnitt aus der letzten Karte, Schritt für Schritt:
int math = 5;int physics = 6;int english = 6;double average = (math + physics + english) / 3;System.out.println("Notendurchschnitt: " + average);Schritt für Schritt, in Worten
- Drei Noten, jede in einem int: 5, 6, 6.
- Zuerst die Klammern: 5 + 6 + 6 = 17. Auch die Summe ist ein int.
- 17 / 3: Beide Seiten sind int. Wie viele ganze Gruppen zu 3 passen in 17? 5.
- Der Rest 2 (also 17 % 3) wird abgeschnitten. Das Ergebnis ist die ganze Zahl 5.
- Erst jetzt wird 5 in double average gespeichert und dabei zu 5.0.
- Ausgegeben wird „Notendurchschnitt: 5.0“. 5,67 taucht nirgends auf.
Was abgeschnitten wird, ist nicht ganz verloren. Der Operator % ergibt den Rest der Division: 17 % 3 ist 2, denn 17 = 5 · 3 + 2.
Zusammen teilen die beiden eine Menge in ganze Teile und einen Rest. Der Film dauert 135 Minuten:
int minutes = 135;int hours = minutes / 60;int rest = minutes % 60;System.out.println(hours + " Std. " + rest + " Min.");2 Std. 15 Min.% wirst du oft brauchen. Eine Zahl ist gerade, wenn n % 2 gleich 0 ist. Die letzte Ziffer einer Zahl ist n % 10.
Genauer, für Neugierige
- Bei negativen Zahlen wird das Ergebnis Richtung null abgeschnitten, und der Rest hat das Vorzeichen des Dividenden.
%funktioniert auch mit Kommazahlen:
System.out.println(-7 / 2);System.out.println(-7 % 2);System.out.println(7.5 % 2);-3-11.5- Eine ganze Zahl geteilt durch 0 bricht das Programm mit einem Fehler ab:
ArithmeticException: / by zero. Beidoublegibt es keinen Fehler:5.0 / 0ergibt unendlich, und0.0 / 0ergibtNaN(„keine Zahl“).
Probier es aus
Flaschen in Kisten
In eine Kiste passen 6 Flaschen. Du hast 17.
Was gibt das Programm aus?
int bottles = 17;int perCase = 6;System.out.println(bottles / perCase + " Kisten");System.out.println(bottles % perCase + " bleiben übrig");17 / 6 sind 2 volle Kisten (12 Flaschen), und 17 % 6 ist der Rest: 5 Flaschen, die keine Kiste füllen.
Die Idee
Umwandlung zwischen Typen
Damit die Division eine Kommazahl ergibt, muss mindestens eine Seite ein double sein. Hast du ein int, wandelst du es um: Du schreibst den Typ in Klammern vor den Wert. Das nennt man Typumwandlung (Cast).
int sum = 5 + 6 + 6;double average = (double) sum / 3;System.out.println(average);System.out.printf("%.2f%n", average);int whole = (int) 9.99;System.out.println(whole);5.6666666666666675.679(double) sum macht aus 17 eine 17.0, und dann ergibt die Division eine Kommazahl. Steht die Zahl direkt im Code, reicht es, sie als Kommazahl zu schreiben: sum / 3.0.
Andersherum, von double nach int, wird der Nachkommateil abgeschnitten: (int) 9.99 ist 9, nicht 10. Deshalb macht der Compiler das nicht von selbst: Schreibst du int whole = 9.99;, lässt sich das Programm nicht kompilieren. Von int nach double geht nichts verloren, und die Umwandlung passiert von selbst: double price = 10; ist 10.0.
Genauer, für Neugierige
- Ein Cast geht von Zahl zu Zahl. Text in eine Zahl umwandeln machst du schon mit
Integer.parseInt: Das ist etwas anderes. - Ein Zeichen (
char) wird eigentlich als Zahl gespeichert, als sein Code. Deshalb lässt es sich in einintumwandeln und zurück:
System.out.println((int) 'A');System.out.println((char) 66);int max = 2147483647;System.out.println(max + 1);65B-2147483648- Die dritte Zeile ist eine Überraschung:
intreicht bis 2 147 483 647. Eins mehr ergibt keinen Fehler. Die Zahl „springt“ zur kleinsten negativen Zahl. Für größere Zahlen gibt eslong.
Probier es aus
Finde den Fehler
Die Stromrechnung beträgt 125 € und wird auf drei Mitbewohner aufgeteilt. Das Programm sagt, jeder zahlt 41,00 €, es sollten aber 41,67 € sein. In welcher Zeile ist der Fehler?
Wähle die Zeile mit dem Fehler.
125 / 3 ist eine Ganzzahldivision und ergibt 41. Der Cast kommt erst danach und macht aus 41 eine 41.0. Die Korrektur: vor der Division umwandeln, (double) bill / people.Die Idee
Kurzschreibweisen: += und ++
Oft änderst du einen Wert auf Basis von sich selbst: Das Guthaben auf der Karte sinkt mit jedem Einkauf, ein Zähler steigt um eins. Dafür gibt es kurze Schreibweisen:
double balance = 20;int purchases = 0;balance -= 4.5;purchases++;balance -= 3.5;purchases++;System.out.println(purchases + " Einkäufe, es bleiben " + balance + " €");2 Einkäufe, es bleiben 12.0 €| Du schreibst | Das bedeutet |
|---|---|
balance -= 4.5; |
balance = balance - 4.5; |
total += price; |
total = total + price; |
x *= 2;, x /= 2;, x %= 2; |
dasselbe mit *, / und % |
purchases++; |
purchases = purchases + 1; |
seats--; |
seats = seats - 1; |
+= funktioniert auch mit Text: message += "!"; hängt ein Ausrufezeichen ans Ende.
Genauer, für Neugierige
++ kann auch vor der Variable stehen. Allein in einer Zeile gibt es keinen Unterschied. In einem Ausdruck schon: a++ liefert den alten Wert und erhöht danach, ++a erhöht zuerst und liefert den neuen Wert.
int a = 5;int b = a++;int c = ++a;System.out.println(a + " " + b + " " + c);7 5 7So ein Code ist schwer zu lesen. Schreib ++ und -- allein in eine Zeile.
Die Idee
Math: Wurzel, Potenz, Runden
Eine Pizzeria verkauft eine 30-cm-Pizza zum selben Preis wie zwei 20-cm-Pizzen. Was ist mehr? Die Fläche eines Kreises ist π · r². Für die Potenz und für π gibt es Fertiges in Math: Du schreibst den Namen und in Klammern die Zahlen. Das sind Methoden, fertige Codestücke. Eigene schreibst du im Modul „Methoden“.
double big = Math.PI * Math.pow(15, 2);double small = 2 * Math.PI * Math.pow(10, 2);System.out.printf("Eine 30-cm-Pizza: %.1f cm²%n", big);System.out.printf("Zwei 20-cm-Pizzen: %.1f cm²%n", small);System.out.println(Math.sqrt(144));System.out.println(Math.abs(-7.5));Eine 30-cm-Pizza: 706.9 cm²Zwei 20-cm-Pizzen: 628.3 cm²12.07.5Eine große Pizza ist mehr als zwei kleine.
| Du schreibst | Was es ergibt |
|---|---|
Math.sqrt(x) |
die Quadratwurzel |
Math.pow(x, n) |
x hoch n |
Math.abs(x) |
den Betrag (ohne Vorzeichen) |
Math.round(x) |
Runden auf eine ganze Zahl |
Math.PI |
die Zahl π, 3,14159… |
Wurzel und Potenz liefern ein double, auch wenn das Ergebnis eine ganze Zahl ist (deshalb 12.0). Brauchst du ein int, wandle es um: (int) Math.sqrt(144).
Genauer, für Neugierige
- Runden von 2,5: Java und C# liefern verschiedene Ergebnisse.
System.out.println(Math.round(2.5));System.out.println(Math.round(3.5));System.out.println(Math.round(5.678 * 100) / 100.0);345.68Math.roundrundet „die Hälfte“ auf und liefert einlong, keinint. Für zwei Nachkommastellen multiplizierst du mit 100, rundest und teilst durch100.0. Wenn es nur um die Ausgabe geht, istprintf("%.2f")bequemer.
- printf richtet sich nach den Spracheinstellungen des Computers. Auf einem Computer mit deutschen Einstellungen siehst du
706,9, nicht706.9.
Übung
Lass das Programm rechnen
Löse die Aufgaben in deinem Editor. Jede Zahl der Eingabe steht in einer eigenen Zeile.
1. Durchschnitt von drei Zahlen. Lies drei ganze Zahlen ein und gib ihren Durchschnitt mit zwei Nachkommastellen aus. Pass bei der Division auf.
566Durchschnitt: 5.672. Sekunden in Stunden. Lies eine Anzahl Sekunden ein und teile sie in Stunden, Minuten und Sekunden auf. Tipp: Eine Stunde hat 3600 Sekunden, und % ergibt, was übrig bleibt.
37251 Std. 2 Min. 5 Sek.3. Volumen einer Kugel. Lies den Radius ein und gib das Volumen aus: V = 4/3 · π · r³. Überleg dir, was 4 / 3 ist, bevor du es so schreibst.
10Volumen: 4188.79 cm³4. Celsius in Fahrenheit. F = C · 9 / 5 + 32. Lies die Temperatur in Grad Celsius ein.
3737.0 °C = 98.6 °FWeitere Aufgaben
- Zoll in Zentimeter. Ein Zoll sind 2,54 cm. Für 12 Zoll:
30.48 cm. - Fläche eines Rechtecks. Lies Länge und Breite ein und gib die Fläche aus (Länge · Breite).
- Fläche eines Quadrats. Lies die Seitenlänge ein und gib die Fläche aus. Mach es einmal mit
*und einmal mitMath.pow. - Bogenmaß in Grad. Grad = Bogenmaß · 180 / π. Für 3.14159:
180.00°. - Stunden in Sekunden. Lies eine Anzahl Stunden ein und gib aus, wie viele Sekunden das sind. Für 2 Stunden: 7200.
- Der Code eines Zeichens. Lies ein Zeichen ein und gib seinen Code aus. Für
A: 65. Das erste Zeichen des eingelesenen Texts bekommst du mitin.nextLine().charAt(0). Was das bedeutet, siehst du in der Lektion über Text.
Test
Teste dich
Verwandte Lektionen
Abschnitt „Verwandte Lektionen“- Baut auf: Dein erstes Programm · Variablen und Typen · Eingabe und Ausgabe
- Geht weiter in: Bedingungen · Schleifen · Arrays · Zweidimensionale Arrays
- Aufgaben zum Thema: Sprachgrundlagen