= Projekt = Hier finden Sie eine genauere Spezifikation der möglichen Projekte == Projekt 1 (Kalender) == '''Kurzbeschreibung:''' Ein Kalenderprogramm ähnlich dem vom 3. Übungsblatt, aber mit umfassenderer Funktionalität. '''Geforderte Funktionalität:''' * Es sollte wahlweise das Kalenderblatt für einen gegebenen Monat in einem gegebenem Jahr ausgegeben werden (wie beim 3. Übungsblatt) oder alle zwölf Kalenderblätter für ein ganzes gegebenes Jahr * Bei der zweiten Option (Kalender für ein ganzes Jahr) sollte der Benutzer die Anzahl der Monate die pro Reihe angezeigt werden bestimmen dürfen. Hier in [[http://www.shivaranjan.com/shivaupload/windowslivewriter/UbuntuLinuxHowtoQuicklyViewCalendarinTer_10958/ubuntu_linux_calenar_3.png|diesem Bild]] sind es zum Beispiel drei Monate pro Reihe. Jede Zahl zwischen 1 und 12 sollte möglich sein. * Die Namen der Wochentage und Monate sollten in mindestens drei verschiedenen Sprachen angezeigt werden können (frei wählbar vom Benutzer). * Falls der aktuelle Tag in der angezeigten Ausgabe vorkommt, sollte er hervorgehoben werden. Am einfachsten in "reverse video" (weiß auf schwarz statt schwarz auf weiß), [[http://kb.iu.edu/data/adzf.html|das geht zum Beispiel so]]. * All diese Optionen sollten durch eine sinnvolle Eingabe in der Kommandozeile realisiert werden können, also zum Beispiel ''./Calendar''''''Main --language=de Juli 2010'' oder ''./Calendar''''''Main --language=fr 2011''. '''Technische Realisierung:''' * Wie genau Sie die Klassen für dieses Programm designen, ist in großen Teilen Ihnen überlassen. Es sollte natürlich sinnvoll und verständlich sein. * Was Sie allerdings auf jeden Fall machen sollten, ist die Funktionalität für das Malen mehrere Monate auf einmal in eine eigene Klasse auszulagern, die nichts direkt mit der Kalenderfunktionalität zu tun hat. Diese Klasse sollte in der Lage sein, beliebige "Textrechtecke" (insbesondere eben Kalendermonate) mit einer gegebenen Anzahl Rechtecke pro Reihe auf dem Bildschirm auszugeben. == Projekt 2 (Zipper) == '''Kurzbeschreibung:''' Ein Programm zum Komprimieren und Dekomprimieren von beliebigen Dateien a la ''gzip'' (Linux) oder ''zip'' (Windows). '''Geforderte Funktionalität:''' * Es sollten zwei nicht-triviale (De-)Komprimierungsverfahren zur Auswahl stehen. Welche das sind, ist völlig Ihnen überlassen. Stöbern Sie im Netz oder denken Sie sich selber etwas aus. Aber es sollte nicht-trivial sein und wirklich komprimieren (einfach die Datei kopieren gilt zum Beispiel nicht). * Es sollte alles über *ein* Main Programm laufen, dem man folgendes übergibt: (1) den Namen der Eingabedatei, (2) den Namen der Ausgabedatei, (3) welches der beiden Verfahren, (4) ob man komprimieren oder dekomprimieren möchte. Zum Beispiel ''./Zipper''''''Main --method=lempel-ziv --mode=compress --input-file=xyz.txt --output-file=xyz.zipped''. '''Technische Realisierung:''' * Wie genau Sie die Klassen für dieses Programm designen ist in großen Teilen Ihnen überlassen. Es sollte natürlich sinnvoll und verständlich sein. * Was Sie allerdings auf jeden Fall machen sollten: eine abstrakte Oberklasse mit den abstrakten Methoden ''compress'' und ''decompress'', und dann eine Unterklasse für jedes Verfahren, die diese Methoden konkret implementiert. == Projekt 3 (selbstgewählt) == Bei dieser Alternative, ist die Spezifikation des Projektes Ihnen überlassen. Einzige Bedingung ist, dass es in Umfang und Komplexität den ersten beiden Projekten ähnlich ist. Insbesondere sollte es vom Schwierigkeitsgrad nicht zu weit darüber hinaus gehen, Ihr Tutor muss es schließlich verstehen und korrigieren können. Projekt 3 ist mehr etwas für Teilnehmer, die sich in der Sprache (C++) schon recht sicher fühlen und denen die bisherigen Übungsblätter eher leicht gefallen sind.