Belegaufgaben


Einführung Informatik/Algorithmen und Datenstrukturen

Prof. Dr. Reiner Dumke

SS 2001

Sören Balko, Ilona Blümel, Dr. Martina Engelke, Markus Feldbach, Niels Grabe, Dr. Reinhard Köppe, Uwe Scholz, Nadine Schulz, Dr. Fritz Zbrog

BELEGAUFGABEN

(alternativ: erfolgreiche Teilnahme am Wettbewerb)

Ausgabe: 04.05.01

Bearbeitung: in Gruppen von zwei Studierenden (können aus verschiedenen Studienrichtungen sein)

Abnahme des lauffähigen JAVA-Programms im SUN-Pool in 03-304b: ab 18. Juni 2001

Konsultationsmöglichkeiten: beim Tutor

Die Lösung ist als JAVA-Applet oder Applikation abzuliefern und im SUN-Pool verfügbar zu machen.

Als Dokumentation ist bis zum 18.06.01 in gedruckter Form beim Übungsleiter abzugeben:

Achten Sie darauf, dass die Oberfläche in einer separaten Klasse formuliert wird.

Bei der Belegabnahme wird geprüft, inwieweit das vorgeführte Programm läuft und verstanden ist (Programm muss gut erklärt und leichte Modifikationen müssen vorgenommen werden können).


Von den folgenden Aufgaben ist eine zur Bearbeitung auszuwählen!


1. Auswertung von arithmetischen Ausdrücken mit Hilfe eines Baumes

Schreiben Sie ein JAVA-Programm, das den Syntaxbaum eines arithmetischen Ausdrucks anschaulich darstellt.

Beispiel: ((x * y) + 6) / (4 - z) ergibt folgenden Syntaxbaum:

Die Auswertung erfolgt wie folgt rekursiv:

Falls der Inhalt des Knotens k '+',  '-',  '*'  oder '/' ist, so

Die Berechnung der Wurzel liefert dann den gesuchten Wert des Ausdrucks.


2. Hash-Verfahren

Es ist ein JAVA-Programm zu schreiben, das die Speicherung von Daten mit Hash-Verfahren demonstriert. Bei Kollisionen sollen die Daten mit gleichen Hash-Funktionswerten

Das Einfügen von Daten und das Suchen von Daten sollte anschaulich auf dem Bildschirm dargestellt werden. Der die jeweilige Aktion auslösende Quelltext-Teil ist auf dem Bildschirm anzuzeigen.


3. Variation des Abzählreims

In diesem Spiel sitzt eine Gruppe von Kindern im Kreis. Die Kinder reichen hinter sich in Uhrzeigerrichtung ein Taschentuch herum bis der Spielleiter eine Glocke läutet. Das Kind, hinter dem zu diesem Zeitpunkt das Taschentuch liegt, muss den Spielkreis verlassen. Der Prozess wird solange wiederholt bis nur noch ein Kind überbleibt, das ist dann der Gewinner.


4. Schiffe versenken

Visualisieren Sie folgendes Spiel:

unsere Lösung (Daniel Hakenjos und Sebastian Nusser)


5. RSA-Chiffre

Das RSA-Verfahren gehört zu den modernen Public-Key Chiffrierverfahren. Es ist ein Verfahren, das mit zwei Schlüsseln arbeitet, einem öffentlichen Schlüssel zum Chiffrieren und einem geheimen Schlüssel zum Dechiffrieren der Nachricht. Die Nachricht wird in Blöcke zerlegt, die jeweils eine Zahl darstellen.

Das Generieren eines Schlüsselpaares erfolgt in diesen Schritten:
1. Wähle zwei Primzahlen p und q (im Beispiel p=47, q=59)
2. Berechne n = p*q (n = 2773)
3. Berechne f = (p-1)*(q-1) (f = 2668)
4. Wähle ein e, das teilerfremd zu n und f ist: (e = 17)
5. Berechne das modulare Inverse d so, dass die Beziehung (e*d)%f = 1 gilt. (d  = 157).
Die Primzahlen p und q sind zu vergessen, als öffentlicher Schlüssel wird (e,n) verwendet, als geheimer Schlüssel (d,n).

Das Chiffrieren eines Klartextblockes m (einer Zahl m <n) erfolgt mit einer modularen Potenzierung: c = m^e mod n.
Das Ergebnis ist der Geheimtextblock c, ebenfalls eine Zahl.  (Beispiel: für m = 920  ist c = 948)
Das Dechiffrieren erfolgt ebenso durch die Berechnung der modularen Potenz mit dem geheimen Schlüssel: m = c^d mod n.

Für kleine n ist das RSA-Verfahren unsicher, da aus n die beiden Primzahlen ermittelt werden können und damit aus der Kenntnis des öffentlichen Schlüssels der geheime berechnet werden kann. Das RSA-Verfahren ist sicher, wenn das n genügend groß ist. Aus diesem Grund sollten die gewählten Primzahlen mindestens 512 Bit lang sein.

