Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
gf_informatik:zahlensysteme:binary_collection [2023-05-12 08:01] – [Parallel über zwei Strings] hof | gf_informatik:zahlensysteme:binary_collection [2025-05-13 07:38] (aktuell) – hof | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ## Binärzahlen | + | ## Binärzahlen |
+ | < | ||
Das Dossier enthält mehrere Programmieraufgaben, | Das Dossier enthält mehrere Programmieraufgaben, | ||
+ | |||
### Schleifen | ### Schleifen | ||
+ | |||
+ | Bei der *direkten* Schleife ist der Ausdruck hinter `in` die Sequenz der uns interessierenden Elemente (z.B. ein String mit den Binär-Nennwerten `0` oder `1`). Die Schleifenvariable (der Name zwischen `for` und `in`) wird in jedem Schleifendurchgang auf das nächste Element gesetzt. | ||
*Direkte* Schleife über alle Buchstaben eines Strings (einer Zeichenfolge): | *Direkte* Schleife über alle Buchstaben eines Strings (einer Zeichenfolge): | ||
- | <code python> | + | <html>< |
- | b = ' | + | |
for digit in b: | for digit in b: | ||
- | print(digit) | + | print(digit)</ |
- | </code> | + | |
#### Parallel über zwei Strings | #### Parallel über zwei Strings | ||
+ | |||
+ | Bei der _indirekten_ Schleife steht der Ausdruck hinter `in` für die Liste der Indices, ist also eine Liste von Ganzzahlen (`int`). Die Schleifenvariable heisst meistens `index` oder kurz `i`. Um auf das uns interessierende Element zuzugreifen, | ||
*Indirekte* Schleife über die Buchstaben in zwei gleichlangen Strings: | *Indirekte* Schleife über die Buchstaben in zwei gleichlangen Strings: | ||
- | <code python> | + | <html>< |
- | b1 = ' | + | |
b2 = ' | b2 = ' | ||
for index in range(len(b1)): | for index in range(len(b1)): | ||
Zeile 21: | Zeile 25: | ||
digit2 = b2[index] | digit2 = b2[index] | ||
print(digit1, | print(digit1, | ||
- | </code> | + | </bottom-editor></ |
Oder mit `while`: | Oder mit `while`: | ||
- | <code python> | + | <html>< |
- | b1 = ' | + | |
b2 = ' | b2 = ' | ||
index = 0 | index = 0 | ||
Zeile 34: | Zeile 37: | ||
print(digit1, | print(digit1, | ||
index = index + 1 | index = index + 1 | ||
- | </code> | + | </bottom-editor></ |
- | Elegante Alternative mit [[https:// | + | Elegante Alternative mit [[https:// |
- | <code python> | + | |
- | b1 = ' | + | <html>< |
b2 = ' | b2 = ' | ||
for digit1, digit2 in zip(b1, b2): | for digit1, digit2 in zip(b1, b2): | ||
print(digit1, | print(digit1, | ||
- | </code> | + | </bottom-editor></ |
Zeile 50: | Zeile 53: | ||
Erste Möglichkeit: | Erste Möglichkeit: | ||
- | <code python> | + | <html>< |
- | b = ' | + | |
for index in range(len(b)): | for index in range(len(b)): | ||
reversed_index = len(b) - 1 - index | reversed_index = len(b) - 1 - index | ||
digit = b[reversed_index] | digit = b[reversed_index] | ||
print(digit) | print(digit) | ||
- | </code> | + | </bottom-editor></ |
Etwas kompakter: `range` mit einem Step-Argument: | Etwas kompakter: `range` mit einem Step-Argument: | ||
- | <code python> | + | <html>< |
- | b = ' | + | |
# range(start, | # range(start, | ||
for index in range(len(b) - 1, -1, -1): | for index in range(len(b) - 1, -1, -1): | ||
digit = b[index] | digit = b[index] | ||
print(digit) | print(digit) | ||
- | </code> | + | </bottom-editor></ |
- | Noch kompakter: Die Funktion [[https:// | + | Oder mit `while`: |
+ | |||
+ | |||
+ | < | ||
+ | index = len(b) - 1 # Letzter gültiger Index | ||
+ | while index >= 0: | ||
+ | digit = b[index] | ||
+ | print(digit) | ||
+ | index = index - 1 | ||
+ | </ | ||
+ | |||
+ | Noch kompakter: Die Funktion [[https:// | ||
- | <code python> | + | <html>< |
- | b = ' | + | |
for d in reversed(b): | for d in reversed(b): | ||
print(d) | print(d) | ||
- | </code> | + | </bottom-editor></ |
- | Noch kompakter (aber auch leserlich? | + | Noch kompakter (aber auch leserlich? |
- | <code python> | + | <html>< |
- | b = ' | + | |
for d in b[::-1]: | for d in b[::-1]: | ||
print(d) | print(d) | ||
- | </code> | + | </bottom-editor></ |
#### Rückwärts über zwei Strings? | #### Rückwärts über zwei Strings? | ||
++++Lösung| | ++++Lösung| | ||
- | <code python> | + | Am einfachsten mit `while`: |
- | b1 = ' | + | |
+ | <html>< | ||
+ | b2 = ' | ||
+ | index = len(b1) - 1 | ||
+ | |||
+ | while index >= 0: | ||
+ | digit1 = b1[index] | ||
+ | digit2 = b2[index] | ||
+ | print(digit1, | ||
+ | index = index - 1 | ||
+ | </ | ||
+ | |||
+ | Eleganter mit `reversed` und `zip` (kein Prüfungsstoff): | ||
+ | |||
+ | < | ||
b2 = ' | b2 = ' | ||
for d1, d2 in zip(reversed(b1), | for d1, d2 in zip(reversed(b1), | ||
print(d1, d2) | print(d1, d2) | ||
- | </code> | + | </bottom-editor></ |
++++ | ++++ | ||
Zeile 101: | Zeile 127: | ||
Zwei Zahlen `a` und `b` - was gibt ⌊a/b⌋ (Ganzzahldivision), | Zwei Zahlen `a` und `b` - was gibt ⌊a/b⌋ (Ganzzahldivision), | ||
- | <code python> | + | <html>< |
- | a = 42 | + | |
b = 2 | b = 2 | ||
quotient = a // b | quotient = a // b | ||
rest = a % b | rest = a % b | ||
- | </code> | + | print(quotient, |
+ | </bottom-editor></ | ||
### Strings und Integers | ### Strings und Integers | ||
Zeile 112: | Zeile 138: | ||
Jeder Ausdruck in Python hat einen Type. Der Type bestimmt, welche Operationen damit ausgeführt werden können: Mit Zahlen können wir rechnen, mit Zeichenketten nicht. Alle Types können auch als Zeichenkette | Jeder Ausdruck in Python hat einen Type. Der Type bestimmt, welche Operationen damit ausgeführt werden können: Mit Zahlen können wir rechnen, mit Zeichenketten nicht. Alle Types können auch als Zeichenkette | ||
(String) dargestellt werden, und aus einem String wieder zurückverwandelt werden. | (String) dargestellt werden, und aus einem String wieder zurückverwandelt werden. | ||
+ | |||
#### Zeichenketten (Strings) | #### Zeichenketten (Strings) | ||
Ein `string` ist eine Folge von Buchstaben. Die Folge kann auch leer sein (`'' | Ein `string` ist eine Folge von Buchstaben. Die Folge kann auch leer sein (`'' | ||
- | <code python> | + | <html>< |
- | digit1 = ' | + | |
digit2 = ' | digit2 = ' | ||
summe = digit1 + digit2 | summe = digit1 + digit2 | ||
- | print(summe) | + | print(summe) |
- | print(int(digit1) + int(digit2)) | + | print(int(digit1) + int(digit2)) |
- | </code> | + | </bottom-editor></ |
#### Zahlen | #### Zahlen | ||
Zeile 132: | Zeile 158: | ||
Strings können in Zahlen umgewandelt werden, wenn der Inhalt des Strings einer Zahl entspricht: | Strings können in Zahlen umgewandelt werden, wenn der Inhalt des Strings einer Zahl entspricht: | ||
- | <code python> | + | <html>< |
- | zahl = int(' | + | |
zahl = int(' | zahl = int(' | ||
zahl = float(' | zahl = float(' | ||
zahl = float(' | zahl = float(' | ||
- | </code> | + | </bottom-editor></ |
Addieren, subtrahieren oder multiplizieren wir zwei Ganzzahlen, resultiert wiederum eine Ganzzahl. Bei der Division hingegen entsteht als Resultat ein `float`. | Addieren, subtrahieren oder multiplizieren wir zwei Ganzzahlen, resultiert wiederum eine Ganzzahl. Bei der Division hingegen entsteht als Resultat ein `float`. | ||
Zeile 143: | Zeile 168: | ||
Strings sind *immutable*, | Strings sind *immutable*, | ||
- | <code python> | + | <html>< |
- | s1 = ' | + | |
s2 = ' | s2 = ' | ||
print(s1 + s2) # prints ' | print(s1 + s2) # prints ' | ||
- | </code> | + | </bottom-editor></ |
Dasselbe ist auch praktisch, um Buchstaben in einer Schleife aneinanderzureihen: | Dasselbe ist auch praktisch, um Buchstaben in einer Schleife aneinanderzureihen: | ||
- | <code python> | + | <html>< |
- | def flip_bits(b): | + | |
result = '' | result = '' | ||
for digit in b: | for digit in b: | ||
- | if digit = ' | + | if digit == ' |
result = result + ' | result = result + ' | ||
- | elif digit = ' | + | elif digit == ' |
result = result + ' | result = result + ' | ||
return result | return result | ||
- | </code> | + | </bottom-editor></ |
**Achtung**: | **Achtung**: | ||
- | <code python> | + | <html>< |
- | a = 101 # eine Zahl | + | |
b = ' | b = ' | ||
- | c = a + b # Fehler! | + | c = a + b |
# Zahl umwandeln in String | # Zahl umwandeln in String | ||
Zeile 174: | Zeile 196: | ||
# String umwandeln in Zahl | # String umwandeln in Zahl | ||
c = a + int(b) | c = a + int(b) | ||
- | </code> | + | </bottom-editor></ |
**String mit Nullen auffüllen** | **String mit Nullen auffüllen** | ||
Zeile 182: | Zeile 204: | ||
Variante 1: Mit `while`: | Variante 1: Mit `while`: | ||
- | <code python> | + | <html>< |
- | b = ' | + | |
n = 8 | n = 8 | ||
while len(b) < n: | while len(b) < n: | ||
b = ' | b = ' | ||
- | </code> | + | print(b) |
+ | </bottom-editor></ | ||
Variante 2 (nicht Lernstoff): Strings multiplizieren | Variante 2 (nicht Lernstoff): Strings multiplizieren | ||
Zeile 193: | Zeile 215: | ||
Strings können übrigens auch mit dem `*` Operator verknüpft werden - zum Beispiel um die Anzahl fehlender Nullen zu erstellen: | Strings können übrigens auch mit dem `*` Operator verknüpft werden - zum Beispiel um die Anzahl fehlender Nullen zu erstellen: | ||
- | <code python> | + | <html>< |
- | b = ' | + | |
n = 8 | n = 8 | ||
count = n - len(b) | count = n - len(b) | ||
zeros = ' | zeros = ' | ||
b = zeros + b | b = zeros + b | ||
- | </code> | + | print(b) |
+ | </bottom-editor></ | ||
Variante 3 (nicht Lernstoff): Eleganter mit [[https:// | Variante 3 (nicht Lernstoff): Eleganter mit [[https:// | ||
- | <code python> | + | |
- | b = ' | + | <html>< |
n = 8 | n = 8 | ||
- | b = b.zfill(n) | + | print(b.zfill(n)) |
- | </code> | + | </bottom-editor></ |
### Funktionen | ### Funktionen |