TU Ilmenau, Fakultät IA FG Telematik/Rechnernetze Prof. Dr.-Ing. G. Schäfer, Dr. S. Grau http://www.tu-ilmenau.de/telematik/aup Algorithmen und Programmierung WS13/14 Übungsblatt 12 Abgabe am Mittwoch 22.01.2014 in der Vorlesung Mit (*) gekennzeichnete Teilaufgaben geben Bonuspunkte. Aufgabe 1 Wahr oder Falsch 2(+2) Punkte Entscheiden Sie für die folgenden Aussagen jeweils, ob sie wahr oder falsch sind. Falls Sie nicht weiter wissen, nutzen Sie zuerst die Vorlesungsfolien und danach Sekundärliteratur. (a) Ein Java-Klasse kann mehrere Interfaces implementieren. (b) Methoden deren Aufruf den inneren Zustand eines Objekts nicht ändert, werden als statisch deklariert. (c) Jede Java-Klasse besitzt einen parameterlosen Konstruktor. (d) Zwei Objekte desselben Typs können gegenseitig lesend und schreibend auf ihre mit private gekennzeichneten Attribute zugreifen. (*) In abgeleiteten Klassen können als private gekennzeichnete Attribute der Oberklasse verwendet werden. (*) Es ist in Java möglich das Überschreiben einer Klassenmethode in Unterklassen zu verbieten. (*) Der Garbage Collector von Java gibt automatisch den Speicher aller Objekte frei, auf die innerhalb eines einstellbaren Zeitaums nicht mehr lesend oder schreiben zugegriffen wurde. (*) Für selbstdefinierte Klassen erlaubt Java kein Überschreiben der Operatoren +,-,*,/ und ==. Aufgabe 2 Datenstruktur Stack 4(+4) Punkte Auf Folie 14 des Foliensatzes “Grundlegende Datenstrukturen” werden Funktionalität und Operationen des Datentyps Stack beschrieben. (a) Erstellen Sie eine eigene Stack-Klasse in Java. Nutzen Sie hierfür keine Klassen der existierenden Collections-Typen. Verwalten Sie gespeicherte Einträge intern in einem Feld, dessen Auslastung sie überwachen. Ist das Feld vollständig gefüllt und wird ein weiteres Element hinzugefügt, soll automatisch ein Feld doppelter Größe assoziiert und die bestehenden Einträge kopiert werden. Sinkt die Auslastung des Feldes unter die Hälfte, soll das Feld entsprechend halbiert werden. Alle Operationen bei denen es zu keiner Anpassung der Feldgröße kommt, sollen mit Aufwand O(1) ablaufen. (*) Stellen Sie zusätzlich einen Iterator zur Verfügung, mit dem die gespeicherten Elemente traversiert werden können. Bitte wenden! 2 Algorithmen und Programmierung WS13/14 Aufgabe 3 Overriding und Overloading Übungsblatt 12 2+1 Punkte Das nebenstehende JavaProgramm nutzt die Konzepte class X { int x; Overriding und Overloading. public X(int x) { this.x = x; } public int a (int x, int y) { return x*y; } public int a (int x) { return a(x,this.x); } (a) Die mit /** A **/ gekennzeichnete Stelle wird } mehrmals durchlaufen. Nehmen Sie an, die class Y extends X { public Y(int x) { super(x); // Konstr. d. Oberkl. } Indexvariable i der umgepublic int a (int x, int y) { return a(x*y, x, y); } benden Schleife habe den public int a (int x, int y, int z) { return x*y+z; } Wert 3. } Geben Sie an, welche Me- class Prog { thoden bei der Auswerpublic static void main(String[] args) { tung dieser Anweisung mit X[] x = new X[4]; welchen Parametern aufgefor (int i=0; i<x.length; i++) { rufen werden. Kennzeichx[i] = new Y(i); nen Sie für jede aufgeru} int sum = 0; fene Methode, in welcher for (int i=0; i<x.length; i++) { Klasse sie definiert wurde. sum += x[i].a(i); /** A **/ Welcher Wert wird schließ} lich zu sum addiert? System.out.println(sum); (b) Wie ist die Ausgabe des } Programms? } Aufgabe 4 Datenstruktur für rationale Zahlen 8 Punkte Auf den Folien 27 bis 31 des Foliensatzes “Objektorientierung” wird eine Klasse RatNumber zur Repräsentation rationaler Zahlen vorgestellt. Das entsprechende Grundgerüst finden Sie auch in der Datei RatNumber.java auf unserer Webseite. Erweitern Sie die Klasse, so dass ihre Datenstruktur die folgenden Operationen unterstützt: • normalize - ’Kürzen’ der rationalen Zahl auf Repräsentation mit minimalem Zähler und Nenner • isZero - Test auf Gleichheit zum Wert Null • toString - Ausgabe als String (in Form eines Bruches) • equals - Test auf Gleichheit mit zweiter rationaler Zahl • mult, div, minus - Implementierung der Operationen Multiplikation, Division und Subtraktion Achten Sie auf die Wahl geeigneter Rückgabetypen und Sichtbarkeiten der Methoden. Definieren Sie zusätzlich zum Standardkonstruktor einen weiteren Konstruktor, welcher eine Ganzzahl übergeben bekommt und das RatNumber-Objekt mit dem entsprechenden Wert initialisiert. Weiter auf nächster Seite! Algorithmen und Programmierung WS13/14 Übungsblatt 12 Aufgabe 5 Vigenère-Verschlüsselung 3 1+6(+3) Punkte Die Vigenère-Verschlüsselung ist ein bekanntes symmetrisches Verschlüsselungsverfahren der frühen Neuzeit. Dabei definiert jeder Buchstabe des Schlüssels eine zyklische Verschiebung des Alphabets. Der Schlüsselbuchstabe K bewirkt zum Beispiel die Abbildung des Klartextbuchstabens A auf K, B auf L, C auf M, D auf N, . . ., Z auf J: Klartextbuchst.: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Abb. für K Chiffrebuchst.: K L M N O P Q R S T U V W X Y Z A B C D E F G H I J Um einen ganzen Text zu verschlüsseln, wird der Schlüssel zunächst durch Wiederholung auf die Länge des Klartextes gebracht und dann für jede Position der auftretende Klartextbuchstabe über das durch den Schlüsselbuchstaben (der gleichen Position) verschobene Alphabet verschlüsselt. Ein Beispiel mit dem Schlüssel KEY und dem Klartext TEXTTEXT wäre also: K E Y K E Y K E T E X T T E X T D I V D X C H X (a) Verschlüsseln Sie das Wort TELEMATIK mit dem Schlüssel TCP. (b) Erstellen Sie eine Java-Klasse Vigenere, welche im Konstruktor den zu verwendenden Schlüssel als char[] übergeben bekommt und welche die öffentlichen Methoden encrypt(char[] t) sowie decrypt(char[] t) zur Verfügung stellt. Beide sollen ver- bzw. entschlüsselte Texte in Feldern des Typs char zurückgeben. Wird ein Text in mehrere Teilstücke zerlegt und diese Teile einzeln per encrypt verschlüsselt, soll die Verkettung der Resultate einer direkten Verschlüsselung des ursprünglichen Textes entsprechen (die Position im Schlüssel muss also zwischengespeichert werden). Das Verhalten von decrypt sei analog. (*) Das Vigenère-Verfahren gewinnt deutlich an Sicherheit, wenn der sogenannte Autokey-Modus genutzt wird. Hier wird der Schlüssel nicht wiederholt, sondern um den Klartext verlängert. Im Beispiel würde gelten: K E Y T T E X T D I V M E X T T T E X T X B Q M Erweitern Sie ihre Klasse um Unterstützung für die Autokey-Methode.