Schreiben Sie eine Klasse MyRSA für die Generierung der Schlüssel, die Chiffrierung und die Dechiffrierung. Für die Demo-Beispiele sollen Zahlen aus dem Bereich Integer gewählt werden können, für den sicheren Einsatz auch große Zahlen (nutzen Sie die in Java vorhandene Klasse BigInteger).
In einer Applikation sollen Schlüsselgenerierungen möglich sein, das Chiffrieren und Dechiffrieren. Die Zahlen können als Hexadezimalzahlen dargestellt werden. Die Schlüssel sollten in einer Datei gespeichert werden.


6. Knack den Code

Das Knacken eines Geheimtext gehört seit jeher zu den reizvollsten Aufgaben. Das einfache Durchprobieren aller Möglichkeiten, der Brute-Force Angriff kommt bei den meisten Chiffrierverfahren nicht in Frage, da er zu lange dauert. Kennt man das Chiffrierverfahren, gelingt die Kryptanalyse der klassischen Verfahren fast online.

Die folgenden Geheimtexte wurden mit einem monoalphabetischen Verfahren chiffriert. Dazu wird eine Tabelle benötigt, die jedem Klartextbuchstaben genau einen Geheimtextbuchstaben zuordnet. Einzige Randbedingung ist, dass nicht zwei verschiedene Zeichen durch ein gleiches ersetzt werden dürfen. Die Tabelle, bzw. deren Generierungsvorschrift muss dem Empfänger der Nachricht bekannt sein, damit er danach dechiffrieren kann. Der Kryptanalytiker versucht, diese Tabelle zu konstruieren.

Das systematische Durchprobieren erfordert, alle Permutationen des Alphabets, also alle verschiedenen Anordnungen zu durchsuchen. Das sind mit 26! » 4*1026 Möglichkeiten zu viel, deshalb setzt man statistische Methoden ein. Die charakteristische Häufigkeitsverteilung der Buchstaben ist sprachabhängig und bleibt im Geheimtext erhalten, so kann man vermuten, dass der häufigste Buchstabe (in der deutschen Sprache mit 17%) das 'e' sein wird. Mit der Kenntnis der Häufigkeiten der Buchstaben und der Buchstabenpaare sowie der erhaltenen Textmuster versucht man intuitiv, alle weiteren Buchstaben der Tabelle zu erraten. Irrtümer sind möglich und können wieder korrigiert werden.

In der Belegaufgabe soll eine Java-Applikation geschrieben werden, die ein Knacken des monoalphabetisch chiffrierten Geheimtextes unterstützt.

Auf dem Bildschirm soll angezeigt werden:

In die Tabelle sollen sukzessiv die Ersetzungsbuchstaben eingetragen werden. Das Klartextfeld soll darauf den bis dahin dechiffrierten Text anzeigen.

Wenn die Ersetzungstabelle vollständig gefüllt ist, sollte ein verständlicher Klartext angezeigt werden.

Die Geheimtexte sind in Dateien gespeichert, die Eingabe soll über den Dateinamen erfolgen.

Erleichternd für das Knacken des Geheimtextes ist, wenn die einzelnen Wortlängen erkennbar sind. Aus diesem Grund wird der Geheimtexten in Großbuchstaben umgewandelt und alle Zeichen entfernt, die keine Buchstaben sind. Zur besseren Lesbarkeit werden die Buchstaben in Gruppen angeordnet.

Beispiel: Der Klartext:

"Die klassische Aufgabe der Kryptographie ist es, eine Nachricht oder Aufzeichnung für den Unbefugten unverständlich zu machen."

wird mit dieser Tabelle:
 

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
O L G K P Z W Y J X Q U N T E R D C H I F S B A M V

in den folgenden Geheimtext chiffriert:

KJPQU OHHJH GYPOF ZWOLP KPCQC MRIEW CORYJ PJHIP HPJTP TOGYC JGYIE KPCAF ZVPJG YTFTW ZCKPT FTLPZ FWIPT FTSPC HITKU JGYVF NOGYP T

 


7. Visualisierung der Funktionalitäten des ADT "Stack"

Im Rahmen dieser Aufgabe sind die in der Vorlesung eingeführten Funktionen eines Stacks mit Hilfe eines Java-Applets zu implementieren und für einen Benutzer graphisch zu visualisieren. Ein Benutzer soll dabei die Möglichkeiten besitzen Elemente in Form eines Zeichens (zum Beispiel a, b, c, ...) und die auszuführende Operation in Form einer Auswahlbox (zum Beispiel Listbox oder Checkbox) einzugeben. Entsprechend dieser Informationen sind die jeweiligen Operationen auszuführen und schrittweise dem Benutzer zu verdeutlichen.


8. Visualisierung von Petrinetzen

Im Rahmen dieser Aufgabe sind die Funktionalitäten von Petrinetzen, wie sie in der Vorlesung eingeführt wurden, zu implementieren, die für eine entsprechende Visualisierung notwendig sind. Dazu gehören u.a. die Funktionalitäten zum Erzeugen und Löschen von Stellen, Transitionen und Kanten sowie deren Visualisierung. Auch Bedingungen wie die Tatsache, dass Kanten nur Stellen mit Transitionen bzw. Transitionen mit Stellen verbinden können sind dabei zu berücksichtigen. Auf eine Implmentierung von Token und das übliche Schaltverhalten von Petrienetzen soll im Rahmen dieser Aufgabe verzichtet werden.


