Zum Inhalt
wannacode

Operatoren und Arithmetik

Kurz gesagt: Die arithmetischen Operatoren +, -, *, / und % rechnen mit Zahlen: / schneidet den Nachkommateil nicht ab (17 / 5 ist 3.4), Math.trunc schneidet ihn ab, und % ergibt den Rest.

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.

const coffee = 2.5;
const croissant = 1.5;
const total = 3 * coffee + 2 * croissant;
const change = 20 - total;
console.log("Gesamt: " + total + " €");
console.log("Rückgeld: " + change + " €");
Ausgabe
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 - 3 ist 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?

const tickets = 3;
const fee = 5;
console.log("Gesamt: " + tickets * 8 + fee);
Antwort

Problem

2,25 Stunden statt 2 Std. 15 Min.

Der Film dauert 135 Minuten. Du willst ihn als Stunden und Minuten zeigen: 2 Std. 15 Min. Der erste Versuch:

const minutes = 135;
const hours = minutes / 60;
console.log(hours + " Std.");
Ausgabe
2.25 Std.

In JavaScript ergibt / immer eine Kommazahl, auch wenn beide Zahlen ganz sind: 6 / 3 ist 2, und 17 / 3 ist 5.666666666666667. Hier brauchst du aber zwei ganze Stunden und die übrigen Minuten. Wie bekommst du nur den ganzzahligen Teil?

Die Idee

Der ganzzahlige Teil und der Rest

Math.trunc(...) schneidet den Nachkommateil einer Zahl ab: Math.trunc(2.25) ist 2. Deshalb ergibt Math.trunc(135 / 60) die ganzen Stunden, und Math.trunc(17 / 3) ist 5. Das nennt man Ganzzahldivision. Math ist eine Sammlung fertiger Berechnungen. Weitere davon kommen am Ende der Lektion.

Hier ist sie Schritt für Schritt, mit der Summe von drei Noten:

const math = 5;
const physics = 6;
const english = 6;
const whole = Math.trunc((math + physics + english) / 3);
console.log("Ganzzahliger Teil: " + whole);
Schritt für Schritt, in Worten
  1. Drei Noten: 5, 6, 6.
  2. Zuerst die Klammern: 5 + 6 + 6 = 17.
  3. 17 / 3 ist 5,667…, und Math.trunc behält nur den ganzzahligen Teil: Wie viele ganze Gruppen zu 3 passen in 17? 5.
  4. Der Rest 2 (also 17 % 3) wird abgeschnitten. Das Ergebnis ist die ganze Zahl 5.
  5. 5 wird in whole gespeichert.
  6. Ausgegeben wird „Ganzzahliger Teil: 5“. Der Nachkommateil (5,67) ist nicht im Ergebnis.

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:

const minutes = 135;
const hours = Math.trunc(minutes / 60);
const rest = minutes % 60;
console.log(hours + " Std. " + rest + " Min.");
Ausgabe
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 schneidet Math.trunc Richtung null ab, und der Rest hat das Vorzeichen des Dividenden. % funktioniert auch mit Kommazahlen:
console.log(Math.trunc(-7 / 2));
console.log(-7 % 2);
console.log(7.5 % 2);
Ausgabe
-3
-1
1.5
  • Eine Division durch 0 bricht das Programm nicht ab: 5 / 0 ergibt Infinity (unendlich), und 0 / 0 und 5 % 0 ergeben NaN („keine Zahl“).

Probier es aus

Flaschen in Kisten

In eine Kiste passen 6 Flaschen. Du hast 17.

Was gibt das Programm aus?

const bottles = 17;
const perCase = 6;
console.log(Math.trunc(bottles / perCase) + " Kisten");
console.log(bottles % perCase + " bleiben übrig");
Antwort

Die Idee

Umwandlung zwischen Typen

In JavaScript sind Zahlen ein einziger Typ, number. Es gibt keine getrennten Typen für ganze Zahlen und Kommazahlen, zwischen denen du umwandeln müsstest: / ergibt eine Kommazahl, wie du gesehen hast. Eine ganze Zahl aus einer Kommazahl machst du mit Math:

const total = 5 + 6 + 6;
const average = total / 3;
console.log(average);
console.log(average.toFixed(2));
const whole = Math.trunc(9.99);
console.log(whole);
Ausgabe
5.666666666666667
5.67
9
  • Math.trunc(9.99) ist 9: Es schneidet den Nachkommateil ab, es rundet nicht;
  • Math.round(9.99) ist 10: Es rundet auf die nächste ganze Zahl;
  • Math.floor(9.99) ist 9 und Math.ceil(9.01) ist 10: Sie runden ab und auf.

