Digitale Vorlesung
Die Vorlesung wird auch im Sommersemester 2021 in Form von Videos mit (freiwilligen) Tipps zur Nachbereitung angeboten. Die Videos stammen aus dem Sommersemster 2020; Korrekturen und Anmerkungen sind in einem Addendum zusammengefaßt. Fragen zur Vorlesung können im entsprechenden Forum in Teams gestellt werden. Antworten können nicht nur von allen Tutoren und Dozenten sondern auch von Studierenden gegeben werden (letzteres ist wünschenswert: diskutieren Sie miteinander!).
Im Folgenden finden Sie die Links auf die Videos in Form von Lehreinheiten, die versuchen, das Videomaterial auf die Wochen im Semester zu verteilen (mit Tipps zur Nachbereitung der Videos). Zu jeder Lehreinheit wird auch das entsprechende Übungsblatt gelistet. Derzeit sind 10 Lehreinheiten spezifiziert.
Online Vorlesung in Lerneinheiten
Die Vorlesungsvideos sind in 10 Lehreinheiten eingeteilt. Das Semester hat 14 Wochen und wir planen derzeit mit 11-12 Übungsblättern. Wir empfehlen, jede Woche mindestens eine Lehreinheit (zusammen mit dem Übungsblatt) zu bearbeiten, in den vorletzten beiden Woche das 11. und ggf. 12. Übungsblatt, und in der letzten Wochen den Stoff nochmals quer-Beet zu wiederholen. Die Übungsaufgaben sind auf diesen Rhythmus abgestimmt (am Ende stehen etwas komplexere Aufgaben).
Für jede Lehreinheit stehen ein oder mehrere "Vorlesungs"-Videos zur Verfügung, in denen die Ideen und Hintergründe diskutiert werden. Außerden enthält jede Lehreinheit einige Tipps zur Nachbereitung. Eine aktive Nachbereitung ist wichtig! Setzen Sie sich als Ziel, alle wichtigen Konzepte, die in den Folien und Videos besprochen werden, einmal in der Praxis kurz auszuprobieren, bevor Sie mit den komplexeren Übungsaufgaben beginnen. Wenn ein Video zu langweilig wird ist das nicht schlimm (schauen Sie es ruhig mit höherer Geschwindigkeit, wenn Sie den Stoff schon grob kennen); wirklich feststellen, ob man es verstanden hat, kann man erst, wenn man die Konzepte selbst ausprobiert. Die Hinweise zur Nachbereitung sollen dazu Anregungen geben. Auch hier müssen Sie den Hinweisen nicht starr folgen (die Nachbereitungsaufgaben sind keine offiziellen "Übungsaufgaben", werden also nicht formal überprüft) - passen Sie Ihr Vorgehen Ihren Vorkenntnissen und Verständnislücken an.
Hinweis: Alle Videos werden auch auf dem Panopto-System der JGU gespiegelt. Anders als auf diesen Webseiten stehen die Videos dort im h264/mp4 Format zur Verfügung, das auf mehr Geräten (insbesondere Apple Safari/IPhone ohne Erweiterungen) abspielbar ist. Das Panopto System ist auch skalierbarer und kann noch genutzt werden, falls unser eigener Server die Last nicht bewältigen kann. Klicken Sie auf diesen Link, um auf die Panopto-Seite zu gelangen.
Lehreinheit 1: Versionskontrolle
(geschätzter Aufwand: VID 0.25h + NB 3.5h)
Diese Lehreinheit dient zur Vorbereitung der Übungen. Wir lernen Versionskontrollsysteme wie SVN,HG oder GIT kennen und installieren einen C++-Compiler und eine Entwicklungsumgebung.
Versionsverwaltung mit git: Recherchieren Sie im Internet nach Dokumentation zum Versionsverwaltungssystem git und machen Sie sich mit der Funktionsweise vertraut.
- Für Interessierte:
Ein gehr gutes Buch zu dem Thema ist das Buch „Progit“, das online frei verfügbar ist: (Es reicht vollkommen aus Kapitel 1 bis 3 zu lesen). - Eine Zusammenschrift Konzepte aus dem oben gennanten Buches können Sie hier finden.
- Sofern Sie lediglich die Abgabe absolvieren möchten, ohne sich tiefer mit git zu beschäftigen: Easy Git
Gitlab: Loggen Sie sich auf dem GitLab-Server der JGU ein:
gitlab.rlp.net. Suchen Sie nach den für Sie angelegten Repository mit den Übungsaufgaben. Installieren Sie auf Ihrem System den git-client und erzeugen Sie ein ssh-Schlüsselpaar für den Zugang. Clonen Sie dann das bereitgestellte Repository.
Installation der Entwicklungsumgebung: Installieren Sie auf Ihrem System einen C++-Compiler. Unter Windows empfehlen wir den Microsoft Visual C++-Compiler (der Compiler ist kostenlos als "MS C++ Build Tools" bzw. als Bestandteil des MS Visual Studios "Community Edition" verfügbar), unter Linux und MacOS empfehlen wir CLANG (clang++). Auf allen drei Systemen lohnt es sich, den GNU-C++ Compiler (gcc/g++) ebenfalls zu installieren; unter Windows wird dies bei der Installation von QtCreator im Installer angeboten.
Sollten Sie noch unschlüssig sein, welches Betriebssystem sie nutzen möchten, können Sie eine Installation von Ubuntu-Linux in einer virtuellen Machine via VirtualBox in Betracht ziehen; hier ist die Installation der Werkzeuge über den eingebauten Paketmanager recht einfach (z.B. Pakete "build-essential" und "g++" für den gcc/g++-Compiler).
Hello World: Übersetzen Sie ein "Hello World"-Programm mit dem C++-Compiler auf der Kommandozeile und starten Sie es. Schauen Sie ggf. in das nächste Video rein, um zu verstehen, wie man das macht. Internetrecherche hilft ebenfalls.
IDE/QtCreator: Für die weiteren Übungsaufgaben empfehlen wir die Nutzung einer IDE (Integrated Development Environment). Ein sehr gutes und für alle wichtigen PC-Plattformen frei verfügbares Tool ist der QtCreator. Der Download ist z.B. über
https://www.qt.io/ möglich; wählen Sie die Open-Source Version (GPL/LGPL). Es gibt auch eine kommerzielle Version; diese ist aber sehr teuer und für die Übungen nicht notwendig. Achten Sie auch darauf, die richtige Version für Ihr Betriebssystem und Ihren bereits installierten C++-Compiler auszuwählen.
Übungsblatt: Hello EiS
Abgabe: 27. April 2021, 14:00 Uhr
Über dieses Übungsblatt
Auf diesem Übungsblatt geht es darum, Sie mit den neuen Tools vertraut zu machen.
- Da wäre zum einen die Editor-Compiler-Kombination, die Sie selbstverständlich selbst wählen können; Unterstützung zusichern können wir allerdings nur für CLANG (clang++) (Mac/Linux) und den Visual-Studio Compiler (Windows). Hier werden sicher die größten Schwierigkeiten entstehen. Das Blatt ist so gedacht, dass Sie die Möglichkeit haben, während der Praktika mit den Assistenten eventuell aufkommende Probleme mit dem Setup zu klären.
- Ein anderes wichtiges Thema ist die Auseinandersetzung mit einem Versionsverwaltungssystem. Wir werden ein Tool verwenden, das insbesondere in den letzten Jahren zum Vorreiter avancierte, Git. Da immer mehr größere Softwareprojekte auch auf dieses dezentrale Versionsverwaltungssystem umsteigen, kann ich Ihnen nur empfehlen, sich damit gut auseinanderzusetzen.
[
1] Meine persönliche Empfehlung ist im Laufe des Studiums ein kleines Feature in ein größeres Softwareprojekt mittels Git einzupflegen (selbstverständlich tun dies im Schnitt 9 von 10 Studenten </ironie>). So viel ist sicher: Beim Lesen von Code und beim Stellen eines „Pull-Request“ lernt man Aspekte der Softwareentwicklung kennen, die kleine und abgeschlossene Übungeneinheiten wie unsere nicht vermitteln können. Damit Sie dies also selbstständig tun können, kümmern wir uns innerhalb dieser Übung also um die Basis.
Lehreinheit 2: Grundlagen der Programmierung in C++
(geschätzter Aufwand: VID 2h + NB 3h)
In diesem Abschnitt lernen Sie die Grundlegenden Features von C++ kennen. Wenn Sie Python aus EiP kennen, sollten Sie nun direkt mit dem Programmieren starten können.
Implementieren/übersetzen Sie 1-2 Übungsaufgaben aus Einführung in die Programmierung, die Sie bereits in Python gelöst haben, in C++. Wählen Sie z.B. eine einfache (z.B. Zählen von 1 bis 100 oder ggt berechnen) und, wenn noch Zeit ist, eine kompliziertere (z.B. n-Damen rekursiv, Bubble-Sort mit
std::vector
). Probieren Sie aus, einen zusammengesetzten Datentyp (
struct
) selbst zu definieren.
Eine typische Aufgabe beim Lernen einer neuen Programmiersprache ist es, eine mathematische Größe, wie etwaπ, anzunähern. Die erste Aufgabe haben Sie sicher bereits in EiP gesehen. Als zweite Aufgabe für Sie wollen wir nun ein etwas anderes Experimentnach implementieren. Wir nutzen dazu eine physikalische Simulation. Das Schöne bei unserer Version ist, dass wir zwei Dinge lernen; die einfachste Form der physikalischen Simulation (glauben Sie mir, dieses Experiment ist außerordentlich stabil und benötigt keinerlei Vorwissen zur Numerik oder darunterliegenden Physik) und wie man in C++ while-Loops(und breaks) verwendet.
Übungsblatt: Low-Level-Repräsentation von Zahlen
Abgabe: 4. Mai 2021, 14:00 Uhr
Über dieses Übungsblatt
Auf diesem Übungsblatt schauen wir uns die Basisdatentypen von C++ im Detail an und gewinnen so schon mal einen ersten Einblick in die Machinennähe von C++.
- Zum einen schauen wir uns an, wie Operationen direkt auf Bit-Ebene in C++ bewerkstelligt werden können. Als konkrete Anwendung schauen wir uns an, wie beliebig große Zahlen im Dezimalsystem als Binärcode so codiert werden können, dass eine Ausgabe schnell möglich ist.
- Reelle Zahlen können auf dem Rechner durch Fließkommazahlen approximiert werden. Das Problem dabei ist, dass die Art der Darstellung im Rechner zu einigen Eigenheiten beim Rechnen führt. Welche genau das sind, und wieso sie etwa einige dieser Bugs verhindern könnten, lernen wir in der zweiten Aufgabe.
Lehreinheit 3: Hardwarenahe ("low-level") Programmierung
(geschätzter Aufwand: VID 1.5h + NB 2.5h)
In diesem Kapitel geht es um die Verwendung von Zeigern und die manuelle Speicherverwaltung. Dies ist vielleicht das Feature, das low-level-Sprachen wie C/C++/Pascal/Modula-2/Ada/Rust von weniger hardwarenahen Sprachen wie JAVA, C# und Python abhebt.
Legen Sie selbst ein Array von integer-Zahlen mittels new
an und bearbeiten Sie es (schreiben, lesen, ausgeben). Wenn Sie schnell vorankommen, versuchen Sie eine einfach verkettete Liste.
Übungsblatt: Erste Strukturen
Abgabe: 11. Mai 2021, 14:00 Uhr
Über dieses Übungsblatt
Das Hauptthema auf diesem Übungsblatt sind Strukturen (structs
), die wir zwar bereits in der letzten Lehreinheit kennen gelernt haben, aber noch nicht dazu gekommen sind damit zu arbeiten.
Einerseits eignen sich struct
s hervorragend dafür, zusammengehörige Daten zu gruppieren. Das erleichtert beispielsweise das Weitergeben von Daten zwischen Funktionen. Insbesondere beim Einlesen von Daten aus einer externen Quelle bietet es sich an, diese in ein für C++ verständliches Format zu überführen. Dazu entwickeln wir eine (sehr kleine) Software zum Auswerten biologischer Daten.
In der zweiten Aufgabe schauen wir uns im Gegensatz dazu structs
an, die wir zum Rechnen verwenden können; wir implementieren eine Erweiterung von uint64_t
auf die dreifache Speichergröße von \(192\)-bits.
Lehreinheit 4: Statische Typisierung und generische Programmierung
(geschätzter Aufwand: VID 1.5h + NB 2h) Dieser Abschnitt der Vorlesung behandelt eher theoretische Konzepte: Welche Arten von Typsystemen gibt es in Programmiersprachen und wo ordnen sich Python und C++ dort ein? Es geht natürlich nur um die grundlegenden Begriffe - in den Vertiefungsvorlesungen zu den Programmiersprachen kann man dort wesentlich tiefer einsteigen.
In dem Zusammenhang schauen wir uns auch (ganz kurz) generische Programmierung mit templates an. Alles dies sind eher Exkursionen, um den konzeptionellen Rahmen besser zu verstehen. Konkret wird es bei den Containerklassen und low-level Abstraktionen; dies ist für das Programmieren sehr praktisch.
Schreiben Sie eine einfache Containerklasse, z.B. für Vektoren fester Länge. Experimentieren mit templates (versuchen Sie, Ihrem Vektor beliebige Typen zu erlauben.)
Übungsblatt: Zeiger & Referenzen
Abgabe: 18. Mai 2021, 14:00 Uhr
Über dieses Übungsblatt
Auf diesem Übungsblatt untersuchen wir eines der Killer-Features von C++: Zeiger.
Wie in der Vorlesung (innerhalb von Lehreinheit 03) bereits erklärt sind Zeiger „Verweise“ auf Speicher. Wenn man es geschickt anstellt, kann man mithilfe von Zeigern verhindern sehr große Datenmengen zu kopieren oder man kann auf mannigfaltige Arten und Weisen neue Datenstrukturen implementieren. Eine sehr bekannte ist die Datenstruktur doppelt verkettete Liste (siehe Aufgabe 3). Bevor wir dies jedoch tun, müssen wir die Eigenheiten der Sprache C++ zum Thema Zeiger und Referenzen etwas genauer anschauen (Aufgabe 1) und verstehen, welche Probleme konzeptionell dabei tatsächlich entstehen können (Aufgabe 2).
Gut zu Wissen In aktuellem C++-Code gibt es kaum noch gute Gründe dafür die hier behandelten „raw“-Pointer zu verwenden! Dies gilt insbesondere für high-level Anwendungen. Einen guten Grund werden wir jedoch auf dem nächsten Blatt zum Thema „Speicherverwaltung“ beleuchten. Ziel dieses Blattes ist es also insbesondere nicht zu lernen guten C++-Code zu schreiben, sondern die internen Mechanismen zu verstehen, die wir auf den kommenden Blättern verwenden werden.
Lehreinheit 5: Module in Theorie und Praxis
(geschätzter Aufwand: VID 1h + NB 2h)
Wenn man über C++ redet, kommt man nicht (bzw. seit C++-20 kaum) an "Headerfiles" und "Includes" vorbei. Hier ist die ganze, traurige Geschichte.
Bauen Sie ein triviales Programm, dass aus zwei Modulen besteht. Nutzen Sie einmal die Kommandozeile und einmal eine IDE (z.B. QtCreator).
Übungsblatt: Templates & Speicherverwaltung
Abgabe: 25. Mai 2021, 14:00 Uhr
Über dieses Übungsblatt
Auf diesem Übungsblatt arbeiten wir drei weitere wichtige Inhalte von Lerneinheit 04 auf, Templates, Speicherverwaltung und Containerklassen.
Wir haben im Tutorium 04 und auf dem Übungsblatt 04 zwei „Orte“ zum Speichern von Daten in C++ kennen gelernt:
- Stack: Die Größe des Speichers eines Arrays ist hier zur Compile-Zeit fest und vor allem wird der Stackspeicher (u.a. durch das Betriebssystem) begrenzt.
- Heap bzw. Free Store: Der dynamische Speicher ist im Grunde nur durch den RAM des ausführenden Rechners beschränkt und wird durch
new
angesprochen.
Das Hauptproblem von raw-Pointern ist die einfache Frage, wer sich um das Löschen der unnötigen Objekte kümmert. In Sprachen wie Python oder Java stellt sich die Frage meistens nicht. Dort kümmert sich ein Mechanismus namens
Garbage Collector um das Aufräumen des Speichers.
Auf diesem Blatt werden wir den Begriff der Speicherverwaltung (aus Vorlesung C07) aus zwei verschiedenen Sichtweisen betrachten.
- A1: Als erstes starten wir damit zu verstehen, wie eines der „high-level“ Features in Python, nämlich Tupel, in C++ realisiert werden können. Aus einer high-level perspektive sind dies nämlich Konstrukte, die den Speicher verschiedenartiger Objekte zu einem gemeinsamen Objekt vereinen.
- A2: Als nächstes Kapseln wir etwas aus dem „low-level“ Bereich ab, um uns zukünftig Arbeit und mögliche Fehler zu ersparen; Wir möchten das Problem lösen, dass Arrays in C++ statisch sind und implementieren daher eine abgekapselte Version eines dynamischen Arrays, wie es auch etwa aus Python in Form von Lists bekannt ist.
Und übrigens: Die Strukturen
std::tuple
und
std::vector
, die auf diesem Blatt (natürlich vereinfacht) nachimplementiert werden, dürfen ab dem nächsten Übungsblatt in jeder Lösung mit verwendet werden, sofern es sich anbietet.
[
1] Dabei werden periodisch alle Objekte darauf geprüft, ob es noch einen Zeiger gibt, der darauf zeigt. Alle „freistehenden“ Objekte können demnach gelöscht werden. In C++ gibt es diesen Mechanismus nicht von Haus aus.
Lehreinheit 6: Ideen und Technik der objektorientierten Programmierung
(geschätzter Aufwand: VID 1.5h + NB 2h)
In diesem Kapitel lernen wir, was objektorientierte Programmierung ist, und wie man diese in C++ (im Vergleich zu Python) realisiert (sowohl technisch, aus Sicht des Übersetzers/Interpreters, wie auch -wichtiger- aus Anwendersicht).
Übertragen Sie ein OOP-Beispiel aus EiP (Python) in C++.
Übungsblatt: Einführung OOP
Abgabe: 1. Juni 2021, 14:00 Uhr
Über dieses Übungsblatt
Dieses Aufgabenblatt soll eine Einführung in die Objektorientierte Programmierung darstellen.
- Dazu schauen wir uns als erstes an in welche Probleme man laufen kann, wenn man damit anfängt Klassen in Headerfiles zu deklarieren.
- Als nächstes möchten wir das Konzept der Polymorphie und Vererbung (zwei Grundpfeiler der OOP, siehe Vorlesung zu LE06) an einem einfachen Beispiel nachvollziehen.
- Zuletzt vertiefen wir unser Verständnis der Kapselung. Dies ist die dritte der in der Vorlesung genannten grundlegenden Ideen der objektorientierten Programmierung. Notiz am Rande: die Kapselungsidee haben Sie bereits auf den letzten Blättern kennen gelernt, wenn auch nicht unbedingt explizit unter diesem Namen. ;)
Lehreinheit 7: Analyse und Entwurf größerer Systeme - ein Überblick über Softwareengineering-Methoden
(geschätzter Aufwand: VID 1.5h + NB 2h)
Softwareentwicklung ist ein hochgradig soziologischer Prozess. Das Feld des Softwareengineerings beschäftigt sich mit diesem Problem: Wie können Menschen die Komplexität bewältigen? Dieser Vorlesungsabschnitt gibt einen Überblick über die Probleme und einige Konzepte, die helfen können. Dieser Teil ist sehr viel weniger technisch als der Rest der Vorlesung.
Ausprobieren kann man das nicht in 2h. Dazu gibt es z.B. das SE-Praktikum, und noch viele Jahre an Berufserfahrung. Recherchieren Sie statt dessen im Netz nach modernen Konzepten der Teamarbeit, z.B. "Agile", "Scrum", "Extreme Programming". Was treibt diese Ideen an? Vergessen Sie nicht (am besten auf einer polarisierenden Social-Media-Seite wie dem "programming"-Forum von Reddit oder Hacker-News) nach Kritik zu all diesen Ideen zu suchen ;-)
Übungsblatt: Projektaufgabe Planung + Grundgerüst
Abgabe: 15. Juni 2021, 14:00 Uhr
Über dieses Übungsblatt
Softwareengineering muss geübt werden.
In diesem Praxisorientierten Übungsblatt bekommen Sie die Möglichkeit ein etwas größeres Softwareengeneeringprojekt durchzuführen. Dabei wird im Gegensatz zur Funktionalität die genaue Struktur des Projektes nicht spezifiziert, weshalb es sich um eine Kreativaufgabe handelt. Bitte beachten Sie, dass es sich besonders bei dieser Übung um eine Gruppenarbeit handelt wobei es das Ziel ist es dass jede Lerngruppe jeden Schritt von der Konzeption bis zum finalen Code gemeinsam löst.
Die Aufgabe teilt sich in drei Teile auf.
Die Aufgabe teilt sich in Planung, Umsetzung und Erweiterung auf. Bei der Planung geht es darum, die grobe Struktur und das Zusammenspiel der verschiedenen Klassen zu erklären. Im Umsetzungsteil soll dieser abstrakte Plan als Code implementiert werden. Einer der schwersten Aspekte des Softwareengineering ist es Code zu schreiben, der flexibel und wartbar ist. Aus diesem Grund haben wir eine Erweiterung als letzten Teil der Übung angedacht: nach Fertigstellung des Hauptprojektes soll ein weiteres Feature eingebaut werden. Falls ihr Code gut gestaltet ist, sollte Ihnen dies leichter fallen. Nach einer Woche Bearbeitungszeit erscheint der Erweiterungsteil der Aufgabe. Die Erweiterung im Vorhinein nicht zu kennen ist hier teil der Übung.
Ablauf
In diesem Übungsblatt sollen Sie das Projekt planen und das Grundgerüst erarbeiten. Nach einer Woche erscheint ein weiteres Übungsblatt zum Erweiterungsteil der Übung, in dem weitere Features zu Ihrem Projekt hinzugefügt werden. Das komplette Projekt hat einer Bearbeitungszeit von zwei Wochen. Die Abgabe der beiden Teile erfolgt in ein einziges Repository.
Übungsblatt: Projektaufgabe Erweiterung
Abgabe: 15. Juni 2021, 14:00 Uhr
Über dieses Übungsblatt
In diesem Übungsblatt werden nun einige Features auf das Grundgerüst der letzten Woche gebaut.
Lehreinheit 8: Architekturbeispiele für OOP, Vergleich zu funktionalem Entwurf
(geschätzter Aufwand: VID 2h)
Wie entwerfe ich ein größeres System mit objektorientierten Methoden? In diesem Video schauen wir uns an einem konkreten Beispiel an, wie man so etwas machen kann. Darüber hinaus gibt es einen (groben) Vergleich zu funktionalen Ideen, und wir lernen das Expression-Problem kennen, dass die beiden Ideen als komplementär darstellt in Bezug auf die Probleme, die man damit am einfachsten/elegantesten (leicht erweiterbar) lösen kann.
Die Ideen werden intensiver in den Übungen verfolgt - planen Sie hier mehr Zeit ein. Vergessen Sie auch nicht, im Internet auf den üblichen Plattformen nach der Kontroverse / Auseinandersetzung zwischen dem "OOP" und dem "functional"-Lager zu suchen. Die Diskussion ist zum Teil sehr polarisiert. ;-)
Übungsblatt: Weitere Architekturbeispiele & Lambda-Ausdrücke
Abgabe: 22. Juni 2021, 14:00 Uhr
Über dieses Übungsblatt
Auf diesem Übungsblatt möchten wir uns weitere möglichkeiten Ansehen mehr Struktur in Code zu bringen. Als erstes schauen wir uns dazu das Decorator-Pattern am Beispiel von Streams an, das uns ermöglicht beliebig komplexe Klassen durch Verschachtelung zu generieren. Im zweiten Teil des Blattes schauen wir uns an, wie funktionale(re)r Code mittels C++ realisiert werden kann.
Lehreinheit 9: Graphische Benutzerschnitstellen
(geschätzter Aufwand: VID 1h + NB 3h)
In diesem Kapitel lernen wir die architektonischen Prinzipien von typischen GUI-Systemen/Bibliotheken kennen. Vielleicht bekommen wir sogar einen Anruf aus Hollywood (sicher nicht für das Video, aber vielleicht für das Widget).
Programmieren Sie eine "Hello World"-Applikation in Qt (z.B. ein Fenster, das einen Button enthält). Fügen Sie einige weitere Widgets hinzu und experimentieren Sie damit.
Übungsblatt: GUI Basics
Abgabe: 29. Juni 2021, 14:00 Uhr
Über dieses Übungsblatt
Programmierung von GUIs ist ein Thema, dass vieles bereits gelernte vorraussetzt, zusätzlich werden neue Dinge eingeführt. Damit Sie die Möglichkeit haben sich gründlich damit auseinanderzusetzen, wird sich dieses Blatt ausschließlich mit der Programmierung von GUIs in C++ mittels des Qt-Frameworks befassen. Dieses hat einige Vorteile:
- Qt-Code kann plattformübergreifend kompiliert werden
- Qt ist open source und hat eine sehr große Userbase
- Qt enthält einige Wrapper für andere Sprachen. So kann Ihr Qt-Code fast 1:1 in anderen Sprachen eingebettet werden, etwa mittels PyQt in Python. Mit anderen Worten: Die Zeit, die Sie in dieses Übungsblatt stecken ist automatisch auch eine Investition in die Erstellung von GUIs mit anderen Programmiersprachen.
[
1] Für das Schlagwort „Qt C++“ gibt Google 23 Mio Suchergebnisse an.
Lehreinheit 10: Nebenläufige Systeme
(geschätzter Aufwand: VID 1h + NB 2h) Zum Schluss schauen wir noch ganz kurz auf die parallele Programmierung. Wir können dieses Thema nur anreißen, bekommen aber einen ersten Einblick in die Techniken und Probleme.
Schreiben Sie eine kleine Qt-Konsolenanwendung, die mit zwei Threads parallel Text auf der Konsole ausgibt und dabei die Threads so koordiniert (z.B. mit einem Mutex), dass keinen Textblöcke vermischt werden. Was passiert, wenn man die Koordination ausschaltet (oder noch nicht eingebaut hat)?
Übungsblatt: Threads
Abgabe: 6. Juli 2021, 14:00 Uhr
Über dieses Übungsblatt
Nicht nur Rechenkluster und die haushaltsüblichen Multicpu-Systeme fördern das Arbeiten mit parallelisierbaren Algorithmen. Auch Benutzeroberflächen (Sie möchten nicht, dass Ihr Programm stehen bleibt, wenn sie eine aufwändige Rechnung durchführen) und Webprotokolle, die das Internet mit asynchronen (non-blocking) Ansätzen zu mehr gleichzeitig möglichen Anfragen pro Anwendung führte, benötigen mehr als einen Thread pro Programm. Auf diesem Übungsblatt werden wir uns einige einfache Ansätze zum Thema „Parallelisierung“ anschauen.
Beachten Sie, dass wir auf diesem Blatt noch einmal viele Bonusaufgaben hinzugefügt haben, sollten Sie noch Punkte für die Zulassung benötigen.
Lehreinheit 11: Übungsaufgabe Systementwicklung
Übungsblatt: Projektaufgabe
Abgabe: 13. Juli 2021, 14:00 Uhr
Über dieses Aufgabenblatt
Übrigens: Dieses Übungsblatt enthält gelbe Felder, die Zusatzinformationen anzeigen, wenn Sie mit der Maus darüber Fahren.Ziel dieses Übungsblattes ist es das angegebene Problem möglichst eigenständig zu lösen.Im Rahmen dieses Aufgabenblattes werden wir ein einfaches Computeralgebra-System in vier Schritten zu programmieren:
- Parsing:
Zuerst konvertieren wir einen linear als Zeichenkette (String) codierten mathematischen Ausdruck (z.B. 3*(b + a*2) / (1 + sin(1-b)^2)^2
) in eine Hierarchie von Konstanten, Variablen und Funktionen.
Ein Konzept für eine solche Hierarchie selbst zu entwickeln ist dabei Teil der Aufgabe. - Evaluation:
Mit der eben bestimmten Darstellung können wir nun Computeralgebra betreiben: Als erstes nutzen wir die Darstellung, um den Wert des Ausdrucks zur Laufzeit auszuwerten (im Beispiel: für a
und b
Zahlen einsetzen und das Ergebnis berechnen). Dies ist eine Aufgabe, die ein Interpreter wie Python ständig bewältigen muss.
- Manipulation:
Darauf aufbauend schauen wir uns algebraische Umformungen an — hat man schon eine Baumdarstellung, so ist dies relativ einfach. Als Beispiele für Computeralgebra haben wir uns die Ableitung von einfachen Funktionen rausgegriffen. - GUI:
Zuletzt sollen die obigen Teile bequem in einer GUI für einen Nutzer bequem verwendbar zusammengefasst werden.
Warum der ganze Aufwand? Die Aufgabe soll dazu dienen noch einmal das praktisch gelernte nochmals Anwenden zu können: GUIS, statische Typisierung & objektorientiertes Programmieren, dynamic Dispatch und funktionale Ansätze werden hier in einer weiteren Softwaredesignübung vereint.
Was tun, wenn alles schief geht? Sollten Sie Probleme beim Implementieren des Parsers haben, können Sie trotzdem den Rest des Projektes bearbeiten. Dazu können Sie die Objektbäume für die Ausdrücke direkt im Code konstruieren (man programmiert nur die Klassen zur Repräsentation von Ausdrücken, braucht aber keinen funktionierenden Parser).