home  |  suche  |  kontakt/johner  |  institut 
studierende  |  tech-docs  |  mindmailer 

Assignment 12: Reflection

Deutsch

Sie wollen eine (sehr einfache) verteilte Anwendung schreiben. Dazu würde von einem Computer eine Textdatei zu einem zweiten übertragen. Wir gehen davon aus, dass diese Textdatei bereits beim zweiten Computer (Ihrem) angekommen sei und dass diese Datei folgende Informationen enthält:

  1. Namen eine zu instanzierenden Klasse
  2. Argumente für den Konstruktor
  3. Name einer zu instanzierenden Methode
  4. Wert, der an die zu instanzierende Methode übergeben werden soll

Der Einfachheit nehmen wir weiterhin an, dass sowohl Konstruktor als auch die genannte Methode nur ein Argument vom Typ String akzeptieren.

Tipps zum Vorgehen

  • Legen Sie ein neues Projekt an (de.htwg.reflection.SimpleRpc)
  • Erstellen Sie in dem Package z.B. eine Klasse Mensch, die nur das Attribut Name (String) haben solle. Erzeugen Sie Konstruktor sowie getter und setter.
  • Erstellen Sie in dem Package beispielsweise eine zweite Klasse, die die gleichen Methoden wie die Klasse Mensch implementiert. Erzeugen Sie auch hier mindestens einen Konstruktor.
  • Erstellen Sie nun eine Klasse RPC, welche aus einer Datei die obengenannten vier Strings einliest.
  • Weiter soll RPC die in der Datei angegebene Klasse (z.B. Mensch) instanzieren und die (einzige) setter-Methode mit dem ebenfalls gegebenen Wert aufrufen.
  • Stellen Sie über ein System.out sicher, dass der Wert richtig gesetzt wurde.

English

Your task is to write a very simple distributed application. A text file is sent from one computer to the next. We assume that this text file already is on the target computer and that it contains the following data:

  1. Name of class to be instantiated
  2. Constructor arguments
  3. Name of method to be invoked
  4. Method parameters

For the sake of simplictly we futher assume that both, the constructor and the method, expect exactly one parameter of type String.

Hints

  • Create new Project
  • Create package with classes (e.g. class "human" with attribute "name" (String)). Add construtor, getter, setter and toString-methods
  • Add second class accordingly (e.g. class "animal" with attribute "type" (String))
  • Write class "RPC" (remote procedure call), that reads the data from the text file.
  • RPC instantiates the class that is mentioned in the text file. 
  • RPC invokes the method that is mentioned in the text filed.
  • Dump the attributes of the class (System.out)

Assignment 11: Exception handling and assertions

Deutsch

Teilaufgabe a)

Gegeben sei eine Klasse PoorMansDb, mit der man Strings unter einem Schlüssel in eine Datei schreiben und von dort wieder lesen kann. Sie stellt somit eine äußerst primitive Datenbank dar. Leider ist die PoorMansDb auch etwas fehlerträchtig, nicht jeder Zugriff ist erfolgreich. Es ist NICHT notwendig, dass Sie die Klasse PoorMansDb lesen oder gar verstehen. Sie müssen Sie nur benutzen.

Schreiben Sie eine Klasse, die den Zugriff auf diese Datenbank kapselt (z.B. eine Klasse DBWrapper). Der DBWrapper soll folglich auch Methoden wie speichern, laden und ändern enthalten. Diese Methoden rufen die Methoden save, load und update der Klasse PoorMansDb auf. Dabei müssen sie mit der Unzuverlässigkeit der PoorMansDb umgehen können, indem sie beim Auftreten von Fehlern mehrere Versuche unternehmen, bevor sie selbst einen Fehler werfen.

Noch ein Tipp: Legen Sie im Zweifelsfall eine leere Textdatei an. Wählen Sie ein Verzeichnis, in dessen Namen/Pfad keine Leerzeichen enthalten sind. Beachten Sie, dass der Editor auf dem Mac eine RTF-Datei erzeugt (selbst wenn die Dateiendung "txt" ist), falls man in der Menüleiste nicht explizit  "Format -> in reinen Text umwandeln" wählt. Nutzen Sie alternativ den Textwrangler.

