DCV 2024 09/Objekt Orientierte Programmierung Übungen: Unterschied zwischen den Versionen

Aus CCWiki
Zur Navigation springen Zur Suche springen
Sandro (Diskussion | Beiträge)
Sandro (Diskussion | Beiträge)
Keine Bearbeitungszusammenfassung
 
(4 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 44: Zeile 44:
Verwende hierfür die bereits bestehende Klasse '''Person''', aus dem vorherigen Beispiel.
Verwende hierfür die bereits bestehende Klasse '''Person''', aus dem vorherigen Beispiel.


Erstelle '''Funktionen''' die sowohl diese Personen zu der Serie hinzufügen als auch wieder löschen!
Erstelle '''Funktionen''' die sowohl diese Personen zu der Serie hinzufügen als auch wieder löschen kann!


=== Aufgabe: Datenklasse ===
=== Aufgabe: Datenklasse ===
Zeile 99: Zeile 99:
Verwende die erstellte '''Klasse''' aus dem vorhergehenden Beispiel und erstelle eine '''Methode''' welche eine {{JSL|List}} von Personen nach entweder nach '''Größe''', '''Alter''', '''Gewicht''', oder '''Name''' sortiert. Hierfür kann ein '''enum''' verwendet werden, oder auch einfach ein {{JSL|int}}.
Verwende die erstellte '''Klasse''' aus dem vorhergehenden Beispiel und erstelle eine '''Methode''' welche eine {{JSL|List}} von Personen nach entweder nach '''Größe''', '''Alter''', '''Gewicht''', oder '''Name''' sortiert. Hierfür kann ein '''enum''' verwendet werden, oder auch einfach ein {{JSL|int}}.


=== '''Bonusaufgabe: Permutation''' ===
Erstelle eine Vector mit einzelnen Buchstaben. Zum Beispiel ["A", "B", "C", "D"].


Implementiere den bekannten Permutationsalgorithmus, diesmal mit Hilfe von Vectoren.
=== Aufgabe: Türkische Serie 2.0 ===
Erweitere die bestehende '''Klasse''' "Serie" mit neuen Attributen.
* Title
* Genre
* Jahr
* Originalsprache
* Regisseur
* Direktor
NEU!
* ScoutListe (Liste mit Vector)
* CastListe (Liste mit Vector)
 
 
Erstelle mit Hilfe einer neuen Klasse (Schauspieler) ein Objekt, ähnlich wie eine Person, mit sinnvollen Attribute.
* Vorname
* Nachname
* Alter
* Gage
 
 
Erstelle dann in der '''Klasse''' "Serie" Funktionen die Schauspieler(Objekt) zu einer Liste hinzufügen und löschen können.
Erstelle in der Main, mind. 5 Schauspieler und füge diese dann zu der ScoutingListe dazu.
Erstelle ein Methode, die Schauspieler auf die CastingListe bringt und dabei aber auch von der ScoutingListe entfernt!
 
Erweitere dann die Simulation der Serie.
* Es müssen mindestens 2 Schauspieler angeheuert sein, um die Produktion zu starten.
* Erstelle Events, wo du Schauspieler aus dem aktuellen Cast löschst und/oder neue dazu fügst.
 
== Zoo-Simulation ==
 
=== Aufgabe: Zoo ===
 
Erstelle eine '''Main''' Klasse, die zuständig ist für
* die Initialisierung des Zoos und aller seiner Bestandteile
* Initiieren des nächsten Simulationsschrittes
 
Erstelle eine '''Zoo''' Klasse mit ''Name'' und ''Gründungsjahr''
 
Erstelle eine '''Gehege''' Klasse mit ''Name'' der als Beschreibung des Geheges dient.
 
Erweitere deinen Zoo, sodass Gehege dynamisch hinzugefügt und entfernt werden können.
 
Erweitere dein Programm um eine Funktion, die die Struktur des Zoos ausgibt. Der erwartete Ausdruck sieht folgendermaßen aus.
 
{{BML|code=
├── Zoo: Tiergarten Dornbirn, gegründet 2022
│  ├── Gehege: Alpenwiese
│  ├── Gehege: Ried
│  ├── Gehege: Terrarium (warm)
}}
 
=== Aufgabe: Tiere ===
 
Erweitere dein Zooprogramm mit Tiere.
 
Erstelle eine '''Tier''' Klasse mit einem ''Name'' und einer ''Gattung''
 
Erweitere die Gehege, um Tiere dynamisch zufügen und entfernen zu können.
 
Erweitere den Struktur-Ausdruck von Zoo, dass es auch die Tiere ausdrückt.
 
{{BML|code=
├── Zoo: Tiergarten Dornbirn, gegründet 2022
│  ├── Gehege: Alpenwiese
│      ├── Rijska, Kuh
│  ├── Gehege: Ried
│      ├── Garmond, Storch
│      ├── Hugo, Storch
│      ├── Idaxis, Storch
│  ├── Gehege: Terrarium (warm)
│      ├── (leer)
}}
 
=== '''Bonusaufgabe: Tierfutter''' ===
 
Erweitere dein Zooprogramm mit Futter-Bedarfsanalyse.
 
Erstelle eine Klasse für '''Futter''' mit einen ''Name'', ''Einheit'' und ''Einheitspreis''.
 
Jedes Tier hat einen Futterbedarf, die beinhaltet den ''Futter'' und eine ''Menge''
 
 
Erstelle eine Statistik, was den Futterbedarf von Zoo ist, und wie viel die Tagesversorgung sich kostet. Für diese Aufgabe kann man {{JSL|HashMap}} gut brauchen.
 
=== Aufgabe: Pfleger ===
 
Erweitere dein Zooprogramm um Tierpfleger.
 
Erstelle eine Klasse '''Pfleger''' mit einem ''Namen'' und mit einer dynamischen Liste von ''Gehegen'', wofür der Pfleger zuständig ist. Erweitere die Klasse ''Zoo'', dass die eine Liste der ''Pfleger'' beinhaltet.
 
Erweitere den Struktur-Ausdruck um die neu eingeführten Pfleger.
 
=== Aufgabe: Simulation 0.1 ===
 
Erweitere das Programm mit einer Tagessimulation.
 
# An jedem Tag gehen die Pfleger los und kümmern sich um die Gehege in deren Zuständigkeitsbereich.
## Falls ein Pfleger ein Gehege findet, welche schon bearbeitet wurde, überspringt er das Gehege und nimmt das nächste
# Wenn ein Pfleger zu einem Gehege kommt, wird er zuerst die Tiere füttern
# Nach dem Füttern wird er ein Zufälliges Tier länger beobachten.
## Mit einer Erweiterung der Pfleger mit den ''Lieblings-Tier-Gattung'', kann der Pfleger das Tier bewundern.
 
Lass auf der Konsole ausdrucken, wer-was macht...
 
=== '''Bonusaufgabe: Simulation 0.2''' ===
 
Erweitere die Simulation
 
# Jedes Tier hat eine ''Gesundheit'', ein ''MaxGesundheit'' und einen ''Biss''
# Jedes Tier versucht mit 40% Wahrscheinlichkeit, ein Nachbar von ihm aus dem gleichen Gehege zu beißen.
# Falls ein Tier gebissen wird, wird seine Gesundheit mit dem Biss von Angreifer reduziert
# "toten Tiere" beißen nicht.
# Am Ende des Tages werden "toten Tiere" aus dem Gehege entfernt
 
Lass auf der Konsole ausdrucken, wer-was macht...
 
=== '''Bonusaufgabe: Simulation 0.3''' ===
 
Erweitere den Zoo mit Tierärzte, die die verletzte Tiere behandeln und heilen. Erstelle eine Klasse '''TierArzt''' mit einem ''Name''.
 
Erweitere die Simulation
 
# Jeder Tierarzt wird an jedem Tag - genau 1 Tier behandeln
# Der Tierarzt wählt das Tier mit der geringsten relativen Gesundheit
## Zum Beispiel: 10 Gesundheit mit 100 Maximum ist 10% und so dringender als 1 Gesundheit aus 2 ergo 50%.
# Der Tierarzt wird zufällig zwischen 30 und 100% der Gesundheit wiederherstellen
# Kein Tier kann über die maximale Gesundheit geboostet werden.
 
Lass auf der Konsole ausdrucken, wer-was macht...
 
== Übungen zur Vererbung ==
 
=== '''Super Klasse''' und '''Sub Klasse''' ===
In der Hierarchie steht die '''Super Klasse''' über der '''Sub Klasse''', welche von dieser '''Super Klasse''' erbt.
 
* erstelle zwei verschiedene Objekt Klassen, die Gemeinsamkeiten teilen (z.B. Mensch und Tier/ oder Obst und Gemüse)
* erstelle eine Super Klasse die diese Gemeinsamkeiten vereint bzw. beinhaltet.
* lösche die Attribute und Methoden aus den Sub Klassen die nun über die Super Klasse entstehen und verbinden diese mit Hilfe von '''extends'''.
* erstelle nun eine weiter Sub Klasse die von einer oberen Sub Klasse erbt (z.B. Tier - Hund / Obst - Apfel)
* erstelle noch eine Klasse die jetzt von diese letzten Klasse erbt (z.B Hund -Schäferhund ( Apfel - [https://de.wikipedia.org/wiki/Granny_Smith Granny_Smith])
 
=== Konstruktoren und Methoden überladen ===
Diese Übung zeigt mittels Überladung, wie ein Konstruktor oder eine Methode mehrere mögliche Arten haben kann, um diese zu verweden.
 
*erstelle hierzu eine Objekt Klasse, die mit 4 Attribute ein Objekt beschreibt.
*erstelle außerdem noch mindestens einen getter für ein Attribut.
Beispiel: Teilnehmer
# String name,
# int alter,
# String email,
# int idNummer;
 
public void getEmail();
 
*erstelle nun einen Konstruktor für diese 4 Attribute.
*erstelle einen zweiten Konstruktor mit nur 2 Attribute.
*erstelle einen dritten Konstruktor mit keinem Attribut.
 
Teste in deiner Main, nun die 3 verschiedenen Möglichkeiten ein Objekt zu erstellen, mit diesen unterschiedlichen Konstruktoren.
Was passiert wenn du ein Objekt erstellt hast, das kein email-Attribut hat, du aber versuchst von diesem Objekt die Methode getEmail(); aufzurufe?
 
 
 
 
=== Beispiel '''Super Klasse''' erweitern ===
Erweitere nun das vorherige Beispiel mit der Super Klasse und den Sub Klassen, und füge allen einen Konstruktor hinzu.
 
*erstelle für jede Klasse einen Konstruktor
*gib mit der Schlüsselfunktion super(); relevante Attribute weiter und teste in der Main deine Objekte
 
*erstelle eine Liste von deinen Objekten und gib verschiedene Informationen aus.
*verwende die toString(), .getClass()  und .getClass().getSimpleName() Methode.
*schreibe eine @Override toString Methode
 
 
 
=== Abstrakte Klasse ===
Die Abstrakte Klasse gibt uns die Möglichkeit, eine Objekt Klasse zu erstellen die als Super Klasse fungiert, ohne das diese aber selbst ein Objekt instanziieren kann.
Zusätzlich können wir damit erzwingen, dass Sub Klassen die von dieser Klasse erben, bestimmte Methoden zum Beispiel unbedingt haben MUSS.
 
*erstelle zwei Sub Klassen mit Attribute und Methoden
*erstelle eine Super Klasse für diese zwei Klassen, mit Attribute, Methoden und Konstruktor.
 
*schreibe die Super Klasse nun zu einer public abstract class um
 
Zusätzlich wollen wir verhindern, dass Methoden dieser Super Klasse direkt aufgerufen werden können. Sie soll als Blueprint dienen und die Sub Klassen dazu zwingen diese Methoden selbst zu schreiben.
*schreibe die Methoden der Super Klasse in abstrakte Methoden um.
(Wichtig, Syntax beachten!!!)
 
*Überarbeite nun die Sub Klassen mit den notwendigen Methoden.
 
 
 
 
 
 
== Übungen Zur Modellierung ==
 
Die folgenden Übungen haben das Ziel, schnell ein Model zu erfassen, das die folgenden Aspekte beinhaltet:
# Klassen
# Kompositionen
# Vererbungen
# Methoden / Funktionen
# Variablen / Attribute
 
[[Datei:Uml-class-diagram-cheat-sheet.png]]
 
 
Eine ausführliche Erklärung dazu findet sich beim Klick auf diesen Verweis: [https://ccwiki.digitalcampusvorarlberg.at/index.php/UML_Klassendiagramm].
 
=== Schwarzwald Klinik ===
 
Es gibt ein '''Krankenhaus''' mit unterschiedlichen '''Abteilungen'''. Manche Abteilungen sind '''Ambulanz'''en anderen sind '''Station'''en. Ambulanzen haben eine Öffnungszeit sowie einen Warteraum mit einer definierten Anzahl von Plätzen. Stationen beinhalten '''Zimmer''' in denen sich '''Betten''' befinden.
Wenn ein Patient ins Krankenhaus kommt, besucht dieser entsprechend seiner Erkrankung eine Ambulanz. Falls der Fall schwerwiegender ist, muss er in einer Station aufgenommen werden. Patienten werden untersucht, behandelt und eventuell gepflegt. Aus der Ambulanzen dürfen die Patienten nach kurzer Zeit wieder nach Hause gehen. Patienten die in Stationen behandelt werden, müssen solange da bleiben, bis sie vollständig geheilt sind.
 
=== Restaurant ''Dolce Vita'' ===
 
Es gibt ein '''Restaurant''', das aus mehreren Räumen besteht. Jeder '''Raum''' hat einen zuständigen '''Kellner'''. In jedem '''Raum''' befinden sich unterschiedliche Tische. Manche sind groß, andere sind winzig klein. Wenn eine '''Gruppe''' eintrifft, werden sie vom '''Hauptkellner''' begrüßt. Der Hauptkellner führt sie zu einem Tisch und übergibt die Gruppe an den im jeweiligen Raum zuständigen Kellner. Die Gruppe der Gäste bekommt eine '''Speisekarte''' mit den Speisen und Getränken. Der Kellner nimmt die Bestellungen auf und serviert diese anschließend. Nach dem Essen fragt die Gruppe nach der '''Rechnung''' und bezahlt diese.
 
Am Ende des Tages macht der Hauptkellner eine Gesamtabrechnung und eine Analyse:
* Welcher Kellner hat die meisten Gäste bedient?
* Welcher Kellner hat den Höchsten Umsatz generiert?
* Welcher Kellner hat den größten Gewinnn erwirtschaftet? (Dazu braucht man die Selbstkosten pro Speise/Getränk)
* Was war die beliebteste Speise?
* Was war das beliebteste Getränk?
 
=== Museum: Neue Pinakothek ===
 
Ein '''Museum''' besteht aus Gängen und Ausstellungsräume. Jeder '''Gang''' und '''Ausstellungsraum''' kennt über die benachbarten Räume. In jedem Ausstellungsraum sind '''Kunststücke''' ausgestellt. Ein Kunststück kann ein Zeichen, Gemälde, Statue, oder ein Kunstobjekt sein.
Es gibt einen besonderen Gang im Museum, der als Eingang für Gäste dient. Ab dem Zeitpunkt der Öffnung dürfen Gäste ins Museum kommen. Ein Gast in einem Gang wählt einen zufälligen Raum, den er betritt. Falls sich ein Gast in einem Ausstellungsraum befindet, kann er ein zufälliges Kunststück beobachten oder in den nächsten Raum gehen. Falls ein Gast nach einer Zeit müde wird, geht er nach Hause. Zwischen den Gästen sind einige mit bösen Absichten. Ein '''Dieb''' stiehlt den beobachteten Gegenstand, falls er sich allein in einem Raum befindet. Um die Diebstähle zu verhindern sind einige '''Wächter''' im Museum unterwegs. Die Wächter beobachten keine Kunstobjekte, sondern sie versuchen sich in Räumen zu befinden in denen auch anderen Gäste präsent sind.
 
 
 
=== Aufgabe: Geometry ===
 
Erstelle eine '''Abstrakte Klasse''' {{JSL|Geometry}}. Diese enthält folgende '''Methoden''':
* {{JSL|getCircumference()}} und gibt einen {{JSL|double}} zurück
* {{JSL|getArea()}} und gibt einen {{JSL|double}} zurück
 
Erstelle nun einige '''Klassen''' die von {{JSL|Geometry}} erben (Circle, Square, Rectangle, Triangle,...). Jede '''Klasse''' soll in ihrem Konstruktor die entsprechenden Werte erhalten.
 
Erstelle nun verschiedene '''Instanzen''' von {{JSL|Geometry}}, speichere diese in einer {{JSL|List}}. Erstelle eine '''Methode''' die den Gesamtumfang und die Gesamtfläche aller {{JSL|Geometry}} '''Objekte''' in der {{JSL|List}} ausgibt.
 
'''Teste deine Implementierung ausgiebig'''
 
[[Datei:Geometry.png|mini|ohne]]
 
=== Aufgabe: Geometry Interface ===
Gleiche Aufgabe wie zuvor, verwende jedoch ein '''Interface''' anstatt eine '''Abstrakte Klasse''' für die Geometry.
Welche möglichen Vorteile ergeben sich dadurch?
 
[[Datei:Geometry Interface.png|mini|ohne]]
 
=== Aufgabe: Geometry Enhanced Version ===
  Zeichne zuerst für die Aufgabe ein entsprechendes Klassendiagramm (kann wiederverwendet werden)
 
Erweitere das vorhergehende Beispiel um die Geometrische Form Stern und Haus vom Nikolaus. Verwende soviel Code wie möglich wieder.
 
{|
|-
| [[Datei:Hausvomnikolaus.png|mini|none|Haus vom Nikolaus|150px]] || [[Datei:Kompass Stern.png|mini|Kompass Stern|150px]]
|}
 
== Simulationen ==
 
 
 
=== Aufgabe: Carsimulation ===
Erstelle eine {{JSL|Car}} '''Klasse'''. Diese enthält alle gängigen Attribute die für ein Auto benötigt werden. Zumindest sollte die '''Klasse''' folgende Attribute enthalten:
* Hersteller
* Modell
* kW (Leistung)
* Tankinhalt
* Antriebsart (erstelle dafür eine Enumeration ''Benzin'', ''Diesel'', ''Gas'', ''Strom'')
* Gewicht
Überlege welche Attribute du im '''Konstruktor''' als Parameter erhalten willst. Ohne welche kann eine Auto '''Instanz''' nicht existieren?
Erstelle nun die '''Methode''' {{JSL|drive(int kilometer)}} welche einen {{JSL|int}} zurückgibt. Diese '''Methode''' soll, wenn es der Tankinhalt zulässt, die gegebene Strecke zurücklegen. Wenn der Tank leer ist, soll nur die Strecke zurückgegeben werden, die zurückgelegt werden konnte, ansonsten die gesamte Strecke. Um den Verbrauch zu berechnen und den Tankinhalt zu reduzieren, verwende das '''Gewicht''' und die '''kW (Leistung)''' des Autos.
 
Wenn der Tank leer ist, soll der Tank über eine '''Methode''' mit einer gewissen Menge an Kraftstoff aufgefüllt werden. Erstelle dazu eine entsprechende '''Methode''' und fahr weiter.
 
Erstelle nun eine Carsimulation welche eine gewisse Anzahl von Autoinstanzen erstellt und diese fahren lässt und wenn nötig wieder betankt.
 
'''Wunsch:''' Die Methoden sollen zu ihrer eigentlichen Funktion auch eine schöne Ausgabe erstellen
 
=== Aufgabe: Carsimulation Extended ===
Erweitere das vorhergende Beispiel um die '''Klassen'''
* {{JSL|Engine}} (Motor)
* {{JSL|Tank}}
* {{JSL|GasStation}}
* {{JSL|RepairStation}}
Sowohl {{JSL|Tank}} und {{JSL|Motor}} sollen in {{JSL|Car}} als Attribute existieren und durch die {{JSL|RepairStation}} austauschbar sein.
 
Eine {{JSL|Engine}} soll nach einer zufälligen Wahrscheinlichkeit einen Defekt haben und in der {{JSL|RepairStation}} getauscht werden. Je mehr Kilometer gefahren wurden, desto höher ist die Wahrscheinlichkeit, dass die {{JSL|Engine}} kaputt geht.
 
Wenn die {{JSL|Car}} nicht die gewünschten Kilometer fährt, so ist entweder der Tank leer, oder der Motor kaputt. Erstelle '''Methoden''' der {{JSL|Car}} '''Klasse''' die den Tankinhalt und den Zustand des '''Motors''' (defekt oder ganz) zurückgeben.
 
Wird die {{JSL|drive(int kilometers)}} '''Methode''' ausgeführt, so soll nun eine Methode im Motor aufgerufen werden, die diesen startet, und nach den gefahrenen Kilomtern wieder stoppt. Auch der Treibstoffverbrauch soll mit dem Motor zusammenhängen. Vielleicht ist es eine gute Idee beim Starten den Tank an den Motor zu übergeben?
 
==== Erstelle folgende '''Subklassen''' von '''Tank''' ====
* Battery
* FuelTank
 
Überlege welche '''Methoden''' in der '''Superklasse''' '''Tank''' Sinn machen.
 
==== Erstelle folgende '''Subklassen''' von '''Car''' ====
* SelfRepairingCar (hat der Motor einen Schaden, so soll dieser automatisch repariert und weitergefahren werden)
* AeroDynamicCar (reduziert den Treibstoffverbrauch um 50%)
* CrapCar (erhöht die Wahrscheinlichkeit dass der Motor kaputt geht um 50%)
 
Überlege welche '''Methoden''' in der '''Superklasse''' '''Car''' sinn machen. Eine eigene Methode in der '''Superklasse''' welche den Treibstoffverbrauch pro Kilometer ausrechnet, macht wahrscheinlich sinn. Diese kann dann in den '''Subklassen''' überschrieben werden.
 
'''Teste deine Autosimulation ausgiebig.'''
 
=== Aufgabe: Bank ===
Ein Bankinstitut hat verschiedene Schalter. Ein Kunde geht in ein Bankinstitut um sein Bankgeschäft zu verrichten. Zuerst geht der Kunde ins Institut und geht zum nächsten freien Schalter. Wenn der Kunde den Schalter wieder verlässt, wird der Schalter zu einer Wahrscheinlichkeit von 20% für eine Pause geschlossen (die Pause eines Schalters endet nach dem 3 weitere Kunden die Bank betreten und verlassen haben). Hat ein Schalter kein Geld mehr so muss dieser wieder aufgefüllt werden und der Schalter ist für die Dauer eines Kunden geschlossen.
* Das Bankgeschäft eines Kunden ist entweder eine Einzahlung bzw. eine Auszahlung.
* Kann ein Schalter eine gewisse Geldmenge nicht bedienen geht der Kunde zum nächsten Schalter und der Ursprüngliche Schalter wird aufgefüllt.
* Es soll nachvollzogen werden können welcher Schalter welche Kunden bedient hat und was für ein Betrag eingezahlt oder ausgezahlt wurde ('''ACHTUNG''' keine {{JSL|HashMap}}).
 
# Erstelle ein UML Diagramm für dein Banksystem (Dia)
# Erstelle die notwendingen Klassen und Methoden.
# Erstelle nun eine Bank mit einigen Schaltern und erstelle weiters einige Kunden.
# Simuliere nun das Bankgeschäft. Die Kunden gehen der reihe nach in die Bank. Am Ende der Simulation soll für jeden Schalter eine Statistik ausgegeben werden (welche Kunden waren dort, welche Beträge wurden verarbeitet).
# Erstelle Unit Tests für deine Banksimulation
 
=== Aufgabe: Filesystem traversal ===
Das wurde schonmal gemacht, einfach nochmal machen, das schadet nicht :-)
Erstelle eine Methode welche durch das Dateisystem ab einem gegebenen Pfad navigiert (Ob der Pfad als {{JSL|String}} oder {{JSL|File}} übergeben wird ist egal). Wird der Pfad nicht gefunden, so soll eine {{JSL|FileNotFoundException}} geworfen werden. Die Navigation soll dabei '''Rekursiv''' erfolgen. Gib den Pfad mit entsprechender Einrückung aus.
'''Tip zur Rekursion:''' Iteriere in einer Methode durch alle Kinder einer Datei. Handelt es sich um einen Ordner so rufe für jedes Kind dieses Ordners die Methode wieder auf und erhöhe die Einrückung.
 
'''Ausgabe (muss nicht genau so aussehen):'''
{{BML|code=
├── otherPackageInvocationTest
│   └── Test.java
├── week1
│   ├── tag3
│   │   ├── Aufgabe1.java
│   │   ├── Aufgabe2.java
│   │   └── Loops.java
│   ├── tag4
│   │   ├── Christbaum2.java
│   │   ├── Christbaum.java
│   │   ├── Loops.java
│   │   ├── Traingle2.java
│   │   └── Triangle.java
│   ├── tag5
│   │   ├── Circle2.java
│   │   ├── Circle3.java
│   │   ├── Circle.java
│   │   └── Methods.java
│   └── tag5a
│      └── UseMethods.java
├── week2
│   ├── day3
│   │   ├── Calendar.java
│   │   ├── LogicPuzzle.java
│   │   ├── Recursion2.java
│   │   └── Recursion.java
│   └── day4
│      ├── Menu.java
│      └── UserInput.java
}}
 
=== Aufgabe: Filesystem traversal usefull ===
Erstelle eine Methode welche durch das Dateisystem ab einem gegebenen Pfad navigiert. Die Methode erhält weiters eine Klasse {{JSL|FileReceiver}}. Diese Klasse hat eine Methode {{JSL|onFileReceived(int depth, File file)}} welche zur Verarbeitung jeder einzelnen Datei, bzw. jedes einzelnen Ordners aufgerufen wird. Erstelle verschiedene weitere Klassen die von {{JSL|FileReceiver}} erben und {{JSL|onFileReceived(int depth, File file)}} überschreiben und folgende Aufgaben erfüllen sollen:
* Größe aller Dateien berechnen
* Anzahl der Dateien mit einer bestimmten Endung zählen
* Alle Dateiendungen Zählen. Tip.: {{JSL|HashMap}}
* Die größe jedes Ordners ermitteln. Tip.: Hier wird die '''depth''' und ein Stapel benötigt ({{JSL|List}}, oder {{JSL|Stack}}).
 
=== Aufgabe: Filesystem traversal usefull & extended ===
Wie in der vorhergehenden Aufgabe, jedoch soll nicht nur ein {{JSL|FileReceiver}} übergeben werden können, sondern eine {{JSL|List}} von {{JSL|FileReceiver}}.
 
=== Aufgabe: JUnit ===
Wähle drei Beispiele aus deiner Sammlung und teste diese mit '''JUnit'''.
 
=== Aufgabe: Geometry ===
Erstelle eine '''Abstrakte Klasse''' {{JSL|Geometry}}. Diese enthält folgende '''Methoden''':
* {{JSL|getCircumference()}} und gibt einen {{JSL|double}} zurück
* {{JSL|getArea()}} und gibt einen {{JSL|double}} zurück
 
Erstelle nun einige '''Klassen''' die von {{JSL|Geometry}} erben (Circle, Square, Rectangle, Triangle,...). Jede '''Klasse''' soll in ihrem Konstruktor die entsprechenden Werte erhalten.
 
Erstelle nun verschiedene '''Instanzen''' von {{JSL|Geometry}}, speichere diese in einer {{JSL|List}}. Erstelle eine '''Methode''' die den Gesamtumfang und die Gesamtfläche aller {{JSL|Geometry}} '''Objekte''' in der {{JSL|List}} ausgibt.
 
'''Teste deine Implementierung ausgibig'''
 
=== Aufgabe: Verhalten ===
Wie in [[Protokoll#19._November_2021|Protokoll 19.11]] gezeigt, soll nun das '''Schwimmverhalten''' implementiert werden. Erstelle endweder die Bestehende Klassenhierarchie als Übung in deinem eigenen Paket, oder kopiere diese.
 
=== Aufgabe: Graph ===
 
Ein Graph ist eine Datenstruktur die aus mehreren Knoten (Nodes besteht). Eine Node kann mehrere Nodes als Nachbarn haben, das heißt, sie hat eine Verbindung zu diesen Nachbarn.
[[Datei:Graph.png|mini|Ein einfacher Graph|150px]]
 
* Erstelle eine Datenstruktur für die '''Node''' mit (X/Y Koordinaten), verwende für die Nachbarn eine {{JSL|List}} in der jeweiligen '''Node'''
* Erstelle weiters eine Datenstruktur für den Graphen, welche eine {{JSL|List}} von '''Nodes''' enthält
* Erstelle aus den schwarzen Pixeln des folgenden Labyrinths einen Graphen
 
[[Datei:Labyrinth.png|150px|mini|none|Ein Labyrinth]]
 
=== Aufgabe: Dijkstra ===
 
Zeige deinen Graphen in einem {{JSL|JPanel}} an. Es soll nun der Start und das Ziel angeklickt werden können. Finde mittels Dijkstra Algorithmus[https://de.wikipedia.org/wiki/Dijkstra-Algorithmus] den kürzesten Weg vom Start zum Ziel. Illustriere dabei alle durchwanderten Knoten.
 
=== Schule: Volksschule Rotkreuz (Lustenau) ===
 
Es gibt eine '''Schule'''. In der Schule sind verschiedene Räume, so wie '''KlassenRaum''', '''SportHalle''', '''Handwerk & Technik Raum'''. Die Schule hat ein '''Schuldirektor''' und viele '''Lehrer'''.  Die '''Schüler''', die die Schule besuchen, gehören zu einer '''SchuleKlasse'''. Jede SchuleKlasse hat einen fixen Tagesablauf, die im '''Kursplan''' festgelegt ist. Der Kursplan beinhaltet, das Thema, den Lehrer und den Raum, wo es stattfindet.
 
==== Simulation 0.1 ====
 
Morgen kommen alle Lehrer und alle Schüler in die Schule. Die Schüler, die zu spät erscheinen, müssen zu dem Direktor.
 
==== Simulation 0.2 ====
 
Die Schüler haben einen fixen Tagesablauf. 45 Minuten Stunden, 15 Minuten Pause, 45 Minuten Stunde, ....
Am Beginn jeder Unterrichtsstunde gehen die Schüler in den entsprechenden Kursraum, wie es im Stundenplan vorgesehen ist.
 
==== Simulation 0.3 ====
 
Die Lehrer gehen in den Kursraum, wo sie gebraucht sind. Nach der Stunde kommen sie in dem Lehrerzimmer zurück. Falls sie keine Kursstunde haben, bleiben sie im Lehrerzimmer und korrigieren Hausaufgaben und Tests.

Aktuelle Version vom 14. November 2024, 14:07 Uhr

Im folgenden sollen diese Begriffe verstanden und angewandt werden. Diese sind nicht chronologisch geordnet.

Tip: Für weitere Informationen: Objektorientierte Programmierung
  • Klasse
    • Instanz- vs. Klassenmethode
    • Instanz- vs. Klassenattribut
    • Innere Klassen (statisch vs. nicht statisch)
  • Enumeration (enum)
  • Collections (Liste, Set, Map)
  • Vererbung
  • Abstrakte Klasse
  • Interface
  • Polymorphismus
  • Beziehungen
    • Has-A vs. Is-A
    • Implementierung von Interfaces
  • Generics
  • Designpatterns


Aufgabe: Person

Erstelle eine Klasse welche die typischen Werte eines Menschen speichern kann.

  • Größe
  • Alter
  • Name
  • Gewicht

Erstelle weiters eine toString() Methode und erstelle einen schönen String mit den gegebenen Werten.


Aufgabe: Türkische Serie

Erstelle eine Klasse welche die typischen Werte einer TV-Serie speichern kann.

  • Title
  • Genre
  • Jahr
  • Originalsprache

Erstelle weiters eine toString() Methode und erstelle einen schönen String mit den gegebenen Werten.

Erstelle weiterhin 2-3 Objekten, als typische türkische Serien.

Erweitere deine Klasse mit den Attributen

  • Regisseur
  • Produzent

Verwende hierfür die bereits bestehende Klasse Person, aus dem vorherigen Beispiel.

Erstelle Funktionen die sowohl diese Personen zu der Serie hinzufügen als auch wieder löschen kann!

Aufgabe: Datenklasse

Es soll eine Methode erstellt werden, welche das kleinste und das größte Element sowie den Durchschnitt eines int[] ermittelt und zurückgibt. Alle ermittelten Werten sollen in einem Datenobjekt zurückgegeben werden. Erstelle dazu eine Datenklasse welche die entsprechenden Werte enthält. Teste diese Methode ausgiebig mit verschiedenen int[], verwende auch ein zufallsgeneriertes int[] mit negativen und positiven Werten.

  • Erstelle die Datenklasse mit einem Sinnvollen Klassennamen und entsprechenden Attributen. Achte hierbei auch auf die Korrekte Sichtbarkeit
  • Erstelle in in der Datenklasse einen Konstruktor welcher alle Werte entgegennimmt und erstelle getter für alle Werte
  • Überschreibe die toString() Methode und erstelle einen schönen String mit den gegebenen Werten.

Aufgabe: Fotoapparat

Erstelle eine Fotoapparat Klasse.

  • Mit zumindest folgenden Attributen (es dürfen auch gerne mehr sein), Brennweite min/max, Model, Hersteller und Megapixel.
  • Erstelle für die Attribute getter und setter
  • Erstelle weiters die Methode takePhoto(), die ein Foto schießt (Mach einfach eine nette Ausgabe)
  • Überschreibe die toString() Methode und gib die relevanten Daten als String zurück

Erstelle verschiedene Instanzen der Fotoapparat Klasse und Teste diese ausgiebig.

Bonusaufgabe: Fotoapparat & Objektiv & Speicherkarte

Erweitere das vorhergehende Beispiel um die Klassen Objektiv und Speicherkarte. Die Brennweite der Kamera fällt demnach weg. Das Objektiv und die Speicherkarte sollen getauscht werden können. Erstelle Methoden um zu erfragen wieviele Fotos bereits aufgenommen wurden und wieviel Speicher noch frei ist. Für die Berechnung speicherplatz pro bild, kann ein wert von 0.3mb pro Megapixel angenommen werden.[1]

Handhabung von dynamischen Datenstrukturen (ArrayList, Vector, LinkedList, HashSet, HashMap)

Aufgabe: Vector erstellen

Erstelle einen Vector mit 20 Zufallszahlen zwischen 0 und 99.

Gib den Vector mit System.out.println() aus.

Aufgabe: Vector erstellen

Erstelle einen Vector mit 20 Zufallszahlen zwischen 0 und 99.

Erstelle jeweils eine Funktionen für:

  1. Zählen der geraden Zahlen
  2. Suche nach der kleinsten Zahl
  3. Suche nach der größten Zahl
  4. Sortiere die Elementen absteigend
  5. Lösche alle Ungerade Zahlen

Aufgabe: Zwei Vectoren zusammenführen

Es gibt zwei Vectoren mit 20 Elementen, die nach Größe sortiert sind.

Erstelle einen dritten Vector, in dem du die Elemente der vorhergehenden Vectoren zusammenfügst, der neu erstellte Vector soll immer noch sortiert sein.

Aufgabe: Person 2.0

Erstelle eine Klasse welche die typischen Werte eines Menschen speichern kann.

  • Größe
  • Alter
  • Name
  • Gewicht

Erstelle weiters eine Methode welche eine List von Personen erhält und bezüglich Größe, Alter, Gewicht, das kleinste und das größte Element sowie den Durchschnitt berechnet und wie in der vorhergehenden Aufgabe in einer eigenen Klasse zurückgibt.

Aufgabe: Person Sortiert

Verwende die erstellte Klasse aus dem vorhergehenden Beispiel und erstelle eine Methode welche eine List von Personen nach entweder nach Größe, Alter, Gewicht, oder Name sortiert. Hierfür kann ein enum verwendet werden, oder auch einfach ein int.


Aufgabe: Türkische Serie 2.0

Erweitere die bestehende Klasse "Serie" mit neuen Attributen.

  • Title
  • Genre
  • Jahr
  • Originalsprache
  • Regisseur
  • Direktor

NEU!

  • ScoutListe (Liste mit Vector)
  • CastListe (Liste mit Vector)


Erstelle mit Hilfe einer neuen Klasse (Schauspieler) ein Objekt, ähnlich wie eine Person, mit sinnvollen Attribute.

  • Vorname
  • Nachname
  • Alter
  • Gage


Erstelle dann in der Klasse "Serie" Funktionen die Schauspieler(Objekt) zu einer Liste hinzufügen und löschen können. Erstelle in der Main, mind. 5 Schauspieler und füge diese dann zu der ScoutingListe dazu. Erstelle ein Methode, die Schauspieler auf die CastingListe bringt und dabei aber auch von der ScoutingListe entfernt!

Erweitere dann die Simulation der Serie.

  • Es müssen mindestens 2 Schauspieler angeheuert sein, um die Produktion zu starten.
  • Erstelle Events, wo du Schauspieler aus dem aktuellen Cast löschst und/oder neue dazu fügst.

Zoo-Simulation

Aufgabe: Zoo

Erstelle eine Main Klasse, die zuständig ist für

  • die Initialisierung des Zoos und aller seiner Bestandteile
  • Initiieren des nächsten Simulationsschrittes

Erstelle eine Zoo Klasse mit Name und Gründungsjahr

Erstelle eine Gehege Klasse mit Name der als Beschreibung des Geheges dient.

Erweitere deinen Zoo, sodass Gehege dynamisch hinzugefügt und entfernt werden können.

Erweitere dein Programm um eine Funktion, die die Struktur des Zoos ausgibt. Der erwartete Ausdruck sieht folgendermaßen aus.

├── Zoo: Tiergarten Dornbirn, gegründet 2022
   ├── Gehege: Alpenwiese
   ├── Gehege: Ried
   ├── Gehege: Terrarium (warm)

Aufgabe: Tiere

Erweitere dein Zooprogramm mit Tiere.

Erstelle eine Tier Klasse mit einem Name und einer Gattung

Erweitere die Gehege, um Tiere dynamisch zufügen und entfernen zu können.

Erweitere den Struktur-Ausdruck von Zoo, dass es auch die Tiere ausdrückt.

├── Zoo: Tiergarten Dornbirn, gegründet 2022
   ├── Gehege: Alpenwiese
       ├── Rijska, Kuh
   ├── Gehege: Ried
       ├── Garmond, Storch
       ├── Hugo, Storch
       ├── Idaxis, Storch
   ├── Gehege: Terrarium (warm)
       ├── (leer)

Bonusaufgabe: Tierfutter

Erweitere dein Zooprogramm mit Futter-Bedarfsanalyse.

Erstelle eine Klasse für Futter mit einen Name, Einheit und Einheitspreis.

Jedes Tier hat einen Futterbedarf, die beinhaltet den Futter und eine Menge


Erstelle eine Statistik, was den Futterbedarf von Zoo ist, und wie viel die Tagesversorgung sich kostet. Für diese Aufgabe kann man HashMap gut brauchen.

Aufgabe: Pfleger

Erweitere dein Zooprogramm um Tierpfleger.

Erstelle eine Klasse Pfleger mit einem Namen und mit einer dynamischen Liste von Gehegen, wofür der Pfleger zuständig ist. Erweitere die Klasse Zoo, dass die eine Liste der Pfleger beinhaltet.

Erweitere den Struktur-Ausdruck um die neu eingeführten Pfleger.

Aufgabe: Simulation 0.1

Erweitere das Programm mit einer Tagessimulation.

  1. An jedem Tag gehen die Pfleger los und kümmern sich um die Gehege in deren Zuständigkeitsbereich.
    1. Falls ein Pfleger ein Gehege findet, welche schon bearbeitet wurde, überspringt er das Gehege und nimmt das nächste
  2. Wenn ein Pfleger zu einem Gehege kommt, wird er zuerst die Tiere füttern
  3. Nach dem Füttern wird er ein Zufälliges Tier länger beobachten.
    1. Mit einer Erweiterung der Pfleger mit den Lieblings-Tier-Gattung, kann der Pfleger das Tier bewundern.

Lass auf der Konsole ausdrucken, wer-was macht...

Bonusaufgabe: Simulation 0.2

Erweitere die Simulation

  1. Jedes Tier hat eine Gesundheit, ein MaxGesundheit und einen Biss
  2. Jedes Tier versucht mit 40% Wahrscheinlichkeit, ein Nachbar von ihm aus dem gleichen Gehege zu beißen.
  3. Falls ein Tier gebissen wird, wird seine Gesundheit mit dem Biss von Angreifer reduziert
  4. "toten Tiere" beißen nicht.
  5. Am Ende des Tages werden "toten Tiere" aus dem Gehege entfernt

Lass auf der Konsole ausdrucken, wer-was macht...

Bonusaufgabe: Simulation 0.3

Erweitere den Zoo mit Tierärzte, die die verletzte Tiere behandeln und heilen. Erstelle eine Klasse TierArzt mit einem Name.

Erweitere die Simulation

  1. Jeder Tierarzt wird an jedem Tag - genau 1 Tier behandeln
  2. Der Tierarzt wählt das Tier mit der geringsten relativen Gesundheit
    1. Zum Beispiel: 10 Gesundheit mit 100 Maximum ist 10% und so dringender als 1 Gesundheit aus 2 ergo 50%.
  3. Der Tierarzt wird zufällig zwischen 30 und 100% der Gesundheit wiederherstellen
  4. Kein Tier kann über die maximale Gesundheit geboostet werden.

Lass auf der Konsole ausdrucken, wer-was macht...

Übungen zur Vererbung

Super Klasse und Sub Klasse

In der Hierarchie steht die Super Klasse über der Sub Klasse, welche von dieser Super Klasse erbt.

  • erstelle zwei verschiedene Objekt Klassen, die Gemeinsamkeiten teilen (z.B. Mensch und Tier/ oder Obst und Gemüse)
  • erstelle eine Super Klasse die diese Gemeinsamkeiten vereint bzw. beinhaltet.
  • lösche die Attribute und Methoden aus den Sub Klassen die nun über die Super Klasse entstehen und verbinden diese mit Hilfe von extends.
  • erstelle nun eine weiter Sub Klasse die von einer oberen Sub Klasse erbt (z.B. Tier - Hund / Obst - Apfel)
  • erstelle noch eine Klasse die jetzt von diese letzten Klasse erbt (z.B Hund -Schäferhund ( Apfel - Granny_Smith)

Konstruktoren und Methoden überladen

Diese Übung zeigt mittels Überladung, wie ein Konstruktor oder eine Methode mehrere mögliche Arten haben kann, um diese zu verweden.

  • erstelle hierzu eine Objekt Klasse, die mit 4 Attribute ein Objekt beschreibt.
  • erstelle außerdem noch mindestens einen getter für ein Attribut.

Beispiel: Teilnehmer

  1. String name,
  2. int alter,
  3. String email,
  4. int idNummer;

public void getEmail();

  • erstelle nun einen Konstruktor für diese 4 Attribute.
  • erstelle einen zweiten Konstruktor mit nur 2 Attribute.
  • erstelle einen dritten Konstruktor mit keinem Attribut.

Teste in deiner Main, nun die 3 verschiedenen Möglichkeiten ein Objekt zu erstellen, mit diesen unterschiedlichen Konstruktoren. Was passiert wenn du ein Objekt erstellt hast, das kein email-Attribut hat, du aber versuchst von diesem Objekt die Methode getEmail(); aufzurufe?



Beispiel Super Klasse erweitern

Erweitere nun das vorherige Beispiel mit der Super Klasse und den Sub Klassen, und füge allen einen Konstruktor hinzu.

  • erstelle für jede Klasse einen Konstruktor
  • gib mit der Schlüsselfunktion super(); relevante Attribute weiter und teste in der Main deine Objekte
  • erstelle eine Liste von deinen Objekten und gib verschiedene Informationen aus.
  • verwende die toString(), .getClass() und .getClass().getSimpleName() Methode.
  • schreibe eine @Override toString Methode


Abstrakte Klasse

Die Abstrakte Klasse gibt uns die Möglichkeit, eine Objekt Klasse zu erstellen die als Super Klasse fungiert, ohne das diese aber selbst ein Objekt instanziieren kann. Zusätzlich können wir damit erzwingen, dass Sub Klassen die von dieser Klasse erben, bestimmte Methoden zum Beispiel unbedingt haben MUSS.

  • erstelle zwei Sub Klassen mit Attribute und Methoden
  • erstelle eine Super Klasse für diese zwei Klassen, mit Attribute, Methoden und Konstruktor.
  • schreibe die Super Klasse nun zu einer public abstract class um

Zusätzlich wollen wir verhindern, dass Methoden dieser Super Klasse direkt aufgerufen werden können. Sie soll als Blueprint dienen und die Sub Klassen dazu zwingen diese Methoden selbst zu schreiben.

  • schreibe die Methoden der Super Klasse in abstrakte Methoden um.

(Wichtig, Syntax beachten!!!)

  • Überarbeite nun die Sub Klassen mit den notwendigen Methoden.




Übungen Zur Modellierung

Die folgenden Übungen haben das Ziel, schnell ein Model zu erfassen, das die folgenden Aspekte beinhaltet:

  1. Klassen
  2. Kompositionen
  3. Vererbungen
  4. Methoden / Funktionen
  5. Variablen / Attribute


Eine ausführliche Erklärung dazu findet sich beim Klick auf diesen Verweis: [2].

Schwarzwald Klinik

Es gibt ein Krankenhaus mit unterschiedlichen Abteilungen. Manche Abteilungen sind Ambulanzen anderen sind Stationen. Ambulanzen haben eine Öffnungszeit sowie einen Warteraum mit einer definierten Anzahl von Plätzen. Stationen beinhalten Zimmer in denen sich Betten befinden. Wenn ein Patient ins Krankenhaus kommt, besucht dieser entsprechend seiner Erkrankung eine Ambulanz. Falls der Fall schwerwiegender ist, muss er in einer Station aufgenommen werden. Patienten werden untersucht, behandelt und eventuell gepflegt. Aus der Ambulanzen dürfen die Patienten nach kurzer Zeit wieder nach Hause gehen. Patienten die in Stationen behandelt werden, müssen solange da bleiben, bis sie vollständig geheilt sind.

Restaurant Dolce Vita

Es gibt ein Restaurant, das aus mehreren Räumen besteht. Jeder Raum hat einen zuständigen Kellner. In jedem Raum befinden sich unterschiedliche Tische. Manche sind groß, andere sind winzig klein. Wenn eine Gruppe eintrifft, werden sie vom Hauptkellner begrüßt. Der Hauptkellner führt sie zu einem Tisch und übergibt die Gruppe an den im jeweiligen Raum zuständigen Kellner. Die Gruppe der Gäste bekommt eine Speisekarte mit den Speisen und Getränken. Der Kellner nimmt die Bestellungen auf und serviert diese anschließend. Nach dem Essen fragt die Gruppe nach der Rechnung und bezahlt diese.

Am Ende des Tages macht der Hauptkellner eine Gesamtabrechnung und eine Analyse:

  • Welcher Kellner hat die meisten Gäste bedient?
  • Welcher Kellner hat den Höchsten Umsatz generiert?
  • Welcher Kellner hat den größten Gewinnn erwirtschaftet? (Dazu braucht man die Selbstkosten pro Speise/Getränk)
  • Was war die beliebteste Speise?
  • Was war das beliebteste Getränk?

Museum: Neue Pinakothek

Ein Museum besteht aus Gängen und Ausstellungsräume. Jeder Gang und Ausstellungsraum kennt über die benachbarten Räume. In jedem Ausstellungsraum sind Kunststücke ausgestellt. Ein Kunststück kann ein Zeichen, Gemälde, Statue, oder ein Kunstobjekt sein. Es gibt einen besonderen Gang im Museum, der als Eingang für Gäste dient. Ab dem Zeitpunkt der Öffnung dürfen Gäste ins Museum kommen. Ein Gast in einem Gang wählt einen zufälligen Raum, den er betritt. Falls sich ein Gast in einem Ausstellungsraum befindet, kann er ein zufälliges Kunststück beobachten oder in den nächsten Raum gehen. Falls ein Gast nach einer Zeit müde wird, geht er nach Hause. Zwischen den Gästen sind einige mit bösen Absichten. Ein Dieb stiehlt den beobachteten Gegenstand, falls er sich allein in einem Raum befindet. Um die Diebstähle zu verhindern sind einige Wächter im Museum unterwegs. Die Wächter beobachten keine Kunstobjekte, sondern sie versuchen sich in Räumen zu befinden in denen auch anderen Gäste präsent sind.


Aufgabe: Geometry

Erstelle eine Abstrakte Klasse Geometry. Diese enthält folgende Methoden:

  • getCircumference() und gibt einen double zurück
  • getArea() und gibt einen double zurück

Erstelle nun einige Klassen die von Geometry erben (Circle, Square, Rectangle, Triangle,...). Jede Klasse soll in ihrem Konstruktor die entsprechenden Werte erhalten.

Erstelle nun verschiedene Instanzen von Geometry, speichere diese in einer List. Erstelle eine Methode die den Gesamtumfang und die Gesamtfläche aller Geometry Objekte in der List ausgibt.

Teste deine Implementierung ausgiebig

Aufgabe: Geometry Interface

Gleiche Aufgabe wie zuvor, verwende jedoch ein Interface anstatt eine Abstrakte Klasse für die Geometry.

Welche möglichen Vorteile ergeben sich dadurch?

Aufgabe: Geometry Enhanced Version

 Zeichne zuerst für die Aufgabe ein entsprechendes Klassendiagramm (kann wiederverwendet werden)

Erweitere das vorhergehende Beispiel um die Geometrische Form Stern und Haus vom Nikolaus. Verwende soviel Code wie möglich wieder.

Haus vom Nikolaus
Kompass Stern

Simulationen

Aufgabe: Carsimulation

Erstelle eine Car Klasse. Diese enthält alle gängigen Attribute die für ein Auto benötigt werden. Zumindest sollte die Klasse folgende Attribute enthalten:

  • Hersteller
  • Modell
  • kW (Leistung)
  • Tankinhalt
  • Antriebsart (erstelle dafür eine Enumeration Benzin, Diesel, Gas, Strom)
  • Gewicht

Überlege welche Attribute du im Konstruktor als Parameter erhalten willst. Ohne welche kann eine Auto Instanz nicht existieren? Erstelle nun die Methode drive(int kilometer) welche einen int zurückgibt. Diese Methode soll, wenn es der Tankinhalt zulässt, die gegebene Strecke zurücklegen. Wenn der Tank leer ist, soll nur die Strecke zurückgegeben werden, die zurückgelegt werden konnte, ansonsten die gesamte Strecke. Um den Verbrauch zu berechnen und den Tankinhalt zu reduzieren, verwende das Gewicht und die kW (Leistung) des Autos.

Wenn der Tank leer ist, soll der Tank über eine Methode mit einer gewissen Menge an Kraftstoff aufgefüllt werden. Erstelle dazu eine entsprechende Methode und fahr weiter.

Erstelle nun eine Carsimulation welche eine gewisse Anzahl von Autoinstanzen erstellt und diese fahren lässt und wenn nötig wieder betankt.

Wunsch: Die Methoden sollen zu ihrer eigentlichen Funktion auch eine schöne Ausgabe erstellen

Aufgabe: Carsimulation Extended

Erweitere das vorhergende Beispiel um die Klassen

  • Engine (Motor)
  • Tank
  • GasStation
  • RepairStation

Sowohl Tank und Motor sollen in Car als Attribute existieren und durch die RepairStation austauschbar sein.

Eine Engine soll nach einer zufälligen Wahrscheinlichkeit einen Defekt haben und in der RepairStation getauscht werden. Je mehr Kilometer gefahren wurden, desto höher ist die Wahrscheinlichkeit, dass die Engine kaputt geht.

Wenn die Car nicht die gewünschten Kilometer fährt, so ist entweder der Tank leer, oder der Motor kaputt. Erstelle Methoden der Car Klasse die den Tankinhalt und den Zustand des Motors (defekt oder ganz) zurückgeben.

Wird die drive(int kilometers) Methode ausgeführt, so soll nun eine Methode im Motor aufgerufen werden, die diesen startet, und nach den gefahrenen Kilomtern wieder stoppt. Auch der Treibstoffverbrauch soll mit dem Motor zusammenhängen. Vielleicht ist es eine gute Idee beim Starten den Tank an den Motor zu übergeben?

Erstelle folgende Subklassen von Tank

  • Battery
  • FuelTank
Überlege welche Methoden in der Superklasse Tank Sinn machen.

Erstelle folgende Subklassen von Car

  • SelfRepairingCar (hat der Motor einen Schaden, so soll dieser automatisch repariert und weitergefahren werden)
  • AeroDynamicCar (reduziert den Treibstoffverbrauch um 50%)
  • CrapCar (erhöht die Wahrscheinlichkeit dass der Motor kaputt geht um 50%)
Überlege welche Methoden in der Superklasse Car sinn machen. Eine eigene Methode in der Superklasse welche den Treibstoffverbrauch pro Kilometer ausrechnet, macht wahrscheinlich sinn. Diese kann dann in den Subklassen überschrieben werden.

Teste deine Autosimulation ausgiebig.

Aufgabe: Bank

Ein Bankinstitut hat verschiedene Schalter. Ein Kunde geht in ein Bankinstitut um sein Bankgeschäft zu verrichten. Zuerst geht der Kunde ins Institut und geht zum nächsten freien Schalter. Wenn der Kunde den Schalter wieder verlässt, wird der Schalter zu einer Wahrscheinlichkeit von 20% für eine Pause geschlossen (die Pause eines Schalters endet nach dem 3 weitere Kunden die Bank betreten und verlassen haben). Hat ein Schalter kein Geld mehr so muss dieser wieder aufgefüllt werden und der Schalter ist für die Dauer eines Kunden geschlossen.

* Das Bankgeschäft eines Kunden ist entweder eine Einzahlung bzw. eine Auszahlung.
* Kann ein Schalter eine gewisse Geldmenge nicht bedienen geht der Kunde zum nächsten Schalter und der Ursprüngliche Schalter wird aufgefüllt.
* Es soll nachvollzogen werden können welcher Schalter welche Kunden bedient hat und was für ein Betrag eingezahlt oder ausgezahlt wurde (ACHTUNG keine HashMap).
  1. Erstelle ein UML Diagramm für dein Banksystem (Dia)
  2. Erstelle die notwendingen Klassen und Methoden.
  3. Erstelle nun eine Bank mit einigen Schaltern und erstelle weiters einige Kunden.
  4. Simuliere nun das Bankgeschäft. Die Kunden gehen der reihe nach in die Bank. Am Ende der Simulation soll für jeden Schalter eine Statistik ausgegeben werden (welche Kunden waren dort, welche Beträge wurden verarbeitet).
  5. Erstelle Unit Tests für deine Banksimulation

Aufgabe: Filesystem traversal

Das wurde schonmal gemacht, einfach nochmal machen, das schadet nicht :-)

Erstelle eine Methode welche durch das Dateisystem ab einem gegebenen Pfad navigiert (Ob der Pfad als String oder File übergeben wird ist egal). Wird der Pfad nicht gefunden, so soll eine FileNotFoundException geworfen werden. Die Navigation soll dabei Rekursiv erfolgen. Gib den Pfad mit entsprechender Einrückung aus.

Tip zur Rekursion: Iteriere in einer Methode durch alle Kinder einer Datei. Handelt es sich um einen Ordner so rufe für jedes Kind dieses Ordners die Methode wieder auf und erhöhe die Einrückung.

Ausgabe (muss nicht genau so aussehen):

├── otherPackageInvocationTest
   └── Test.java
├── week1
   ├── tag3
      ├── Aufgabe1.java
      ├── Aufgabe2.java
      └── Loops.java
   ├── tag4
      ├── Christbaum2.java
      ├── Christbaum.java
      ├── Loops.java
      ├── Traingle2.java
      └── Triangle.java
   ├── tag5
      ├── Circle2.java
      ├── Circle3.java
      ├── Circle.java
      └── Methods.java
   └── tag5a
       └── UseMethods.java
├── week2
   ├── day3
      ├── Calendar.java
      ├── LogicPuzzle.java
      ├── Recursion2.java
      └── Recursion.java
   └── day4
       ├── Menu.java
       └── UserInput.java

Aufgabe: Filesystem traversal usefull

Erstelle eine Methode welche durch das Dateisystem ab einem gegebenen Pfad navigiert. Die Methode erhält weiters eine Klasse FileReceiver. Diese Klasse hat eine Methode onFileReceived(int depth, File file) welche zur Verarbeitung jeder einzelnen Datei, bzw. jedes einzelnen Ordners aufgerufen wird. Erstelle verschiedene weitere Klassen die von FileReceiver erben und onFileReceived(int depth, File file) überschreiben und folgende Aufgaben erfüllen sollen:

  • Größe aller Dateien berechnen
  • Anzahl der Dateien mit einer bestimmten Endung zählen
  • Alle Dateiendungen Zählen. Tip.: HashMap
  • Die größe jedes Ordners ermitteln. Tip.: Hier wird die depth und ein Stapel benötigt (List, oder Stack).

Aufgabe: Filesystem traversal usefull & extended

Wie in der vorhergehenden Aufgabe, jedoch soll nicht nur ein FileReceiver übergeben werden können, sondern eine List von FileReceiver.

Aufgabe: JUnit

Wähle drei Beispiele aus deiner Sammlung und teste diese mit JUnit.

Aufgabe: Geometry

Erstelle eine Abstrakte Klasse Geometry. Diese enthält folgende Methoden:

  • getCircumference() und gibt einen double zurück
  • getArea() und gibt einen double zurück

Erstelle nun einige Klassen die von Geometry erben (Circle, Square, Rectangle, Triangle,...). Jede Klasse soll in ihrem Konstruktor die entsprechenden Werte erhalten.

Erstelle nun verschiedene Instanzen von Geometry, speichere diese in einer List. Erstelle eine Methode die den Gesamtumfang und die Gesamtfläche aller Geometry Objekte in der List ausgibt.

Teste deine Implementierung ausgibig

Aufgabe: Verhalten

Wie in Protokoll 19.11 gezeigt, soll nun das Schwimmverhalten implementiert werden. Erstelle endweder die Bestehende Klassenhierarchie als Übung in deinem eigenen Paket, oder kopiere diese.

Aufgabe: Graph

Ein Graph ist eine Datenstruktur die aus mehreren Knoten (Nodes besteht). Eine Node kann mehrere Nodes als Nachbarn haben, das heißt, sie hat eine Verbindung zu diesen Nachbarn.

Ein einfacher Graph
  • Erstelle eine Datenstruktur für die Node mit (X/Y Koordinaten), verwende für die Nachbarn eine List in der jeweiligen Node
  • Erstelle weiters eine Datenstruktur für den Graphen, welche eine List von Nodes enthält
  • Erstelle aus den schwarzen Pixeln des folgenden Labyrinths einen Graphen
Ein Labyrinth

Aufgabe: Dijkstra

Zeige deinen Graphen in einem JPanel an. Es soll nun der Start und das Ziel angeklickt werden können. Finde mittels Dijkstra Algorithmus[3] den kürzesten Weg vom Start zum Ziel. Illustriere dabei alle durchwanderten Knoten.

Schule: Volksschule Rotkreuz (Lustenau)

Es gibt eine Schule. In der Schule sind verschiedene Räume, so wie KlassenRaum, SportHalle, Handwerk & Technik Raum. Die Schule hat ein Schuldirektor und viele Lehrer. Die Schüler, die die Schule besuchen, gehören zu einer SchuleKlasse. Jede SchuleKlasse hat einen fixen Tagesablauf, die im Kursplan festgelegt ist. Der Kursplan beinhaltet, das Thema, den Lehrer und den Raum, wo es stattfindet.

Simulation 0.1

Morgen kommen alle Lehrer und alle Schüler in die Schule. Die Schüler, die zu spät erscheinen, müssen zu dem Direktor.

Simulation 0.2

Die Schüler haben einen fixen Tagesablauf. 45 Minuten Stunden, 15 Minuten Pause, 45 Minuten Stunde, .... Am Beginn jeder Unterrichtsstunde gehen die Schüler in den entsprechenden Kursraum, wie es im Stundenplan vorgesehen ist.

Simulation 0.3

Die Lehrer gehen in den Kursraum, wo sie gebraucht sind. Nach der Stunde kommen sie in dem Lehrerzimmer zurück. Falls sie keine Kursstunde haben, bleiben sie im Lehrerzimmer und korrigieren Hausaufgaben und Tests.