Mit Zahlen kann man rechnen: Aus zwei Zahlen wird mit einer Mathematischen Operation eine neue Zahl berechnet.
Der Computer muss aber Zahlen irgendwie abspeichern. Deshalb kennen die meisten Programmiersprachen mindestens zwei Arten von Zahlen. Diese unterscheiden sich darin, wie viel Speicherplatz sie belegen und wie die Daten codiert werden.
Python hat zwei Datentypen für unsere gängigen Zahlen:
int- für Ganze Zahlen
vom Englischen integer float- für Dezimalbrüche
vom Englischen floating point
int
Im Kapitel «Daten und Information» haben wir die binäre Darstellung von Zahlen kennengelernt. So kann Python ganze Zahlen abspeichern – einzig das Vorzeichen muss noch irgendwie codiert werden.
a = 18
b = -1Im Gegensatz zu vielen anderen Programmiersprachen, gibt es keine feste Grössenbeschränkung für Ganze Zahlen in Python. Die Box wächst also bei Bedarf! Natürlich stellt der Speicher des Gerätes eine Obergrenze dar.
float
Dezimalbrüche werden vom Computer normalerweise in zwei Teilen abgespeichert, ähnlich wie bei der Exponentialschreibweise, wie man sie bei sehr kleinen und sehr grossen Konstanten – z.B. der Elementarladung oder der Plankschen Temperatur – verwendet:
Der Computer speichert sich z.B. für die Elementarladung
- eine gewisse Anzahl Ziffern, also
- die zugehörige Zehnerpotenz, also
Zusammengesetzt ergeben diese beiden Zahlen:
Somit können sehr grosse und auch sehr kleine Zahlen dargestellt werden – allerdings nur bis zu einer gewissen Genauigkeit:
e = 1.602176634e-19
Tp = 1.4165784e32Natürlich kann man Dezimalbrüche auch ganz normal notieren, z.B.
x = 1.25
y = -0.098Warnung: Rundungsfehler
Da floats nicht beliebig exakt gespeichert werden können, entstehen Rundungsfehler. Bereits das folgende Beispiel liefert nicht das erwartete Ergebnis:
print(0.1 + 0.1 + 0.1)Dies, weil der Computer die Ziffern als binäre Zahlen abspeichert.
Im Dezimalsystem haben wir ähnliche Probleme, wenn wir z.B. 1/3 als Dezimalbruch – also 0.3333… – darstellen wollen. Da reichen endlich viele Stellen nicht!
Arithmetische Operatoren
Diese werden verwendet, um mit Zahlen zu rechnen. Der ausgewertete Ausdruck ergibt wieder eine Zahl. Die Operatoren entsprechen mehr oder weniger den von der Mathematik bekannten Grundrechenarten:
| Operand | Operation | Bemerkung |
|---|---|---|
+ | Addition | Zusammenzählen |
- | Subtraktion | Minusrechnen |
* | Multiplikation | Malrechnen |
/ | Division | Durchrechnen, Ergebnis ist ein float |
// | ganzzahlige Division | Ergebnis ist ein int |
% | Modulo | Rest der ganzzahligen Division als int |
** | Potenzieren | Hochrechnen |
mehr: Ganzzahlige Division und Modulo:
also
Eingabe von Zahlen
Da mit input beliebige Eingaben vom User übernommen werden, müssen wir diese jeweils ins gewünschte Format bringen:
r = float(input("gib den Radius des Kreises ein: "))
x = int(input("gib eine Zahl zwischen 1 und 100 ein: "))
print(r,x)- Zeile 1
inputliefert Text. Wir verwendenfloat, um eine Kommazahl zu erhalten- Zeile 2
inputliefert Text. Wir verwendenfloat, um eine Kommazahl zu erhalten
Aufgabe
Was geschieht wenn wir keine korrekte Zahl eingeben?
- Kopiere das obenstehende Beispiel in Thonny
- Starte das Programm mit den folgenden Eingaben
- Radius
- 1, 2.3, «Hallo»
- Zahl
- 1, 2.3, «Hallo»
Wo klappt es und wo nicht?
Lösung
- Radius
- 1 -> 1.0
- 2.3 -> 2.3
- Hallo -> Error
- Zahl
- 1 -> 1
- 2.3 -> Error
- Hallo -> Error
Ausdrücke
Ein Ausdruck ist etwas, das Python auswerten, resp. berechnen kann. Wir können mit Variablen, Werten und Operatoren Ausdrücke programmieren:
z.B. könnten wir einen Ausdruck schreiben, der die Fläche eines Dreiecks berechnet:
s = float(input("gib die Seitenlänge ein: "))
h = float(input("gib die Höhe ein: "))
A_dreieck = s * h / 2
print("Die Fläche des Dreiecks beträgt:", A_dreieck)Die Formel steckt in der dritten Zeile.
Bei der Auswertung gilt die «Punkt-vor-Strich»-Regel. Im Zweifelsfall können Klammern gesetzt werden:
ergebnis1 = 12 + 2 / 7
ergebnis2 = (12 + 2) / 7
ergebnis3 = 12 + (2 / 7)
print(ergebnis1, ergebnis2, ergebnis3)Aufgabe: Klammern
Überlege dir, wie die Klammern im obenstehenden Beispiel die 3 «Ergebnis»-Werte beeinflussen. Überprüfe dann deine Vermutungen, indem du das Programm ausführst.
Aufgabe: Geometrie
Nimm das Programm zur Berechnung der Dreiecksfläche als Vorlage und schreibe ähnliche Programme zur Berechnung weiterer geometrischer Werte:
kreis.py- Umfang und Fläche eines Kreises abhängig von dessen Radius
pythagoras.py- Länge der Hypothenuse bei einem rechteckigen Dreieck mit Pythagoras bei gegebenen Kathetenlängen
kugel.py- Umfang, Volumen und Fläche einer Kugel abhängig von dessen Radius
Lösung: Geometrie
from math import pi
r = float(input("gib den Radius des Kreises ein: "))
A_kreis = r ** 2 * pi
U_kreis = 2 * r * pi
print("Die Fläche des Kreises beträgt:", A_kreis)
print("Der Umfang des Kreises beträgt:", U_kreis)from math import sqrt
a = float(input("gib die Länge der ersten Kathete ein: "))
b = float(input("gib die Länge der zweiten Kathete ein: "))
c = sqrt(a**2 + b**2) # Variante 1: mit Quadratwurzel
c = (a**2 + b**2)**0.5 # Variante 2: mit «Hoch 1/2»
print("Die Hypothenuse hat eine Länge von:", c)from math import pi
r = float(input("gib den Radius der Kugel ein: "))
V_kugel = (4/3) * pi * r**3
print("Das Volumen der Kugel beträgt:", V_kugel)
A_kugel = 4*pi * r**2
print("Die Oberfläche der Kugel beträgt:", A_kugel)Zusatzaufgabe: Quadratische Gleichung
Schaffst du es, die Lösungsformel für Quadratische Gleichungen zu programmieren?
Du kennst also die drei Koeffizienten a, b und c der Gleichung
und möchtest damit Lösungswerte für x berechnen.
Lösung: Quadratische Gleichung
from math import sqrt
print("Dieses Programm löst eine Quadratische")
print("Gleichung der Form ax^2 + bx + c = 0")
a = float(input("Gib den Wert für den Koeffizienten a ein: "))
b = float(input("Gib den Wert für den Koeffizienten b ein: "))
c = float(input("Gib den Wert für den Koeffizienten c ein: "))
x1 = (-b + sqrt(b**2 - 4*a*c))/(2*a)
x2 = (-b - sqrt(b**2 - 4*a*c))/(2*a)
print("Die Lösungen lauten:")
print("x1 =", x1)
print("x2 =", x2)Vergleichsoperatoren
Mit zwei Zahlen kann man nicht nur rechnen, man kann sie auch vergleichen. Eigentlich ist das ja auch eine Berechnung – das Ergebnis ist nur keine Zahl, sondern ein Wahrheitswert:
| Operand | Operation | Bemerkung |
|---|---|---|
== | gleicher Wert | für Float gefährlich |
!= | nicht gleich | für Float gefährlich |
< | kleiner als | |
> | grösser als | |
<= | kleiner gleich | |
>= | grösser gleich |
print(12 >= 1)
print(12.1 < 12)
print(12.0 == 12)
print(1/3 > 0.333333)
print(3 * 0.1 == 0.3)Zusatzaufgabe: Logik
Schau dir das folgende Programm an:
a = int(input("gib eine Zahl ein: "))
b = int(input("gib eine weitere Zahl ein: "))
print("<", a < b)
print(">", a > b)
print("<=", a <= b)
print(">=", a >= b)
print("")
print("==", a == b)
print("!=", a != b)Wie könnten die Ergebnisse der Vergleiche mit == und != mit den vier obenstehenden Ergebnissen <, >, <= und >= für jede mögliche Kombination von a und b vorhergesagt werden?
Aufgabe: Zahlen raten
Wir programmieren ein Zahlenraten:
- der Computer wählt zufällig eine Zahl zwischen 1 und 100
- der User versucht die Zahl zu erraten
- der Computers sagt, ob die gesuchte Zahl grösser oder kleiner als der abgegeben Tipp ist.
Programmiere dieses Spiel, indem du die untenstehende Vorlage ab Zeile 8 erweiterst.
from random import randint
x = randint(1,100)
while True:
tipp = int(input("rate"))
print("gewonnen: ", x==tipp)
# computer gibt tipps, ob grösser oder kleiner- Zeile 1
- die Funktion
randintwird aus dem Modulrandomimportiert - Zeile 3
- es wird eine Zufallswert (ganze Zahl zwischen 1 und 100) erzeugt und der Variablen
xzugewiesen. - Zeile 5
- wir wiederholen die Tippabgabe und die Rückmeldung des Computers
Lösung: Zahlen raten
from random import randint
x = randint(1,100)
while True:
tipp = int(input("rate"))
print("gewonnen: ", x==tipp)
print("gesuchte Zahl ist grösser: ", x>tipp)
print("gesuchte Zahl ist kleiner: ", x<tipp)Aufgabe: Zahlen Faktorisieren
Programmiere ein Spiel, wo der User vom Computer generierte Zahlen in ihre Faktoren zerlegen muss:
- Der Computer wählt zufällig eine Ganze Zahl (z.B. zwischen 1 und 100).
- Der Benutzer kann dann einen Teiler der Zahl eintippen.
- Die Zahl wird durch die Eingabe dividiert und dieses Vorgehen wird wiederholt.
- Der Benutzer hat gewonnen, wenn 1 übrigbleibt
Verwende als Vorlage das vorherige Rate-Spiel: Dort hast du bereits die Zufallszahl und die Wiederholung eingebaut.
Lösung: Faktorisieren
from random import randint
x = randint(1,100)
print("Wir faktorisieren die Zahl ", x)
while True:
faktor = int(input("Gib einen Faktor ein: "))
x = x / faktor
print("Es bleibt übrig: ", x)
print("Du bist fertig: ", x==1)
print("Du hast einen Fehler: ", int(x)!=x)