Algorithmen und Datenstrukturen - HowTo
Sommersemester 2026
Fabian Kuhn
Daphne
Die Programmierübungen werden in Python programmiert und die Lösungen mittels Daphne eingereicht. Üblicherweise verlangen wir für alle Aufgaben Unit Tests und einwandfreie Style Checks. Dies wird von dem Build-Server (der bei Daphne im Hintergrund läuft) automatisch überprüft.
Im Folgenden wird kurz beschrieben, an welche Richtlinien Sie Sich halten sollten damit die Abgabe Ihrer Lösungen auf Daphne und das Zusammenspiel mit dem Build-Server einwandfrei funktioniert.
Python
Die Übungen müssen mit Python 3 gelöst werden. Verwenden Sie nicht mehr als die Python Standard Library, mit Ausnahme von MatPlotLib.
Style Checking
Wir verlangen, dass alle Python Dateien den Programmierkonventionen PEP-8 folgen. Dafür brauchen Sie einen Stylechecker wie etwa flake8. Mit dem Style Checker können Sie überprüfen ob Ihr Programm den Programmierkonventionen entspricht in dem Sie den folgenden Befehl ausführen.
flake8 <My_Python_File>Tests
Wir erwarten, dass jede nicht triviale Funktion mit Unit Tests getestet wird. Unit Tests mit doctest schreiben Sie direkt in den Kommentarblock am Anfang jeder Python-Funktion. Unit Tests mit der Bibliothek unittest schreiben Sie indem Sie separate Test-Dateien erstellen, welche auf Test.py enden.
Makefile
Um Tests und Style Checking automatisiert zu prüfen brauchen Sie das Command Line Tool make. (Standardmäßig bei Mac und Linux installiert, bei Windows über WSL) Make wird durch ein Makefile configuriert, welches sich im ausführenden Ordner befinden muss. Benutzen Sie am besten einfach das Makefile, dass wir beim ersten Übungsblatt bereitgestellt haben (also erstellen Sie eine Kopie in jedem Abgaben Ordner, in dem Sie auch Python Dateien abgeben). Das Makefile definiert sogenannte targets, wobei jedes target nur eine Abfolge an command line Kommandos ist. Wir verlangen in jedem Makefile 3 targets clean, test, checkstyle.
- clean Bringt das repository auf den Ausgangsstand (löscht also alle automatisch generierten Dateien). Die vom Python-Interpreter automatisch generierten Dateien sollten Sie nicht über SVN hochladen
- test Lässt alle Tests für jede Python Datei laufen. Je nach Testframework, dass Sie benutzen müssen Sie hier den Befehl anpassen. Das von uns bereitgestellte MakeFile nutzt doctest.
- checkstyle Führt Flake8 auf allen Python Dateien aus.
Um die tests laufen zu lassen und den Stylecheck auszuführen, können Sie einfach make all ausführen. Wenn die Ausgabe Fehler zeigt, dann kümmern Sie sich erst um diese, bevor Sie mit svn commit -m "..." abgeben.
Es ist ok wenn Sie es nicht geschafft haben, dass alle Tests erfolgreich sind. Die Tests dann zu löschen oder zu verändern, um zu erreichen dass alle Tests erfolgreich sind ist nicht sinnvoll!
Die Verwendung von LLMs zur Bearbeitung der Übungsblätter ist nicht erlaubt. Das Übernehmen von Lösungen oder auch nur von Teilen davon gilt als Täuschungsversuch, mit entsprechenden Konsequenzen.
Unabhängig davon lernen Sie nichts, wenn Sie Lösungen von solchen Tools übernehmen. Die Erfahrung aus vergangenen Semestern zeigt, dass Studierende, die so arbeiten, erhebliche Schwierigkeiten in der Klausur haben und diese meistens nicht bestehen.
Kurzübersicht Abgabe von Übungsblättern (SVN + Daphne)
Die Abgabe erfolgt ausschließlich elektronisch über SVN (Subversion) in Daphne.
1. Registrierung in Daphne
- Öffne: https://daphne.informatik.uni-freiburg.de
- Melde dich mit deinem RZ-Account (MyAccount) an
- Registriere dich für die passende Veranstaltung (SS 2026)
- Dein persönliches SVN-Repository wird automatisch erstellt
2. SVN-Client installieren
- Linux / macOS: SVN ist meist bereits installiert, falls nicht bei Linux sudo apt-get install subversion bei macOS die developer tools installieren xcode-select --install
- Windows: WSL einrichten dafür gerne das Hannah Bast Wiki befolgen
3. Repository auschecken (einmalig)
Im Terminal:
svn checkout --username <RZ-LOGIN> https://daphne.tf.uni-freiburg.de/<SEMESTER>/<KURS>/svn/<RZ-LOGIN> Beispiel:
svn checkout --username ab123 https://daphne.tf.uni-freiburg.de/ss2026/AlgoDat/svn/ab123- Du wirst nach deinem Passwort gefragt werden, dein Passwort ist einfach dein RZ-Passwort
- Es wird ein lokaler Arbeitsordner erstellt (auf deinem Rechner)
4. Struktur für ein Übungsblatt
Grundlegend gilt, zuerst erstellt ihr den Ordner fürs Übungsblatt, macht eure Lösungen in den Ordner und ladet die Lösungen dann in svn hoch.
cd <Dein-Kürzel>
mkdir uebungsblatt-01
svn add uebungsblatt-01Dateien hinzufügen:
touch uebungsblatt-01/erfahrungen.txt
svn add uebungsblatt-01/erfahrungen.txtAm besten statt einer leeren Datei (durch touch generiert) korrekte Lösungen zum Übungsblatt hinzufügen.
5. Abgabe (Commit)
Bis jetzt waren alle Änderungen lokal, um diese Änderungen auch auf dem Server durchzuführen müssen die Änderungen "commited" werden.Wichtig: Erst durch Commit wird abgegeben!
svn commit -m "Abgabe Blatt 1"- Ohne Commit → keine Abgabe
- Commit-Nachricht ist verpflichtend
6. Abgabe überprüfen
svn status- Zusätzlich im Browser über Daphne prüfen
- Bewertet wird die letzte Version vor der Deadline
Typischer Workflow
- svn checkout (einmalig)
- Ordner uebungsblatt-xy erstellen
- Lösungsdateien hinzufügen
- svn add <uebungsblatt-xy>
- svn commit -m "..."
Häufige Fehler
- Dateien nicht mit svn add hinzugefügt
- Kein svn commit gemacht
- Falsches Verzeichnis (nicht uebungsblatt-xy)
- Zu spät committed
Minimale Ordnerstruktur
uebungsblatt-01/
erfahrungen.txt
loesungen.pdfSubversion (SVN)
Für zusätzliche Informationen rund um SVN verweisen wir Sie auf Das Hannah Bast Wiki.CI Pipeline
Damit Ihre Übungen vom Build-Server bearbeitet werden können (und damit die Tutoren die Übungsabgaben nicht mühsam suchen müssen), müssen Sie jeweils in einem Unterordner uebungsblatt-xx Ihres Daphne-Homeverzeichnisses liegen, wobei xx die Nummer des Übungsblattes bezeichnet (einstellige Nummern mit führender 0!).
Sobald Sie Ihre Lösungen in den entsprechenden Unterordner Ihres SVN-Repositories hochgeladen haben, führt Daphne die Targets Ihres Makefiles automatisch aus. Anschließend sehen Sie in Daphne das Ergebnis und erhalten eine entsprechende Rückmeldung. Wenn Sie die Style-Konventionen eingehalten haben und alle Unit-Tests erfolgreich durchlaufen, wird ein grüner Haken angezeigt. Andernfalls erscheint ein rotes X. Ein rotes X ist in Ordnung, wenn es durch fehlschlagende, sinnvolle Unit-Tests verursacht wird (z. B. weil Ihre Lösung noch nicht korrekt ist). Nicht in Ordnung sind hingegen Fehler aufgrund fehlender oder fehlerhafter Struktur, etwa bei Verletzungen der Style-Vorgaben oder einem fehlenden bzw. fehlerhaften Makefile.
MatPlotLib
Für manche Programmieraufgaben sollen Sie die Laufzeiten Ihrer Implementierungen auswerten indem Sie Graphen erstellen und einreichen. Wir machen zwar keinerlei Vorgaben über die Software die Sie dafür nutzen sollen, aber da wir in der Vorlesung und für unsere Lösungen in der Übung auf MatplotLib zurückgreifen verweisen wir hier einmal kurz auf das MatPlotLib-Tutorial. Ansonsten können Sie sich auch an dem von uns bereitgestellten Code orientieren.
Zeitmessungen
Um Zeitmessungen zurchzuführen empfehlen wir das Time Modul von Python. Hier ist ein Beispiel wie Sie die Laufzeit ihres Codes prüfen können und das ganze direkt graphisch darstellen lassen.
import time
import matplotlib.pyplot as plt
# specifying the sizes of the input instances
start_value = 1000
end_value = 50001
step_size = 1000
test_range = range(start_value, end_value, step_size)
execution_times = []
# Loop from 'skip' up to 'range_n', stepping by 'skip'
for n in test_range:
# generating random input for our algorithm
input = [random.randint(0, 10000) for _ in range(n)]
# executing our algorithm and measuring the time
start_time = time.time()
my_algorithm(input)
end_time = time.time()
execution_time = end_time - start_time
execution_times.append(execution_time)
# the input sizes in the suitable format for matplotlib
x_values = list(test_range)
plt.figure(figsize=(10, 6))
# Plot the algorithm
plt.plot(x_values, execution_times, label='my Algorithm',
color='red', linewidth=2)
plt.ylabel('Execution Time (seconds)')
plt.title('Time Complexity of my Algorithm')
# Format the rest of the chart
plt.xlabel('Input Size (n)')
plt.grid(True, linestyle='--', alpha=0.7)
# Display the plot
plt.tight_layout()
plt.show()