9.  Das Spiel "Pasch"

Im Rahmen dieser Aufgabe ist ein Applet mit allen Funktionalitäten zum klassischen Spiel "Pasch" zu implementieren, wobei 2 Spieler gegeneinander spielen können sollen (innerhalb der gleichen Instanz des Applets). Ausgangspunkt stellen dabei die 5 Würfel und die zwei Spieler dar. Jeder Spieler würfelt abwechselnt mit den Würfeln. Basierend auf der aktuellen Augenzahl kann ein Spieler entscheiden, ob er die Felder Einser, Zweier, Dreier, Vierer, Fünfer, Sechser (jenachdem wieviel von einer bestimmten Augenzahl gleiche Würfel vorhanden sind, werden die Punkte gezäht), Einer-Pasch, Zweier-Pasch (Augenzahl gleich Punktzahl), Kleine Straße (20 Punkte), Große Straße (25 Punkte), Full-House (Augenzahl gleich Punktzahl), Pasch (50 Punkte) und Last-Chance (Augenzahl gleich Punktzahl) belegen möchte, wobei durch das Programm die Punktzahl berechnet werden soll. Jedes Feld kann innerhalb einer Runde nur einmal belegt werden. Sind alle Felder belegt, gewinnt der Spieler mit der höchsten Punktzahl. Eine entsprechende Auswertung ist vorzunehmen. Dieses Spiel ist im Rahmen eines speziellen Applets zu visualisieren.



10. Animierte Registermaschine

Schreiben Sie ein Applet, daß eine Registermaschine bezüglich des Inhaltes der Register, der Befehlsnummer und des im Fokus stehenden Befehls animiert.
Der Befehlsvorrat sei load, cload,store, cstore, add, mult, div, goto  und  halt . Die Befehlseingabe soll per vorzubereitendem File erfolgen.  Das Applet ist mit Hilfe der Buttons Neu, Step und Exit zu steuern.



11. Animation der Umsetzung von ADT-Spezifikation zu einer Java-Implementation

Schreiben Sie ein Applet, das auf seinen Darstellungsflächen jeweils die ADT-Spezifikation eines finiten Stacks und im anderen Teil die Java-Implementation (Sourcecode) darstellt.
Wird eine Zeile der Spezifikation angeklickt, färbt sie sich und im zweiten Teil der Darstellungsfläche wird der zugehöhrige Java-Text entsprechend eingefärbt.



12. Bildverarbeitung

Es ist ein in einem zweckmäßigen Format gegebenen Bild durch die Anwendung einer Filtertechnik zu verbessern. Das Bild kann auch eingescannt werden.
Als Filter kann z.B. ein Medianfilter (siehe unter Bildverarbeitungsvorlesung) eingesetzt werden. Das Ausgangs- und das Resultatsbild sind anzuzeigen.



13. Billard

Visualisieren Sie in einem Applet die zwei-dimensionale Simulation der mechanischen Abläufe beim Billard-Spiel. Dazu gehören der initiale Impuls des Queues auf die erste Kugel, die Kollision von Kugeln untereinander, sowie die Kollision von Kugeln und Bande. Löcher, Spielregeln usw. brauchen nicht berücksichtigt zu werden. Es sollen mindestens zwei Kugeln dargestellt werden.

Die Kugeln sind durch ihre Mittelpunkte (x,y) in einem Rechteck gegeben. Der initiale Bewegungsvektor (dx,dy) ist (0,0), d.h. die Kugeln ruhen. Durch den Queue wird einer Kugel ein Impuls gegeben. In jedem Animations-Schritt wird jede Kugel um ihren Bewegungsvektor versetzt. Falls dabei eine Kollision mit einer anderen Kugel auftritt bzw. die Bande getroffen wird, wird der Bewegungsvektor der betroffenen Kugeln neu berechnet. Außerdem ist die Reibung zu berücksichtigen, die den Bewegungsvektor in jedem Schritt verkleinert.



14. Funktions-Plotter

Stellen Sie den Verlauf einer mathematischen Funktion mittels eines Java-Applets dar. Der Parameterbereich soll veränderbar sein sowie zusammen mit dem automatisch bestimmten Wertebereich an den Achsen angetragen werden. Wählen Sie eine der folgenden Varianten:

Variante 2D: Die darzustellende Funktion f(x) wird als String eingegeben und mittels Stacks berechnet. Die Darstellung erfolgt zwei-dimensional (analog zu diesen Beispielen, wobei die Darstellung mehrerer Kurven in einem Diagramm nicht verlangt ist). Als Operatoren sind mindestens die Grundrechenarten +, -, * und / vorzusehen.

Variante 3D: Es soll eine zwei-dimensionale Funktion f(x,y) dargestellt werden. Die Auswertung des Ausdrucks ist nicht verlangt, es reicht aus, aus einer Reihe vordefinierter Funktionen auswählen zu können. Dafür sollen in der Darstellung die verdeckten Linien entfernt werden (siehe diese Beispiele).


Startseite