Teilaufgabe b)

Die folgenden Teilaufgaben haben mit der PoorMansDb nichts mehr zu tun.

Schreiben Sie eine eigene Methode public int halbiere(int zahl), die einen Fehler wirft, wenn eine ungerade Zahl übergeben wird. Welche Exception schlagen Sie vor? Schreiben Sie ein Programm bzw. eine main-Methode, mit dem Sie diese Methode aufrufen und prüfen können.

 Teilaufgabe c)

Ersetzen Sie in der Lösung zu Teilaufgabe b) den Code, der einen Fehler wirft, durch ein assert-Statement.

English

Part a)

Given is a class PoorMansDb, that allows to save string in a file and restore it from there. Strings are saved and restored / load with a key.

PoorMansDb is a very primitive database. Unfortunately this database is not very reliable. It is NOT necessary to read or even understand the class. Just use it.

Write a class that wraps the database (e.g. DBWrapper). This DBWrapper consequently wraps the methods load and save of the PoorMansDb. I.e. DBWrapper also contains methods load and save that eventually (but not directly) call the PoorMansDb's method. DBWrapper's methods implement an exception handling in a way that is makes several attempts to call the methods of PoorMansDB before giving up and informing any class using DBWrapper if the attempts eventually haven't been successful.

Additional hint: If necessary create empty textfile. Chose a directory that does not contain spaces. Please mind that editors e.g. those on MAC operating systems frequently create RTF files instead of plain text files. Use a text editor such as TextWrangler instead.

Part b)

This part and the next part are not related to the previous part a).

Write a method public int divideInHalf(int number) that throws an exception, if an odd number is passed as parameter. What type of exception do you propose?

Write a main method calling the method divideInHalf.

Part c)

Replace the code in part b) by an assertion statement.

Assginment 10: Enums

Deutsch

Teil a)

Sie wollen nicht nur den Treibstoffverbrauch der Fahrzeuge erfassen, sondern auch die Treibstoffsorte (Super, Normal, Diesel). Daher möchten Sie die Fahrzeuge mit der jeweiligen Treibstoffsorte initialisieren und sicher sein, dass nur eine der drei Treibstoffsorten wählbar ist.

Implementieren Sie dies als interne oder externe Enum. Wie hätten Sie die Aufgabe ohne Enums gelöst?

Teil b)

Iterieren Sie über die Enum-Werte und geben Sie dabei die verschiedenen Treibstoffsorten aus. Allerdings soll die Ausgabe anders lauten (High-Power-Super, Turbo-Normal und Renn-Diesel). Ändern Sie die Enum entsprechend.

Schließlich wollen Sie auch die Oktanzahl (100, 98 und 95) ausgeben. Welche Möglichkeit haben Sie dazu?

Mit dem Teil b) können Sie Folgendes üben:

  • Enums mit Methoden
  • Enums mit Attributen
  • Iteration über Enum-Werte

English

Part a)

Implement a class car with attributes consumption and gasolineType (super, normal, diesel). You want to be sure that the attributes are set immediately for any car and that only the three types of gasoline can be set.

Implement this using internal or external enums. How would you have solved this excercise without enumerations?

Part b)

Interate over all enum values and print out the alternative name of each enum-value (e.g. high-power-super, turbo-normal, and race-diesel). Update the enumeration values accordingly.

Additionally each gasolineType has an individual octane value (100, 98 und 95) that is printed as well. 

Assignment 8: B-trees

German

Sie fügen in einen B-Baum mit k=2 die folgenden Elemente ein: 11, 2, 7, 4, 8, 6, 1, 5, 9, 15. Anschließend löschen Sie 6, 2, 15 und 5.

Sie fügen in einen B-Baum mit k=1 die folgenden Elemente ein: 9, 2, 6, 8, 7, 4, 5, 10, 11, 12, 13. Danach löschen Sie 2, 12, 13.

Zeichnen Sie die Bäume zum Schluss der Operationen sowie Zwischenschritte.

