Universität Augsburg, Institut für Informatik Sommersemester 2006 Prof. Dr. Werner Kießling 08. Juni. 2006 M. Endres, A. Huhn, T. Preisinger Lösungsblatt 5 Aufgabe 1: Cloneable Tree.java Informatik II /* Klasse Tree, generisch implementiert Cloneable */ public class Tree<T> implements Cloneable // Knoten private T node; // linker Teilbaum private Tree<T> left; // rechter Teilbaum private Tree<T> right; /* Konstruktor, an den das Knoten-Objekt uebergeben wird. Der Knoten ist dann das Objekt, left und right werden auf null gesetzt */ public Tree(T node) this.node = node; /* a) Konstruktor, bei dem auch der linke und der rechte Teilbaum initialisiert werden */ public Tree(T node, Tree<T> left, Tree<T> right) this.node = node; this.left = left; this.right = right; // b) // Erstellen einer tiefen Kopie protected Tree<T> clone() // zuerst neuen Baum anlegen Tree<T> t = new Tree<T>(node); // Rekursiv clonen if (left!= null) t.left = left.clone(); if (right!= null) t.right = right.clone(); return t; /* c) Baumstruktur in einen String schreiben und zurueckgeben */ public String tostring() if (node!= null) return node.tostring() + " " + left + " " + right; /* null zurueckgeben, falls der Baum keine Elemente hat */ return null; 1
// d) // main-methode public static void main(string args[]) // Baum aus Abb. 1 anlegen Tree<Integer> tree = new Tree<Integer> (1, new Tree<Integer>(2), new Tree<Integer>(3)); // tiefe Kopie erstellen Tree<Integer> tree_clone = tree.clone(); // Ausgabe auf der Kommandozeile System.out.println("tree: " + tree.tostring()); System.out.println("tree_clone: " + tree_clone.tostring()); Aufgabe 2: Exceptions MatrixException.java package blatt03.exception; // MatrixException erweitert Exception public class MatrixException extends Exception // leerer Konstruktor public MatrixException() super(); // Konstruktor mit String public MatrixException(String message) // Aufruf des Konstruktors // der Oberklasse super(message); Matrix.java... // 2.c) // Konstruktor fuer das Matrix-Array public Matrix(int[][] m) throws MatrixException // m auf null ueberpruefen // und ggf. MatrixException werfen if (m == null) throw new MatrixException("Matrix darf nicht NULL sein"); /* der Konstruktor Matrix(int rows, int columns) kann nicht aufgerufen * werden, da der Aufruf an erster Stelle stehen muesste Deswegen alles * nochmal neu initialisieren */ this.rows = m.length; this.columns = m[0].length; this.m = new int[rows][columns]; // fuellen von m for (int i = 0; i < rows; i++) 2
// durchlaufe alle Zeilen for (int j = 0; j < columns; j++) // durchlaufe alle Spalten this.m[i][j] = m[i][j]; // setze Wert... // 2.b) // Matrixmultiplikation public Matrix mult(matrix B) throws MatrixException // Ueberpruefen, ob die Matrizen kompatibel sind if (this.columns!= B.rows) // System.out.println("Die Dimensionen der Matrizen sind nicht // kompatibel"); // return null; throw new MatrixException( "Die Dimensionen der Matrizen sind inkompatibel!"); // neues Matrix-Objekt erstellen Matrix C = new Matrix(this.rows, B.columns); // Berechung des Elementes c_ij in der Matrix C for (int i = 0; i < rows; i++) // durchlaufe alle Zeilen for (int j = 0; j < B.columns; j++) // durchlaufe alle Spalten for (int k = 0; k < columns; k++) // bilden der Summe C.m[i][j] += m[i][k] * B.m[k][j]; // Matrix C zurueckliefern return C; MatrixTest.java package blatt03.test; // importieren der Matrix-Klasse import blatt03.math.matrix; import blatt03.exception.*; public class MatrixTest // main-methode public static void main(string[] args) try // Matrizen erstellen int[][] matrixa = 1, 2, 3, 4, 5, 6 ; int[][] matrixb = 1, 2, 3, 4 ; // Erzeugen der Matrix-Objekte Matrix A = new Matrix(matrixA); Matrix B = new Matrix(matrixB); // Ausgabe der Matrizen mit Hilfe von // System.out.println(...) System.out.println("A = \n" + A.toString()); 3
System.out.println("B = \n" + B.toString()); // 2.d) // Matrixmultiplikation und Ausgabe der Ergebnismatrix Matrix AxB = A.mult(B); System.out.println("A x B = \n" + AxB.toString()); /* an dieser Stelle wird das Programm aufgrund der Exception abgefangen. Der nachfolgende Code wird nicht mehr ausgefuehrt */ /* 2.c) Wenn das Array null ist, kann kein Matrix-Objekt angelegt werden Exception wird geworfen */ int[][] matrixc = null; new Matrix(matrixC); // abfangen von MatrixException catch (MatrixException e) System.err.println(e.getMessage()); Aufgabe 3: XML-Parser XMLParser.java import java.util.*; // Klasse XMLParser public class XMLParser // Das XML-Dokument Tontraeger.txt private final static String xml = "siehe tontraeger.txt"; // a) + b) // Die Methode parse zum parsen des Dokumentes // xmltag enthaelt das XML-Tag // xmldoc ist das XML-Dokument in einem String // Der Vector soll nur String aufnehmen koennen public Vector<String> parse(string xmltag, String xmldoc) // endtag = Schliessenden Tag // begintag = Oeffnendes Tag // In inhalt wird der Inhalt des Tags gespeichert String endtag, begintag, inhalt = ""; int index = 0, startindex = 0, endindex = 0; // generische typsicherer Vector, // kann nur String enthalten Vector<String> v = new Vector<String>(); // erstmal alles in Kleinbuchstaben wandeln xmltag = xmltag.tolowercase(); xmldoc = xmldoc.tolowercase(); // endtag bestimmen (am Anfang </ anhaengen ) 4
// subtring(1) nimmt xmltag ab Position 1! endtag = "</"+xmltag.substring(1); // das > vom Tag wird abgeschnitten, um spaeter zu wissen wo // der Inhalt vom Tag anfaengt (siehe *) begintag = xmltag.substring(0,xmltag.length()-1); // hier laeuft das eigentliche parsen // wenn nichts mehr gefunden wird bricht die Schleife ab while(true) // Vorkommen von begintag ab Position index bestimmen index = xmldoc.indexof(begintag,index); // Nichts mehr gefunden -> Abbruch (aus der Schleife raus) if (index == -1) break; // der Start vom Inhalt ist das erste Auftreten von > nach dem // begintag + 1! *! startindex = xmldoc.indexof(">",index)+1; endindex = xmldoc.indexof(endtag,index+1); // index auf das Ende vom aktuellen Tag setzen, um spaeter nicht // wieder dasselbe zu lesen index = endindex; // den Inhalt aus dem XMLDOC per substring rausholen inhalt = xmldoc.substring(startindex,endindex); // zum Vektor hinzufuegen // trim entfernt Leerzeichen am Anfang und Ende v.add(inhalt.trim()); return v; // main-methode public static void main(string[] args) XMLParser xp = new XMLParser(); int i = 0; // Hashtable erzeugen Hashtable<Integer, String> h = new Hashtable<Integer, String>(); // <Interpret> als Tag Vector<String> x = xp.parse("<interpret>",xml); // alle Strings von dem Vector durchlaufen for(string str2 : x) String str1, str = ""; // hier wird der String nach einem Leerzeichen abgehackt // Alternativ: String [] sta = str2.split(" "); StringTokenizer st = new StringTokenizer(str2," ",false); 5
// alle einzelnen Woerter durchlaufen und den Anfangsbuchstaben // gross schreiben und den Rest klein schreiben while (st.hasmoretokens()) str1 = st.nexttoken(); str = str + " " +str1.substring(0,1).touppercase() + str1.substring(1).tolowercase(); // Leerzeichen am Anfang und Ende abschneiden str = str.trim(); // wenn noch nicht in Hashtable enthalten, dazufuegen if (!h.contains(str)) h.put(new Integer(i),str); i++; // Enumeration zum druchlaufen Enumeration e = h.keys(); System.out.println("\n\nKeys: "); // die Keys (Zahlen von 1 -.. durchlaufen // solange es noch Elemente gibt while(e.hasmoreelements()) System.out.println(e.nextElement()); // die Elemente Inhalte durchlaufen e = h.elements(); System.out.println("\n\nInterpreten (Elemente): "); while(e.hasmoreelements()) System.out.println(e.nextElement()); /* Alternative (ohne Enumeration) for (Integer ikey : h.keyset()) System.out.println(iKey.toString()); for (String strinhalt : h.values()) System.out.println(strInhalt); */ 6