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