Serie 4 / 14.12.2010 - Informatik Uni-Leipzig

Werbung
Universität Leipzig
Institut für Informatik
WS 10/11
Dr. Monika Meiler
Modellierung und Programmierung 1
Übungsserie 4
Abgabetermin: 14.12.2010, 23:55 Uhr
Grundsätzlich sind Antworten zu begründen, Nebenrechnungen anzugeben,
Programmquellcode und Ergebnisdateien einzureichen.
1.
Rekursion
a) Entwickeln Sie in einem Programm
Quer.java jeweils eine iterative und eine rekur-
sive Methode, welche die Quersumme einer
long-Zahl
bestimmen.
public static int itQuer(long n){...}
public static int reQuer(long n){...}
b) Eine Verallgemeinerung sind gewichtete Quersummen, bei denen die Ziern erst mit
den Werten einer periodischen Zahlenfolge multipliziert und diese Ergebnisse dann
addiert werden. Dabei wird mit der niedrigstwertigsten Zier begonnen.
Sei die periodisch fortgesetzte Folge
a(n) = {1, 3, 2, −1, −3, −2, 1, 3, 2, −1, −3, −2, ...}
und die zu prüfende Zahl
422625.
Dann ist die gewichtete Quersumme
5 · 1 + 2 · 3 + 6 · 2 − 2 · 1 − 2 · 3 − 4 · 2 = 5 + 6 + 12 − 2 − 6 − 8 = 7.
Erweitern Sie Ihr Programm
Quer.java um die Methode
public static int wQuer(long n){...},
welche die gewichtete Quersumme mit der angegebenen Folge
Testen Sie
itQuer, reQuer
und
wQuer
a(n)
berechnet.
an den Zahlen
77131834, 8876826, 99506204
und leiten Sie die Ergebnisse in
Hinweis: Um das
i-te
Quer.out um.
Element von
a(n)
Länge 6 anlegen, auf welches Sie mittels
c) Die Methode
wQuer
zu erhalten, können Sie z.B. ein Feld der
i
modulo
6
zugreifen.
liefert eine Teilbarkeitsregel für die Zahl 7. Formulieren und
beweisen Sie diese.
Hinweis: Verwenden Sie für den Beweis die Summendarstellung für Zahlen im Positionssystem zur Basis 10.
1
2.
Fehlerfortpanzung
x
f (x) = e =
∞
X
xi
i=0
i!
=1+x+
x2 x3
+
+ ...
2!
3!
Das Implementieren der Reihenentwicklung für die Exponentialfunktion soll die Fehlerfortpanzung, bedingt durch die Zahlendarstellung im Rechner, demonstrieren.
Hinweis zum Programmieren einer Reihenentwicklung:
Um die Anzahl der Operationen zu minimieren, berechnet man einen neuen Summanden
aus dem alten und addiert ihn anschlieÿend zu der bis dahin berechneten Summe. Das
wird solange wiederholt, bis ein neuer Summand so klein ist, dass er keinen Beitrag zur
Summenbildung liefert, d.h. die Summe sich nicht mehr verändert (Rechnergenauigkeit):
Startwerte
Berechnen des neuen Summanden
Merken der alten Summe
Berechnen der neuen Summe
Abbruchbedingung
neueSumme = 1, Summand = 1, i = 1,
berechne
Summand = Summand * x / i,
alteSumme = neueSumme,
neueSumme = neueSumme + Summand,
i
=i+
solange
1,
neueSumme
6=
Stellen Sie in einer Klasse
alteSumme
Exp zwei Klassenmethoden für die Exponentialfunktion bereit:
a) Interpretieren Sie die Reihenentwicklung der Exponentialfunktion in einer Methode
public static double myExp(double x){...}
f (x) für x ∈ [−20, 0] mit
0.5 und vergleichen Sie die Ergebnisse Ihrer Methode mit denen der
double Math.exp(double) der Klasse java.lang.Math.
Tabellieren Sie in einem Testprogramm die Funktionswerte
der Schrittweite
Methode
b) Fehlerbehandlung: Für einige x < 0 wird das Ergebnis negativ. Man berechnet für
1
|x|
x
den Fall x < 0 deshalb e
und setzt e = |x| . Geben Sie eine verbesserte Methode
e
public static double myExpBesser(double x){...}
an, die diesen Fall unter Verwendung der Methode
derholen Sie den Test.
Erzeugen Sie durch Ausgabeumleitung eine Datei
myExp gesondert behandelt. Wie-
Exp.out mit den Testergebnissen.
Exp.java (Grobstruktur)
public class Exp
{
public static double myExp(double x){ }
public static double myExpBesser(double x){ }
}
public static void main(String[] args)
{
for(double x = 0; x > -20; x-=.5)
{
// Berechnung und Ausgabe der Ergebnisse
// myExp(x), myExpBesser(x), Math.exp(x)
}
}
2
3.
Modellierung (Militärverwaltung)
Regiment
Kompanien
Ozieren
zivilen Personen
Kompanie
Ozier
Regimentskommandeur
Ein nichtausbildendes
ozieren
niechef
und
beinhaltet
sowie
, welcher stets ein
bestehend aus
. Jede
ist. Der
Gefreiten UnterKompaOzier
,
besitzt einen
, ebenfalls ein
,
möchte zur Verwaltung der Regimentskaserne ein Rechnerprogramm einsetzen, mit dem
folgende Daten erfasst werden:
Vor- Nachname, Adresse (Strasse, Hausnummer, Postleitzahl, Ort), Geburtsdatum
(Tag, Monat, Jahr)
Soldaten abgeleisteten
Dienstjahre
Zivilpersonen
Tätigkeit
und
aller Personen des Regiments, bei allen
und bei allen
deren
die
innerhalb des Regiments. Mo-
dellieren Sie die Regimentsstruktur als UML-Klassendiagramm (ohne Funktionalität).
Achten Sie auf kleine, wiederverwendbare Klassen.
a) Geben Sie grasch die Klassen einschlieÿlich ihrer Instanzvariablen an und
b) stellen Sie die Beziehungen der Klassen untereinander dar.
4.
Klasse Datum
Gottfried Wilhelm Leibniz ist am 1.7.1646 geboren. Was für ein Wochentag war das? Um
diese oder ähnliche Fragen zu beantworten, muss man den Wochentag aus dem Datum
heraus berechnen können. Wir wollen eine Klasse
Datum implementieren, welche diese Auf-
gabe für die Jahre zwischen 1600 und 3000 erfüllt und folgenden Klassenaufbau haben soll:
Interpretieren Sie die Methoden:
a) Die Methode
setDatum übernimmt ein korrektes Datum in die dafür vorgesehenen
tag, monat, und jahr, setzt schaltjahr, berechnet wochentag und
Instanzvariablen
gibt das gesetzte Datum zurück. Ist das übergebene Datum nicht korrekt, setzt die
Methode die Instanzvariablen
Ausnahme (DatumException).
b) Die Methode
tag, monat,
berechneWochentag
und
jahr
zurück auf
0
und wirft eine
ist eine Hilfsmethode für die Methode
setDatum.
Sie berechnet aus dem Datum den Wochentag nach dem Gregorianischen Kalender,
der seit 1582 gilt.
c) Die Methode
toString
erzeugt zu einem Datum einen String der Form:
Mittwoch, am 15.12.2010.
Testen Sie Ihre Klasse in einem Programm
DatumTest.java,
welches wiederholt
Daten einliest, analysiert und das Datum als String ausgibt. Überprüfen Sie mit
Ihrem Programm die folgenden Daten und ermitteln Sie den Wochentag:
3
•
Die Gründung der Universität Leipzig fand am 2.12.1409 statt.
•
Gottfried Wilhelm Leibniz wurde am 1.7.1646 geboren.
•
Neil Armstrong betrat am 21.7.1969 als erster Mensch den Mond.
•
Siegmund Jähn startete als erster deutscher Kosmonaut am 26.8.1978 in das
Weltall.
und leiten Sie die Ergebnisse in eine Datei
DatumTest.out
um.
Hinweis:
•
Schaltjahre sind durch 4 teilbar Jahre mit der Ausnahme der Jahrhunderwenden.
Diese sind nur dann Schaltjahre, wenn das Jahrhundert durch 4 teilbar ist.
Beispiel: 2000 war ein Schaltjahr (20 modulo 4 = 0), 1900 war kein Schaltjahr (19
modulo 4 = 3).
•
Beachten Sie, dass ein Datum 29.2. nur in einem Schaltjahr korrekt ist.
4
Herunterladen