﻿------------------------------------------------

Aufgabe 5a.1 
(+) Ein Tischler hat ein Lager mit Brettern in drei Holzsorten (Buche, Eiche u. Mahagoni). Alle Bretter haben den selben Querschnitt, sind aber unterschiedlich lang. Wird ein Brett einer bestimmten Länge verkauft, so wird, falls die entsprechende Länge nicht vorrätig ist, einfach das passende Stück von einem der vorhandenen Bretter abgeschnitten. Um den Verschnitt nicht allzu groß werden zu lassen, soll dabei immer das kürzest mögliche Brett zersägt werden. Schreiben Sie ein Programm, das dem Tischler hilft, sein Lager zu verwalten. Folgende Funktionen sind unabdingbar: Erfassung des aktuellen Bestandes, Einkauf von Brettern beliebiger Länge, Verkauf von Brettern beliebiger Länge (das Programm soll das kürzest mögliche Brett automatisch vorschlagen), Aufräumen des Lagers (dabei werden alle Bretter, die eine vom Benutzer festzulegende Länge unterschreiten, aus dem Lager entfernt). 

------------------------------------------------

Aufgabe 5a.2 
(+) Ein Autoverleih verleiht Autos in den Klassen Economy, Normal und Luxus. Die Verwaltung des Fuhrparks soll durch ein Programm erleichtert werden. Folgende Funktionen sind unabdingbar: Verleih (Der Kunde spezifiziert die gewünschte Klasse und bekommt den durch das Programm ermittelten Stellplatz mitgeteilt), Rückgabe (Der Rechner schlägt einen freien Stellplatz vor und ermittelt die gefahrenen Kilometer), Ausmustern (Die Stellplätze aller Wagen, die eine vom Benutzer vorzugebende Kilometerleistung überschritten haben, sollen vom Rechner ermittelt und ausgegeben werden. Da diese Wagen woanders veräußert werden, sind die entsprechenden Stellplätze ab diesem Zeitpunkt auch wieder als frei zu betrachten). 

------------------------------------------------

Aufgabe 5a.3 
(+) Ein befreundeter fanatischer CD-Sammler hat Sie gebeten, ihm ein einfaches Programm zur Verwaltung seiner Sammlung zu schreiben. Er wünscht sich folgende Funktionen: Für jedes Album sollen Interpret, Name und Stilrichtung speicherbar sein. Eingabe, Ändern und Löschen von Eintragungen soll möglich sein. Eine Suche soll entweder nach Interpret, nach Albumname oder Stilrichtung vorgenommen werden können und eine Liste aller jeweils passenden CDs liefern. 

------------------------------------------------

Aufgabe 5a.4 
(+) Für eine Bar soll ein Programm zur Unterstützung des Einkaufs Verwendung finden. Es wird eine kleine Anzahl von verschiedenen Spirituosen verwendet, um eine ebenfalls kleine Zahl von festgelegten Drinks herzustellen.Die Rezepte für die Drinks sind bekannt und Änderungen im Angebot sind keine zu erwarten. Das Programm soll folgende Funktionen zur Verfügung stellen: Einkauf (Einkauf von Spirituosen), Verkauf (Verkauf von Drinks), Bestandstest (Ausgabe aller Spirituosen, deren Bestand unter einer vom Benutzer zu definierenden Menge liegt) und Spezialverkauf. Beim Spezialverkauf wird für den Kunden nach Wunsch ein Drink gemixt, der nicht auf der Karte aufgeführt ist. 

------------------------------------------------

Aufgabe 5a.5 
(+) Ein Kneipenbesitzer hat Sie um ein Programm zur Unterstützung seiner regelmäßigen Turnierveranstaltungen gebeten. Nach Eingabe der angemeldeten Teilnehmer und der Anzahl der verfügbaren Geräte (=Anzahl der Spiele, die gleichzeitig durchgeführt werden können) soll der Computer einen Spielplan für ein simples KO-System entwerfen und angeben, welche Paarungen auf welchem Gerät spielen müssen. Nach Eingabe eines Ergebnisses für ein Gerät, soll die nächste Paarung (für die beide Spieler verfügbar sind) ermittelt, und das Gerät für diese reserviert werden. Nach Beendigung des Turnieres sollen die zwei besten Spieler ausgegeben werden, um die Preisverleihung vorzubereiten. 

