added tut05
This commit is contained in:
166
Tutorium/tut05/README.md
Normal file
166
Tutorium/tut05/README.md
Normal file
@ -0,0 +1,166 @@
|
||||
---
|
||||
marp: true
|
||||
paginate: true
|
||||
theme: rose-pine
|
||||
footer: EidP 2024 - Nils Pukropp - https://git.narl.io/nvrl/eidp-2024
|
||||
style: ".columns {\r display: grid;\r grid-template-columns: repeat(2, minmax(0, 1fr));\r gap: 1rem;\r }"
|
||||
|
||||
---
|
||||
|
||||
# Tutorium 04 - 2024-11-14
|
||||
|
||||
Blatt 04, assert, top-level statements, Blatt 05
|
||||
|
||||
---
|
||||
|
||||
# Vorab - LFG Rechnernetze
|
||||
|
||||
- Handynummer: [+49-160-8080619](tel:+491608080619)
|
||||
- Mail: [nils@narl.io](mailto:nils@narl.io)
|
||||
|
||||
---
|
||||
|
||||
# Vorab - Ausfall Tutorium 12.12.
|
||||
|
||||
- Tutorium am 12.12. fällt aus
|
||||
- Bitte Ersatztutorium auf der [Vorlesungswebsite](https://proglang.github.io/teaching/24ws/eidp.html) aussuchen
|
||||
- Ihr könnt da auch Vorrechnen/Anwesenheitspunkte bekommen
|
||||
|
||||
---
|
||||
|
||||
# Blatt 04
|
||||
|
||||
---
|
||||
|
||||
# `assert` - Was ist das?
|
||||
|
||||
- Eine Annahme über einen Zustand
|
||||
- Wird gerne zum Testen verwendet
|
||||
- Wenn die Annahme nicht stimmt, dann *stürzt* euer Programm ab
|
||||
- Wird manchmal als Invariante benutzt
|
||||
|
||||
---
|
||||
|
||||
# `assert` als Invariante
|
||||
|
||||
- Ihr müsst euch sicher sein, dass die Invariante immer stimmt
|
||||
- z.B. wenn ihr auf dem Blatt mit nur korrekten Eingaben rechnen könnt
|
||||
|
||||
```python
|
||||
def input_number() -> int:
|
||||
num = input("Please enter a whole number:\n>")
|
||||
assert num.isnumeric()
|
||||
return int(num)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# `assert` als Schleifeninvariante
|
||||
|
||||
- Typischeres Beispiel für Invariante in Informatik ist die Schleifeninvariante
|
||||
- Damit können Beweise über die Korrektheit des Algorithmus gemacht werden
|
||||
|
||||
|
||||
---
|
||||
|
||||
```python
|
||||
def multiply(a: int, b: int) -> int:
|
||||
x, y, p = a, b, 0
|
||||
# Die Schleifeninvariante gilt vor der Schleife
|
||||
assert (x * y) + p == a * b
|
||||
while x > 0:
|
||||
# Die Schleifeninvariante gilt an jedem Schleifenanfang
|
||||
assert (x * y) + p == a * b
|
||||
p = p + y
|
||||
# Zwischendrin muss diese nicht gelten
|
||||
x = x - 1
|
||||
# Die Schleifeninvariante muss am Ende jedes Durchlaufs gelten
|
||||
assert (x * y) + p == a * b
|
||||
# Die Schleifeninvariante muss ganz am Ende gelten
|
||||
assert (x * y) + p == a * b
|
||||
return p
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# `assert` als Top-Level Statement
|
||||
|
||||
- es ist aber sehr untypisch seinen ganzen Code mit Invarianten voll zu machen
|
||||
- wir programmieren ja nur korrekte Algorithmen ;)
|
||||
- stattdessen wird assert gerne zum Testen verwendet
|
||||
- Hier muss dann `assert` in die `if __name__ == "__main__":`
|
||||
- Mit genug guten Tests können wir auch davon ausgehen, dass der Algorithmus korrekt ist
|
||||
|
||||
---
|
||||
|
||||
```python
|
||||
if __name__ == "__main__":
|
||||
assert multiply(3, 4) == 12
|
||||
assert multiply(0, 1) == 0
|
||||
assert multiply(1000, 0) == 0
|
||||
assert multiply(100, 1000) == 100000
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# Top-Level Statements
|
||||
Wann benutzen wir `if __name__ == "__main__":`?
|
||||
|
||||
---
|
||||
|
||||
# Wann `if __name__ == "__main__":`?
|
||||
|
||||
- eigentlich immer wenn eine der Folgenden Funktionen benutzt:
|
||||
- `assert`
|
||||
- `print(...)`
|
||||
- `input(...)`
|
||||
- außer es ist anders gefordert! Das steht dann aber explizit dabei
|
||||
|
||||
---
|
||||
|
||||
# Wann `input()/print()`?
|
||||
|
||||
- Es gibt zwei Aufgaben Typen
|
||||
1. Implementieren Sie Funktion *f* die `f(...) -> ...` tut.
|
||||
- meistens gibt es `assert` als Beispiele
|
||||
2. Implementieren Sie ein Programm das von Benutzer `x` fordert und `y` ausgibt.
|
||||
- es gibt immer eine Beispieleingabe/-ausgabe
|
||||
|
||||
---
|
||||
|
||||
# Beispiel Type I
|
||||
|
||||
Schreiben Sie eine Funktion `multiply` die zwei Zahlen multipliziert
|
||||
|
||||
```python
|
||||
def multiply(a: int, b: int) -> int:
|
||||
x, y, p = a, b, 0
|
||||
while x > 0:
|
||||
p = p + y
|
||||
x = x - 1
|
||||
return p
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
Hier kann man z.B. auch die Tests einfach in die main schreiben:
|
||||
|
||||
```python
|
||||
if __name__ == "__main__":
|
||||
assert multiply(3, 4) == 12
|
||||
assert multiply(0, 1) == 0
|
||||
assert multiply(1000, 0) == 0
|
||||
assert multiply(100, 1000) == 100000
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# Beispiel Type II
|
||||
|
||||
Schreiben Sie ein [Programm](./src/program.py) was zwei Zahlen nimmt und das Ergebnis ausgibt, das soll solange geschehen bis der Nutzer `exit` schreibt
|
||||
|
||||
---
|
||||
|
||||
# Blatt 05
|
||||
|
||||
---
|
BIN
Tutorium/tut05/slides.pdf
Normal file
BIN
Tutorium/tut05/slides.pdf
Normal file
Binary file not shown.
22
Tutorium/tut05/src/asserts.py
Normal file
22
Tutorium/tut05/src/asserts.py
Normal file
@ -0,0 +1,22 @@
|
||||
def multiply(a: int, b: int) -> int:
|
||||
x, y, p = a, b, 0
|
||||
# Die Schleifeninvariante gilt vor der Schleife
|
||||
assert (x * y) + p == a * b
|
||||
while x > 0:
|
||||
# Die Schleifeninvariante gilt an jedem Schleifenanfang
|
||||
assert (x * y) + p == a * b
|
||||
p = p + y
|
||||
# Zwischendrin muss diese nicht gelten
|
||||
x = x - 1
|
||||
# Die Schleifeninvariante muss am Ende jedes Durchlaufs gelten
|
||||
assert (x * y) + p == a * b
|
||||
# Die Schleifeninvariante muss ganz am Ende gelten
|
||||
assert (x * y) + p == a * b
|
||||
return p
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
assert multiply(3, 4) == 12
|
||||
assert multiply(0, 1) == 0
|
||||
assert multiply(1000, 0) == 0
|
||||
assert multiply(100, 1000) == 100000
|
4
Tutorium/tut05/src/program-2.py
Normal file
4
Tutorium/tut05/src/program-2.py
Normal file
@ -0,0 +1,4 @@
|
||||
import program
|
||||
|
||||
|
||||
print(program.multiply(3, 4))
|
19
Tutorium/tut05/src/program.py
Normal file
19
Tutorium/tut05/src/program.py
Normal file
@ -0,0 +1,19 @@
|
||||
def multiply(a: int, b: int) -> int:
|
||||
x, y, p = a, b, 0
|
||||
while x > 0:
|
||||
p = p + y
|
||||
x = x - 1
|
||||
return p
|
||||
|
||||
|
||||
def run() -> None:
|
||||
while True:
|
||||
a = input("Bitte geben Sie eine Zahl oder exit ein:\n> ")
|
||||
if a == "exit":
|
||||
break
|
||||
b = input("Bitte geben Sie eine weitere Zahl ein:\n> ")
|
||||
print(f"{a} * {b} = {multiply(int(a), int(b))}")
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
run()
|
Reference in New Issue
Block a user