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