P r o b e k l a u s u r Z u s a t z a u f g a b e n E i n f ü h r u n g i n d a s P r o g r a m m i e r e n Sommersemester 2013 Jewgeni Rose Technische Universität Braunschweig j.rose@tu-bs.de 1
Aufgabe 1 Objektorientierung Gegeben sei folg Klasse Punkt: public class Punkt { private double x, y; // Nullpunkt public Punkt() { this(0, 0); public Punkt(double x, double y) { this.x = x; this.y = y; public double getx() { return x; public double gety() { return y; Dabei beschreibt die Klasse einen Punkt im Koordinatensystem mit den beiden Attributen x und y, welche für die jeweiligen Achsenwerte stehen. a) Erweitern Sie die Klasse Punkt um die zwei Methoden: public double abstand() { public double abstand(punkt p) { Die parameterlose Methode berechnet den Abstand zum Nullpunkt und die untere Methode den Abstand zum Punkt p. Der Abstand d zweier Punkte berechnet sich wie folgt: ( ) ( ) 2
b) Erstellen Sie eine eigene Klasse Gerade, die mit Hilfe der Klasse Punkt eine Gerade in der Ebene repräsentiert. Eine Gerade g sei dabei durch folg Gleichung definiert: y = mx + n m ist die Steigung der Geraden n ist der Achsenabschnitt ( ) Die Klasse Gerade soll im Konstruktor zwei Punkte p und q übergeben bekommen und daraus die Geradengleichung berechnen. m und n sollen in privaten Attributen gespeichert und mittels öffentlicher Methoden steigung und achsenabschnitt zugänglich gemacht werden. Hinweis: Sie können davon ausgehen, dass die Gerade keine Senkrechte ist. c) Erweitern Sie die Klasse Gerade um eine weitere Methode schnittpunkt welche den Schnittpunkt dieser Geraden zu einer anderen Geraden g berechnet. public Punkt schnittpunkt(gerade g) { Um den Schnittpunkt zweier Geraden zu berechnen, kann man beide Geradengleichungen gleichsetzen und nach x auflösen, was die x-koordinate liefert. Für die y- Koordinate setzt man x in eine der beiden Geradengleichungen ein und berechnet y. Hinweis: Sie können davon ausgehen, dass die Geraden nicht parallel zueinander stehen. 3
d) Erstellen Sie eine weitere Klasse Dreieck. Die Klasse soll im Konstruktor drei Punkte x, y und z übergeben bekommen und intern speichern. Darüber hinaus soll die Klasse die beiden Methoden inhalt und umfang besitzen, die entsprechend den Flächeninhalt und Umfang des Dreiecks berechnen. Nutzen Sie hierbei bereits vorhandene Methoden da wo es sich anbietet. Den Flächeninhalt A können Sie mit der Heron-Formel berechnen: ( ) ( ) ( ) wobei a, b und c die drei Seitenlängen des Dreiecks sind und s wie folgt berechnet wird: ( ) Aufgabe 2 for-schleifen a) Schreiben Sie eine statische Methode intersect die zwei ganzzahlige Mengen A und B erhält, deren Durchschnitt bildet und als Ergebnis eine neue Menge mit den Elementen zurückliefert. Beispiel: A = {2, 3, 4, 6, B = {1, 3, 6, 9 A B = {3, 6 public static int[] intersect(int[] a, int[] b) { b) Schreiben Sie eine statische Methode union die zwei ganzzahlige Mengen A und B erhält, deren Vereinigung bildet und als Ergebnis eine neue Menge mit den Elementen zurückliefert. Beispiel: A = {2, 3, 4, 6, B = {1, 3, 6, 9 A B = {1, 2, 3, 4, 6, 9 4
c) Schreiben Sie eine statische Methode complement die zwei ganzzahlige Mengen A und B erhält, deren Komplement bildet und als Ergebnis eine neue Menge mit den Elementen zurückliefert. Beispiel: A = {2, 3, 4, 6, B = {1, 3, 6, 9 A \ B = {2, 4 Hinweis: In der Mengenlehre gibt es im Allgemeinen keine Mengen, in denen die Elemente mehrfach vorkommen dürfen so auch hier nicht. Gehen Sie zudem bei allen Teilaufgaben sicher, dass das neue Array genauso groß ist, wie es Elemente enthält. Aufgabe 3 Rekursion, Sortieren Implementieren Sie den Algorithmus Quicksort für das Sortieren (von bspw. Feldern mit Zahlen). Der Pseudocode für den Sortieralgorithmus ist weiter unten aufgeführt. Sie können folg Methode als Ausgang für Ihr Programm betrachten: public static void quicksort(int[] array) { // Aufruf einer Hilfsmethode quicksort(int[], int, int) // (array, links, rechts) quicksort(array, 0, array.length - 1); 5
Quicksort: funktion quicksort(daten, links, rechts) i := links j := rechts pivot := daten[mitte] // teile das Feld in zwei Teile wiederhole solange i j // Suche von links ein Element, welches größer als // das Pivotelement ist wiederhole solange daten[i] < pivot i := i + 1 // Suche von rechts ein Element, welches kleiner als // das Pivotelement ist wiederhole solange daten[j] > pivot j := j - 1 falls i j dann tausche daten[i] mit daten[j] i := i + 1 j := j - 1 // Rekursionsschritt um beide Teile weiter aufzuteilen // und zu sortieren falls links < j dann quicksort(daten, links, j) falls i < rechts dann quicksort(daten, i, rechts) 6
Aufgabe 4 Automaten Im vierten Aufgabenblatt haben Sie bereits die sogenannten deterministischen endlichen Automaten (DEA) kennengelernt. Sie sind deterministisch, weil in jedem Schritt/Zustand jede Eingabe/jedes Verhalten eindeutig ist. Sie können also bei einer Eingabe x in Zustand Q1 nicht einmal in den Zustand Q2 und einmal in Q3 wechseln. Und endlich sind die Automaten, weil sie endlich viele Zustände besitzen. Ihre Aufgabe soll es jetzt sein einen sogenannten vdea zu konstruieren, wobei das v für vollständig steht. Das bedeutet, dass in jedem Zustand jede Eingabe definiert sein muss. a) Zeichnen Sie einen Automatengraphen (s. Blatt 4) für das folg Problem: Sie haben eine Eingabe als Zeichenkette (String) und sollen überprüfen ob das Wort SOS darin enthalten ist. Achten Sie darauf, dass das Wort für sich alleine steht. Groß- und Kleinschreibung soll nicht unterschieden werden. Eingaben die das Wort enthalten, müssen das mit einer positiven Rückgabe (vom Typ boolean) bestätigen. Der folg Beispielsatz soll false liefern: Ich habe soeben Sose falsch geschrieben. b) Implementieren Sie Ihren Graphen aus a) als Java-Programm. 7