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-08 09:46] – [Auftrag zu Primzahlen] hof | gf_informatik:algorithmen_ii [2025-12-11 09:14] (aktuell) – hof | ||
|---|---|---|---|
| Zeile 2: | Zeile 2: | ||
| ===== Struktogramme und Python ===== | ===== Struktogramme und Python ===== | ||
| + | < | ||
| ==== Aufgaben A ==== | ==== Aufgaben A ==== | ||
| Zeile 11: | Zeile 12: | ||
| === Aufgabe A1: Maximum === | === Aufgabe A1: Maximum === | ||
| - | * Teil 1: Zwei Zahlen sollen eingegeben und die grössere der beiden Zahlen ausgegeben werden. | + | * Teil 1: Zwei Zahlen sollen eingegeben |
| - | * Teil 2: Schreibe Code um als Funktion `max2(a, b)`, die das Maximum von a und b _zurückgibt_. Die _Ausgabe_ (`print`) soll 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!_ |
| <nodisp 1> | <nodisp 1> | ||
| ++++Lösung| | ++++Lösung| | ||
| - | <code python> | + | <html>< |
| def max2(a, b): | def max2(a, b): | ||
| if a > b: | if a > b: | ||
| Zeile 27: | Zeile 28: | ||
| return max2(max2(a, | return max2(max2(a, | ||
| - | print(max(input(' | + | print(max3(int(input(' |
| - | </code> | + | </bottom-editor></ |
| ++++ | ++++ | ||
| </ | </ | ||
| Zeile 35: | Zeile 36: | ||
| * Teil 1: Drei Zahlen sollen eingegeben werden und danach in absteigender Reihenfolge der Grösse ausgegeben werden. | * Teil 1: Drei Zahlen sollen eingegeben werden und danach in absteigender Reihenfolge der Grösse ausgegeben werden. | ||
| - | < | + | < |
| ++++Lösung: | ++++Lösung: | ||
| - | <code python> | + | <html>< |
| def sort(a, b, c): | def sort(a, b, c): | ||
| if a > b: | if a > b: | ||
| Zeile 55: | Zeile 56: | ||
| sort(input(), | sort(input(), | ||
| - | </code> | + | </bottom-editor></ |
| ++++ | ++++ | ||
| </ | </ | ||
| <nodisp 2> | <nodisp 2> | ||
| - | * (Ausgeblendet): | + | ++++Ausgeblendet| |
| + | * Teil 2: Schreibe Code um als Funktion `my_sort(a, | ||
| + | ++++ | ||
| </ | </ | ||
| Zeile 89: | Zeile 92: | ||
| ===== Mathematische Algorithmen ===== | ===== Mathematische Algorithmen ===== | ||
| + | Mit _iterativen_ Algorithmen berechnen wir Schritt für Schritt das gewünschte Resultat. Das Resultat wird in einer Variable sukzessive akkumuliert. In einer Schleife wird jede Runde ein Wert hinzugefügt, | ||
| - | ==== Primzahlen ==== | + | **Beispiel**: |
| - | === Theorie === | + | |
| - | * Was ist eine Primzahl? | + | <html><bottom-editor> |
| - | * Wenn nötig: Nachlesen auf [[wpde>Primzahl]] (erster Satz)! | + | def summe_aller_zahlen(n): |
| - | * Primzahl-Test: | + | # Berechnet |
| - | * Eine Funktion, die herausfindet | + | |
| - | * Wieviele Parameter hat die Funktion `is_prime`? | + | |
| - | * Teiler-Test: | + | # Klassische Schleife mit Zähler-Variable |
| - | * Eine Funktion, die herausfindet (_zurückgibt_), | + | |
| - | * Wieviele Parameter hat die Funktion `is_divisor`? | + | while zahl <= n: |
| - | + | | |
| - | === Auftrag zu Primzahlen === | + | |
| - | + | return | |
| - | * 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: | + | |
| - | | + | |
| - | * **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. | + | |
| - | | + | |
| - | ++++ | + | |
| - | + | ||
| - | **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): | + | |
| - | """ | + | |
| - | | + | |
| - | return False | + | |
| - | i = 2 | + | |
| - | # Es reicht, bis zur Wurzel von n zu testen | + | |
| - | | + | |
| - | while i <= math.sqrt(n): | + | |
| - | | + | |
| - | # Wir haben einen Teiler gefunden -> keine Primzahl, beenden. | + | |
| - | return False | + | |
| - | | + | |
| - | # Keinen Teiler gefunden -> wir haben eine Primzahl! | + | |
| - | return | + | |
| - | </ | + | |
| - | ++++ | + | |
| - | </ | + | |
| + | print(summe_aller_zahlen(10)) | ||
| + | </ | ||
| ==== Aufgaben B ==== | ==== Aufgaben B ==== | ||
| - | === Aufgabe B1: Einfache (math.) | + | === Aufgabe B1: Iterative |
| Schreibe für jede Aufgabe eine Funktion, die passende Argumente entgegennimmt und das Resultat zurück gibt. | Schreibe für jede Aufgabe eine Funktion, die passende Argumente entgegennimmt und das Resultat zurück gibt. | ||
| Zeile 165: | Zeile 121: | ||
| - Ganzzahldivision mit Rest mit Addition und Subtraktion | - Ganzzahldivision mit Rest mit Addition und Subtraktion | ||
| - 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? | ||
| + | ++++ | ||
| <nodisp 1> | <nodisp 1> | ||
| ++++Lösung: | ++++Lösung: | ||
| - | <code python> | + | <html>< |
| def multiply(a, b): | def multiply(a, b): | ||
| """ | """ | ||
| Zeile 204: | Zeile 167: | ||
| return test == n | return test == n | ||
| - | a = input(" | + | a = int(input(" |
| - | b = input(" | + | b = int(input(" |
| print(str(a) + " * " + str(b) + " = " + str(multiply(a, | print(str(a) + " * " + str(b) + " = " + str(multiply(a, | ||
| print(str(a) + " ^ " + str(b) + " = " + str(exponentiate(a, | print(str(a) + " ^ " + str(b) + " = " + str(exponentiate(a, | ||
| Zeile 214: | Zeile 177: | ||
| print(str(a) + " ist eine Zweierpotenz: | print(str(a) + " ist eine Zweierpotenz: | ||
| print(str(b) + " ist eine Zweierpotenz: | print(str(b) + " ist eine Zweierpotenz: | ||
| - | </code> | + | </bottom-editor></ |
| ++++ | ++++ | ||
| </ | </ | ||
| Zeile 229: | Zeile 192: | ||
| ++++ | ++++ | ||
| - | < | + | < |
| ++++Lösung: | ++++Lösung: | ||
| - | <code python> | + | <html>< |
| def quersumme(x): | def quersumme(x): | ||
| summe = 0 | summe = 0 | ||
| Zeile 241: | Zeile 204: | ||
| print(quersumme(413)) | print(quersumme(413)) | ||
| - | </code> | + | </bottom-editor></ |
| + | ++++ | ||
| + | </ | ||
| + | |||
| + | ==== 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 1> | ||
| + | ++++Lösung: | ||
| + | < | ||
| + | import math | ||
| + | |||
| + | def is_divisor(dividend, | ||
| + | """ | ||
| + | return dividend % divisor == 0 | ||
| + | |||
| + | def is_prime(n): | ||
| + | """ | ||
| + | if n < 2: | ||
| + | return False | ||
| + | t = 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 | ||
| + | </ | ||
| ++++ | ++++ | ||
| </ | </ | ||
| - | ==== Anspruchsvolle Algorithmen ==== | ||
| === Aufgabe B3: Primfaktorzerlegung === | === Aufgabe B3: Primfaktorzerlegung === | ||
| Zeile 254: | Zeile 281: | ||
| * Schreibe eine Funktion `prime_factors(x)`, | * Schreibe eine Funktion `prime_factors(x)`, | ||
| - | < | + | < |
| ++++Lösung: | ++++Lösung: | ||
| - | Mit den Funktionen `is_prime` und `is_divisor` von oben: | + | Mit den Funktionen `is_prime` und `is_divisor` von oben ([[https:// |
| <code python> | <code python> | ||
| def next_prime(n): | def next_prime(n): | ||
| Zeile 275: | Zeile 302: | ||
| 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 308: | ||
| 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 291: | Zeile 320: | ||
| * Schreibe eine Funktion `ggT(x,y)`, die zwei Zahlen `x` und `y` entgegennimmt und den ggT der beiden zurückgibt. | * Schreibe eine Funktion `ggT(x,y)`, die zwei Zahlen `x` und `y` entgegennimmt und den ggT der beiden zurückgibt. | ||
| - | < | + | < |
| ++++Lösung: | ++++Lösung: | ||
| - | <code python> | + | <html>< |
| def ggt(a, b): | def ggt(a, b): | ||
| """ | """ | ||
| Zeile 303: | Zeile 332: | ||
| print(ggt(544, | print(ggt(544, | ||
| - | </code> | + | </bottom-editor></ |
| ++++ | ++++ | ||
| </ | </ | ||
| Zeile 315: | Zeile 344: | ||
| <nodisp 1> | <nodisp 1> | ||
| ++++Lösung: | ++++Lösung: | ||
| - | <code python> | + | <html>< |
| def wurzel(n, precision=0.0001): | def wurzel(n, precision=0.0001): | ||
| """ | """ | ||
| Zeile 330: | Zeile 359: | ||
| print(wurzel(225)) | print(wurzel(225)) | ||
| - | </code> | + | </bottom-editor></ |
| ++++ | ++++ | ||
| </ | </ | ||