Übung Praktische Informatik I HWS 2008/2009 Benjamin Guthier Lehrstuhl für Praktische Informatik IV Universität Mannheim guthier@pi4.informatik.uni-mannheim.de 24.10.08 6-1
Heutige große Übung Hinweise zum 6. Übungsblatt Reguläre Ausdrücke, Automaten, kontextfreie Grammatiken Referenzen auf Objekte Arrays Offizielle Java-Dokumentation 24.10.08 6-2
Aufgabe 1 - Zahlworte Es soll eine Klasse Zahlworte implementiert werden, die int-zahlen in die entsprechenden Zahlworte als String umwandelt. Der Einfachheit halber dürfen bestimmte Regelmäßigkeiten angenommen werden. 1a) Implementieren Sie die Methode String ziffer(int z) 1b) Implementieren Sie die Methode String zahlwort(int zahl) Methode ziffer wird mehrfach in Methode zahlwort benötigt. Die Regeln in Aufgabe 1b) sind schon fast die Lösung! 24.10.08 6-3
Aufgabe 2 - Verschlüsselung Erstellen Sie eine Klasse Enigma, die Zeichenketten mittels eines Passwortes verschlüsselt. Die Verschlüsselung soll so ablaufen, dass das Passwort gegebenenfalls wiederholt über die Zeichenkette gelegt und zeichenweise hinzuaddiert wird. 2a) char[] verschluesseln(char[] zeichen, char[] passwort) char[] verschluesseln(char[] zeichen, char[] passwort) Beispiel für Verschlüsselung (Vignère-Chiffre): pwdpwdpwd + nachricht = dxgxomsex Polyalphabetische Substitutionschiffre (wie die echte Enigma!) Besonderheit in Unicode: A hat den Wert 65, B 66, a 97, usw... Addition produziert also seltsame Sonderzeichen. Das ist okay. 24.10.08 6-4
Aufgabe 2 - Verschlüsselung (2) 2b) Implementieren Sie einer Testmethode public static void main(string[] args), die eine Zeichenkette vom Benutzer erfragt und ver-, bzw. entschlüsselt. Benutzereingabe mittels Methode String JOptionPane.showInputDialog(String) Konvertierung eines String in char[] mittels Methode aus der Klasse String char[] tochararray() 24.10.08 6-5
Aufgabe 3 - Reguläre Ausdrücke Hinweis: In Aufgabe 3b sind zehn verschiedene Elemente der Sprache gemeint! Mehr zu regulären Ausdrücken im Inhaltsteil der Übungsfolien... 24.10.08 6-6
Alphabet, Wort, Sprache Ein Alphabet ist eine endliche Menge von Zeichen. Beispiele: = {0, 1, 2, 3,..., 9} = {a, b, c,..., y, z} = {Ø,,,,, 3, M, ƒ, Ÿ} Ein Wort ist eine endliche Folge von Zeichen aus. Beispiele: 0815 wort 3M Ø Leeres Wort ε Eine Sprache über ist eine Menge von Worten aus. Beispiele: {7, 77, 777, 7777,...} (Sprache mit unendlich vielen Worten) {ε, abc, def, ghi, jkl, mno, qrst, uvw, xyz} (enthält das leere Wort) { 3M, M3, ƒ Ÿ} 24.10.08 6-7
Reguläre Ausdrücke Erlauben Definition von Sprachen ohne Auflistung aller (ggf. unendlich vieler) Wörter. Reguläre Ausdrücke sind über einem Alphabet definiert. Zusätzliche Operatoren: oder * Wiederholung. Verkettung (wird eigentlich immer weggelassen)? optional (Definiert durch: e? := e ε) ( ) Klammerung Präzedenzregeln helfen Klammern zu sparen: * und? binden stärker als Verkettung bindet stärker als 24.10.08 6-8
Reguläre Ausdrücke (2) Beispiele für reguläre Ausdrücke: 77* (0 1 2 3 4 5 6 7 8 9)*(0 5) (ab c*)(d e f)?ghi Anwendungen für reguläre Ausdrücke: Definition von erlaubten Literalen in Programmiersprachen Erweiterte Suche in großen Texten: Suche alle Datumsangaben Suche Referenzen der Form [<ziffer>*] Erweitertes Suchen und Ersetzen: Ersetze alle Dezimalstellen Trennpunkte (englisch) durch Kommas (deutsch). 24.10.08 6-9
Endliche Automaten Äquivalentes Mittel zur Definition von Sprachen Haben gleiche Mächtigkeit wie reguläre Ausdrücke Automaten bestehen aus: Zuständen (auch Knoten ) Zustandsübergängen ( Kanten ), beschriftet mit Zeichen aus Alphabet Einem markierten Startknoten Beliebig vielen Zielknoten Beispiel: Automat zu regulärem Ausdruck 0*(1 2 3 4 5 6 7 8 9)(0 5) 24.10.08 6-10
Endliche Automaten (2) Definition einer Sprache durch Verifikation Beginne beim Startknoten Jeder Buchstabe des Wortes beschreibt einen Zustandsübergang Erreicht man mit dem letzten Buchstaben des Wortes einen Zielknoten, so ist das Wort Teil der Sprache. Umgekehrt gehört das Wort nicht zur Sprache, wenn kein Zielknoten erreicht oder ein nicht vorgesehener Zustandsübergang durchgeführt wird. Beispielworte: 98, 0025, 100 24.10.08 6-11
Kontextfreie Grammatiken Kontextfreie Grammatiken sind mächtiger als reguläre Ausdrücke dank Rekursion. Reguläre Ausdrücke zur Definition simpler Literale: Datum, Geldbetrag, float, Bezeichner in Java Definition einer Programmiersprache braucht mehr. Kontextfreie Grammatiken können mehr, z.b. korrekte Klammerung: <expr> ::= <literal> <expr> + <expr> <expr> - <expr> <expr> * <expr> <expr> / <expr> ( <expr> ) 24.10.08 6-12
Referenzen auf Objekte In Java existiert Unterschied zwischen primitiven Datentypen und Referenzdatentypen (Objekten). Beispiel für Referenzdatentyp Person Person a = new Person( Benjamin ); Person b = a; b.name = Horst ; // a.name ist nun auch Horst Person c = new Person( Horst ); // Nun gilt: // Vergleich (a == b) ist true, // aber Vergleich (a == c) ist false! 24.10.08 6-13
Arrays Arrays sind Referenzdatentypen, gebildet durch: <Datentyp>[] Erlauben die Speicherung mehrerer gleichartiger Objekte Aber: Anzahl ist unveränderlich. Nützlich in sehr vielen Bereichen der Programmierung Array von Personen = Personenverzeichnis Array von Zeichen = String Array von Farbwerten (Pixeln) = Bild Array von Spielkarten = Kartenstapel 24.10.08 6-14
Arrays (2) Arrays aus primitiven Datentypen int[] zahlen = new int[200]; zahlen[30] = 42; // OK Arrays aus Referenzdatentypen Person[] personen = new Person[200]; personen[30].name = Horst ; // Fehler! Das 30. Element der Liste ist nur eine Referenz und noch nicht initialisiert. Zuerst 200 Personen mit new erzeugen Person[] personen = new Person[200]; for (int i=0; i<200; ++i) personen[i] = new Person(); personen[30].name = Horst ; // Jetzt OK 24.10.08 6-15
Arrays (3) Elegante Schleife für Arrays in Java (ähnlich for-each-schleife) for (<Datentyp> <Bezeichner> : <Container>) <Anweisung> Ein Beispiel: int[] betraege = new int[200];... int summe = 0; for (int b : betraege) summe += b; Vorsicht: b ist hier nur eine Kopie des int und keine Referenz! for (int b : betraege) b = 100; // tut nichts! Nur Lesen moeglich 24.10.08 6-16
Offizielle Java-Dokumentation Webseite: http://java.sun.com/javase/6/docs/api/ Oder bei manueller Suche, auf Folgendes achten: Java Standard Edition (Java SE) Version 6 Core API Enthält Dokumentation aller eingebauter Java-Klassen. Keine Beschreibung der Sprache an sich (Syntax, Konstrukte) Wichtige Pakete sind: java.lang, java.util, java.io und java.net 24.10.08 6-17
Okay, dann... Schönes Wochenende! T.G.I.F. 24.10.08 6-18