Musteraufgaben OOP Aufgabe 1: Vererbung (20 Punkte)

Werbung
Musteraufgaben OOP
Aufgabe 1:
Vererbung
(20 Punkte)
Im Rahmen einer Softwareentwicklung für die einheitliche Verwaltung von Flugzeugen wurde
die Klasse Flugzeug entwickelt. Die Klasse Flugzeug ist auszugsweise angegeben:
abstract class Flugzeug {
private String hersteller;
private int maxSpeed;
private String immatNummer;
private int anzahlFluegel = 1;
//
//
//
//
Herstellername
Max. Geschwindigkeit
Immatrikulationsnummer
Anzahl Flügelpaare
public Flugzeug(String hersteller, int maxSpeed, int anzahlFluegel) {
this.hersteller
= hersteller;
this.maxSpeed
= maxSpeed;
this.anzahlFluegel = anzahlFluegel;
}
public String getImmatNummer(){
return immatNummer;
}
protected void setImmatNummer(String immatNummer){
this.immatNummer = immatNummer;
}
public int getMaxSpeed(){
return maxSpeed;
}
abstract public boolean getLooping();
// weitere Methoden
}
Schreiben Sie ausgehend von dieser Klasse eine Klasse Verkehrsflugzeug sowie eine Klasse
Doppeldecker. Diese sollen folgende Spezifikation erfüllen:
Klasse Verkehrsflugzeug
• Ein Verkehrsflugzeug ist ein Flugzeug, das genau ein Flügelpaar sowie eine zusätzliche
Variable für die Anzahl der Passagiere hat.
• Ein Verkehrsflugzeug fliegt keine Loopings. Stellen Sie deshalb sicher, dass die Methode
getLooping immer false zurückgibt, auch in allfälligen Unterklassen von
Verkehrsflugzeug.
• Schreiben Sie einen Konstruktor, mit dem ein Verkehrsflugzeug-Objekt erzeugt
werden kann. Dazu müssen der Hersteller (String), die maximale Geschwindigkeit (int),
die Immatrikulationsnummer (String) und die Anzahl Passagiere (int) angegeben werden.
• Die Klasse Verkehrsflugzeug hat die Methoden getAnzahlPassagiere und
setAnzahlPassagiere zum Abfragen und Setzen der Anzahl der Passagiere.
Klasse Doppeldecker
• Ein Doppeldecker ist ein Flugzeug, das genau zwei Flügelpaare hat.
• Weiter ist ein Doppeldecker akrobatiktauglich, d.h. man kann damit Loopings fliegen.
Für einen Looping muss der Doppeldecker eine Mindestgeschwindigkeit von 320 km/h
erreichen. Definieren Sie dafür eine Konstante LOOPINGSPEED. Die Methode
•
•
•
•
getLooping soll true zurückgeben, falls die zulässige max. Geschwindigkeit
(maxSpeed) grösser LOOPINGSPEED ist.
Die Klasse Doppeldecker hat eine Variable offenesCockpit vom Typ boolean.
Sie gibt an, ob der Doppeldecker ein offenes oder geschlossenes Cockpit hat. Nachdem
offenesCockpit gesetzt worden ist, darf sie nicht mehr verändert werden.
Schreiben Sie eine Methode isOffenesCockpit, die den Wert von offenesCockpit
zurückgibt.
Schreiben Sie zwei Konstruktoren, mit denen ein Doppeldecker-Objekt initialisiert
werden kann.
o Der 1. Konstruktor hat folgende Parameter:
Hersteller (String), maximale Geschwindigkeit (int), die Immatrikulationsnummer
(String) und einen boolean offenesCockpit, der angibt, ob der Doppeldecker
ein offenes oder geschlossenes Cockpit hat
o Der 2. Konstruktor hat folgende Parameter:
Hersteller (String), maximale Geschwindigkeit (int), die Immatrikulationsnummer
(int). Der Defaultwert für offenesCockpit bei einem Doppeldecker ist true.
Die Klasse Doppeldecker soll nicht erweiterbar sein.
a) (8 Punkte) Implementieren Sie die vollständige Klasse Verkehrsflugzeug gemäss der
oben angegebenen Spezifikation.
b) (12 Punkte) Implementieren Sie die vollständige Klasse Doppeldecker gemäss der oben
angegebenen Spezifikation.
Aufgabe 2:
Dateien
(20 Punkte)
Schreiben Sie ein JAVA-Hauptprogramm (Kommandozeilen-Applikation) LangeZeilen, das
auf der Kommandozeile zwei Parameter erwartet: erstens eine ganze Zahl n und zweitens den
Namen (inkl. evtl. Pfad) einer Datei. Das Programm soll die Datei zeilenweise einlesen, zählen,
wieviele Zeilen länger als n Zeichen sind, und dann einen Satz auf die System-Konsole ausgeben
„Die Datei <NameDerDatei> enthält <Anzahl> Zeilen, die länger als <n> Zeichen sind.“ (Dabei
sollen für <NameDerDatei>, <Anzahl> und <n> die aktuellen Werte eingefügt werden.)
Falls ein Benutzer das Programm aufruft mit weniger als zwei Parametern, soll das Programm
eine Kurzanleitung auf die System-Konsole schreiben („Aufruf: ...“) mit der Angabe, wie der
korrekte Aufruf aussieht und was die Parameter bedeuten.
Hinweis: Gesamter Code darf in der main-Methode stehen.
Aufgabe 3:
Abstrakte Klassen / Interfaces
(25 Punkte)
Ein Pizzastore produziert verschiedene Pizzas: Margherita, Napolitana, QuattroStagione etc.
Alle Pizzas haben folgende Attribute: zutaten[] und preis. Zudem müssen sie folgende
Methoden implementieren: getZutaten und getPreis.
Die Pizza Margherita ist in verschiedenen Grössen (klein, mittel, gross) erhältlich; sie hat daher
ein zusätzliches Attribut grösse und eine zusätzliche Methode getGrösse. Der Preis ist von
der Grösse abhängig (proportional zur Grösse).
a) (15 Punkte)
Verwenden Sie für die Teilaufgabe a) ein Interface (keine Basisklasse):
• Schreiben Sie die Klassen PizzaNapolitana und PizzaMargherita.
• Schreiben Sie eine Mini-Buchhaltung für Pizzas. Die Pizzas werden in einen Array
eingetragen. Füllen Sie den Array mit je einer PizzaNapolitana und
PizzaMargherita.
• Schreiben Sie geeigneten Code, der den Preis der beiden im Array enthaltenen Pizzas
errechnet.
b) (10 Punkte)
Schreiben Sie für die obigen Pizzas eine Basisklasse Pizza (nur diese).
• Die Klasse Pizza kann nicht instanziert werden.
• Überlegen Sie, welche Methoden bereits in der Basisklasse implementiert werden können
und welche den Subklassen aufgezwungen werden müssen.
Aufgabe 4:
Threads
(30 Punkte)
Schreiben Sie eine Klasse Ziehbrunnen (als Hauptprogamm und Applet), welche je einen
Thread mit den Namen pumpe und verteiler erzeugt. pumpe und verteiler sind
Objekte der Klasse Schoepfer.
Schreiben Sie die Klasse Schoepfer (Schoepfer hat die Fähigkeit, die Funktion von
verteiler oder von pumpe auszuüben).
Das Applet verwaltet den Wassertrog (int-Variable). pumpe schüttet im Sekundentakt eine
zufällige Menge Wasser (zwischen 0 und 20 Liter) in den Trog, verteiler entnimmt im
selben Rhythmus dem Trog eine zufällige Menge Wasser (ebenfalls zwischen 0 und 20 Liter).
Wenn im Trog weniger Wasser vorhanden ist, als verteiler holen will, wird verteiler in
den Wartezustand versetzt. Sobald pumpe wieder genügend Wasser geliefert hat, beendet diese
den Wartezustand von verteiler. Für die gepumpte Wassermenge gibt es keine
Beschränkung (Trog darf überlaufen).
Aufgabe 5:
Polymorphismus
(30 Punkte)
Sie schreiben im Folgenden eine Ticketkontrolle. Konzentrieren Sie sich auf die
Aufgabenstellung und nicht auf irgendwelche Eigenheiten in Ihrem Lieblingsverkehrsverbund.
So können Sie davon ausgehen, dass Fahrgäste immer kontrolliert werden (keine
Selbstkontrolle). Einzeltickets und Mehrfahrtenkarten sind immer nur in einer Zone gültig.
Generalabos gelten im ganzen Netz.
abstract class Ticket {
private int preis; // Der Preis
private boolean entwertet; // Ungültig, wenn entwertet!
public Ticket( int preis ) {
this.preis = preis;
entwertet = false;
}
public int gibPreis() { return preis; }
public void entwerten() { entwertet = true; }
public boolean istEntwertet() { return entwertet; }
public abstract boolean gueltigInZone( int zone );
}
class Einzelticket extends Ticket {
private int zone; // Nur in dieser Zone gültig!
private String verfallsDatum; // String im Format JJJJMMTT
// Nach diesem Datum ungültig!
public Einzelticket(int preis, String verfallsDatum, int zone) {
super(preis);
this.verfallsDatum = verfallsDatum;
this.zone = zone;
}
public String gibVerfallsDatum() { return verfallsDatum; }
public boolean gueltigInZone(int zone) {
return zone == this.zone; }
}
class Mehrfahrtenkarte extends Ticket {
private int fahrten; // Anzahl erlaubte Fahrten
private int zone; // Nur in dieser Zone gültig!
public Mehrfahrtenkarte(int preis, int fahrten, int zone) {
super(preis);
this.fahrten = fahrten;
this.zone = zone;
}
public void entwerten() {
if( fahrten == 0 ) return;
fahrten -= 1;
}
public boolean istEntwertet() { return fahrten == 0; }
public boolean gueltigInZone( int zone ) {
return zone == this.zone; }
}
class Generalabo extends Ticket {
private String inhaber; // Nur für diese Person gültig!
private String verfallsDatum; // String im Format JJJMMTT
// Nach diesem Datum ungültig!
public Generalabo(int preis, String inhaber, String verfallsDatum) {
super(preis);
this.inhaber = inhaber;
this.verfallsDatum = verfallsDatum;
}
public
public
public
public
void entwerten() { /* es passiert nix! */ }
String gibVerfallsDatum() { return verfallsDatum; }
boolean gueltigInZone( int zone ) { return true; }
String gibInhaber() { return inhaber; }
}
Vervollständigen Sie nun folgendes Gerüst einer Ticketkontrolle. Der Kontrolleur hat zur
Verfügung:
1.
2.
3.
4.
Die Namen aller Fahrgäste
Ihre Tickets. Dabei gilt: tickets[i] ist das Ticket des Fahrgasts mit Namen namen[i]
Die aktuelle Zone, in der die Kontrolle stattfindet
Das heutige Datum
Der Kontrolleur muss alle Tickets entwerten, und die Anzahl der Schwarzfahrer zählen. Ein
entwertetes Ticket ist nie gültig. Ansonsten ist die Gültigkeit vom Typ des Tickets abhängig.
Überlegen Sie sich sorgfältig das richtige Kriterium.
Hinweis: Das Datum ist als String abgelegt in der Form „JJJJMMTT“, d.h. heute an Ihrem
Prüfungstag ist „20060905“. Solche Daten kann man lexikographisch miteinander vergleichen
(d.h. gemäss Ihrer „alphabetischen“ Reihenfolge. Sie können die String-Methode compareTo
verwenden).
Das Programmgerüst:
public int kontrolliere( String[] namen, Ticket[] tickets, int zone,
String datum ) {
int schwarzFahrer = 0;
if( namen.length != tickets.length )
throw new IllegalArgumentException();
}
// IHR CODE HIER!
return schwarzFahrer;
}
Aufgabe 6:
Exceptions
(10 Punkte)
Schreiben Sie eine Methode integerDivision. Der Methode werden als Argumente
Dividend und Divisor als String-Variablen übergeben (die von einem TextField eingelesen
worden sind).
Schreiben Sie zudem das Code-Fragment, das zeigt, wie der Aufruf der Methode und das
Exception-Handling aussehen.
Die Methode soll wie folgt reagieren:
•
Falls die Variablen nur einen Leer-String (““) enthalten, soll die Methode eine
IllegalArgumentException werfen.
•
•
•
Enthalten die Variablen keine numerischen Werte, wird eine
NumberFormatException an das aufrufende Programm geworfen.
Enthält der Dividend den Wert Null(0), wird eine ArithmeticException an das
aufrufende Programm geworfen.
Im “Normalfall“ gibt die Methode den Quotienten zurück.
Aufgabe 7:
Vererbung
(20 Punkte)
In dieser Aufgabe entwickeln Sie eine Klasse AttentionScrollbar, die von der Klasse
Scrollbar des Packages java.awt abgeleitet ist. Die Klasse AttentionScrollbar
unterscheidet sich von der Klasse Scrollbar durch folgende zusätzliche(!) Eigenschaften:
•
Wenn der eingestellte Wert des AttentionScrollbars durch den Schieberegler mehr als die
Hälfte des einstellbaren Bereiches (Mittelwert) erreicht hat, soll die Hintergrundfarbe rot werden.
Fällt der Wert des eingestellten Bereiches wieder unter diesen Mittelwert, so soll die
Hintergrundfarbe wieder die ursprüngliche Hintergrundfarbe annehmen.
•
Eine neue Methode public int getCritical() liefert die Anzahl, wie häufig der Mittelwert
durch Änderung des Schiebereglers überschritten wurde und somit die Hintergrundfarbe auf rot
eingestellt wurde. Am Anfang ist dieser Wert auf 0.
Damit Sie die Klasse AttentionScrollbar ohne Nachschlagen der Klasse Scrollbar lösen
können, sind hier die zur Lösung der Aufgabenstellung benötigten Methoden aufgelistet und kurz
erläutert:
1. public void setBackground(Color c) // setzt Hintergrundfarbe
2. public Color getBackground()
// liest momentane Hintergrundfarbe
3. public void setValue(int newValue) // setzt den Wert des Scrollbars.
Diese Methode wird automatisch aufgerufen, wenn der GUI Benutzer den neuen Wert mit Hilfe
des Schiebers neu einstellt. Diese Methode muss daher in der Klasse AttentionScrollbar
überschrieben werden.
4. public Scrollbar(int orientation, int value, int visible, int
maximum, int minimum)
// Konstruktor der Klasse Scrollbar
5. public int getMinimum() und public int getMaximum()
// liefert den kleinsten und grössten
einstellbaren Wert des Scrollbars
Implementieren Sie die Klasse AttentionScrollbar vollständig.
Aufgabe 8:
Dateien
(20 Punkte)
Entwickeln Sie eine Methode filtern. Diese Methode besitzt drei Parameter:
•
Der erste Parameter eingabeDatei beinhaltet den Namen einer Datei, die gelesen werden soll.
•
Der zweite Parameter filterWort gibt an, nach welchem Wort gesucht werden soll. Sätze, in
denen das Wort des Parameters filterWort vorkommt, sollen in eine Datei geschrieben werden.
•
Der Name dieser Datei wird im dritten Parameter ausgabeDatei der Methode filtern
angegeben.
Die Methode filtern soll als Ergebnis zurückgeben, in wie vielen Sätzen das Wort des Parameters
filterWort vorkommt. Auf die Gross- und Kleinschreibung des Filterwortes muss nicht geachtet
werden. (Nutzen Sie dazu die Methode equalsIgnoreCase der Klasse String)
Um die Aufgabe zu vereinfachen, können Sie davon ausgehen, dass Sätze der Eingabedatei lediglich
durch die drei Zeichen “.“ “;“ und “!“ getrennt werden (Punkt, Strichpunkt, Ausrufezeichen).
Falls irgendein Fehler festgestellt wird, können Sie die Methode mit dem Aufruf System.exit(-1)
beenden.
Die Methode filtern besitzt somit folgende Signatur:
public int filtern (String eingabeDatei, String filterWort,
String ausgabeDatei)
Aufgabe 9:
Abstrakte Klassen / Interfaces
(25 Punkte)
Eine Mitarbeiterdatenbank enthält verschiedene Arten von Mitarbeitern: Hilfsarbeiter, Angestellte,
Verkäufer usw.
Die verschiedenen Arten von Mitarbeitern haben nebst ihrer Verschiedenheit auch Gemeinsamkeiten.
Als Basis für die Mitarbeiterdatenbank braucht es zunächst Klassen.
Aufgabe:
a) (14 Punkte) Schreiben Sie folgende Klassen, um einen Hilfsarbeiter “darzustellen“:
- eine abstrakte Klasse Mitarbeiter, die als Basis für alle Arten von Mitarbeitern
verwendet werden kann.
- eine Klasse Hilfsarbeiter, die von der Klasse Mitarbeiter abgeleitet wird.
b) (11 Punkte) In dieser Aufgabe entwickeln Sie die Klasse Verkäufer, diesmal aber mittels Verwendung
eines Interfaces. Entwickeln Sie dabei den Code von Grund auf, ohne Verwendung der Klassen aus
Aufgabe a). Schreiben Sie dazu folgendes:
- ein Interface MitarbeiterInterface, welches für alle Arten von Mitarbeitern verwendet
werden kann.
- eine Klasse Verkäufer, die das Interface MitarbeiterInterface implementiert.
Spezifikation:
Allen Mitarbeitern gemeinsam sind folgende Attribute:
- personalNr (int)
- name (String)
- datumEintritt (String)
Allen Mitarbeitern gemeinsam sind folgende Methoden:
- getName
- getPersonalNr
- getMonatsLohn
Beim Hilfsarbeiter wird der MonatsLohn wie folgt berechnet:
stundenlohn*anzahlstunden + ueberstundenzuschlag*anzahlueberstunden;
Beim Verkäufer wird der MonatsLohn wie folgt berechnet:
fixgehalt+umsatz*provision/100;
Anmerkungen:
- Überlegen Sie, welche Methoden in der Basisklasse bereits implementiert werden
können und welche erst in der abgeleiteten Klasse.
- Die benötigten Variablen und Methoden ergeben sich aus obiger Spezifikation.
Aufgabe 10: Threads
(30 Punkte)
Zwei Kollegen eröffnen einen Pizzakurier-Dienst. Der eine Kollege (der Pizzaiolo) nimmt am Telefon
Bestellungen entgegen und bereitet bestellte Pizzas zu; der andere (der Kurier) liefert jeweils eine
einzelne zubereitete Pizza aus. In dieser Aufgabe sollen Sie diesen Pizzakurier-Dienst in Java mittels
einer multithreaded Konsolenapplikation mit dem Namen Pizzeria implementieren.
Die Applikation sei wie folgt spezifiziert:
•
•
•
Die Klasse Pizzaiolo implementiert den Pizzaiolo-Thread und die Klasse Kurier den
Kurier-Thread. Die Synchronisation zwischen den Threads erfolgt über ein gemeinsames Objekt
der Klasse PizzaSync. Eine Pizza selbst wird im Programm mit einem int-Wert simuliert, der
für jede neu zubereitete Pizza inkrementiert wird.
Der Pizzaiolo arbeitet wie folgt:
- Er wartet auf einen Telefonanruf und nimmt die Bestellung entgegen, dies dauert zusammen
eine zufällige Zeit zwischen 3 und 13 Sekunden.
- Er bereitet die Pizza zu, dies dauert 7 Sekunden.
- Er übergibt die Pizza zur Auslieferung an den Kurier, wobei der Pizzaiolo wartet, wenn der
Kurier gerade eine Pizza ausliefert. Anschliessend wartet er wieder auf den nächsten
Telefonanruf etc.
Der Kurier arbeitet wie folgt:
- Er wartet, bis er vom Pizzaiolo eine Pizza erhält.
- Erhält er eine Pizza, so liefert er sie aus. Dies dauert 15 Sekunden.
- Hat er die Pizza ausgeliefert, so wartet er wieder auf die nächste Pizza etc.
Im Folgenden sind die komplette Implementierung der Klasse Pizzaiolo und je ein Programmgerüst
für die Klassen Kurier, PizzaSync und Pizzeria vorgegeben:
public class Pizzaiolo extends Thread {
private PizzaSync ps;
Random rand = new Random();
//Erzeugt Zufallszahlengenerator
public Pizzaiolo(PizzaSync ps) {
this.ps = ps;
}
public void run() {
int nummer = 0;
while (true) {
// Auf Telefonanruf warten und Bestellung entgegennehmen
try {
// nextInt gibt hier die nächste ganzzahlige Zufallszahl
// zwischen 0 und 10000 zurück
Thread.sleep(3000 + rand.nextInt(10001));
} catch (InterruptedException e) {
System.err.println("Exception");
}
++nummer;
System.out.println("Pizza " + nummer + " bestellt");
// Pizza zubereiten und ausliefern
try {
Thread.sleep(7000);
} catch (InterruptedException e) {
System.err.println("Exception");
}
System.out.println("Pizza " + nummer + " zubereitet");
ps.lieferePizza(nummer);
}
}
}
public class Kurier extends Thread {
// Ihr Code aus Aufgabe a)
}
public class PizzaSync {
/* Wird vom Pizzaiolo verwendet, um eine Pizza zur Auslieferung zu
* übergeben; blockiert, wenn der Kurier beschäftigt ist */
public synchronized void lieferePizza(int pizza) {
// Ihr Code aus Aufgabe b)
}
/* Wird vom Kurier verwendet, um eine Pizza zur Auslieferung
* abzuholen; blockiert, wenn keine Pizza bereit */
public synchronized int getPizza() {
// Ihr Code aus Aufgabe b)
}
/* Wird vom Kurier verwendet, wenn er eine Pizza ausgeliefert hat */
public synchronized void pizzaGeliefert() {
// Ihr Code aus Aufgabe b)
}
}
public class Pizzeria {
public static void main(String args[]) {
// Ihr Code aus Aufgabe c)
}
}
a) (12 Punkte) Implementieren Sie die vollständige Klasse Kurier gemäss der oben angegebenen
Spezifikation. Verwenden Sie die vorgegebenen Methoden der Klasse PizzaSync, um mit dem
Pizzaiolo zu kommunizieren. Hat der Kurier eine Pizza erhalten, soll er „Pizza n wird ausgeliefert“ auf
der Konsole ausgeben. Hat er die Pizza ausgeliefert, so soll er „Pizza n wurde ausgeliefert“ ausgeben.
„n“ ist dabei der int-Wert, der die aktuelle Pizza repräsentiert.
b) (14 Punkte) Implementieren Sie die drei vorgegebenen Methoden der Klasse PizzaSync, damit
Pizzaiolo und Kurier korrekt gemäss der Spezifikation zusammenarbeiten. Deklarieren Sie ebenfalls
Instanzvariablen, falls dies notwendig ist.
c) (4 Punkte) Implementieren Sie die Klasse Pizzeria, welche verwendet wird, um die
Konsolenapplikation zu starten. Die Klasse soll die notwendigen Objekte erzeugen und die Threads
starten.
Aufgabe 11: Polymorphismus
(20 Punkte)
Gegeben ist eine Klassenhierarchie mit den Klassen Ausweis, Identitaetskarte, Pass und
Fahrausweis.
public class Ausweis {
protected int nummer;
protected String inhaber;
protected String ablaufdatum;
// Nummer des Ausweises
// Inhaber des Ausweises
// Ablaufdatum des Ausweises
public Ausweis(int nummer, String inhaber, String ablaufdatum) {
this.nummer = nummer;
this.inhaber = inhaber;
this.ablaufdatum = ablaufdatum;
}
public int getNummer() {return nummer;}
public String getInhaber() {return inhaber;}
public String getAblaufdatum() {return ablaufdatum;}
}
public class Identitaetskarte extends Ausweis {
public int groesse;
// Groesse des Inhabers
public String buergerort;
// Buergerort des Inhabers
public Identitaetskarte(int nummer, String inhaber,
String ablaufdatum, int groesse,
String buergerort) {
super(nummer, inhaber, ablaufdatum);
this.groesse = groesse;
this.buergerort = buergerort;
}
public int getGroesse() {return groesse;}
public String getBuergerort() {return buergerort;}
}
public class Pass extends Identitaetskarte {
public String fingerabdruck;
// Digitaler Fingerabdruck
// des Inhabers
public Pass(int nummer, String inhaber, String ablaufdatum,
int groesse, String buergerort, String fingerabdruck) {
super(nummer, inhaber, ablaufdatum, groesse, buergerort);
this.fingerabdruck = fingerabdruck;
}
public String getFingerabdruck() {return fingerabdruck;}
}
public class Fahrausweis extends Ausweis {
public String kategorien;
// Fahrzeugkatogerien, die der Inhaber
// lenken darf
public Fahrausweis(int nummer, String inhaber, String ablaufdatum,
String kategorien) {
super(nummer, inhaber, ablaufdatum);
this.kategorien = kategorien;
}
public String getKategorien() {return kategorien;}
}
Eine weitere Klasse AusweisVerwaltung implementiert eine einfache Konsolen-Applikation, welche
die Ausweise verwaltet. Ihre Aufgabe ist es, Teile dieser Applikation zu implementieren. Verwenden Sie
dazu das nachfolgende Programmiergerüst:
public class AusweisVerwaltung {
private Ausweis[] ausweise;
public AusweisVerwaltung() {
ausweise = new Ausweis[100];
// Erzeugen diverser Ausweise (es ist nur eine Auswahl angegeben)
ausweise[0] = new Identitaetskarte(1234567, "Max Meier",
"10.05.2010", 178, "Chur");
ausweise[7] = new Pass(76596678, "Eva Mueller", "31.12.2008",
169, "Zuerich", "10010110");
ausweise[16] = new Fahrausweis(5126578, "Ida Fuchs",
"20.03.2015", "A B D1");
// Verwendung der von Ihnen zu implementierenden Methoden
System.out.println("Total Ausweise: " + countAusweise(ausweise));
int[] countResult = countAusweisTyp(ausweise);
System.out.println("Identitaetskarten: " + countResult[0] +
", Paesse: " + countResult[1] +
", Fahrausweise: " + countResult[2]);
printPaesse(ausweise);
}
public static void main(String args[]) {
AusweisVerwaltung av = new AusweisVerwaltung();
}
/* Zählt die Anzahl Ausweise im Array ausweise */
public int countAusweise(Ausweis[] ausweise) {
// Ihre Aufgabe a)
}
/* Zählt die Anzahl Ausweise im Array ausweise nach Ausweis-Typ */
public int[] countAusweisTyp(Ausweis[] ausweise) {
// Ihre Aufgabe b)
}
/* Gibt die Paesse im Array ausweise auf der Konsole aus */
public void printPaesse(Ausweis[] ausweise) {
// Ihre Aufgabe c)
}
}
a) (5 Punkte) Implementieren Sie die Methode countAusweise vollständig, welche die Anzahl
Ausweise im Parameter ausweise zurückgibt.
b) (8 Punkte) Implementieren Sie die Methode countAusweisTyp vollständig, welche die Anzahl
Identitätskarten, Pässe und Fahrausweise im Parameter ausweise in dieser Reihenfolge in einem
int-Array der Länge 3 zurückgibt.
c) (7 Punkte) Implementieren Sie die Methode printPaesse vollständig, welche die Pässe im
Parameter ausweise zeilenweise auf der Konsole ausgibt. Eine Zeile soll alle Attribute eines Passes
enthalten, jeweils mittels einem Komma getrennt.
Aufgabe 12: Exceptions
(25 Punkte)
Für ein JAVA-Anwendungsprogramm wird eine statische Methode quadGl benötigt, die die reellen
Lösungen einer quadratischen Gleichung a2x2 + a1x + a0 = 0 gemäss den folgenden Spezifikationen
berechnet:
Die Koeffizienten a2, a1 und a0 werden der Methode als Parameter vom Typ Array von double
übergeben, die Methode quadGl gibt die Lösungen als Array von double zurück. Falls das Koeffizienten-Array nicht drei Elemente hat, oder falls a2 = 0 ist, so wirft die Methode quadGl eine
IllegalArgumentException. Ist das Koeffizienten-Array in Ordnung, so können die Lösungen
nach folgender Formel berechnet werden:
(
)
x1, 2 = − a1 ± a12 − 4a 2 a 0 / (2a 2 )
Der Ausdruck unter der Wurzel wird als Diskriminante bezeichnet. Falls die Diskriminante negativ ist, so
hat die quadratische Gleichung keine reellen, sondern nur zwei konjugiert komplexe Lösungen; in diesem
Fall wirft die Methode quadGl eine NoRealSolutionException; diese ist eine spezielle Klasse
von RuntimeExceptions, die Sie definieren müssen.
Falls die Diskriminante = 0 ist, so hat die quadratische Gleichung eine (doppelte) reelle Lösung, falls die
Diskriminante > 0 ist, so hat die quadratische Gleichung zwei reelle Lösungen. In diesen Fällen wird
(werden) die Lösung(en) gemäss der Formel berechnet und in einem Array der Länge 1 bzw. 2
zurückgegeben.
a) (2 Punkte) Schreiben Sie die Klasse NoRealSolutionException.
b) (18 Punkte) Schreiben Sie die Methode quadGl .
c) (5 Punkte) In einer anderen Methode private void p1() des Anwendungsprogrammes wird
die Methode quadGl aufgerufen, um die Lösungen einer quadratischen Gleichung zu berechnen. Falls
die quadratische Gleichung mindestens eine reelle Lösung hat, so wird mit dieser gerechnet. Falls die
quadratische Gleichung keine reelle Lösung hat, so wird eine weitere Methode private void p2()
aufgerufen. Codieren Sie die vollständige Befehlssequenz der Methode p1, in der die Aufrufe der
Methoden quadGl und p2 stehen.
Herunterladen