14
Dennis Komm Programmieren und Problemlösen Wahrheitswerte 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 r 1 SOH 20 DC4 39 58 : 77 M 96 115 s 2 STX 21 NAK 40 ( 59 ; 78 N 97 a 116 t 3 ETX 22 SYN 41 ) 60 < 79 O 98 b 117 u 4 EOT 23 ETB 42 * 61 = 80 P 99 c 118 v 5 ENQ 24 CAN 43 + 62 > 81 Q 100 d 119 w 6 ACK 25 EM 44 , 63 ? 82 R 101 e 120 x 7 BEL 26 SUB 45 - 64 @ 83 S 102 f 121 y 8 BS 27 ESC 46 . 65 A 84 T 103 g 122 z 9 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 DEL 14 SO 33 ! 52 4 71 G 90 Z 109 m ... 15 SI 34 53 5 72 H 91 [ 110 n 16 DLE 35 # 54 6 73 I 92 \ 111 o 17 DC1 36 $ 55 7 74 J 93 ] 112 p 18 DC2 37 % 56 8 75 K 94 ˆ 113 q Programmieren und Problemlösen – Kontrollstrukturen Frühjahr 2020 Dennis Komm 2 / 45

Zeichenketten (Strings) · 2020-03-05 · 10 % 3 = 1, denn 9 = 3·3 10 % 4 = 2, denn 8 = 4·2 11 // 5 = 2, denn 10 = 5·2 23 // 4 = 5, denn 20 = 4·5 12 % 3 = 0, denn 12 = 4·3 Falls

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Zeichenketten (Strings) · 2020-03-05 · 10 % 3 = 1, denn 9 = 3·3 10 % 4 = 2, denn 8 = 4·2 11 // 5 = 2, denn 10 = 5·2 23 // 4 = 5, denn 20 = 4·5 12 % 3 = 0, denn 12 = 4·3 Falls

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

Page 2: Zeichenketten (Strings) · 2020-03-05 · 10 % 3 = 1, denn 9 = 3·3 10 % 4 = 2, denn 8 = 4·2 11 // 5 = 2, denn 10 = 5·2 23 // 4 = 5, denn 20 = 4·5 12 % 3 = 0, denn 12 = 4·3 Falls

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

Page 3: Zeichenketten (Strings) · 2020-03-05 · 10 % 3 = 1, denn 9 = 3·3 10 % 4 = 2, denn 8 = 4·2 11 // 5 = 2, denn 10 = 5·2 23 // 4 = 5, denn 20 = 4·5 12 % 3 = 0, denn 12 = 4·3 Falls

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

Page 4: Zeichenketten (Strings) · 2020-03-05 · 10 % 3 = 1, denn 9 = 3·3 10 % 4 = 2, denn 8 = 4·2 11 // 5 = 2, denn 10 = 5·2 23 // 4 = 5, denn 20 = 4·5 12 % 3 = 0, denn 12 = 4·3 Falls

Ü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

Page 5: Zeichenketten (Strings) · 2020-03-05 · 10 % 3 = 1, denn 9 = 3·3 10 % 4 = 2, denn 8 = 4·2 11 // 5 = 2, denn 10 = 5·2 23 // 4 = 5, denn 20 = 4·5 12 % 3 = 0, denn 12 = 4·3 Falls

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

Page 6: Zeichenketten (Strings) · 2020-03-05 · 10 % 3 = 1, denn 9 = 3·3 10 % 4 = 2, denn 8 = 4·2 11 // 5 = 2, denn 10 = 5·2 23 // 4 = 5, denn 20 = 4·5 12 % 3 = 0, denn 12 = 4·3 Falls

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

Page 7: Zeichenketten (Strings) · 2020-03-05 · 10 % 3 = 1, denn 9 = 3·3 10 % 4 = 2, denn 8 = 4·2 11 // 5 = 2, denn 10 = 5·2 23 // 4 = 5, denn 20 = 4·5 12 % 3 = 0, denn 12 = 4·3 Falls

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

Page 8: Zeichenketten (Strings) · 2020-03-05 · 10 % 3 = 1, denn 9 = 3·3 10 % 4 = 2, denn 8 = 4·2 11 // 5 = 2, denn 10 = 5·2 23 // 4 = 5, denn 20 = 4·5 12 % 3 = 0, denn 12 = 4·3 Falls

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

Page 9: Zeichenketten (Strings) · 2020-03-05 · 10 % 3 = 1, denn 9 = 3·3 10 % 4 = 2, denn 8 = 4·2 11 // 5 = 2, denn 10 = 5·2 23 // 4 = 5, denn 20 = 4·5 12 % 3 = 0, denn 12 = 4·3 Falls

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

Page 10: Zeichenketten (Strings) · 2020-03-05 · 10 % 3 = 1, denn 9 = 3·3 10 % 4 = 2, denn 8 = 4·2 11 // 5 = 2, denn 10 = 5·2 23 // 4 = 5, denn 20 = 4·5 12 % 3 = 0, denn 12 = 4·3 Falls

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

Page 11: Zeichenketten (Strings) · 2020-03-05 · 10 % 3 = 1, denn 9 = 3·3 10 % 4 = 2, denn 8 = 4·2 11 // 5 = 2, denn 10 = 5·2 23 // 4 = 5, denn 20 = 4·5 12 % 3 = 0, denn 12 = 4·3 Falls

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

Page 12: Zeichenketten (Strings) · 2020-03-05 · 10 % 3 = 1, denn 9 = 3·3 10 % 4 = 2, denn 8 = 4·2 11 // 5 = 2, denn 10 = 5·2 23 // 4 = 5, denn 20 = 4·5 12 % 3 = 0, denn 12 = 4·3 Falls

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

Page 13: Zeichenketten (Strings) · 2020-03-05 · 10 % 3 = 1, denn 9 = 3·3 10 % 4 = 2, denn 8 = 4·2 11 // 5 = 2, denn 10 = 5·2 23 // 4 = 5, denn 20 = 4·5 12 % 3 = 0, denn 12 = 4·3 Falls

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

Page 14: Zeichenketten (Strings) · 2020-03-05 · 10 % 3 = 1, denn 9 = 3·3 10 % 4 = 2, denn 8 = 4·2 11 // 5 = 2, denn 10 = 5·2 23 // 4 = 5, denn 20 = 4·5 12 % 3 = 0, denn 12 = 4·3 Falls

Ü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