Sie können auch diese Aufgabe eigenständig prüfen:

  • Öffenen Sie dazu Eclipse,
  • wählen Sie File > Import > Existing Project into Workspace > Select Archive File und
  • importieren Sie die BBaum-Zip-Datei, die auf //merkur/Lehre/Johner liegt.
  • Klicken Sie dann auf das Projekt mit der rechten Maustaste und wählen Run As "Java Applet".
  • Ziehen Sie das Applet so in die Breite, dass Sie die Zahlen eingeben können.

English

Insert the following elements into a B-tree (degree k=2): 11, 2, 7, 4, 8, 6, 1, 5, 9, 15. Then delete 6, 2, 15 and 5.

Insert the following elements into a B-treee (degree k=1): 9, 2, 6, 8, 7, 4, 5, 10, 11, 12, 13. Then delete 2, 12, 13.

Draw the trees (also intermediate steps).

You can assess the correctness of your solution yourself:

  • open Eclipse,
  • Chose File > Import > Existing Project into Workspace > Select Archive File and
  • import BBaum-Zip file (//merkur/Lehre/).
  • Click on project and chose "Run As Java Applet".
  • You might have to resize the applet

Assignment 7: Binary trees

Deutsch

Teil a)

Wie sehen die binären Suchbäume aus, bei denen die Elemente in folgender Reihenfolge eingefügt werden?

  • 1,7,3,4,2,6,5
  • 7,6,5,1,2,3,4
  • 7,6,5,4,3,2,1
  • 1,3,5,7,2,4,6

Teil b)

Wie würden die gleichen Zahlenfolgen in einen höhenbilanzierten Binärbaum eingefügt? Beschreiben Sie dazu die Zwischenschritte einschließich der Operation (z.B. nur einfügen, einfügen mit Rechtsrotation, einfügen mit Rechts-Linksrotation) und das Endergebnis.

Teil c)

Entwerfen Sie Ihre eigene Klausuraufgabe: Wählen Sie maximal 7 Ziffern so, dass beim Einfügen einmal eine Einfach- und einmal eine Mehrfachrotation notwendig wird.

 

Diese Übung wird bei der Abgabe nicht geprüft. Das können Sie selbst tun, beispielsweise mit dem Applet auf der Seite https://www.cs.usfca.edu/~galles/visualization/AVLtree.html.

English

Part a)

Insert the following numbers into a binary search tree

  • 1,7,3,4,2,6,5
  • 7,6,5,1,2,3,4
  • 7,6,5,4,3,2,1
  • 1,3,5,7,2,4,6

Part b)

Insert the same numbers into a height accounted binary search tree (AVL tree). Please explain the steps e.g. left/right rotations.

Part c)

Please design your exam question: Pick a list of 7 numbers to be inserted into an AVL tree in a way that a single and a double rotation are required.

Note

You may/have to evaluate your solutions yourself e.g. using this Applet: https://www.cs.usfca.edu/~galles/visualization/AVLtree.html.

=== Termin ===

Termin: Abgabe am 27. Oktober d.h. Sie sollten die Aufgaben 1-6 vor Beginn dieser Übungsstunde fertiggestellt haben.

Hinweis: Bei SPO3 gibt es keinen Schein. Ich möchte die Aufgaben trotzdem mit Ihnen durchsprechen.

Übung 6: Hashfunktion

Deutsch

  1. Über welche Eigenschaften sollte eine Hashfunktion verfügen?
  2. Schreibe jeweils eine einfache Hashfunktion für die Klassen MyInteger, MyString und Auto. Die Klasse MyInteger verfüge über ein Attribut int, die Klasse MyString über ein Attribut String und die Klasse Auto über die Attribute fahrgestellnummer (int) (eindeutig) und typ (String).
  3. Stelle fest, wie die hashCode() Methode der Klasse java.lang.String implementiert ist. (Sourcen von Java lesen)

