Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
gf_informatik:zahlensysteme:binary_collection [2024-05-20 07:34] – [Schleifen] hofgf_informatik:zahlensysteme:binary_collection [2025-05-13 07:38] (aktuell) hof
Zeile 1: Zeile 1:
-## Binärzahlen mit Python+## Binärzahlen in Python: Bausteine 
 +<html><script type="module" src="https://bottom.ch/ksr/ed/bottom-editor.js"></script></html>
  
 Das Dossier enthält mehrere Programmieraufgaben, um Binärzahlen mit Python-Code zu manipulieren. Hier findest du Übungen, Hinweise und Ideen, wie die Umsetzung der Algorithmen in Python gelingen könnte. Das Dossier enthält mehrere Programmieraufgaben, um Binärzahlen mit Python-Code zu manipulieren. Hier findest du Übungen, Hinweise und Ideen, wie die Umsetzung der Algorithmen in Python gelingen könnte.
 +
 ### Schleifen ### Schleifen
  
-*Direkte* Schleife über alle Buchstaben eines Strings (einer Zeichenfolge). 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:+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.
  
-<code python> +*Direkte* Schleife über alle Buchstaben eines Strings (einer Zeichenfolge): 
-b = '100110'+<html><bottom-editor style="min-height: 6lh">b = '100110'
 for digit in b: for digit in b:
-    print(digit) +    print(digit)</bottom-editor></html> 
-</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, müssen wir einen Listenzugriff programmieren, z.B. `liste[index]`. Mit dem Index kann auch gerechnet werden, um zum Beispiel jedes zweite Element oder die Elemente in umgekehrter Richtung zu erhalten.
  
 *Indirekte* Schleife über die Buchstaben in zwei gleichlangen Strings: *Indirekte* Schleife über die Buchstaben in zwei gleichlangen Strings:
  
-<code python> +<html><bottom-editor>b1 = '10011010'
-b1 = '10011010'+
 b2 = '11110000' b2 = '11110000'
 for index in range(len(b1)): for index in range(len(b1)):
Zeile 23: Zeile 25:
     digit2 = b2[index]     digit2 = b2[index]
     print(digit1, digit2)     print(digit1, digit2)
-</code>+</bottom-editor></html>
  
 Oder mit `while`: Oder mit `while`:
  
-<code python> +<html><bottom-editor>b1 = '10011010'
-b1 = '10011010'+
 b2 = '11110000' b2 = '11110000'
 index = 0 index = 0
Zeile 36: Zeile 37:
     print(digit1, digit2)     print(digit1, digit2)
     index = index + 1     index = index + 1
-</code>+</bottom-editor></html>
  
