Zeichenketten (Strings) · 2020-03-05 · 10 % 3 = 1, denn 9 = 3·3 10 % 4 = 2, denn 8 = 4·2 11 //...
Transcript of Zeichenketten (Strings) · 2020-03-05 · 10 % 3 = 1, denn 9 = 3·3 10 % 4 = 2, denn 8 = 4·2 11 //...
Dennis Komm
Programmieren und ProblemlösenWahrheitswerte und Kontrollstrukturen
Frühling 2020 – 5. März 2020
Zeichenketten (Strings)Wiederholung
Zeichenketten (Strings)
Zeichenketten sind „Listen von Zeichen“ (es gibt Unterschiede)
Zeichen entsprechen (grösstenteils) Tasten auf der Tastatur
Strings stehen in Anführungszeichen
Zugriff auf einzelne Zeichen mit eckigen Klammern
Zeichenkette wort = "HALLO WELT"
wort[0] ist erster Buchstabe
wort[1] ist zweiter Buchstabe
. . .
wort[len(wort)-1] ist letzter Buchstabe
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 1 / 45
Zeichen – Die Unicode-Tabelle
0–18 19–37 38–56 57–75 76–94 95–113 114–127
Dez. Zeichen Dez. Zeichen Dez. Zeichen Dez. Zeichen Dez. Zeichen Dez. Zeichen Dez. Zeichen
0 NUL 19 DC3 38 & 57 9 76 L 95 _ 114 r1 SOH 20 DC4 39 ’ 58 : 77 M 96 ‘ 115 s2 STX 21 NAK 40 ( 59 ; 78 N 97 a 116 t3 ETX 22 SYN 41 ) 60 < 79 O 98 b 117 u4 EOT 23 ETB 42 * 61 = 80 P 99 c 118 v5 ENQ 24 CAN 43 + 62 > 81 Q 100 d 119 w6 ACK 25 EM 44 , 63 ? 82 R 101 e 120 x7 BEL 26 SUB 45 - 64 @ 83 S 102 f 121 y8 BS 27 ESC 46 . 65 A 84 T 103 g 122 z9 HT 28 FS 47 / 66 B 85 U 104 h 123 {10 LF 29 GS 48 0 67 C 86 V 105 i 124 |11 VT 30 RS 49 1 68 D 87 W 106 j 125 }12 FF 31 US 50 2 69 E 88 X 107 k 126 ~13 CR 32 SP 51 3 70 F 89 Y 108 l 127 DEL14 SO 33 ! 52 4 71 G 90 Z 109 m . . .15 SI 34 “ 53 5 72 H 91 [ 110 n16 DLE 35 # 54 6 73 I 92 \ 111 o17 DC1 36 $ 55 7 74 J 93 ] 112 p18 DC2 37 % 56 8 75 K 94 ˆ 113 q
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 2 / 45
Zeichen – Die Unicode-Tabelle
Verwende Funktionen ord() und chr()
ord(x) gibt Position von Zeichen x in Unicode-Tabelle an
chr(y) gibt Zeichen an Position y in Unicode-Tabelle an
x = input("Geben Sie ein Zeichen ein: ")print("Das Zeichen", x, "steht an Stelle", ord(x))
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 3 / 45
Operatoren
AdditionZahlen: Arithmetische OperationListen und Strings: Zusammenfügen (bei Strings existiert kein append)
daten = [1, 4, 6]daten2 = daten + [5]satz = "Guten Tag"satz2 = satz + ", Urs"satz3 = satz2 + "."
MultiplikationZahlen: Arithmetische OperationListen und Strings: Zusammenfügen
daten = [2, 3] * 5satz = "HA" * 3
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 4 / 45
Cäsar-Verschlüsselung
Symmetrische Verschlüsselung
Sender Empfänger
Klartext
Chiffrierung
GeheimtextÜbertragungsmedium(Bote, Internet, . . . )
Geheimtext
Dechiffrierung
Klartext
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 5 / 45
Cäsar-Verschlüsselung
Situation
Parteien A und B wollen über unsicheren Kanal diesmal mittelsCäsar-Verschlüsselung kommunizieren
Gemeinsamer Schlüssel k als Zahl zwischen 1 und 25
A verschlüsselt Nachricht, indem k zu jedem Buchstaben addiert wird
A sendet verschlüsselte Nachricht an B
B entschlüsselt Nachricht, indem k von jedem Buchstaben abgezogenwird
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 6 / 45
Cäsar-Verschlüsselung
Verschiebe Buchstaben um festen Wert k durch Addition von k
Beispiel
A B C D E F G H I J K L MW X Y Z A B C D E F G H IN O P Q R S T U V W X Y ZJ K L M N O P Q R S T U V
Klartext: HALLO WELT
Verschlüsselter Text: DWHHK SAHP
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 7 / 45
Cäsar-Verschlüsselung
1. Eingegebener Buchstabe ist Unicode-Zeichen von A bis ZA B . . . W X Y Z65 66 . . . 87 88 89 90
2. Ziehe 65 ab, dann ist das Resultat zwischen 0 und 25A B . . . W X Y Z0 1 . . . 22 23 24 25
3. Addiere nun Schlüssel (zum Beispiel 3) und rechne modulo 26A B . . . W X Y Z3 4 . . . 25 0 1 2
4. Addiere nun wieder 65 zum ErgebnisA B . . . W X Y Z68 69 . . . 90 65 66 67
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 8 / 45
Division mit Rest (Modulo-Rechnen)
Mit „%“ wird der Rest bei der ganzzahligen Division ausgegeben
Analog wird mit “//” der Teil vor dem Komma ausgegeben
10 % 3 = 1, denn 9 = 3 · 310 % 4 = 2, denn 8 = 4 · 211 // 5 = 2, denn 10 = 5 · 223 // 4 = 5, denn 20 = 4 · 512 % 3 = 0, denn 12 = 4 · 3
Falls x % y == 0, dann wird x von y geteilt
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 9 / 45
Übung – Cäsar-Verschlüsselung
Schreiben Sie ein Programm, das
einen gegebenen String durchläuft
jeden Buchstaben mit einemSchlüssel k entschlüsselt
dabei jeden Schlüssel k ausprobiert
dafür folgende Formel verwendet:
e = (v− 65− k) % 26 + 65
Entschlüsseln Sie DLUUQLTHUKSHBAOLBYLRHYBMANPIALZZJOVNNP
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 10 / 45
Übung – Cäsar-Verschlüsselung
for k in range(0, 26):for item in ciphertext:
print(chr((ord(item) - 65 - k) % 26 + 65), end="")print()
for k in range(0, 26):for i in range(0, len(ciphertext)):
print(chr((ord(ciphertext[i]) - 65 - k) % 26 + 65), end="")print()
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 11 / 45
Änderung der Schrittweite
Schleifen über Listen – grössere Schrittweiten
Liste mit Schrittweite 2 durchlaufen
daten = [5, 1, 4, 3]for i in range(0, len(daten), 2):
print(daten[i])
Ausgabe
Alle Elemente an geraden Positionen von 0 bis maximal len(daten) werdenausgegebenï 5,4
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 12 / 45
Die Syntax von range
for i in range(start, ende, schritt)
Iteration über alle Positionen von start bis ende-1 mit Schrittweite schritt
Abkürzung
for i in range(start,ende) ⇐⇒ for i in range(start,ende,1)
Noch eine Abkürzung
for i in range(ende) ⇐⇒ for i in range(0, ende)
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 13 / 45
Verbesserung der Cäsar-Verschlüsselung
Verwende alternierend zwei Schlüssel für gerade und ungerade Positionen
k = int(input("Erster Schluessel: "))l = int(input("Zweiter Schluessel: "))x = input("Text (nur Grossbuchstaben, gerade Laenge): ")for i in range(0, len(x), 2):
print(chr((ord(text[i])-65 + k) % 26 + 65), end="")print(chr((ord(text[i+1])-65 + l) % 26 + 65), end="")
print()
Dennoch bleibt die Cäsar-Verschlüsselung unsicher ï Projekt 1
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 14 / 45
WahrheitswerteBoolesche Werte und Relationale Operatoren
Boolesche Werte und Variablen
Boolesche Ausdrücke können mögliche Werte F oder T annehmen
F entspricht „falsch“
T entspricht „wahr“
George Boole [Wikimedia]
Boolesche Variablen in Python
repräsentieren „Wahrheitswerte“
Wertebereich {False, True}
Beispiel
b = True # Variable mit Wert TrueProgrammieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 15 / 45
Relationale Operatoren
a < b (kleiner als)a >= b (grösser gleich)
a == b (gleich)a != b (ungleich)
Zahlentyp × Zahlentyp→ {False, True}
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 16 / 45
WahrheitswerteBoolesche Funktionen und Logische Operatoren
Boolesche Funktionen in der Mathematik
Boolesche Funktion
f : {F, T}2 → {F, T}
F entspricht „falsch“
T entspricht „wahr“
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 17 / 45
x ∧ y
„Logisches Und“
f : {F, T}2 → {F, T}
F entspricht „falsch“
T entspricht „wahr“
x y x ∧ y
F F F
F T F
T F F
T T T
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 18 / 45
Logischer Operator and
a and b (logisches Und)
{False, True} × {False, True}→ {False, True}
n = -1p = 3b = (n < 0) and (0 < p) # b = True
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 19 / 45
x ∨ y
„Logisches Oder“
f : {F, T}2 → {F, T}
F entspricht „falsch“
T entspricht „wahr“
x y x ∨ y
F F F
F T T
T F T
T T T
Das logische Oder ist immer einschliessend: x oder y oder beide
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 20 / 45
Logischer Operator or
a or b (logisches Oder)
{False, True} × {False, True}→ {False, True}
n = 1p = 0b = (n < 0) or (0 < p) # b = False
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 21 / 45
¬x
„Logisches Nicht“
f : {F, T} → {F, T}
F entspricht „falsch“
T entspricht „wahr“
x ¬x
F T
T F
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 22 / 45
Logischer Operator not
not b (logisches Nicht)
{False, True}→ {False, True}
n = 1b = not (n < 0) # b = True
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 23 / 45
WahrheitswertePräzedenzen
Präzedenzen
not b and am
(not b) and a
a and b or c and dm
(a and b) or (c and d)
a or b and c or dm
a or (b and c) or d
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 24 / 45
Präzedenzen
7 + x < y and y != 3 * z or not b7 + x < y and y != 3 * z or (not b)
Der unäre logische Operator not
ï bindet stärker als binäre arithmetische Operatoren
ï Diese binden stärker als relationale Operatoren
ï und diese binden stärker als binäre logische Operatoren
Einige Klammern auf den vorher gezeigten Folien waren unnötig, abersinnvoll
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 25 / 45
DeMorgansche Regeln
not (a and b) == (not a or not b)
not (a or b) == (not a and not b)
Beispiele
(nicht schwarz und nicht weiss) == nicht (schwarz oder weiss)
nicht (reich und schön) == (arm oder hässlich)
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 26 / 45
Anwendung – Entweder . . . Oder (XOR)
(x or y) and not (x and y) x oder y, und nicht beide
(x or y) and (not x or not y) x oder y, und eines nicht
not (not x and not y) and not (x and y) nicht keines, und nicht beide
not ((not x and not y) or (x and y)) nicht: keines oder beide
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 27 / 45
Kontrollstrukturen
Kontrollfluss
Bisher. . .
linear (von oben nach unten)
for-Schleife für Wiederholung von Blöcken
x = int(input("Eingabe: "))
for i in range(1, x+1):print(i*i)
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 28 / 45
KontrollstrukturenAuswahlanweisungen
Auswahlanweisungen
Realisieren Verzweigungen
if-Anweisung
if-else-Anweisung
if-elif-else-Anweisung (später)
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 29 / 45
if-Anweisung
if condition:statement
a = int(input("Eingabe: "))if a % 2 == 0:
print("gerade")
Ist condition wahr,dann wird statement ausgeführt
statement:beliebige AnweisungRumpf der if-Anweisung
condition: Boolescher Ausdruck
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 30 / 45
if-else-Anweisung
if condition:statement1
else:statement2
a = int(input("Eingabe: "))if a % 2 == 0:
print("gerade")else:
print("ungerade")
Ist condition wahr,so wird statement1 ausgeführt,andernfalls wird statement2 ausgeführt
condition: Boolescher Ausdruck
statement1:Rumpf des if-Zweiges
statement2:Rumpf des else-Zweiges
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 31 / 45
Layout
a = int(input("Eingabe: "))
if a % 2 == 0:print("gerade")
else:print("ungerade")
Einrückung
Einrückung
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 32 / 45
Kontrollstrukturenwhile-Schleifen
while-Schleifen
while condition:statement Einrückung
statement:beliebige AnweisungRumpf der while-Schleife
condition: Boolescher Ausdruck
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 33 / 45
while-Schleifen
while condition:statement
condition wird ausgewertetTrue: Iteration beginnt
statement wird ausgeführtFalse: while-Schleife wird beendet
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 34 / 45
while-Schleifen
s = 0i = 1while i <= 2:
s = s + ii = i + 1
i condition s
i = 1 wahr s = 1i = 2 wahr s = 3i = 3 falsch s = 3
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 35 / 45
Inkrementierung von Variablen
Zum Ändern von Werten von Variablen wird vereinfachte Syntax verwendet
n = n + 1 wird geschrieben als n += 1
n = n + i wird geschrieben als n += i
n = n - 15 wird geschrieben als n -= 15
n = n * j wird geschrieben als n *= j
n = n ** 4 wird geschrieben als n **= 4
. . .
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 36 / 45
Die Sprunganweisung break
break
Umschliessende Schleife wird sofort beendet
Nützlich, um Schleife „in der Mitte“ abbrechen zu können
s = 0
while True:x = int(input("Geben Sie eine positive Zahl ein, Abbruch mit 0: "))if x == 0:
breaks += x
print(s)
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 37 / 45
KontrollstrukturenTerminierung
Terminierung
i = 1while i <= n:
s += ii += 1
Hier und meistens
statement ändert einen Wert, der in condition vorkommt
Nach endlich vielen Iterationen wird condition falsch
ï Terminierung
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 38 / 45
Endlosschleifen
Endlosschleifen sind leicht zu produzieren
while True:print("0")
while not False:print("1")
while 2 > 1:print("2")
. . . aber nicht automatisch zu erkennen
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 39 / 45
Halteproblem
Unentscheidbarkeit des Halteproblems [Alan Turing, 1936]
Es gibt kein Python-Programm, das für jedesPython-Programm P und jede Eingabe I korrektfeststellen kann, ob P bei Eingabe I terminiert
Das heisst, die Terminierung von Programmen kannnicht automatisch überprüft werden
Theoretische Fragestellungen dieser Art waren für Turing die Hauptmotivation fürdie Konstruktion seiner Rechenmaschine
Alan Turing [Wikimedia]
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 40 / 45
Die Collatz-Folge
Folge von natürlichen Zahlen n0, n1, n2, n3, n4, n5, . . .
n0 = n
für jedes i ≥ 1, ni =
ni−1/2, falls ni−1 gerade
3 · ni−1 + 1, falls ni−1 ungerade
Beispiel für n = 5
5, 16, 8, 4, 2, 1, 4, 2, 1, . . . (Repetition bei 1)
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 41 / 45
Übung – Die Collatz-Folge
Schreiben Sie ein Programm, das
eine ganze Zahl n als Eingabe erhält
die Collatz-Folge ausgibt mit der Formeln0 = n und
ni =
ni−1/2, falls ni−1 gerade
3 · ni−1 + 1, falls ni−1 ungerade
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 42 / 45
Übung – Die Collatz-Folge
n = int(input("Berechne die Collatz-Folge fuer n = "))
while n > 1: # stopp, wenn 1 erreicht istif n % 2 == 0: # n ist gerade
n //= 2else: # n ist ungerade
n = 3 * n + 1print(n, end=" ")
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 43 / 45
Die Collatz-Folge
Beispiel für n = 27
27 82 41 124 62 31 94 47 142 71 214 107 322 161 484 242 121364 182 91 274 137 412 206 103 310 155 466 233 700 350 175526 263 790 395 1186 593 1780 890 445 1336 668 334 167 502251 754 377 1132 566 283 850 425 1276 638 319 958 479 1438719 2158 1079 3238 1619 4858 2429 7288 3644 1822 911 27341367 4102 2051 6154 3077 9232 4616 2308 1154 577 1732 866 4331300 650 325 976 488 244 122 61 184 92 46 23 70 35 106 53 16080 40 20 10 5 16 8 4 2 1
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 44 / 45
Die Collatz-Folge
Die Collatz-Vermutung [Lothar Collatz, 1937]
Für jedes n ≥ 1 erscheint die 1 in der Folge
Niemand konnte die Vermutung bislang beweisen
Falls sie nicht stimmt, ist die while-Schleife zurBerechnung der Collatz-Folge für einige n eineEndlosschleife
Lothar Collatz [Wikimedia]
Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 45 / 45