Abgabe bis 9.1.2025
Legen Sie ein Arbeitsverzeichnis für Aufgabe 5 an und speichern Sie darin das Archiv ⤵ aufgabe5.tar.gz. Entpacken sie das Archiv mit dem folgenden Kommando:
tar xzf aufgabe5.tar.gzIhr Arbeitsverzeichnis von Aufgabe 5 sollte anschließend die vier Dateien
Makefile
,
notenspiegel.cpp
,
notenspiegel-in.txt
und
notenspiegel-out.txt
enthalten.
Das vorgegebene Programm notenspiegel.cpp
erstellt einen
Notenspiegel. Ergänzen Sie die fehlenden Übersetzungseinheiten
wie folgt:
Erstellen Sie eine Übersetzungseinheit benotung
,
die eine gleichnamige Wertklasse mit den folgenden Komponenten
enthält:
note
vom Typ int
benotung(int)
zum Initialisieren der Membervariablenstd::invalid_argument
mit "unzulaessige Note "
und der falschen Note als Fehlertext (zulässig sind die Noten
10, 13, 17, 20, 23, 27, 30, 33, 37, 40, 50)beste
und schlechteste
vom Typ benotung
mit der besten
bzw. schlechtesten Noteint int_value()
,
die die im Objekt gekapselte Note liefertbool ist_bestanden()
,
die true
liefert, wenn der Wert der gekapselten Note kleiner oder
gleich 40
ist, sonst false
bool operator==(benotung, benotung)
,
die true
liefert, wenn beide Objekte die gleiche Noten kapseln,
sonst false
benotung
? Implementiert er die in diesem Fall korrekt?
Erstellen Sie eine Übersetzungseinheit fachnote
,
die eine gleichnamige Entitätenklasse mit den folgenden Komponenten
enthält:
fach
vom Typ std::string
und
note
vom Typ benotung
zum Speichern eines Fachnamens mit Notefachnote(const std::string&, const benotung&)
zum Initialisieren der Membervariablenstd::invalid_argument
, wenn diese Konsistenzregel
verletzt ist.= delete
unterdrücken müssen
Erstellen Sie eine Übersetzungseinheit fachnoten_liste
,
die eine gleichnamige Entitätenklasse enthält. Verwenden Sie das
Vorlesungsbeispiel intlist
aus Teil 6 als Vorlage und
sehen Sie die folgenden Änderungen vor:
fachnote*
statt int
speichern.notenspiegel.cpp
ab. Speichern Sie die übergebene
Funktionsadresse in einer zusätzlichen privaten Membervariablen.fachnote
-Objekts freizugeben.Verwenden Sie zum Testen die gewohnten Befehle:
make make cppcheck ./notenspiegel valgrind ./notenspiegel
Führen Sie auch die folgenden automatisierten Tests aus:
valgrind ./notenspiegel < notenspiegel-in.txt ./notenspiegel < notenspiegel-in.txt > out.txt diff -Z notenspiegel-out.txt out.txt
valgrind
darf keine Fehler und diff
keine Unterschiede melden.cppcheck
sollte möglichst keine Probleme melden.Bessern Sie gegebenenfalls nach.
Führen Sie Ihr Programm mit den automatisierten Tests vor.
Zeigen Sie das ausgefüllte Teilnahmeprotokoll.
Hinweis:
Der Compiler g++
darf für Ihr Programm
keine Fehler oder Warnungen mehr ausgeben.
Ihr Programm muss außerdem ordentlich formatiert sein.
Bessern Sie die Formatierung gegebenenfalls mit astyle
nach:
astyle -p -H --style=ansi *.[ch]*
benotung
einen weiteren Konstruktor benotung(int, int)
, der das Objekt
mit dem Mittelwert der beiden übergebenen Einzelnoten initialisiert.
Werfen Sie bei unzulässigen Einzelnoten analog zum anderen Konstruktor
eine Ausnahme vom Typ std::invalid_argument
.
Erweitern Sie notenspiegel.cpp
um die Möglichkeit,
bei einem Fach wahlweise eine oder zwei Noten eingeben zu können.
fachnoten_liste::insert(fachnote*)
neue Noten nicht
am Anfang der Liste ein, sondern suchen Sie mit einer Schleife die richtige
Einfügestelle. Als Voraussetzung brauchen Sie für die Wertklasse
benotung
eine Ordnungsrelation in Form eines befreundeten
operator<
.
fachnote
als
private
und ergänzen Sie eine Fabrikfunktion
new_instance
, die einen Zeiger vom Typ
std::unique_ptr<fachnote>
liefert
(siehe das Vorlesungsbeispiel termin
in Teil 6).
Verwenden Sie dann in notenspiegel.cpp
statt der eigenen
fachnoten_liste
eine Liste
std::forward_list<std::shared_ptr<fachnote>>
.
Die Entsprechung zur Memberfunktion insert
heißt dort
push_front
. Die Funktion delete_fachnote
in
notenspiegel.cpp
können Sie nun weglassen, weil die
Destruktoren von std::forward_list
und std::shared_ptr
den Speicher von Liste und Listenelementen automatisch freigeben.
Prüfen Sie das mit valgrind
nach.