Übungen

Transcription

Übungen
ProInformatik III: OOP
Übungsblatt
#5
Thema des Tages: Mehr Programmierpraxis
Lesen für heute:
Aufholen: Lesen Sie alles aus Kapitel 1–3, was Sie noch nicht
gelesen haben.
1 Telefontarife
Hintergrund
Eine Telekomfirma entwickelt als Teil ihres Abrechnungssystems eine neue Software. Die Software ist
noch im Anfangsstadium, und Sie haben den Auftrag, Funktionalität hinzuzufügen. Der existierende
Code ist im BlueJ-Projekt tariffs definiert. Dieses Projekt hat zwei Klassen: PhoneContract und
PhoneRate.
•
Die PhoneRate-Klasse modelliert Anrufgebühren. Die Gebühren bestehen aus einer einmaligen
Gebühr pro Anruf (Verbindungsgebühr) und einer Gebühr pro Minute. Dadurch dass die
Gebühren in Feldern der Klasse definiert sind, kann die Firma mehrere Instanzen dieser Klasse
verwenden, um Gebührenangebote mit verschiedenen Verbindungs- und Minutengebühren
anzubieten.
•
Die PhoneContract-Klasse speichert eine Telefonnummer, ein PhoneRate-Objekt zum kalkulieren
der Anrufkosten, und einen kumulativen Rechnungsbetrag.
Der Aufgabenabschnitt, unten, beschreibt die Änderungen, die Sie an diesem Projekt vornehmen
sollen. Sie werden eventuell nicht alle Aufgaben in der Zeit des Tutoriums fertigstellen können.
Projekterkundung
Bevor Sie anfangen, die Klassen zu ändern, ist es wichtig zu verstehen, wie der existierende Code
funktioniert. Sie können das erreichen, indem Sie einige PhoneRate- und PhoneContract-Objekte
erzeugen und deren Methoden interaktiv aufrufen. Sie können auch den Quelltext lesen.
•
Erzeugen Sie ein PhoneRate-Objekt. Sie werden zwei Werte für die Parameter des Konstruktors
definieren müssen. Probieren Sie 10 für die Verbindungsgebühr und 15 für die Minutengebühr.
Rufen Sie nun die calculateCost-Methode mehrfach auf (mit verschiedenen Werten für die Länge
des Anrufs) um zu prüfen, ob die Ergebnisse Ihren Erwartungen entsprechen.
•
Erzeugen Sie ein PhoneRate-Objekt mit anderen Parameterwerten und wiederholen Sie Ihre
Experimente. Sind die Anrufgebühren bei verschiedenen Objekten für die gleiche Länge der
Anrufe verschieden? Stimmt das mit Ihren Erwartungen überein?
•
Studieren Sie den Quelltext der PhoneRate-Klasse bis Sie ihn verstehen.
•
Entfernen Sie nun alle erzeugten PhoneRate-Objekte und erzeugen Sie ein PhoneContractObjekt. Geben Sie irgendeine Telefonnummer ein.
Öffnen Sie den Inspector für dieses Objekt („Inspect“-Funktion aus dem Kontextmenü); Sie
werden sehen, dass eins der Felder ein PhoneRate-Objekt enthält, ähnlich dem, mit dem Sie
experimentiert haben.
Testen Sie mehrfach die makeCall- und getBill-Methoden des PhoneContract-Objektes jm zu
sehen, wie sie funktionieren. Dann studieren Sie den Quelltext um sicherzustellen, dass Sie die
Klasse verstehen. Wenn Sie etwas nicht verstehen, fragen Sie, bevor Sie mit den Aufgaben
beginnen.
ProInformatik III: OOP
© M. Kölling, University of Kent
Die Aufgaben
1.
Die Telefongesellschaft möchte die Gesamtlänge aller Anrufe zusammen für jeden Vertrag
speichern. Fügen Sie zur PhoneContract-Klasse ein Integerfeld namens totalDuration hinzu.
Jedesmal wenn makeCall aufgerufen wird, soll die Anrufdauer zu totalDuration hinzuaddiert
werden. Fügen Sie auch eine Accessor-Methode, getTotalDuration, hinzu.
Testen Sie gründlich alle Änderungen, die Sie in dieser Aufgabe gemacht haben.
2.
Fügen Sie eine neuer Methode in die Klasse PhoneContract ein, namens printBill. Sie erwartet
keine Parameter, und liefert keinen Ergebniswert zurück. Die Methode soll eine einzelne Zeile
ausgeben (in das Terminalfenster), die die Telefonnummer enthält, die Gesamtdauer der Anrufe
und den Rechnungsbetrag; zum Beispiel:
Nummer: (030) 8670 5309 Dauer: 523 Betrag: 3000
Testen Sie die Änderungen.
3.
Fehler in dem System der Telefongesellschaft führen manchmal dazu, dass den Kunden Anrufe
mit einer Länge von null Sekunden berechnet werden. Ändern Sie die calculateCost-Methode in
der PhoneRate-Klasse so dass Anrufe der Länge null nichts kosten.
Testen Sie die Änderungen.
4.
Die Telefongesellschaft will einen anderen Tarif zugrunde legen, wenn ein Kunde Anrufe von
insgesamt einer Stunde Länge (3600 Sekunden) geführt hat. Um dies zu ermöglichen, modifizieren
Sie die PhoneContract-Klasse, so dass sie nun zwei PhoneRate-Objekte hat: das ursprüngliche in
dem tariff Feld und ein zweites in einem neuen Feld namens cheapTariff. Erzeugen Sie im
Konstruktor der PhoneContract-Klasse ein zweites PhoneRate-Objekt, und speichern Sie es in
dem cheapTariff Feld. Achten Sie darauf dass die Verbindungsgebühr und die Minutengebühr
einen billigeren Tarif repräsentieren.
Jeder Anruf von einer gegebenen Nummer wird mit genau einem der beiden PhoneRate-Objekte
berechnet. Wenn am Anfang des Anrufes weniger als eine Stunde telefoniert worden ist, wird die
ursprüngliche Rate zugrunde gelegt, und sonst die günstigere Rate. Machen Sie die nötigen
Änderungen in der makeCall-Methode, um dieses Schema zu implementieren.
Testen Sie Ihre Änderungen gründlich. Überzeugen Sie sich, dass Sie alles korrekt implementiert
haben.
[Zusatzaufgabe für Mutige.] Ändern Sie die printBill-Methode, so dass sie folgendes ausgibt:
a. Die Telefonnummer.
b. Die Anzahl der getätigten Anrufe.
c. Den Gesamtbetrag der Rechnung.
d. Die durchschnittliche Dauer eines Anrufs.
e. Die Anzahl der Anrufe, die mit der ursprünglichen Rate berechnet wurden.
f. Die Anzahl der Anrufe, die mit der günstigeren Rate berechnet wurden.
Sie können die Ausgabe formatieren, wie Sie wollen.
Testen Sie Ihre Änderungen.
ProInformatik III: OOP
© M. Kölling, University of Kent