Info 1 Aufgabensammlung 2003 by Andreas Scholz [email protected] Die folgenden Aufgaben und Lösungen sind natürlich ohne Garantie auf Richtigkeit bzw. Relevanz für die Klausur. Und immer daran denken: Behauptung: Jedes Programm lässt sich um mindestens eine Anweisung kürzen. Jedes Programm hat mindestens einen Fehler. Durch Induktion können wir schließen: Jedes Programm ist reduzierbar auf eine Anweisung, die nicht funktioniert... I: UML Aufgabe 1 Modellieren Sie folgende Aussage in einem UML Klassendiagramm: „Ein Verzeichnis enthält Dateien oder andere Verzeichnisse. Eine Datei besitzt einen Namen und eine Größe. Ein Verzeichnis besitzt ebenfalls einem Namen, außerdem ist in ihm die Anzahl der enthaltenen Dateien und Verzeichnisse gespeichert.“ Lösung: Wichtig sind folgende Punkte: - Es ist sinnvoll den Namen in Element zu definieren da alle abgeleiteten Klassen ein Name-Attribut besitzen - Man muss hier unbedingt das Kompositionsmuster verwenden! Wir können folgendes Klassendiagramm aus dem Text extrahieren: Aufgabe 2 Erstellen sie ein Objektdiagramm basierend auf dem obigen Klassendiagramm das folgende Struktur repräsentiert: root/files/test.txt (20 Bytes) root/files/hallo.txt (50 Bytes) root/files/temp/trash.txt (1200 Bytes) root/foo.exe (60 Bytes) dabei sollen folgende Regeln gelten: - root ist das Wurzelverzeichnis - / trennt Verzeichnisnamen (wie in Unix) - bei Dateien ist in Klammern die Größe angegeben Lösung: Wichtig sind folgende Punkte: - Alle Attribute müssen einen Wert haben - Es darf auf keiner Assoziation eine * Kardinalität vorkommen - Die Namen der Objekte sind frei wählbar (man kann sie auch weglassen, der : muss aber immer dastehen) - Unterstreichen nicht vergessen II. Java Programmierung Aufgabe 3 Implementieren Sie die Funktion double[][] MatrizenMultiplikation(double [][] A, double[][] B) die die Matrizenmultiplikation A*B für quadratische Matrizen berechnet und als Ergebnis zurückgibt. Verwenden sie einen Multiplikationsalgorithmus Ihrer Wahl. Lösung: double[][] MatrizenMultiplikation(double [][] A, double[][] B) { double[][] erg=new double[A.length][A.length]; for(int i=0;i<A.length;i++){ for(int j=0;j<A[i].length;j++){ for(int k=0;k<A[i].length;k++){ erg[i][j]+=A[i][k]*B[k][j]; } } } return erg; } Matrizenmultiplikation ist die Standardaufgabe zum Üben von Schleifen (weil man gleich 3 braucht), kann also gut sein dass sie in der Klausur drankommt Am einfachsten ist wohl obiger Zeile*Spalte Algorithmus Aufgabe 4 Schreiben sie folgende for-Schleife in eine while und eine do-while Schleife um for(int i=0;i<n;i++) System.out.println(i*i+"\t"); Lösung: int i=0; while(i<n){ System.out.println(i*i+"\t"); i++; } int j=0; if(n>0){ do{ System.out.println(j*j+"\t"); j++; }while(j<n); } zur Übung welche Schleifenstrukturen es in Java gibt Aufgabe 5 a) Erklären Sie den Unterschied zwischen dem == Operator und der equals Funktion in Bezug auf die Klasse Integer in Java, betrachten Sie dazu folgendes Codestück: Integer i1=new Integer(5); Integer i2=new Integer(5); System.out.println(i1==i2); System.out.println(i1.equals(i2)); //Ausgabe I //Ausgabe II b) Geben Sie an welche Ausgabe in den kommentierten Zeilen erzeugt wird Lösung: a) Der == Operator vergleicht die Referenzen der 2 Integer-Klassen die equals Methode den Wert der beiden Integer b) Ausgabe I: false Ausgabe II: true Bei Wertevergleich mit == immer aufpassen Aufgabe 6 a) Erstellen Sie die Java Klasse Adressbuch basierend auf folgendem Klassendiagramm (verwenden sie eine Reihung, keine verkettete Liste) Implementieren Sie dabei die Methode void Sort() die die Adressen mittels BubbleSort nach Nachnamen sortiert, Sie können dabei davon ausgehen das die Reihung die die Bücher enthält immer voll gefüllt ist. Implementieren Sie außerdem, die Methode void Print() die alle Adressen sortiert nach Nachnamen in der Form: „Vorname, Nachname“ ausgibt, auch hier können Sie davon ausgehen dass die Reihung komplett gefüllt ist. b) Geben Sie an welche (sinnvollen) Methoden noch implementiert werden müssten damit man die Klasse verwenden kann Lösung: a) public class Adressbuch{ private Adresse[] adressen; void Sort(){ Adresse speicher; for(int i=0;i<adressen.length;i++){ for(int j=0;j<adressen.length-1;j++){ if(adressen[j].GetNachName().compareTo( adressen[j+1].GetNachName())>0){ speicher=adressen[j]; adressen[j]=adressen[j+1]; adressen[j+1]=speicher; } } } } void Print(){ Sort(); for(int i=0;i<adressen.length;i++){ System.out.println(adressen[i].GetVorName()+ ", "+adressen[i].GetNachName()); } } } b) Fehlende sinnvolle Methoden: - Konstuktor - Eine Add(Adresse a) – Methode zum hinzufügen von Adressen III. Markov-Algorithmen Aufgabe 7 a) Schreiben Sie einen Markov-Algorithmus der in beliebigen Wörtern über dem Alphabet {a,b} (d.h. die Wörter bestehen nur aus a’s und b’s) jedes zweite Vorkommen von a durch c ersetzt. b) Führen Sie Ihren Algorithmus für das Beispiel aba durch Lösungsidee: Wir speichern in einem Schiffchen mit ob wir eine gerade oder ungerade Anzahl an a’s gelesen haben und ersetzen bei einer geraden Anzahl das a durch ein c Lösung: a) T={a,b,c,g,u} 1. 2. 3. 4. 5. 6. 7. ua -> ag ga -> cu gb -> bg ub-> bu g ->. epsilon u ->. epsilon epsilon -> u b) aba -(7)-> uaba -(1)-> agba -(3)-> abga -(2)-> abcu -(6)-> abc (normalerweise steht die Nummer auf dem Strich)