Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme Dr. Werner Struckmann 7. Dezember 2012 Programmieren I 5. Übungsblatt Hinweis: Ihre Lösung der Pflichtaufgabe dieses Übungsblatts müssen Sie bis spätestens zum 16. Dezember 2012 auf der Web-Seite http://abgabe.yafido.de abgeben. Beachten Sie, dass Sie Ihre Lösung auch Ihrem Tutor erläutern müssen. Halten Sie sich bei der Programmierung an die in der Vorlesung vorgestellten Richtlinien zur Formatierung von Java-Programmen. Auf der Internetseite zu dieser Veranstaltung finden Sie eine Zusammenstellung dieser Richtlinien. Kommentieren Sie Ihre Lösung der Pflichtaufgabe. Der Kommentar muss Ihren Namen, Ihre Matrikelnummer und Ihre Übungsgruppe sowie eine Beschreibung Ihrer Lösung enthalten. Auf der Abgabeseite finden Sie eine Möglichkeit, die Formatierung Ihrer Lösung zu checken. Aufgabe 33: Eine Ducci-Folge beginnt mit n, n ≥ 3, Zahlen, die nebeneinander aufgeführt werden. Dann wird unter jede Zahl der Abstand zu ihrem rechten Nachbarn geschrieben. Unter die letzte Zahl wird der Abstand zur ersten Zahl geschrieben. Dieses Vorgehen wird wiederholt bis alle Zahlen in einer Zeile identisch sind. Als Beispiel betrachten wir die Ducci-Folge, die mit den Zahlen 36 33 9 26 beginnt: 36 3 21 14 14 14 33 24 7 0 0 14 9 17 7 0 14 14 26 10 7 14 0 14 Nach fünf Schritten enthält die Folge viermal die Zahl 14. Man kann zeigen (s. Übung), dass jede Ducci-Folge, die mit n = 4 Zahlen beginnt, terminiert, d. h., dass nach endlich vielen Schritten die vier Zahlen identisch sind. a) Schreiben Sie eine Anwendung Ducci, die eine Ducci-Folge ausgibt. Die Anfangswerte sollen auf der Kommandozeile eingegeben werden. Das Programm soll folgendermaßen ablaufen: javac Ducci.java java Ducci 36 33 9 26 36 3 21 14 14 14 33 24 7 0 0 14 9 17 7 0 14 14 26 10 7 14 0 14 Die Folge für die Anfangswerte 36 33 9 26 terminiert nach 5 Schritten. b) Nach wie vielen Schritten terminieren die Ducci-Folgen, die mit den Anfangswerten 0 24 68 149 bzw. 4334 34652 26777 23 beginnen? c) Geben Sie ein Beispiel für eine Ducci-Folge mit n = 3 Anfangswerten an, die nicht terminiert. Überprüfen Sie, ob die Ausführung Ihres Programms durch Ihr Beispiel in eine Endlos-Schleife gerät. Aufgabe 34: Diese Aufgabe bietet Ihnen die Möglichkeit, grundlegende Konzepte durch die Bearbeitung weiterer Beispiele zu wiederholen. a) Literale: Geben Sie für die primitiven Datentypen char, long, float und double die Formen der Literale anhand von Beispielen an. b) Speicherung von Werten: Die interne Darstellung einer Gleitkommazahl vom Typ float in einem 32-Bit-Wort nach dem IEEE-Standard sieht wie folgt aus: 31 V 30 . . . 23 E 22 . . . 0 M Das Vorzeichen V wird durch 1 Bit gespeichert. Der Exponententeil E wird durch 8 Bits dargestellt und liegt im Bereich von 0 bis 255. Die Werte E = 0 und E = 255 sind für spezielle Zahlen (Null, denormalisierte Werte, Unendlich, Not-a-Number) reserviert. Der Mantissenteil M beansprucht 23 Bits. Im Normalfall, d. h. mit Ausnahme der speziellen Zahlen, ist M der Anteil der Mantisse nach dem Dezimalpunkt. Vor dem Dezimalpunkt steht eine 1, die nicht abgespeichert wird. Man sagt, die Mantisse sei normalisiert. Im normalisierten Fall, d. h. 1 ≤ E ≤ 254, besitzt eine Gleitkommazahl mit dem Vorzeichen V , dem Exponententeil E und dem Mantissenteil M den folgenden Wert: (−1)V 1.M ∗ 2E−127 – Wie werden die float-Werte +41.375 und −41.375 gespeichert? – Welche Werte sind es, wenn diese Bitfolgen als int-Werte interpretiert werden? –2– – Welches ist der maximale float-Wert? c) Operatoren: Es sei x eine Variable vom Typ int. Geben Sie einen Ausdruck an, der das i.-te Bit des gespeicherten Werts von x als Ergebnis liefert. d) Anweisungen: Schreiben Sie eine Methode static String showIntBits(int x), die die gespeicherten Bits des Parameters x als String liefert. Die Methode static int floatToIntBits(float v) der Klasse Float interpretiert die float-Darstellung des Parameters als int-Darstellung. Verwenden Sie diese Methode und Ihre Methode showIntBits, um Ihre Darstellungen der float-Werte +41.375 und −41.375 zu testen. Pflichtaufgabe 35: In dieser Aufgabe werden die grundlegenden Konzepte der objektorientierten Programmierung behandelt. Ein Punkt in einer Ebene wird durch zwei Koordinaten x und y festgelegt. Die Objekte der folgenden Klasse Punkt sollen Punkte einer Ebene repräsentieren. Diese Klasse besitzt den in der Vorlesung vorgestellten typischen Aufbau einer Klasse. Vervollständigen Sie diese Klasse: public class Punkt { // Attribute private double x; private double y; private final double EPS = 0.0000001; // Konstruktor public Punkt(double x, double y) { ... } // get-/set-Methoden public double getX() { ... } public double getY() { ... } public void setX(double x) { ... } public void setY(double y) { ... } // Überlagerung von Methoden der Klasse Object public boolean equals(Object x) { ... } public Object clone() { ... } public String toString() { ... } // Anwendungen public double abstand() { ... } public double abstand(Punkt p) { ... } } Zwei double-Werte sollen als gleich angesehen werden, falls der Betrag ihrer Differenz kleiner als EPS ist. Die Methode toString() soll eine Zeichenfolge der Form (x,y) liefern, wobei x und y die Koordinaten des aktuellen Objekts sind. Die Methode abstand() soll –3– den Abstand des aktuellen Objekts vom Ursprung (0.0,0.0) berechnen. Die Methode abstand(Punkt p) soll den Abstand des aktuellen Objekts vom Parameter p berechnen. Da eine Gerade in einer Ebene durch zwei Punkte definiert werden kann, ist es möglich, die Klasse Punkt zur Repräsentation von Geraden zu verwenden: public class Gerade { private Punkt p; private Punkt q; public Gerade(Punkt p, Punkt q) { ... } public String toString() { ... } public Punkt schnittPunkt(Gerade g) { ... } } Vervollständigen Sie diese Klasse. Senkrechte Geraden sollen nicht bearbeitet werden. Die Methode toString() soll die aktuelle Gerade in der Form y = mx+n darstellen. Die Methode schnittPunkt(Gerade g) soll den Schnittpunkt der aktuellen Geraden mit dem Parameter g berechnen. Falls die aktuelle Gerade und die Parametergerade parallel oder identisch sind, soll das Null-Objekt zurückgeliefert werden. Beispiel: Die Punkte (1.0, 1.4) und (3.0, 3.8) definieren die Gerade g : y = 1.2x + 0.2. Die Punkte (−1.0, 10.2) und (4.0, 0.2) definieren die Gerade h : y = −2.0x + 8.2. Der Schnittpunkt der Geraden g und h ist der Punkt (2.5, 3.2). Schreiben Sie eine Klasse Test, mit der Sie das Beispiel checken und alle Ihre Methoden testen. Zur Lösung dieser Aufgabe dürfen Sie Methoden der Klasse Math verwenden, aber keine Klassen importieren. Sie können natürlich den Klassen weitere Attribute und Methoden hinzufügen. –4–