Programmieren–Sommersemester 2015

Transcrição

Programmieren–Sommersemester 2015
Programmieren Sommersemester 2015
Software-Design und Qualität (SDQ)
https://sdqweb.ipd.kit.edu/wiki/Programmieren
Prof. Dr. Ralf H. Reussner · Philipp Merkle · Kiana Rostami
Übungsblatt 2
Ausgabe: 04.05.2015 13:00
Abgabe: 18.05.2015 13:00
Bearbeitungshinweise
•
Achten Sie darauf nicht zu lange Zeilen, Methoden und Dateien zu erstellen
•
Programmcode muss in englischer Sprache verfasst sein
•
Kommentieren Sie Ihren Code angemessen: So viel wie nötig, so wenig wie möglich
•
Verwenden Sie keine Klassen der Java-Bibliotheken ausgenommen Klassen der Pakete
java.io,
1
java.lang
und
es sei denn die Aufgabenstellung erlaubt ausdrücklich weitere Pakete
1
•
Achten Sie auf fehlerfrei kompilierenden Programmcode
•
Halten Sie alle Whitespace-Regeln ein
•
Halten Sie die Regeln zu Variablen-, Methoden und Paketbenennung ein und wählen Sie aussagekräftige
Namen
Abgabemodalitäten
Die Praktomat-Abgabe wird am Montag, den 11. Mai, freigeschaltet.
•
Geben Sie die Java-Klassen zu Aufgabe A als
*.java-Dateien
ab.
•
Geben Sie die Java-Klassen zu Aufgabe B als
*.java-Dateien
ab.
•
Geben Sie die Java-Klassen zu Aufgabe C als
*.java-Dateien
ab, falls Sie die Bonusaufgabe bearbeiten.
Achten Sie unbedingt darauf, diese Dateien bei der richtigen Aufgabe hochzuladen.
1 Der
Praktomat wird die Abgabe zurückweisen, falls diese Regel verletzt ist.
Programmieren Sommersemester 2015
A
04.05.2015 13:00
Fibonacci-Folge (7 Punkte)
Die Fibonacci-Folge ist eine Zahlenfolge mit groÿer Bedeutung, nicht nur in der Mathematik und der Informatik. Sie lässt sich häug in der Natur beobachten, und der Quotient zweier groÿer, aufeinanderfolgender
Fibonacci-Zahlen entspricht ungefähr dem Goldenen Schnitteinem Verhältnis zweier Gröÿen zueinander, das
aus ästhetischer Sicht als ideal betrachtet wird.
Die ersten zehn Glieder der Fibonacci-Folge lauten folgendermaÿen:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55
Man kann beobachten, dass jedes Folgeglied die Summe seiner beiden Vorgänger istmit Ausnahme der ersten
beiden Glieder, die als Startwerte fest vorgegeben sind. Mathematisch kann die Fibonacci-Folge also wie folgt
beschrieben werden:
fi = fi−1 + fi−2 ,
A.1
mit
f1 = 1
und
f2 = 1
Aufgabenstellung
Schreiben Sie ein Programm, das iterativ alle Fibonacci-Zahlen berechnet, die kleiner oder gleich einer gege-
n sind. Die Zahl n wird dem Programm als Kommandozeilenargument2
java FibonacciSequence 200 3 setzt beispielsweise n auf den Wert 200.
benen Zahl
Legen Sie diese Fibonacci-Zahlen so in einem Array ab, dass die
i − 1 steht. Wie wir
Position 7 − 1 = 6 abgelegt.
Index
i-te
übergeben. Der Aufruf
Fibonacci-Zahl an der Position mit dem
wissen, lautet beispielsweise die siebte Fibonacci-Zahl 13 und wäre demnach an
Legen Sie die Gröÿe des Arrays so fest, dass das Array gerade groÿ genug ist, um alle Fibonacci-Zahlen mit
dem Wert
≤ n
aufzunehmen, aber nicht gröÿer. Abschnitt A.2 erklärt, wie Sie die ideale Gröÿe des Arrays
bestimmen können, noch bevor Ihr Programm berechnet hat, wie viele der Zahlen zwischen
1
und
n
tatsächlich
Fibonacci-Zahlen sind.
Der Zusatz iterativ in obigem Absatz bedeutet: beginnen Sie mit dem Wissen
berechnen Sie anschlieÿend
f3 ,
Sie dürfen annehmen, dass
n
A.2
dann
eine
f4 ,
f1 = 1
Integer-Zahl
f2 = 1 ,
und
ist.
Optimale Dimensionierung des Arrays
Das Array soll gerade groÿ genug sein, um alle Fibonacci-Zahlen mit dem Wert
gröÿer. Dazu muss berechnet werden, wie viele der Zahlen zwischen
1
und
n
≤n
aufzunehmen, aber nicht
tatsächlich Fibonacci-Zahlen sind.
Die nachfolgende Formel hilft dabei. Sie berechnet zu einer gegebenen Fibonacci-Zahl
n = fi deren Index i.
n ist. Falls n keine
Anders ausgedrückt beantwortet die Formel die Frage, die wievielte Fibonacci-Zahl die Zahl
Fibonacci-Zahl ist, liefert die Formel den Index der nächst-kleineren Fibonacci-Zahl.
index(n) =
Dabei ist
2 Das
3 Der
und
und so weiter.
ϕ=
logϕ n ·
√
1+ 5
2 . Sie dürfen ausdrücklich die Klasse
Kommandozeilenargument können Sie aus dem
Klassenname
FibonacciSequence
√
5+
1
2
java.lang.Math
args-Parameter
ist nicht vorgeschrieben.
Seite 2 von 5
der
nutzen.
main-Methode
auslesen.
Programmieren Sommersemester 2015
Hinweis: der Logarithmus zur Basis
ϕ
04.05.2015 13:00
lässt sich mittels Basisumrechnung folgendermaÿen bestimmen:
logϕ (x) =
A.3
Programmausgabe
Geben
Sie
jede
Fibonacci-Zahl
System.out.println(...)
des
Arrays
in
einer
log(x)
log(ϕ)
separaten
Zeile
auf
die
Konsole
aus,
indem
Sie
aufrufen. Die Fibonacci-Zahlen sollen zudem in aufsteigender Sortierung ausge-
geben werden.
Geben Sie als letzte Zeile zusätzlich die Gröÿe des Arrays auf die Konsole aus.
Beispielausgabe für
n = 13
1
1
2
3
5
8
13
7
B
Campus-Management-System (13 Punkte)
4 die Java-Quelltexte eines stark vereinfachten Campus-Management-
Laden Sie von der Vorlesungshomepage
Systems herunter. Das Programm kompiliert zwar, ist aber noch nicht lauähig. Es fehlen die Implementierung
der
main-Methode,
einige Methoden und einzelne Attribute.
Versuchen Sie zunächst, das gegebene Programm zu verstehen. Dabei hilft die Javadoc-Dokumentation der
einzelnen Klassen. Schreiben Sie dann das Programm gemäÿ folgender Beschreibung fertig.
Benennen Sie bestehende Pakete, Klassen, Methoden, Attribute etc. nicht um. Verschieben Sie bestehende
Klassen nicht in andere Pakete.
Zur Vereinfachung brauchen Sie in diesem Übungsblatt nicht zu überprüfen, ob bei einem Methodenaufruf
übergebene Argumente gültig sind. Nehmen Sie an, dass die Argumente gültig sind, also z.B. keine negativen
Matrikelnummern verwendet werden. Weiterhin dürfen Sie annehmen, dass Matrikelnummern und Lehrveranstaltungsnummern eindeutig einem (einzigen) Studenten bzw. einer (einzigen) Lehrveranstaltung zugeordnet
werden können.
B.1 SimpleArrayList-Klasse
Diese Klasse implementiert eine einfache Datenstruktur zur Verwaltung einer Liste von Objekte. Sie lässt
sich gleichermaÿen für Objekte vom Typ
Course
als auch
ExaminationResult
einsetzen. Nach dem Ausle-
sen eines Elements muss das zurückgelieferte Objekt daher einer Typumwandlung (cast) nach
ExaminationResult
Course
bzw.
unterzogen werden. Durch den Einsatz von Generics könnte die Typumwandlung zwar
entfallen, Generics werden aber erst in späteren Übungsblättern eingesetzt und sollen für diese Klasse nicht
verwendet werden.
•
Implementieren Sie die Methoden
actualSize,
add, remove sowie get. Nutzen Sie die vorbereitete
elements-Arrays zu verwalten. Achten Sie darauf,
um den Füllstand des
4 https://sdqweb.ipd.kit.edu/lehre/SS15-Programmieren/cm.zip
Seite 3 von 5
Instanzvariable
dass das Array
Programmieren Sommersemester 2015
04.05.2015 13:00
nicht überläuft: verdoppeln Sie z.B. die Arraygröÿe, sobald kein Platz mehr frei ist. Vergessen Sie nicht,
den Inhalt des alten (kleineren) Arrays in das neue (gröÿere) Array zu übertragen. Hierzu bietet sich die
arraycopy-Methode5
der
System-Klasse
an.
B.2 Course-Klasse
•
Schreiben Sie für die
und
type
Course-Klasse getter- und setter-Methoden, um auf die Attribute name, number, ects
lesend bzw. schreibend zugreifen zu können. Sie brauchen für diese Methoden ausnahmsweise
keine Javadoc-Dokumentation zu schreiben.
B.3 StudyProgram-Klasse
•
Implementieren Sie die beiden Methoden
addCourse
sowie
removeCourse.
Entnehmen Sie die geforder-
te Funktionalität der Javadoc-Dokumentation. Nutzen Sie die vorbereitete Instanzvariable
courses,
um
hinzugefügte Lehrveranstaltungen zu verwalten.
B.4 ExaminationResult-Klasse
•
Implementieren Sie die
passed-Methode.
Entnehmen Sie die geforderte Funktionalität der Javadoc-
Dokumentation.
B.5 Student-Klasse
•
Implementieren Sie die
validMatriculationNumber-Methode.
Entnehmen Sie die geforderte Funktiona-
lität der Javadoc-Dokumentation.
•
Implementieren Sie die Methode
addResult.
Vergessen Sie nicht, der Klasse ein geeignetes Attribut hin-
zuzufügen, so dass hinzugefügte Prüfungsergebnisse gespeichert werden können. Entnehmen Sie die geforderte Funktionalität der Javadoc-Dokumentation. Die korrespondierende Methode
removeResult
ist
nicht gefordert.
•
Implementieren Sie beide
averageGrade-Methoden.
Entnehmen Sie die geforderte Funktionalität jeweils
der Javadoc-Dokumentation.
•
Implementieren Sie die
finishedStudies-Methode.
Entnehmen Sie die geforderte Funktionalität der
Javadoc-Dokumentation.
B.6 CampusManagement-Klasse
•
Schreiben Sie eine sinnvolle
main-Methode und führen Sie das Programm aus. Bilden Sie z.B. den Studien-
gang Informatik oder Informationswirtschaft ab. Jede Klasse soll mindestens ein mal instanziiert werden.
Weiterhin soll jede Methode (und jeder Konstruktor) mindestens ein mal aufgerufen werden, ausgenommen
getter-Methoden und setter-Methoden.
B.7
•
Klassenübergreifende Anforderungen
CampusManagement sowie der CourseType-Enumeine
toString()-Methode hinzu, falls diese nicht bereits vorhanden ist. Die toString()-Methode der Klasse ExaminationResult gibt den Namen der Lehrveranstaltung zurück, gefolgt von einem Doppelpunkt,
Fügen Sie jeder Klasseausgenommen die Klasse
gefolgt von der Note mit einem Punkt als Dezimaltrennzeichen und genau einer Nachkommastelle. Also
beispielsweise
Programmieren:1.3 . Für alle anderen toString()-Methoden ist das Ausgabeformat nicht
vorgeschrieben: überlegen Sie sich jeweils eine geeignete Ausgabe.
5 http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#arraycopy(java.lang.Object,int,java.lang.
Object,int,int)
Seite 4 von 5
Programmieren Sommersemester 2015
C
04.05.2015 13:00
Schaltjahre (3 Bonuspunkte)
Der weltweit verbreitete Gregorianische Kalender nutzt Schalttage, um die durchschnittliche Länge eines Kalenderjahres an die Länge eines Sonnenjahres anzupassen. Denn während ein übliches Kalenderjahr aus 365 Tagen
besteht, hat das Sonnenjahr eine Länge von 365,24219 Tagen. Ein Jahr, das durch Einschaltung eines zusätzlichen Schalttages verlängert wird, bezeichnet man als Schaltjahr.
C.1
Aufgabenstellung
Ein Jahr, das sich ohne Rest durch 400 teilen lässt, ist ein Schaltjahr. Ein Jahr, das sich ohne Rest durch 4
teilen lässt, ist genau dann ein Schaltjahr, wenn das Jahr nicht durch 100 teilbar ist.
Schreiben Sie ein Programm, das nach diesen Regeln alle Schaltjahre zwischen den Jahren 1899 und 2101
ausgibt.
C.2
Programmausgabe
Geben Sie jedes Schaltjahr in einer separaten Zeile auf der Konsole aus, indem Sie
System.out.println(...)
aufrufen.
Geben Sie die Schaltjahre in aufsteigender Sortierung aus, d.h. beginnend mit dem kleinsten Jahr.
Seite 5 von 5