Erkläre den Unterschied zwischen Compile- und Laufzeit.
Der Compilezeit ist die Zeit während der Übersetzung des Codes in Maschinencode, während die Laufzeit die Zeit ist, während der das Programm ausgeführt wird.
Schreibe ein C++-Programm, das eine Klasse für eine geometrische Form namens "Rechteck" implementiert. Die Klasse soll die Länge und Breite eines Rechtecks speichern können, einen Konstruktor haben, um die Werte zu setzen, sowie Methoden zur Berechnung des Umfangs und der Fläche des Rechtecks.
ZUSATZ: Erweitere das Programm, um ein Array von Rechtecken zu erstellen und die Fläche des Rechtecks mit der größten Fläche auszugeben.
s.h Code
Erkläre den Unterschied zwischen call by value und call by reference und wie verhält sich die Übergabe bei feldern
call by value: Wert des Arguments wird kopiert
call by reference: Mittels Zeigern wird auf das Orginal objekt verwiesen
Felder:
Standardmäßig per Referenz übergeben
Was ist der Unterschied zwischen Stack und Heap?
Der Stack wird für lokale Variablen und Funktionsaufrufe verwendet, während der Heap dynamischen Speicher für Objekte verwaltet.
Was versteht man unter zusammengesetzten Datentypen?
"zusammengesetzte Datentypen" sind Datenstrukturen, die aus mehreren elementaren Datentypen oder anderen zusammengesetzten Datentypen zusammengesetzt sind. Diese Datentypen erlauben es, mehrere Werte oder Informationen unter einem einzigen Namen zu gruppieren.
Wir kennen: Arrays, Enums, Klassen und Structs
Gegeben sei folgende Analyse einer Funktion int fun(int a, int b) mittels des
Substitutionsmodells:
1 fun (3 ,5)
2 = fun (8 ,4)
3 = fun (12 ,3)
4 = fun (15 ,2)
5 = fun (17 ,1)
6 = fun (18 ,0)
7 =18
Implementieren Sie int fun(int a, int b) funktional, sodass fun(3,5) dem Verhalten in dem Modell entspricht.
int fun(int a, int b) {
if (b == 0) {
return a;
} else {
return fun(a + b, b - 1);
}
}
int main() {
int result = fun(3, 5);
std::cout << "Das Ergebnis von fun(3, 5) ist: " << result << std::endl;
return 0;
}
Geben Sie die gegebenen Ausdrücke in Infix-Notation und als Bäume an
• 5 5 + 2 * 4 17 + 20 12 - * -
• + A * B / C - E F
Tafel
Wie kann ich bei zwei Klassen A und B ohne Vererbung erreichen, dass A Zugriff auf die privaten Mitglieder von B hat.
Ergänze friend class A; in der Implementierung von B
Erkläre den Unterschied zwischen statischem und dynamischem Polymorphismus in C++. Gebe jeweils ein Beispiel an!
Beispiel: siehe Tut 10
Bei einem C-style String handelt es sich um ein Array von Zeichen, welches mit einen
Nullzeichen ('\0') endet.
Schreibe eine Funktion void printCString(const char* str), die einen solchen C-style String Zeichen für Zeichen ausgibt. Nutze einen Pointer um durch jedes Zeichen des Strings zu iterieren und gebe dieses jeweils aus. Die Funktion soll mit dem Iterieren aufhören, wenn das Nullzeichen gelesen wird. Teste die Funktion mit einem
beliebigen String-Literalwert (z. B. "Hello, world!").
#include <iostream>
void printCString(const char* str) {
// Verwende den Pointer, um durch den String zu iterieren
while (*str != '\0') {
std::cout << *str;
str++;
}
std::cout << std::endl;
}
int main() {
const char* myString = "Hello, world!";
printCString(myString);
return 0;
}
Zeichnen Sie das Umgebungsmodell für den folgenden Code vor der Ausführung
der Zeile 6
1 i n t a =10;
2 i n t b=0;
3
4 v o i d f o o ( i n t n ) {
5 b=n+a++;
6 r e t u r n ;
7 }
8
9 i n t main ( ) {
10 i n t x=5;
11 {
12 i n t y =100;
13 }
14 f o o ( x ) ;
15 }
siehe Folien Tut 10
Schreibe eine templatisierte Klasse mit dem Namen Pair, welche es dem Nutzer erlaubt einen Template-Typ einzugeben, welcher für beide Werte des Paares genutzt wird.
Dieser Code sollte funktionieren:
int main() {
Pair<int> p1 { 2, 3 };
std::cout << "Pair: " << p1.first() << ' ' << p1.second() << '\n';
const Pair<double> p2 { 2.3, 4.5 };
std::cout << "Pair: " << p2.first() << ' ' << p2.second() << '\n';
return 0; }
und folgendes ausgeben:
Pair: 2 3 Pair: 2.3 4.5
s.h. Code
Erläutere den Konzept von Iteratoren in C++. Was ist ein Iterator, wie wird er in Verbindung mit Containern verwendet und welche Vorteile bietet die Verwendung von Iteratoren gegenüber anderen Methoden zur Durchquerung von Containern?
Erstelle ein struct Student, welche den Vornamen und eine Punktzahl (zwischen 0– 100) eines Studenten speichert. Implementiere eine Nutzereingabe, die fragt wie viele Studenten erstellt werden sollen. Nutze einen std::vector um die Studenten zu speichern. Frage danach den Nutzer nach jedem Namen und jeder Punktzahl. Wenn der Nutzer alle Namen und Punktzahl Paare eingegeben hat, sortiere die Liste nach Punktzahl (höchste zuerst). Gebe danach alle Namen und Punktzahl in sortierter Reihenfolge aus.
Für die folgende Eingabe:
Theodor 34 Martha 82 Wilhelm 4 Richard 73
sollte die Ausgabe so aussehen:
Martha hat 82 Punkte erhalten Richard hat 73 Punkte erhalten Theodor hat 34 Punkte erhalten Wilhelm hat 4 Punkte erhalten
s.h code
Was wird ausgegeben und warum?
class Base {
public:
virtual void Print() { std::cout << "Base" << std::endl; }
};
class Derived : public Base {
public:
void Print() override { std::cout << "Derived" << std::endl; }
};
int main() {
Base* b = new Derived();
b->Print();
delete b;
}
Derived
Funktion ist virtuell
Erkläre die Laufzeitunterschiede zwischen virtuellen Funktionen, Funktionstemplates und Inline-Funktionen in C++.