Eine Umwandlung zwischen Typen gibt es in JavaScript von Text zu Zahl: Das ist Number(...) aus der Lektion über die Eingabe.

Genauer, für Neugierige
  • Jedes Zeichen hat einen Code, eine Zahl in der Zeichentabelle. charCodeAt(0) ergibt den Code des ersten Zeichens, und String.fromCharCode macht aus einem Code ein Zeichen:
console.log("A".charCodeAt(0));
console.log(String.fromCharCode(66));
const maxInt = 2147483647;
console.log(maxInt + 1);
console.log(9007199254740992 + 1);
Ausgabe
65
B
2147483648
9007199254740992
  • In Java und C# reicht int bis 2 147 483 647, und eins mehr „springt“ zu einer negativen Zahl. In JavaScript ist 2147483647 + 1 gleich 2147483648. Die Grenze liegt woanders: Ganze Zahlen sind bis 9 007 199 254 740 991 exakt, danach verlieren sie an Genauigkeit (die letzte Zeile). Für größere ganze Zahlen gibt es BigInt.

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.

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:

let balance = 20;
let purchases = 0;
balance -= 4.5;
purchases++;
balance -= 3.5;
purchases++;
console.log(purchases + " Einkäufe, es bleiben " + balance + " €");
Ausgabe
2 Einkäufe, es bleiben 12 €
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.

let a = 5;
const b = a++;
const c = ++a;
console.log(a + " " + b + " " + c);
Ausgabe
7 5 7

So 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. Math ist immer verfügbar, ohne dass du es lädst. Das sind Funktionen, fertige Codestücke. Eigene schreibst du im Modul „Funktionen“.

const big = Math.PI * Math.pow(15, 2);
const small = 2 * Math.PI * Math.pow(10, 2);
console.log(`Eine 30-cm-Pizza: ${big.toFixed(1)} cm²`);
console.log(`Zwei 20-cm-Pizzen: ${small.toFixed(1)} cm²`);
console.log(Math.sqrt(144));
console.log(Math.abs(-7.5));
Ausgabe
Eine 30-cm-Pizza: 706.9 cm²
Zwei 20-cm-Pizzen: 628.3 cm²
12
7.5

Eine große Pizza ist mehr als zwei kleine.

Du schreibst Was es ergibt
Math.sqrt(x) die Quadratwurzel
Math.pow(x, n) oder x ** n x hoch n
Math.abs(x) den Betrag (ohne Vorzeichen)
Math.round(x) Runden auf eine ganze Zahl
Math.trunc(x) den ganzzahligen Teil, ohne Runden
Math.PI die Zahl π, 3,14159…

In JavaScript ist Math.sqrt(144) gleich 12: Die Zahl hat denselben Typ, ob ganz oder mit Komma.

Genauer, für Neugierige
  • Runden von 2,5: Die Sprachen liefern verschiedene Ergebnisse.
console.log(Math.round(2.5));
console.log(Math.round(3.5));
console.log(Math.round(-2.5));
console.log(Math.round(5.678 * 100) / 100);
Ausgabe
3
4
-2
5.68
  • Math.round rundet „die Hälfte“ auf, zur größeren Zahl hin: 2,5 wird zu 3, und -2,5 wird zu -2. Für zwei Nachkommastellen multiplizierst du mit 100, rundest und teilst durch 100. Wenn es nur um die Ausgabe geht, ist toFixed(2) bequemer.
  • toFixed richtet sich nicht nach den Spracheinstellungen des Computers: Der Punkt bleibt überall ein Punkt.

Ü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. Hier brauchst du eine Division mit Kommazahl.

Eingabe
5
6
6
Ausgabe
Durchschnitt: 5.67

2. 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.

Eingabe
3725
Ausgabe
1 Std. 2 Min. 5 Sek.

3. Volumen einer Kugel. Lies den Radius ein und gib das Volumen aus: V = 4/3 · π · r³. Hier ist 4 / 3 gleich 1.333…, wie es sein soll.

Eingabe
10
Ausgabe
Volumen: 4188.79 cm³

4. Celsius in Fahrenheit. F = C · 9 / 5 + 32. Lies die Temperatur in Grad Celsius ein.

Eingabe
37
Ausgabe
37.0 °C = 98.6 °F

Weitere 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 mit Math.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 mit (await ask(""))[0]. Was das bedeutet, siehst du in der Lektion über Text.

Test

Teste dich

1. Was ist Math.trunc(17 / 5)?
2. Was ist 17 % 5?
3. Was ist 17 / 5 in JavaScript?
4. Was ergibt Math.trunc(9.99)?
5. Was gibt console.log("Summe: " + 2 + 3) aus?

Erstellt von Ivo Gergov im Rahmen der Kampagne von Evo Tech für zugängliche Programmierausbildung ·