------------------------------------------------

Aufgabe 5a.6 
Zur Kodierung von Zeichenketten kann folgendes Verfahren (Vigenere Codierung) angewendet werden: Statt wie beim Cäsar Verfahren jeden Buchstaben um eine konstante Zahl zu verschieben, verwendet man eine zweite Zeichenkette als Schlüssel. Jedes Zeichen wird jetzt um einen Wert verschoben, der dem Zeichen an der passenden Position im Schlüssel entspricht. Ist der Schlüssel kürzer als die zu verschlüsselnde Zeichenkette, so wird der Schlüssel einfach zyklisch immer wieder angewendet. Z.B.: 
 
Zeichenkette: eintest
Schlüssel: abc
Code: fkqugvu

(Aus Gründen der Anschaulichkeit wird hier bei a um eins verschoben, bei b um zwei und so weiter. Für die einfache Implementierung empfiehlt sich vielleicht eine andere Zuordnung von Zeichen zu der jeweiligen Zahl, um die verschoben wird.) 
Schreiben Sie die Funktionen code und decode, die als Parameter die Zeichenkette (den Code) und den Schlüssel erhalten, und den Code (die ursprüngliche Zeichenkette am Bildschirm ausgeben. Schreiben Sie auch eine Funktion analyze, die als Parameter die codierte und die uncodierte Zeichenkette erhält und den Schlüsselwert rekonstruiert. (Eventuelle zyklische Wiederholungen können dabei unberücksichtigt bleiben, so daß im obigen Beispiel das Ergebnis 'abcabca' korrekt wäre.) 

------------------------------------------------

Aufgabe 5a.7 
Schreiben Sie eine Funktion, die prüft, ob eine eingegebene Zeichenkette aus einer zyklischen Aufeinanderfolge einer Teilzeichenkette besteht, gegebenenfalls die (minimale) Zykluslänge bestimmt und an die aufrufende Funktion retourniert z.B.: 
 
Eingabe: abcabca Ausgabe: Zykluslänge 3
Eingabe: abcabcd Ausgabe: nicht zyklisch

------------------------------------------------

Aufgabe 5a.8 
Schreiben Sie eine Funktion replace, die als Parameter zwei Zeichenketten erhält, in einer globalen Zeichenkette jedes Auftreten des ersten Parameterwerts sucht und durch den zweiten Parameterwert ersetzt. (verwenden Sie dazu keine Funktionen aus externen Bibliotheken z.B. strlen) Beispiel: 

globale Zeichenkette: Noch Ein Einzeller
Parameter 1: Ein
Parameter 2: Mehr
globale Zeichenkette nach Funktionsende: Noch Mehr Mehrzeller

------------------------------------------------

Aufgabe 5a.9 
Die Ackermann-Funktion A(m,n) ist für natürliche Zahlen m und n wie folgt definiert: 
 
A(0,m)=m+1
A(n,0)=A(n-1,1) falls n>0
A(n,m)=A(n-1,A(n,m-1)) falls n>0 und m>0

Schreiben Sie eine Funktion, welche die Ackermann-Funktion für zwei Eingangsparameter berechnet. Geben Sie außerdem die maximale Rekursionstiefe und die Gesamtanzahl von Aufrufen der Funktion im Hauptprogramm aus. 

------------------------------------------------

Aufgabe 5a.10 
Das bekannte 'Spiel' Life funktioniert nach folgenden Regeln: Auf einem Raster (z.B. einem karierten Zettel Papier) werden bestimmte Zellen markiert (etwa angemalt). Markierte Zellen symbolisieren 'Lebewesen'. Abhängig vom aktuellen Zustand vermehren sich diese Lebewesen oder sterben ab. 
 
Falls von den 8 Nachbarzellen weniger als 2 oder mehr als 3 markiert sind, so stirbt das 'Lebewesen'. (Die Markierung wird entfernt.) 
Leere Zellen, die genau drei markierte Nachbarn haben, werden markiert. (Geburt eines neuen 'Lebewesens') 
Die beiden Regeln werden zuerst für alle Rasterpositionen evaluiert und die Änderungen werden erst dann durchgeführt. (Also lebende oder sterbende Zellen beeinflussen nicht die aktuellen Berechnungen für die Nachbarzellen.) Nach der Durchführung aller Änderungen hat man sozusagen die nächste Generation generiert. 
 
Schreiben Sie ein Programm, das Life auf einem 20*20 Feld simuliert. (Felder außerhalb des Rasters werden für Berechnungszwecke als frei angenommen.) Die erste Generation soll von Hand eingegeben werden und dann kann der Benutzer jeweils die Anzahl von zu berechnenden Generation eingeben. Das Endergebnis soll wieder am Bildschirm dargestellt werden. 

------------------------------------------------

Aufgabe 5a.11 
(*) Ein magisches Quadrat der Ordnung n enthält die Zahlen von 1 bis n2 so, dass die Summe der Zahlen in jeder Zeile, Spalte und Diagonale gleich groß ist. Ein Beispiel für ein Quadrat der Ordnung 4 (alle Summen sind gleich 34): 
 
16	2	3	13
5	11	10	8
9	7	6	12
4	14	15	1
 
Schreiben Sie ein Programm, das für eine vorgegebene Ordnung (max. 6) die magischen Quadrate ermittelt und ausgibt. 

------------------------------------------------

Aufgabe 5a.12 
(*) 'Die Türme von Hanoi' ist ein bekanntes Rätsel. Dabei müssen n verschieden große Scheiben, die auf drei Stäbe gesteckt werden können, geschickt manipuliert werden. Am Beginn sind alle Scheiben der Größe nach sortiert (mit der größten Scheibe unten) auf den ersten Stab gesteckt. Ziel ist es, alle Scheiben auf den dritten Stab zu stecken. Dabei darf pro Spielzug nur jeweils eine Scheibe umgesteckt werden. Die einzige Beschränkung beim Umstecken ist, dass niemals eine größere Scheibe auf eine kleinere Scheibe gelegt werden darf. Eine kurze Überlegung zeigt, dass sich das Problem recht einfach rekursiv lösen lässt. Um n Scheiben umzustecken, müssen zunächst n-1 Scheiben auf den zweiten Stab gesteckt werden. Dann steckt man die größte Scheibe auf den dritten Stab und muss dann nur noch die übrigen n-1 Scheiben ebenfalls auf den dritten Stab stecken. 
Schreiben Sie ein Programm, das die Anzahl der Scheiben einliest und die durchzuführenden Bewegungen der Reihe nach in einem geeigneten Format ausgibt. 

------------------------------------------------

Aufgabe 5a.13 
(*) Schreiben Sie ein Programm, das eine Zahl einliest und alle möglichen Permutationen der in der Zahl vorkommenden Ziffern ausgibt. Im Unterschied zum Beispiel 13 aus der Vorwoche können Sie nicht davon ausgeben, dass jede Ziffer nur einmal vorkommt. 
 
z.B. Eingabe: 1223
Ausgabe: 3221 3212 3122 2321 2312 2231 2213 2132 2123 1322 1232 1223

------------------------------------------------

Aufgabe 5a.14 
(*) Schreiben Sie eine Funktion, die die Anzahl der verschiedenen Summendarstellungen einer natürlichen Zahl ermittelt z.B.: 
 
4=1+1+1+1=2+1+1=2+2=3+1 -> 5 Möglichkeiten

Anmerkung: Die Anzahl kann recht einfach berechnet werden, wenn man sich überlegt, dass für den allgemeinen Fall einer Zahl n der erste Summand alle Zahlen von 1 bis n durchlaufen kann. Die Anzahl der Darstellungen für einen fixen ersten Summanden i ist gleich der Anzahl der möglichen Darstellungen der Zahl n-i, wobei keine Summanden größer als i verwendet werden. (Diese Einschränkung verhindert, dass Kombinationen mehrmals gezählt werden.) 

------------------------------------------------

Aufgabe 5a.15 
(*) Schreiben Sie ein Programm, das einen arithmetischen Ausdruck in Infixnotation, der mittels Rufzeichen beendet wird, einliest und nach Wunsch des Benutzers in Pre- oder Postfixnotation wieder ausgibt. 
 
Eingabe: a+b*(c+d)!
Postfix: abcd+*+
Prefix: +a*b+cd

------------------------------------------------