Allgemeine Erläuterungen: 
Gehen Sie für alle Fragen mit Codebeispielen davon aus, dass alle #includes und using namespace Anweisungen korrekt gesetzt wurden und alleinstehende Funktionen sinnvoll in ein Gesamtprogramm eingebunden wurden, falls nötig.
Es gibt keine negativen Punkte bei den Aufgaben. D.h. Raten lohnt sich ausnahmsweise.
Viel Erfolg!

1C++ Basics

1.1 Was brauche ich mindestens, um ein C++ Programm zu erstellen?
Welche der unten stehenden Aussagen sind richtig(+) und welche falsch(-)?

Ich benötige einen Editor.
ich benötige einen Compiler
Ich benötige einen Linker.
Ich benötige einen Interpreter.

1.2 Welche der folgenden Datentypen zählen in C++ zu den Basisdatentypen?


1.3 Type Safety.
Welche der untenstehenden Zeilen kompilieren ohne Probleme(+) und welche erzeugen Warnings oder Fehler(-)?
Anmerkung: Gehen Sie von den in der Übung empfohlenen Warning-Levels (/W4 bzw. -Wall -Wextra -pedantic) aus.

int i = 123.456;
float f = 123,456;
unsigned int ui = 123 - 456;
bool b = 123 < 456;

1.4 Bezogen auf den angegebenen Code, welche der untenstehenden Aussagen sind richtig(+) und welche falsch(-)?

 

Es wird bei der Ausführung mindestens eine "0" ausgegeben.
Es wird bei der Ausführung mindestens eine "1" ausgegeben.
Es wird bei der Ausführung mindestens eine "2" ausgegeben.
"a" und "a" in den Zeilen 1 und 3 sind zwei verschiedene Variablen.

2Algorithmen und Datenstrukturen

2.1 Welche Aussagen über Hash-Tabellen sind wahr(+) und welche nicht(-)?

Der Überlauf einer Hash-Tabelle mittels sequentieller Container ermöglicht es, mehr Schlüssel-Wert-Paare zu speichern, als die Hash-Tabelle Einträge hat.
Eine Verlängerung der Hash-Tabelle ist mit wenig Aufwand möglich.
Ein Füllgrad von mehr als 80% einer Hash-Tabelle verbessert die Zugriffszeit.
Einfügen, Auffinden und Löschen von Elementen in einer Hash-Tabelle (unordered_map) geschieht in O(1).

2.2 Welche Aussagen über Hash-Funktionen sind wahr(+) und welche nicht(-)?
Erläuterungen für untenstehenden Code:    
- % ist der Modulo-Operator, der einem den Rest bei einer Integerdivision zurückliefert.    
- abs() ist die Betragsfunktion.

 

Allgemein: Jeder Schlüssel bekommt exakt einen Wert aus einer Hash-Funktion zugeordnet
Allgemein: In einer perfekten Hash-Funktion (nicht Hash-Tabelle) können Kollisionen auftreten.
Allgemein: Hash-Funktionen sollten möglichst komplex sein, damit sie perfekt sind.
Zu obigem Code: Bei der Hash-Funktion für welche obiger Code zur Berechnung verwendet wird können Kollisionen auftreten.

2.3 Welche Aussagen über C++ Container sind wahr(+) und welche nicht(-)?

In Listen kommen niemals zwei Elemente mit gleichen Werten vor.
Listen sind stets sortiert.
Ein vector speichere shared_ptr auf eine selbstgeschriebene Klasse Data. Wenn dessen Kapazitätsgrenze überschritten wird, werden der Inhalt des Vectors und alle Data - Elemente auf die die shared_ptr des Vectors verweisen automatisch umkopiert.
Ein set sortiert seine Einträge.

2.4 Welche der untenstehenden Aussagen sind wahr(+) und welche nicht(-)?

 

Allgemein: Abgeleitete Klassen können stets auf alle Elemente ihrer Basisklassen zugreifen.
Zu obigem Code: In obigem Code ist zur Compilezeit immer klar, von welcher Klasse die add(int i) Methode ausgeführt wird.
Zu obigem Code: CustomArray in obigem Code ist eine abstrakte Klasse.
Allgemein: Der Typ eines Templates kann auch erst zur Laufzeit definiert werden.

2.5 Es soll eine Funktion geschrieben werden, die überprüft, ob eine bestimmte Zahl in einem vector von int-Werten vorkommt. Welche der unten stehenden Funktionen (existsInContainer1 und existsInContainer2) kompiliert und liefert das korrekte Ergebnis zurück bzw. welche der folgenden Aussagen sind korrekt(+) und welche nicht(-)?

 

existsInContainer1 kompiliert und liefert das korrekte Ergebnis.
existsInContainer2 kompiliert und liefert das korrekte Ergebnis.
In existsInContainer1 iteriert die for Schleife über sämtliche Einträge im Vector v, falls die gesuchte Zahl nicht in der Liste enthalten ist.
In dem Vector v in den Beispielen können auch Elemente vom Typ double enthalten sein, der Compiler würde eine automatische Typumwandlung vornehmen.

2.6 In untenstehendem Code soll die Methode add(T t) dafür sorgen, dass jedes Element nur einmal im Container entries hinzugefügt werden kann. Aktuell erfüllt der Code der Klasse EachElementOnlyOnce diese Anforderung noch nicht. 
Welche der folgenden Ergänzungen/Ersetzungen (Code Alternative 1 und Code Alternative 2) der Zeile "// insert code here"  kompiliert und erfüllt diese Anforderung bzw. welche der folgenden Aussagen sind wahr(+) und welche nicht(-)?

 

Die Ersetzungen aus der Code Alternative 1 kompilieren und erfüllen die Anforderungen.
Die Ersetzungen aus der Code Alternative 2 kompilieren und erfüllen die Anforderungen.
Der generische Typ T bedeutet, dass bei der Instanziierung eines Objekts vom Typ EachElementOnlyOnce der Typ festgelegt wird, den alle Elemente der Liste entries haben müssen.
Die Methode add(T t) gibt ein Element vom Typ void zurück.

2.7 Welche der folgenden Aussagen bzgl. Bäume sind wahr?

Bäume ohne Verbindung zum Elternknoten können Kreise haben.
In Bäumen hat jeder Knoten genau einen Eltern-Knoten bis auf den Wurzelknoten.
In binären Bäumen hat jeder Knoten, der kein Blatt ist zwischen 1 und 2 Kind-Knoten.
Durch Verwendung von shared_ptr für die Zeiger auf Kind- und Elternknoten kann man für einen Knoten den Zeiger auf ein Kind einfach auf nullptr setzen und der entsprechende Teilbaum wird aus dem Speicher gelöscht.

2.8 Es soll ein Container aus der C++ Standardbibliothek genutzt werden, um zu erkennen, wieviele wertidentische Elemente vom selbstdefinierten Typ Data diesem hinzugefügt wurden. Data hat dabei alle notwendigen Operatoren, wie ==, <, >, etc. entsprechend überladen. Welche der folgenden Container eignen sich dafür?

 

Der Datentyp 1. im Bild ist geeignet.
Der Datentyp 2. im Bild ist geeignet.
Der Datentyp 3. im Bild ist geeignet.
Der Datentyp 4. im Bild ist geeignet.