Algorithmen und Programmierung WS13/14

Werbung
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.
Herunterladen