Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
| Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
| gf_informatik:algorithmen_ii [2023-12-12 10:04] – [Aufgabe A1: Maximum] hof | gf_informatik:algorithmen_ii [2025-11-20 09:50] (aktuell) – hof | ||
|---|---|---|---|
| Zeile 12: | Zeile 12: | ||
| * Teil 1: Zwei Zahlen sollen eingegeben und die grössere der beiden Zahlen ausgegeben werden. Die grössere von zwei gleich grossen Zahlen ist einfach diese eine Zahl. | * Teil 1: Zwei Zahlen sollen eingegeben und die grössere der beiden Zahlen ausgegeben werden. Die grössere von zwei gleich grossen Zahlen ist einfach diese eine Zahl. | ||
| - | * Teil 2: Schreibe Code um als Funktion `max2(a, b)`, die das Maximum von a und b _zurückgibt_. Die _Eingabe_ (`input`) und die _Ausgabe_ (`print`) sollen ausserhalb der Funktion erfolgen. | + | * Teil 2: Schreibe Code um als Funktion `max2(a, b)`, die das Maximum von a und b mit `return` |
| * Teil 3: Schreibe eine Funktion `max3(a, b, c)`, die das Maximum von drei Zahlen zurückgibt. _Verwende dazu die `max2` Funktion!_ | * Teil 3: Schreibe eine Funktion `max3(a, b, c)`, die das Maximum von drei Zahlen zurückgibt. _Verwende dazu die `max2` Funktion!_ | ||
| - | < | + | < |
| ++++Lösung| | ++++Lösung| | ||
| <code python> | <code python> | ||
| Zeile 27: | Zeile 27: | ||
| return max2(max2(a, | return max2(max2(a, | ||
| - | print(max3(input(' | + | print(max3(int(input(' |
| </ | </ | ||
| ++++ | ++++ | ||
| Zeile 89: | Zeile 89: | ||
| ===== Mathematische Algorithmen ===== | ===== Mathematische Algorithmen ===== | ||
| - | |||
| - | ==== Primzahlen ==== | ||
| - | === Theorie === | ||
| - | |||
| - | * Was ist eine Primzahl? | ||
| - | * Wenn nötig: Nachlesen auf [[wpde> | ||
| - | * Primzahl-Test: | ||
| - | * Eine Funktion, die herausfindet (_zurückgibt_), | ||
| - | * Wieviele Parameter hat die Funktion `is_prime`? | ||
| - | * Teiler-Test: | ||
| - | * Eine Funktion, die herausfindet (_zurückgibt_), | ||
| - | * Wieviele Parameter hat die Funktion `is_divisor`? | ||
| - | |||
| - | === Auftrag zu Primzahlen === | ||
| - | |||
| - | * in 2er-Gruppen auf Papier (kein Python!) | ||
| - | * Vorgehen: | ||
| - | * Algorithmus überlegen, in 2er-Gruppe besprechen, | ||
| - | * Mit Lehrperson besprechen | ||
| - | * In Python: Funktion `is_prime(n)` implementieren | ||
| - | * Fertig? siehe Zusatzauftrag und Aufgaben unten | ||
| - | |||
| - | ++++Hinweise| | ||
| - | * Schreibe zuerst die Funktion `is_divisor` und teste sie: | ||
| - | * Wie finden wir heraus, ob `t` ein Teiler von `n` ist? Können wir das mit einer einzelnen Berechnung tun statt als [[gf_informatik: | ||
| - | * **Hinweis**: | ||
| - | * Welche Operation könnte praktisch sein, um die Teilbarkeit zu entscheiden? | ||
| - | * **Hinweis 2**: `t` teilt `n` genau dann, wenn der Rest der Division $\frac{n}{t}$ null ist... | ||
| - | * Schreibe `is_prime` erst, wenn `is_divisor` funktioniert. | ||
| - | * Wie hilft uns `is_divisor` bei der Umsetzung des Primzahltests? | ||
| - | ++++ | ||
| - | |||
| - | **Zusatzauftrag: | ||
| - | |||
| - | * Wie kannst du den Algorithmus optimieren? Mache einen Plan und diskutiere diesen mit der Lehrperson. | ||
| - | * Schreibe eine optimierte Version der Funktion unter dem Namen `is_prime_2` | ||
| - | |||
| - | |||
| - | <nodisp 1> | ||
| - | ++++Lösung: | ||
| - | <code python> | ||
| - | import math | ||
| - | |||
| - | def is_divisor(dividend, | ||
| - | """ | ||
| - | return dividend % divisor == 0 | ||
| - | |||
| - | def is_prime(n): | ||
| - | """ | ||
| - | if n < 2: | ||
| - | return False | ||
| - | i = 2 | ||
| - | # Es reicht, bis zur Wurzel von n zu testen - gäbe es einen grösseren Teiler t so dass | ||
| - | # t*x == n, dann müsste x kleiner sein als Wurzel(n) und wir hätten x bereits gefunden. | ||
| - | while i <= math.sqrt(n): | ||
| - | if is_divisor(n, | ||
| - | # Wir haben einen Teiler gefunden -> keine Primzahl, beenden. | ||
| - | return False | ||
| - | i = i + 1 | ||
| - | # Keinen Teiler gefunden -> wir haben eine Primzahl! | ||
| - | return True | ||
| - | </ | ||
| - | ++++ | ||
| - | </ | ||
| ==== Aufgaben B ==== | ==== Aufgaben B ==== | ||
| Zeile 166: | Zeile 102: | ||
| - Entscheiden ob eine beliebige Zahl eine Zweierpotenz ist oder nicht | - Entscheiden ob eine beliebige Zahl eine Zweierpotenz ist oder nicht | ||
| - | < | + | ++++Hinweise: |
| + | * $7*3 = 0 + 3 + 3 + 3 + 3 + 3 + 3 + 3$ | ||
| + | * Wir benötigen eine Schleife, die 7 mal 3 zum Resultat addiert. | ||
| + | * Ausserhalb der Schleife deklarieren wir eine Variable, die das Resultat enthält und zu Beginn 0 ist, z.B. `result = 0`. | ||
| + | * Wie lautet die Rechnung für das Hoch-Rechnen mit Multiplikation? | ||
| + | ++++ | ||
| + | |||
| + | < | ||
| ++++Lösung: | ++++Lösung: | ||
| <code python> | <code python> | ||
| Zeile 229: | Zeile 172: | ||
| ++++ | ++++ | ||
| - | < | + | < |
| ++++Lösung: | ++++Lösung: | ||
| <code python> | <code python> | ||
| Zeile 245: | Zeile 188: | ||
| </ | </ | ||
| - | ==== Anspruchsvolle Algorithmen | + | ==== Primzahlen |
| + | === Theorie === | ||
| + | |||
| + | * Was ist eine Primzahl? | ||
| + | * Wenn nötig: Nachlesen auf [[wpde> | ||
| + | * Primzahl-Test: | ||
| + | * Eine Funktion, die herausfindet (Also `True` oder `False` _zurückgibt_), | ||
| + | * Wieviele Parameter hat die Funktion `is_prime`? | ||
| + | * Teiler-Test: | ||
| + | * Eine Funktion, die herausfindet (_zurückgibt_), | ||
| + | * Wieviele Parameter hat die Funktion `is_divisor`? | ||
| + | |||
| + | |||
| + | === Auftrag zu Primzahlen === | ||
| + | |||
| + | * in 2er-Gruppen auf Papier (kein Python!) | ||
| + | * Vorgehen: | ||
| + | * Algorithmus für Primzahltest überlegen, in 2er-Gruppe besprechen, | ||
| + | * Mit Lehrperson besprechen | ||
| + | * In Python: Funktion `is_prime(n)` implementieren | ||
| + | * Fertig? siehe Zusatzauftrag und Aufgaben unten | ||
| + | |||
| + | ++++Hinweise| | ||
| + | * Schreibe zuerst die Funktion `is_divisor` und teste sie: | ||
| + | * Wie finden wir heraus, ob `t` ein Teiler von `n` ist? Können wir das mit einer einzelnen Berechnung tun statt als [[gf_informatik: | ||
| + | * **Hinweis**: | ||
| + | * Welche Operation könnte praktisch sein, um die Teilbarkeit zu entscheiden? | ||
| + | * **Hinweis 2**: `t` teilt `n` genau dann, wenn der Rest der Division $\frac{n}{t}$ null ist... | ||
| + | * Schreibe `is_prime` erst, wenn `is_divisor` funktioniert. | ||
| + | * Wie hilft uns `is_divisor` bei der Umsetzung des Primzahltests? | ||
| + | ++++ | ||
| + | |||
| + | **Zusatzauftrag: | ||
| + | |||
| + | * Wie kannst du den Algorithmus optimieren? Mache einen Plan und diskutiere diesen mit der Lehrperson. | ||
| + | * Schreibe eine optimierte Version der Funktion unter dem Namen `is_prime_2` | ||
| + | |||
| + | |||
| + | <nodisp 2> | ||
| + | ++++Lösung: | ||
| + | <code python> | ||
| + | import math | ||
| + | |||
| + | def is_divisor(dividend, | ||
| + | """ | ||
| + | return dividend % divisor == 0 | ||
| + | |||
| + | def is_prime(n): | ||
| + | """ | ||
| + | if n < 2: | ||
| + | return False | ||
| + | i = 2 | ||
| + | # Es reicht, bis zur Wurzel von n zu testen - gäbe es einen grösseren Teiler t so dass | ||
| + | # t*x == n, dann müsste x kleiner sein als Wurzel(n) und wir hätten x bereits gefunden. | ||
| + | while t <= math.sqrt(n): | ||
| + | if is_divisor(n, | ||
| + | # Wir haben einen Teiler gefunden -> keine Primzahl, beenden. | ||
| + | return False | ||
| + | t = t + 1 | ||
| + | # Keinen Teiler gefunden -> wir haben eine Primzahl! | ||
| + | return True | ||
| + | </ | ||
| + | ++++ | ||
| + | </ | ||
| === Aufgabe B3: Primfaktorzerlegung === | === Aufgabe B3: Primfaktorzerlegung === | ||
| Zeile 275: | Zeile 282: | ||
| while is_divisor(remainder, | while is_divisor(remainder, | ||
| remainder = remainder / factor | remainder = remainder / factor | ||
| - | print factor | + | print(factor) |
| # yield factor | # yield factor | ||
| | | ||
| Zeile 281: | Zeile 288: | ||
| factor = next_prime(factor) | factor = next_prime(factor) | ||
| - | prime_factors(input()) | + | prime_factors(int(input())) |
| </ | </ | ||
| ++++ | ++++ | ||
| </ | </ | ||
| + | |||
| + | ==== Weitere anspruchsvolle Algorithmen ==== | ||
| === Aufgabe B4: ggT bestimmen === | === Aufgabe B4: ggT bestimmen === | ||
| Zeile 313: | Zeile 322: | ||
| * Schreibe eine Funktion `wurzel(x)`, | * Schreibe eine Funktion `wurzel(x)`, | ||
| - | < | + | < |
| ++++Lösung: | ++++Lösung: | ||
| <code python> | <code python> | ||