-Elegante Alternative mit [[https://docs.python.org/2.7/library/functions.html#zip|zip]] (nicht Prüfungsstoff): _Zip_ ist das englische Wort für Reissverschluss, wir nehmen also abwechslungsweise von jedem Argument ein Element... 🤐+Elegante Alternative mit [[https://docs.python.org/3/library/functions.html#zip|zip]] (nicht Prüfungsstoff): _Zip_ ist das englische Wort für Reissverschluss, wir nehmen also abwechslungsweise von jedem Argument ein Element... 🤐
  
  
-<code python> +<html><bottom-editor>b1 = '10011010'
-b1 = '10011010'+
 b2 = '11110000' b2 = '11110000'
 for digit1, digit2 in zip(b1, b2): for digit1, digit2 in zip(b1, b2):
     print(digit1, digit2)     print(digit1, digit2)
-</code+</bottom-editor></html
- +
  
 #### Rückwärts #### Rückwärts
Zeile 53: Zeile 53:
 Erste Möglichkeit: Indirekte Schleife mit Umrechnung des Index: Erste Möglichkeit: Indirekte Schleife mit Umrechnung des Index:
  
-<code python> +<html><bottom-editor>b = '111000'
-b = '111000'+
 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></html>
  
 Etwas kompakter: `range` mit einem Step-Argument: Etwas kompakter: `range` mit einem Step-Argument:
  
-<code python> +<html><bottom-editor>b = '111000'
-b = '111000'+
 # range(start, stop, step): Start with len - 1, stop at 0 (so before -1), increment is -1 # range(start, stop, step): Start with len - 1, stop at 0 (so before -1), increment is -1
 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></html>
  
 Oder mit `while`: Oder mit `while`:
  
  
-<code python> +<html><bottom-editor>b = '111000'
-b = '111000'+
 index = len(b) - 1  # Letzter gültiger Index index = len(b) - 1  # Letzter gültiger Index
 while index >= 0: while index >= 0:
Zeile 81: Zeile 78:
     print(digit)     print(digit)
     index = index - 1     index = index - 1
-</code>+</bottom-editor></html>
  
 +Noch kompakter: Die Funktion [[https://docs.python.org/3/library/functions.html#reversed|reversed]] (kein Prüfungsstoff) kehrt jede Sequenz (Liste, String) um:
  
-Noch kompakter: Die Funktion [[https://docs.python.org/2.7/library/functions.html#reversed|reversed]] (kein Prüfungsstoff) kehrt jede Sequenz (Liste, String) um: +<html><bottom-editor>b = '111000'
- +
-<code python> +
-b = '111000'+
 for d in reversed(b): for d in reversed(b):
     print(d)     print(d)
-</code>+</bottom-editor></html>
  
 Noch kompakter (aber auch leserlich?), die Verwendung von [[https://stackoverflow.com/questions/509211/how-slicing-in-python-works/509295#509295|String Slicing]] (kein Prüfungsstoff): Noch kompakter (aber auch leserlich?), die Verwendung von [[https://stackoverflow.com/questions/509211/how-slicing-in-python-works/509295#509295|String Slicing]] (kein Prüfungsstoff):
  
-<code python> +<html><bottom-editor>b = '111000'
-b = '111000'+
 for d in b[::-1]: for d in b[::-1]:
     print(d)     print(d)
-</code>+</bottom-editor></html>
  
  
Zeile 106: Zeile 100:
 Am einfachsten mit `while`: Am einfachsten mit `while`:
  
-<code python> +<html><bottom-editor>b1 = '111000'
-b1 = '111000'+
 b2 = '101010' b2 = '101010'
 index = len(b1) - 1 index = len(b1) - 1
Zeile 116: Zeile 109:
     print(digit1, digit2)     print(digit1, digit2)
     index = index - 1     index = index - 1
-</code>+</bottom-editor></html>
  
 Eleganter mit `reversed` und `zip` (kein Prüfungsstoff): Eleganter mit `reversed` und `zip` (kein Prüfungsstoff):
  
-<code python> +<html><bottom-editor>b1 = '111000'
-b1 = '111000'+
 b2 = '101010' b2 = '101010'
  
 for d1, d2 in zip(reversed(b1), reversed(b2)): for d1, d2 in zip(reversed(b1), reversed(b2)):
     print(d1, d2)     print(d1, d2)
-</code>+</bottom-editor></html> 
 ++++ ++++
  
Zeile 134: Zeile 127:
 Zwei Zahlen `a` und `b` - was gibt $\lfloor a/b\rfloor$ (Ganzzahldivision), und wieviel ist der Rest der Division? Zwei Zahlen `a` und `b` - was gibt $\lfloor a/b\rfloor$ (Ganzzahldivision), und wieviel ist der Rest der Division?
  
-<code python> +<html><bottom-editor>a = 42
-a = 42+
 b = 2 b = 2
 quotient = a // b quotient = a // b
 rest = a % b rest = a % b
-</code>+print(quotient, rest) 
 +</bottom-editor></html>
  
 ### Strings und Integers ### Strings und Integers
Zeile 145: 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 (`''`). Strings sind *immutable*, können also nicht verändert werden. Alle anderen Types müssen sich als String darstellen lassen, indem die Funktion `str()` aufgerufen wird. Strings unterstützen den `+` Operator, um zwei Strings zu verketten. Dies kann verwirrend sein, wenn die Absicht ist, Zahlen zu addieren und stattdessen Strings verkettet werden: Ein `string` ist eine Folge von Buchstaben. Die Folge kann auch leer sein (`''`). Strings sind *immutable*, können also nicht verändert werden. Alle anderen Types müssen sich als String darstellen lassen, indem die Funktion `str()` aufgerufen wird. Strings unterstützen den `+` Operator, um zwei Strings zu verketten. Dies kann verwirrend sein, wenn die Absicht ist, Zahlen zu addieren und stattdessen Strings verkettet werden:
  
-<code python> +<html><bottom-editor>digit1 = '1'
-digit1 = '1'+
 digit2 = '1' digit2 = '1'
  
Zeile 157: Zeile 150:
  
 print(int(digit1) + int(digit2))  # Abhilfe: Strings in Zahlen konvertieren print(int(digit1) + int(digit2))  # Abhilfe: Strings in Zahlen konvertieren
-</code>+</bottom-editor></html>
  
 #### Zahlen #### Zahlen
Zeile 165: 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><bottom-editor>zahl = int('42'       # OK
-zahl = int('42'       # OK+
 zahl = int('3.14'     # FEHLER! zahl = int('3.14'     # FEHLER!
 zahl = float('3.14'   # OK zahl = float('3.14'   # OK
 zahl = float('foobar' # FEHLER! zahl = float('foobar' # FEHLER!
-</code>+</bottom-editor></html>
  
 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 176: Zeile 168:
 Strings sind *immutable*, anders als bei Listen können wir nicht einfach einen Buchstaben ersetzen in einem String. Aber wir können mit dem `+` Operator zwei Strings verketten, um einen neuen String zu erhalten: Strings sind *immutable*, anders als bei Listen können wir nicht einfach einen Buchstaben ersetzen in einem String. Aber wir können mit dem `+` Operator zwei Strings verketten, um einen neuen String zu erhalten:
  
-<code python> +<html><bottom-editor>s1 = 'foo'
-s1 = 'foo'+
 s2 = 'bar' s2 = 'bar'
 print(s1 + s2)  # prints 'foobar' print(s1 + s2)  # prints 'foobar'
-</code>+</bottom-editor></html>
  
 Dasselbe ist auch praktisch, um Buchstaben in einer Schleife aneinanderzureihen: Dasselbe ist auch praktisch, um Buchstaben in einer Schleife aneinanderzureihen:
  
-<code python> +<html><bottom-editor>def flip_bits(b):
-def flip_bits(b):+
     result = ''                    # start with empty string     result = ''                    # start with empty string
     for digit in b:     for digit in b:
-        if digit = '1':            # if digit is a one...+        if digit == '1':            # if digit is a one...
             result = result + '0'  # ...append a zero             result = result + '0'  # ...append a zero
-        elif digit = '0':+        elif digit == '0':
             result = result + '1'  # otherwise append a one             result = result + '1'  # otherwise append a one
     return result     return result
-</code>+</bottom-editor></html>
  
 **Achtung**: Der `+` Operator für Strings funktioniert nur, wenn beide Operanden Strings sind - falls eine Seite eine Zahl ist, führt das zum Programmabbruch: **Achtung**: Der `+` Operator für Strings funktioniert nur, wenn beide Operanden Strings sind - falls eine Seite eine Zahl ist, führt das zum Programmabbruch:
  
-<code python> +<html><bottom-editor>a = 101       # eine Zahl
-a = 101       # eine Zahl+
 b = '010'     # ein String b = '010'     # ein String
 c = a + b     # Fehler! c = a + b     # Fehler!
Zeile 207: Zeile 196:
 # String umwandeln in Zahl # String umwandeln in Zahl
 c = a + int(b)   # OK: + bedeutet Ganzzahl-Addition, c ist die Ganzzahl (int) 111 c = a + int(b)   # OK: + bedeutet Ganzzahl-Addition, c ist die Ganzzahl (int) 111
-</code>+</bottom-editor></html>
  
 **String mit Nullen auffüllen** **String mit Nullen auffüllen**
Zeile 215: Zeile 204:
 Variante 1: Mit `while`: Variante 1: Mit `while`:
  
-<code python> +<html><bottom-editor>b = '1010'
-b = '1010'+
 n = 8 n = 8
 while len(b) < n: while len(b) < n:
     b = '0' + b     b = '0' + b
-</code>+print(b) 
 +</bottom-editor></html>
  
 Variante 2 (nicht Lernstoff): Strings multiplizieren Variante 2 (nicht Lernstoff): Strings multiplizieren
Zeile 226: 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><bottom-editor>b = '1010'
-b = '1010'+
 n = 8 n = 8
 count = n - len(b)    # count = 8 - 4 = 4 count = n - len(b)    # count = 8 - 4 = 4
 zeros = '0' * count   # zeros = '0000' zeros = '0' * count   # zeros = '0000'
 b = zeros + b b = zeros + b
-</code>+print(b) 
 +</bottom-editor></html>
  
  
 Variante 3 (nicht Lernstoff): Eleganter mit [[https://docs.python.org/2.7/library/stdtypes.html?highlight=zfill#str.zfill|zfill]]: Variante 3 (nicht Lernstoff): Eleganter mit [[https://docs.python.org/2.7/library/stdtypes.html?highlight=zfill#str.zfill|zfill]]:
-<code python> + 
-b = '1010'+<html><bottom-editor>b = '1010'
 n = 8 n = 8
-b = b.zfill(n) +print(b.zfill(n)
-</code>+</bottom-editor></html>
  
 ### Funktionen ### Funktionen
  • gf_informatik/zahlensysteme/binary_collection.1716190480.txt.gz
  • Zuletzt geändert: 2024-05-20 07:34
  • von hof