Wissenfragen
Code Aufgaben
Anwendung
Transferaufgaben
100

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.

100

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

100

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

100

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.

200

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

200

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;
}


200

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

200

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

300

Erkläre den Unterschied zwischen statischem und dynamischem Polymorphismus in C++. Gebe jeweils ein Beispiel an!

  • Statisch: zur Compile-Zeit (Templates)
  • Dynamisch: zur Laufzeit (virtuelle Funktionen)

Beispiel: siehe Tut 10

300

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;

}


300

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

300


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

400

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?



  • Definition: Ein Iterator ist ein Objekt, das dazu verwendet wird, über die Elemente eines Containers zu iterieren. Es stellt eine Schnittstelle bereit, um auf die Elemente zuzugreifen, und ermöglicht die Navigation durch den Container.
  • Verwendung mit Containern: Iteratoren werden in Verbindung mit Containern verwendet, um die Elemente sequenziell zu durchlaufen.
  • Vorteile: Iteratoren bieten eine abstrahierte Möglichkeit, auf die Elemente eines Containers zuzugreifen, unabhängig von der tatsächlichen Implementierung des Containers.
400


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

400

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


400

Erkläre die Laufzeitunterschiede zwischen virtuellen Funktionen, Funktionstemplates und Inline-Funktionen in C++. 

  • Virtuelle Funktionen: Bietet Flexibilität und Polymorphie auf Kosten von Laufzeitoverhead. Geeignet für Szenarien mit dynamischer Bindung.
  • Funktionstemplates: Erzeugt spezifischen Code zur Kompilierzeit und ermöglicht generischen Programmcode. Praktisch für allgemeine Algorithmen.
  • Inline-Funktionen: Vermeidet Funktionsaufruf-Overhead durch direkte Codeersetzung. Effizient für kurze Funktionen.