English

  1. What are the most important properties and conditions a hashCode-method has to fulfill?
  2. Implement simple hashCode-methods for following classes

    1. MyInteger (just wraps one int-Value)
    2. MyString (just wraps one String-Value)
    3. Car(attributes licensePlate (String, unique) and type (String)

  3. Find out how the hashCode-method is implemented in java.lang.String. You need to read the Java Sources.

Übung 5: equals #2

Deutsch

Gegeben sei eine Klasse Päckchen mit zwei Attributen vom Typ Adresse und Groesse.

Adresse ist eine Klasse mit den Attributen Empfänger (String), Straße (String), Postleitzahl (int) und Ort (String). Im Rahmen dieser Aufgabe gibt es kein Land, das zu berücksichtigen wäre.

Groesse ist eine Klasse mit den Attributen Länge in cm (int), Breite (int), Höhe (int) und Gewicht in kg (float).

Implementieren Sie alle drei Klassen inklusive der notwendigen equals()-Methoden. Implementieren Sie dabei die equals()-Methode für die Klasse Päckchen aus Sicht des Postbeamten, der das Päckchen frankieren (nicht ausliefern!) muss.

English

Given is a class "Parcel" with attributes "address" and "size".

"Address" is a class with attributes "recipient" (String), "street" (String), "zipcode" (int) and "location" (String). 

"Size" is a class with attributes "length" (int), "width" (int), "height" (int) and "weight" (float).

Implement all three classes including equals-methods. Implement the equals-method of class "Parcel" from the perspective of the post office clerk franking the parcel.

Übung 4: Warm-up, equals

Deutsch

  1. Starten Sie Eclipse, legen Sie ein neues Java-Projekt “Fuhrpark” an, Erstellen Sie ein Package „de.htwg.sote.fuhrpark“
  2. Legen Sie eine Klasse Fahrer mit den Attributen Kürzel und Name an.
  3. Erzeugen Sie die den Konstruktor und die getter/setter-Methoden mit Eclipse. Tragen Sie dabei Sorge, dass es keine Zombie-Fahrer (ohne Name und Kürzel) gibt und das Kürzel nicht nachträglich geändert werden kann
  4. Legen Sie eine Klasse Auto an mit den Attributen Fahrgestellnummer, Typ (z.B. Audi A6), Tankfüllung in Liter (Gleitkommazahl), Tachostand (Ganzzahl) und Fahrer an.
  5. Schreiben Sie eine dritte Klasse Fuhrpark, die über eine main-Methode verfügt, in der Sie zwei Autos und zwei Fahrer erzeugen. Dann weisen Sie jedem Auto je einen der beiden Fahrer zu.
  6. Ergänzen Sie die Klassen so mit Ausgaben (System.out.println), dass Sie überprüfen können, welcher Fahrer auf welchem Auto gesetzt wurde.
  7. Implementieren Sie eine geeignete equals-Methode für die Klasse Auto.

English

  1. Start Eclipse, create a new Java project "CarPool". Create a package "de.htwg.sote.carPool".
  2. Create a class "Driver" with attributes "code" and "name".
  3. Add a constructor and getter-/setter methods. Make sure that there cannot be any "zombie" drivers (without code and name) and that the code cannot be changed later on.
  4. Create a class "Car" with  attributes "serialNumber", "type" (e.g. "Audi A6"), "tankContents" (float), "milage" (int) and "driver".
  5. Write a third class "Fleet" that has a main method that creates two cars and two drivers. Assign a driver to each car.
  6. Add to both classes a method to dump all parameters.
  7. Implement a suitable equals-methhod for class "Car".

Übung 3: Interfaces (freiwillige Zusatzaufgabe)

Deutsch

Sie sind Automobilhersteller und denken darüber nach, für Ihr neustes Modell statt Verbrennungs- Elektromotoren einzubauen. Allerdings sind Sie nicht sicher, ob die Autos mit Elektromotoren nachgefragt werden. Daher möchten Sie für alle Eventualitäten gerüstet sein und erst beim Herstellen des Autos (Aufruf des Konstrutors) entscheiden, welche Motorensorte eingebaut wird. Jeder Motor, unabhängig vom Motorentyp, muss natürlich beschleunigen können (public void beschleunigen (int gasInProzent)).

Implementieren Sie diesen Sachverhalt. Sie werden wahrscheinlich ein Interface und folgende  Klassen benötigen: Automobilhersteller (enthält die main), Auto, Elektromotor, Verbrennungsmotor.

English

You are a car and motor manufacturer and consider to equip your latest car with an electric engine instead of a conventional one. However, you like to stay flexible and decide on building the car (constructor) which engine to actually use. 

Any motor has to accelerate the car (public void accelerate(int percentageOfMax).

Implement this scenario. Most probably you will need a class manufacturer (start class), car, electro engine and combustion engine.

Übung 2: Interfaces

Aufgabe a

Deutsch

Sie wollen eine Software schreiben, die eine Datenbank nutzt. Allerdings wollen Sie in Ihrem Code nicht festlegen, welche konkrete Datenbank später eingesetzt wird (Oracle, DB2, MySQL etc.). Sie möchten aber, dass Ihre Datenbank Daten (Strings oder Object) abspeichern und wieder laden kann.

Implementieren Sie dies mit Hilfe eines Interfaces. Die implementierten Methoden müssen über keine wirklich Funktionalität verfügen.

Sie benötigen letztlich

  • Ein Interface
  • Zwei Klassen, die das Interface implementieren (z.B. "DB2", "Oracle" oder "MySQL")
  • Eine Klasse (z.B. "Applikation"), die variabel mit einer der Implementierungen des Interfaces arbeitet
  • Ggf. eine "Start-Klasse"

English

You have to develop a software (class application) that uses a database. However, you do not hard-code a specific database (e.g. Oracle, DB2, MySQL). All databases can store and load strings and/or objects.

Implement this functionality using interfaces. There is no need to actually implement functionality other than System.out.println. Eventually you need

  • An interface
  • two classes implementing the interface
  • a class "application" using the implementing class
  • a start class (main)

Aufgabe b (freiwillig - wenn Sie Interfaces beherrschen :-))

Bisher wurden die Statusinformationen über Ihre Fahrzeuge nur über System.out.println ausgegeben. Nun möchten Sie alternativ diese Daten in eine Datei oder nach System.err schreiben. Um sich maximale Flexibilität zu gewähren, möchten Sie diese Entscheidung erst zum Startzeitpunkt (z.B. in der main-Methode) treffen.

Tipp: Schreiben Sie ein Interface names Logger, welches über eine Methode log(String text) verfügt. Es soll verschiedene Klassen geben, welche dieses Interface implementieren. Fügen Sie der Klasse Auto eine Methode ausgeben() hinzu, welche selbst auf einer der Klassen, die dieses Interface implementieren, die Methode log(this.toString()) aufruft. Die konkrete Implementierung dieses Interfaces übergeben Sie dem Auto in dessen Konstruktor.

Sie benötigen letztlich

  • Ein Interface Logger
  • Zwei Klassen, die das Interface implementieren (z.B. "SysErrLogger", "SysOutLogger", "FileLogger")
  • Eine Klasse "Auto", die variabel mit einer der Implementierungen des Interfaces arbeitet
  • Ggf. eine "Start-Klasse"

Übung 1: Innere Klassen

Deutsch

Ein Auto (Klasse) habe einen Motor. Tritt man beim Auto aufs Gaspedal (gibGas(int gewichtaufgaspedal)), so wird auf der Motor-Klasse die Methode spritzufuhr(int prozentvonmaximal) aufgerufen.

Implementiere den Motor als innere Klasse, einmal als Member Class, einmal als Lokale Klasse und einmal als Anonyme Klasse.

Bei welchen inneren Klassen besteht die Möglichkeit, dass der Mechaniker direkt von außen die Methode spritzufuhr() aufruft?

English

A car (class) has a motor. Pushing the car's pedal (method accelerate(int pressure)) invokes the method injectFuel(int percentageOfMax) of class motor.

Implement motor as member class, as inner class and anonymous inner class.

Which of these alternatives permit a mechanic calling the method injectFuel from outside the car?