05. Übungsblatt - Technische Universität Braunschweig

Werbung
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–
Zugehörige Unterlagen
Herunterladen