Zum Inhalt
wannacode

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;
Console.WriteLine("Gesamt: " + total + " €");
Console.WriteLine("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?

int tickets = 3;
int fee = 5;
Console.WriteLine("Gesamt: " + tickets * 8 + fee);
Antwort

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;
Console.WriteLine("Notendurchschnitt: " + average);
Ausgabe
Notendurchschnitt: 5

Du 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;
Console.WriteLine("Notendurchschnitt: " + average);
Schritt für Schritt, in Worten
  1. Drei Noten, jede in einem int: 5, 6, 6.
  2. Zuerst die Klammern: 5 + 6 + 6 = 17. Auch die Summe ist ein int.
  3. 17 / 3: Beide Seiten sind int. 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. Erst jetzt wird 5 in double average gespeichert und dabei zu 5.0. Der Nachkommateil ist schon weg.
  6. Ausgegeben wird „Notendurchschnitt: 5“: C# schreibt kein .0 ans Ende. 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;
Console.WriteLine(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 wird das Ergebnis Richtung null abgeschnitten, und der Rest hat das Vorzeichen des Dividenden. % funktioniert auch mit Kommazahlen:
Console.WriteLine(-7 / 2);
Console.WriteLine(-7 % 2);
Console.WriteLine(7.5 % 2);
Ausgabe
-3
-1
1.5
  • Eine ganze Zahl geteilt durch 0 bricht das Programm mit einem Fehler ab: DivideByZeroException. Bei double gibt es keinen Fehler: 5.0 / 0 ergibt unendlich, und 0.0 / 0 ergibt NaN („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;
Console.WriteLine(bottles / perCase + " Kisten");
Console.WriteLine(bottles % perCase + " bleiben übrig");
Antwort

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;
Console.WriteLine(average);
Console.WriteLine($"{average:F2}");
int whole = (int)9.99;
Console.WriteLine(whole);
Ausgabe
5.666666666666667
5.67
9

(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 int.Parse: Das ist etwas anderes.
  • Ein Zeichen (char) wird eigentlich als Zahl gespeichert, als sein Code. Deshalb lässt es sich in ein int umwandeln und zurück:
Console.WriteLine((int)'A');
Console.WriteLine((char)66);
int max = 2147483647;
Console.WriteLine(max + 1);
Ausgabe
65
B
-2147483648
  • Die dritte Zeile ist eine Überraschung: int reicht bis 2 147 483 647. Eins mehr ergibt keinen Fehler. Die Zahl „springt“ zur kleinsten negativen Zahl. Für größere Zahlen gibt es long.
  • In C# gibt es auch Convert.ToInt32(9.99). Es rundet (es ergibt 10), statt wie (int) abzuschneiden.

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:

double balance = 20;
int purchases = 0;
balance -= 4.5;
purchases++;
balance -= 3.5;
purchases++;
Console.WriteLine(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.

int a = 5;
int b = a++;
int c = ++a;
Console.WriteLine(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. 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);
Console.WriteLine($"Eine 30-cm-Pizza: {big:F1} cm²");
Console.WriteLine($"Zwei 20-cm-Pizzen: {small:F1} cm²");
Console.WriteLine(Math.Sqrt(144));
Console.WriteLine(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) 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. 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.
Console.WriteLine(Math.Round(2.5));
Console.WriteLine(Math.Round(3.5));
Console.WriteLine(Math.Round(2.5, MidpointRounding.AwayFromZero));
Console.WriteLine(Math.Round(5.678, 2));
Ausgabe
2
4
3
5.68
  • Math.Round rundet „die Hälfte“ zur geraden Zahl: 2,5 wird zu 2, und 3,5 wird zu 4. So runden die Banken (daher der englische Name „banker's rounding“). Das Runden aus der Schule ist MidpointRounding.AwayFromZero. Mit einem zweiten Argument rundest du auf so viele Nachkommastellen: Math.Round(5.678, 2) ist 5,68.
  • F2 richtet sich nach den Spracheinstellungen des Computers. Auf einem Computer mit deutschen Einstellungen siehst du 706,9, nicht 706.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.

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³. Überleg dir, was 4 / 3 ist, bevor du es so schreibst.

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 Console.ReadLine()[0]. Was das bedeutet, siehst du in der Lektion über Text.

Test

Teste dich

1. Was ist 17 / 5, wenn beide Zahlen int sind?
2. Was ist 17 % 5?
3. Welcher Ausdruck ergibt 2,5?
4. Was ergibt (int)9.99?
5. Was gibt Console.WriteLine("Summe: " + 2 + 3) aus?

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