Zum Inhalt springen

Aufgabe 02 - Alte Bekannte, neue Sprache

Zu Zen-Modus wechseln

Sie lösen eine Reihe klassischer Programmieraufgaben in Python: Probleme, die in jeder Programmiersprache gestellt werden können und deren Lösungsmuster (Zählen, Summieren, Suchen, Umwandeln) zum Grundwerkzeug jeder Entwicklerin und jedes Entwicklers gehören (siehe Kapitel Einführung in Python). Ziel ist doppelt: Routine mit der Python-Syntax aufbauen und dabei erleben, dass Python für viele dieser Muster besonders knappe Formulierungen anbietet.

  • Kapitel Einführung in Python, insbesondere Funktionen, Listen, Dictionaries und Strings.
  • Ihren Spickzettel aus Aufgabe 01, Python und VS Code.
  • Sie setzen Kontrollstrukturen, Funktionen und Datenstrukturen sicher zur Problemlösung ein.
  • Sie strukturieren Lösungen als Funktionen mit Testaufrufen statt als lose Skriptzeilen.
  • Sie vergleichen verschiedene Lösungswege für dasselbe Problem und bewerten sie.
  • Reproduktion: Grundkonstrukte wiedergeben und auf einfachste Aufgaben anwenden (Teil A).
  • Reorganisation und Transfer: bekannte Lösungsmuster auf neue Aufgaben übertragen, Alternativen vergleichen (Teile B und C).
  • Reflexion, Problemlösung und Urteilsbildung: ein offenes Problem analysieren, eine eigene Strategie entwerfen und das Ergebnis beurteilen (Teil D).

Die Übung ist auf etwa zwei Stunden ausgelegt; jede Teilaufgabe wird als Funktion mit mindestens zwei Testaufrufen abgegeben. Teil D ist der Expertenteil.

  1. print_numbers(): gibt die Zahlen 1 bis 20 aus, jede in einer eigenen Zeile.
  2. sum_up_to(n): liefert die Summe 1 + 2 + … + n mit einer Schleife. Kontrollwert: sum_up_to(100) ergibt 5050.
  3. grade_average(grades): liefert den Durchschnitt einer Notenliste. Entscheiden Sie, was bei einer leeren Liste passiert, und schreiben Sie Ihre Entscheidung als Kommentar über die Funktion.
  1. fizzbuzz(n): gibt die Zahlen 1 bis n aus; Vielfache von 3 werden durch Fizz ersetzt, Vielfache von 5 durch Buzz, Vielfache von beiden durch FizzBuzz. Achten Sie auf die Reihenfolge der Prüfungen.
  2. caesar(text, shift): verschiebt jeden Buchstaben um shift Positionen im Alphabet (aus abz wird bei Verschiebung 1 bca); andere Zeichen bleiben unverändert. Hilfsmittel: ord() und chr().
  3. linear_search(values, target): liefert den Index des ersten Treffers oder -1, und zusätzlich die Anzahl der benötigten Vergleiche als zweiten Rückgabewert (return index, comparisons).
  1. Schreiben Sie grade_average erneut, diesmal mit sum() und len() in einer Zeile Funktionsrumpf.
  2. Erzeugen Sie die Liste der Quadratzahlen von 1 bis 20 zweimal: mit einer Schleife und append, und als List Comprehension [x * x for x in range(1, 21)]. Prüfen Sie mit ==, dass beide Listen gleich sind.
  3. word_frequency(text): zählt mit einem Dictionary, wie oft jedes Wort in einem Satz vorkommt (text.split()). Lösen Sie dieselbe Aufgabe danach mit collections.Counter (Dokumentation lesen) und halten Sie den Vergleich in zwei Kommentarzeilen fest.

Ein mit caesar verschlüsselter deutscher Text soll ohne Kenntnis der Verschiebung entschlüsselt werden.

  1. Schreiben Sie crack_caesar(ciphertext), das alle 26 möglichen Verschiebungen durchprobiert und alle Kandidaten erzeugt.
  2. Bewerten Sie jeden Kandidaten automatisch: Im Deutschen ist e der mit Abstand häufigste Buchstabe. Zählen Sie die Buchstabenhäufigkeiten je Kandidat und wählen Sie den Kandidaten, dessen häufigster Buchstabe e ist (oder entwickeln Sie ein besseres Kriterium; dokumentieren Sie es).
  3. Testen Sie mit einem selbst verschlüsselten Satz von mindestens 80 Zeichen. Bei welcher Textlänge beginnt Ihr Kriterium zu versagen? Probieren Sie es aus und notieren Sie die Beobachtung.
  4. Beurteilen Sie in drei Sätzen, was dieses Experiment über die Sicherheit der Caesar-Verschlüsselung aussagt.
  1. Warum muss bei fizzbuzz der Fall “durch 3 und durch 5 teilbar” vor den Einzelfällen geprüft werden?
  2. Was liefert "eins zwei zwei".split() und welchen Typ hat das Ergebnis?
  3. Wie liest sich [x * x for x in range(1, 21)] als deutscher Satz?
  4. Eine Funktion soll zwei Werte zurückgeben. Wie geht das in Python, und wie nimmt der Aufrufer beide entgegen?
  5. Welche Entscheidung mussten Sie bei grade_average für die leere Liste treffen, und warum kann man sie nicht “einfach weglassen”?

classics.py (Teile A und B), python_style.py (Teil C) und gegebenenfalls crack.py (Teil D), jeweils mit Funktionen und Testaufrufen.