Aufgabenblock 3
In diesem Aufgabenblock geht es um Arrays mit unterschiedlichen Dimensionen. Hierdurch werden natürlich auch die Themen Call-by-Reference, Call-by-Value und dynamische Speicherverwaltung relevant. Probieren Sie unterschiedliche Arten aus, Parameter zu übergeben.
3.1 Call-by-What?
Implementieren Sie folgende Funktionen, die zwei Parameter bekommen und ein Ergebnis erzeugen:
- Geben Sie das Maximum zweier Werte zurück
- Geben Sie die gerade Zahl zurück (sind beide Zahlen gerade, so geben Sie den ersten Parameter zurück)
- Geben Sie die Zahl mit dem größeren Betrag zurück
Variationen Implementieren Sie die gewünschten Funktionen in folgenden Varianten:
- Die Funktion erhält zwei Parameter, die mithilfe von Call-by-Value übergeben werden und das Ergebnis zurückgibt
- Die Funktion erhält zwei Parameter, die mithilfe von Call-by-Value übergeben werden und einen Parameter, der mittels Call-by-Reference übergeben wird und in dem das Ergebnis gespeichert werden soll
- Die Funktion erhält einen Parameter mittels Call-by-Value und einen Parameter mittels Call-by-Reference. Das Ergebnis soll in dem Call-by-Reference-Parameter gespeichert werden.
3.2 Felder umdrehen
Schreiben Sie eine Funktion, die ein Feld als Parameter bekommt und die Reihenfolge der Elemente des Feldes umdreht.
3.3 Felder vergrößern
Schreiben Sie eine Funktion, die die Größe eines übergebenen Feldes verdoppelt. An der Position des neuen Feldes soll der Wert an der Stelle des Parameterfeldes stehen. An der Stelle soll der doppelten Werte der Stelle des Parameterfeldes stehen. Aus dem Feld wird also das Feld .
Hinweis: Testen Sie, auf welche Arten Sie das Feld übergeben können (Call-by-Reference, Call-by-Value) und ob Sie einen Rückwert brauchen.
3.4 Vektorrechnung
Schreiben Sie einen kleinen Vektor-Taschenrechner. Vektoren sollen hierbei in Ihrem Programm als ein-dimensionale Arrays dargestellt werden. In Ihrem Hauptprogramm fragen Sie den Nutzer, welche Operationen er durchführen möchte und anschließend lesen Sie die entsprechenden Parameter ein. Mögliche Operationen sind:
- Vektoraddition:
- Vektorsubtraktion:
- Multiplikation eines Vektors mit einem Skalar:
- Skalarprodukt:
In einer einfachen Implementierung können Sie davon ausgehen, dass Sie immer Vektoren mit drei Komponenten haben. Möchten Sie ihr Programm etwas aufwändiger gestalten, so können Sie die Vektorgröße natürlich auch variabel gestalten.
Hinweis: Implementieren Sie jede der oben genannten Funktionen als eigenständige Funktion mit entsprechenden Parametern und Rückgabewerten.
Herausforderung: Sollten Sie sich noch an die map aus der STL erinnern, können Sie Ihren Vektoren auch Namen geben und diese in der Map speichern. Bei den Rechnungen können Sie die Vektoren dann aus der Map lesen und müssen nicht in jedem Schritt einen neuen Vektor eingeben.
3.5 Transponieren einer Matrix
Schreiben Sie ein Programm, das vom Nutzer ein zwei-dimensionales Array von Zahlen einliest (Sie können sogar die Dimensionen abfragen). Nachdem Sie das Array eingelesen haben, schreiben Sie eine Funktion transpose, die das eingegebene Array entgegennimmt (inkl. der Informationen zu den Dimensionen) und es transponiert. Beim Transponieren einer Matrix wird aus der -ten Zeile die -te Spalte (und umgekehrt). Dies erfordert bei Eingaben mit unterschiedlichen Dimensionen, dass Sie ein neues Array anlegen müssen.
Hinweis: Sie können natürlich auch Ihr Programm zur Vektorrechnung um diese Matrizenoperation erweitern.
Pascal und sein Dreieck
Eine Reihe von Mathematikern haben sich ein Konzept zur Errechnung der Binomialkoeffizienten ausgedacht. Unter diesen Mathematikern waren Blaise Pascal, Yang Hui, Nicolo Tartaglia und Omar Chayyām. Das Dreieck beginnt mit der 0ten Zeile. Die -te Zeile dieses Dreiecks hat exakt Einträge. In jeder Zeile wird das erste und das letzte Element mit 1 belegt. Alle weiteren Einträge in der Spalte ergeben sich aus der folgenden Formel: . Schreiben Sie eine Funktion, die die Binomialkoeffizienten der -ten Zeile berechnet. Geben Sie anschließend die Einträge aus. Sie können natürlich auch die binomische Formel entsprechend ausgeben (siehe Wikipedia-Eintrag zu Binomialkoeffizient).
Hinweis: Sie können die Aufgabe als Übung sowohl iterativ als auch rekursiv lösen.
Herausforderung: Schreiben Sie eine weitere Funktion, die die ersten n Zeilen des Dreiecks berechnet und als zweidimensionales Array zurück gibt. Hierbei soll jede Zeile nur die Größe haben, die notwendig ist, um alle erforderlichen Zahlen zu speichern.
Zusatz: Sie können das Pascalsche Dreieck auch in ein Bild umwandeln. Verwenden Sie die Zeilen und Spalten als Indizes der Pixel und setzen Sie nur bei ungeraden Werten den Pixel auf eine beliebige Farbe.
3.7 Ordnung muss sein
Während die Programme bisher von vielen in einer Datei entwickelt wurden, soll es nun darum gehen ein wenig Ordnung in das Chaos zu bringen. Vektor- und Matrizenrechnung braucht man bei unterschiedlichen Problemen. Daher soll die Lösung der Aufgabe zur Vektor- und Matrizenrechnung auf mehrere Dateien verteilt werden, um eine Wiederverwendung zu ermöglichen. Legen Sie hierfür separate Header- und Source-Dateien für Vektoren und Matrizen an. Die Header-Dateien sollen die existierenden Funktionen deklarieren und die zugehörigen Source-Dateien sollen die entsprechenden Definitionen der Funktionen enthalten.