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

Assignment 18: Regular Expressions 2 (optional)

Deutsch

Verschiedene Aufgaben

  • Kopieren Sie sich den Gesetzestext zu Medizinprodukten auf Ihre Festplatte.

    • Finden Sie in diesem Text alle Worte, die mit einen Kleinbuchstaben beginnen.
    • Ersetze Sie in diesem Text alle runden Klammern, die eine Zahl umgeben (z.B. "(2)") durch die entsprechenden eckigen Klammern.

  • Nach was sucht (wahrscheinlich) dieser Ausdruck: "\d\d\.\d\d\.\d\d\d\d"?
  • Wie würden Sie nach einem Euro-Betrag suchen und den in eine Variable einlesen?
  • Was findet dieser Ausdruck: "Re\s*(\[\d+\])?:" Wo kommt er wahrscheinlich zum Einsatz?
  • Erfinden Sie eine eigene Aufgabe.

English

no translation yet

Assignment 17: Regular Expressions

Deutsch

Schreiben Sie eine Klasse EmailCheck, die eine Methode public static boolean checkValidAdress(String email) hat. Diese Methode soll Strings darauf hin prüfen, ob sie gültige E-Mailadressen representieren.

Eine E-Mailadresse sei gültig falls

  • Ein @-Zeichen enthalten ist
  • Davor ein oder mehrere Zeichen stehen
  • Das erste Zeichen nach dem @ muss ein Buchstabe sein
  • Bindestriche sind erlaubt
  • Subdomains sind erlaubt
  • Es sind folgende Topleveldomains gültig: de, info, org, com, net

Schreiben Sie eine (JUnit-) Testklasse, die folgende Checks erfolgreich durchführt:  

 

assertTrue(EmailCheck.checkValidAdress("mail@test.org"));  
assertTrue(EmailCheck.checkValidAdress("super-student@inf.htwg-konstanz.de"));  
assertTrue(EmailCheck.checkValidAdress("rookie@inf-sem1.htwg-konstanz.de"));  
assertTrue(EmailCheck.checkValidAdress("4939@j999.gmx.de"));  
assertTrue(EmailCheck.checkValidAdress("1@a.net"));  
assertFalse(EmailCheck.checkValidAdress("mail@5aaa.org"));  
assertFalse(EmailCheck.checkValidAdress("mail.5aaa.org"));  

English

 

Write a class EmailCheck that has a static method "public static boolean checkValidAdress(String email)". This methods checks whether a string is a valid e-mail.

An email address is valid if

  • It contains an @ sign
  • If there are characters before and after
  • The first character after the @ has to be a letter (and not a digit)
  • Hyphens ("-") are allowed
  • Subdomains are allowed
  • These top level domains are possible: de, org, com, net, kr, it, ua

Write a (JUnit-) test class containing the code above.

Assignment 16: Threads 2 (difficult)

Deutsch

Das klassische Problem, an dem Multithreading erklärt wird, ist das der Philosophen, die um einen Tisch sitzen und entweder essen oder denken. Zum Essen benötigt jeder Philosoph zwei Gabeln (sic!), eine linke und eine rechte. Insgesamt liegt zwischen zwei Philosophen jedoch immer nur eine Gabel.

English

One of the most frequently examples to explain multi threading in informatics is the one with philosophers that sit at table and eat or think. Any philosopher needs to forks (sic!) to eat, a left and a right one. There is just one for between two philosophers:

Deutsch

Würde jetzt jeder Philosoph beispielsweise seine linke Gabel greifen und warten bis die rechte frei würde, so hätten wir eine Deadlock-Situation geschaffen. Schreiben Sie eine Klasse Philosoph, die klüger ist.

Lösungshinweise

  • Legen Sie ein neues Package an (z.B. threads)
  • Legen Sie eine Klasse Philosoph an, die über drei Attribute verfügt, welche bereits im Konstruktor gesetzt werden:
    • Nummer des Philosophen
    • Seine rechte Gabel (den Code für die Gabel finden Sie weiter unten)
    • Seine linke Gabel
  • Philosoph erbt von Thread und überschreibt die run-Methode
  • In der main-Methode
    • werden 5 Gabeln und
    • 5 Philosophen angelegt und dabei die rechte und linke Gabel zugewiesen. (Damit ist nur festgelegt welche Gabeln rechts und links eine Philosophen liegen, er hat noch keine gegriffen)
    • sowie jeder Philosoph gestartet
  • ein gestarteter Philosoph
    • möchte 5 Gänge essen.
    • Er beginnt vor jedem Gang mit Nachdenken (0 - 1 sec)
    • Dann wartet er, bis die linke Gabel frei ist.
    • Sobald dies der Fall ist versucht er die rechte Gabel zu greifen.
    • Gelingt ihm das beginnt er zu essen (0 - 1 sec)
    • Danach legt er die rechte Gabel wieder hin.
    • In jedem Fall, d.h. ober er die rechte Gabel bekam und aß oder nicht, legt er dann die linke Gabel wieder hin.
    • Falls er mit dem Gang fertig ist, beginnt er mit dem nächsten bzw. beendet nach dem 5. Gang das Menü
  • Nutzen die folgende Klasse Gabel

English

If every philosopher grabs his/her left fork and waits for the right fork we would cause a dead-lock. Find a smarter way of solving this assignment.

Hints

  • Add a new package e.g. "threads" or "assignment16"
  • Create a class philosopher with three attributes (number, left and right fork)
  • Philosopher inherits from threads and overwrites the run method
  • The main methods creates the 5 forks and 5 philosophers and assigns the respective left and right forks.
  • The main methods "starts" the philosphers
  • Any philospher
    • wants to eat 5 courses
    • spends 0-1 sec for thinking prior to eating each course
    • waits until the left fork is available
    • If this is given he/she tries to grab the right fork
    • Is this succeeds he/she starts eating (0-1sec)
    • Then he/she returns the right fork
    • In any case he/she returns the left fork
    • starts with the next course immediataly respectively ends the meal after the fifth course
  • Use the class fork

Translation:

  • Gabel: fork
  • legeHin: return (fork)
  • greifeGabel: grabFork
  • warteAuf: waitFor
package threads;

public class Gabel {
  protected int nummer;
  protected boolean liegtAufTisch = true;
  
  public Gabel(int nummer) {
    this.nummer = nummer;
  }

  protected synchronized boolean greifeGabel(Philosoph philosoph) {
    if (liegtAufTisch) {
      System.out.println(philosoph + " greift erfolgreich nach Gabel "+ nummer);
      liegtAufTisch = false;
      return true;
    else {
      System.err.println(philosoph + " greift erfolglos nach Gabel" + nummer);
      return false;
    }
  }

  protected synchronized void legeGabelHin(Philosoph philosoph) {
    System.out.println(philosoph + " legt Gabel " + nummer + " hin");
    liegtAufTisch = true;
    notify();
  }

  protected synchronized void warteAuf(Philosoph philosoph) {
    while (!greifeGabel(philosoph)) {
      try {
        wait();
      catch (Exception e) {
        e.printStackTrace();
      }
    }
  }
}

Assignment 15: Threads 1

Deutsch

Schreiben Sie eine sehr einfache Klasse AusgabeThread, die von Thread erbt und in ihrem Konstruktor den Text übergeben bekommt, den sie ausgeben soll. Sie gibt den Text 10 mal aus, wartet dazwischen aber für eine zufällig lange (max. 1 Sekunde) Zeitspanne. In einer Startklasse werden drei dieser AusgabeThreads mit verschiedenen Texten aufgerufen.

Erst nachdem alle AusgabeThreads zu Ende gelaufen sind, soll das sich die Startklasse mit einer Meldung "habe fertig" beenden.

English

Write a very simple class "PrintThread" that extends Thread and that as a constructor with a parameter text (String). The class prints the text 10 times and waits inbetween randomly between 0 and 1 second. 

The start class launches three PrintThreads with different texts. 

Only if all threads terminate the main class prints "done".

=== Due date ===

Please have the first 14 assignments prepared before the lab on May 18th.

For SPO3 there is no "Schein". Nevertheless, students are encouraged to do the assignments.

 

 

Assignment 14: JavaDocs

Deutsch

Schreibe die JavaDocs für eine Funktion, welche Zufallswerte zwischen einer unteren Grenze a und einer oberen Grenze b mit einer Auflösung (d.h. dem kleinst möglichen Abstand zweier ungleicher Zufallszahlen) von c zurückliefert.

Beispiel: a=15, b=40, c=5. Die Funktion würde zufällig eine der folgenden Zahlen zurückliefern: 15, 20, 25, 30, 35, 40.


public double getZufallszahl(double a, double b, double c) throws IllegalArgumentException

Dabei kann ein Fehlergeworfen werden, wenn b <= a ist.

Erzeuge die JavaDocs (HTML-Dateien) mit Eclipse.

Achtung: Es geht nicht darum, dass Sie den Code implementieren! Sie brauchen nur die JavaDoc zu schreiben.

English

Write JavaDocs for a method that generates random numbers within a range (lower buondary a and upper boundary b and resolution (minimum difference between numbers) c.

Example: a=15, b=40, c=5. Method randomly returns values out of the following set of values: 15, 20, 25, 30, 35, 40.


public double getZufallszahl(double a, double b, double c) throws IllegalArgumentException

An error is thrown if b <= a.

Generate the JavaDocs (HTML files) with Eclipse.

Please note: The task is NOT to implement the method but to document the method with JavaDocs.

Assignment 13: Annotations

Deutsch

Sie haben die Aufgabe gestellt bekommen, einen einfachen Codegenerator zu schreiben, mit dem SQL-Statements erstellt werden können. Dabei sollen die Attribute/Klassenvariablen von Klassen ausgelesen werden und anhand derer Annotations CREATE-TABLE-Ausdrücke mit Namen der Tabellenspalte und dem Datentyp (wie in Annotations festgelegt) geschrieben werden.

Z.B. so für eine Klasse Auto, welche die Attribute Fahrgestellnummer (int) und Typ (String) hat folgendes SQL-Statement erzeugt werden:

 

CREATE TABLE auto (fahrgestellnr INTEGER, type VARCHAR (64));

Beachten Sie, dass der Spaltenname nicht dem Attributnamen entsprechen muss, sondern über die Annotation bestimmt wird.

Gehen Sie wie folgt vor

  1. Legen Sie ein neues Package (optional auch ein neues Eclipse-Projekt) an.
  2. Schreiben Sie eine Annotation SqlAttribute mit den Methoden
    • public boolean persist() und
    • public SQLType sqlType(), wobei SQLType eine Enum mit den Werten INTEGER, FLOAT und VARCHAR sei.
  3. Wählen Sie für diese Annotation ein geeignetes @Target und eine geeignete @Retention
  4. Schreiben Sie eine einfache Klasse. Sie können hier das strapazierte Beispiel Studentin mit den Attributen namen:String und matrikelnummer:int wählen. Fügen Sie den Attributen die Annotations hinzu und wählen Sie einen geeigneten sqlType. Beide Attribute sollen persistiert werden, weshalb persist() true liefern sollte (dies kann auch als default auf der Annotation bereits definiert sein).
  5. Schreiben Sie eine Klasse Codegenerator, welche
    • die Attribute (getDeclaredFields()) ausliest,
    • von jedem Attribut die Annotation SQLType holt,
    • von jedem Attribut dessen Namen ausliest und zum Schluss
    • ein SQL-Statement erzeugt wie oben beschrieben.

English

Your task is to write a simple code generator to generate SQL-statements. The code generator reads attributes from any given class (e.g. via constructor the fully qualified class name is provided (String)). The attributes have an annotation that declares the name of the table column and the data type. Based on this annotations the code generator generates a CREATE statement.

E.g. for a class car (attributes serialnumber (int) and type (String) the folowing statement is generated:

CREATE TABLE car (carnumber INTEGER, type VARCHAR (64));

Please note that the column name does not have to match the name of the attribute but is defined via the annotation.

Recipe

  1. Create a new package (and Eclipse project)
  2. Write an annotation SqlAttribute with methods
    • public boolean persist() und
    • public SQLType sqlType(), where SQLType is an Enum with values INTEGER, FLOAT und VARCHAR(64)
  3. Select for this annotation a suitable  @Target and @Retention
  4. Write a simple class e.g. Student with attributes name (String) and matrikel (int). Add the respective annotations and select a suitable SQLType. Both attributes have to be persisted i.e. persist() is true.
  5. Write a code generator (class with main method) that
    • reads the attributes (getDeclaredFields()),
    • retrieves for each attribut the annotation SQLType,
    • retrieves for each attribute the values and the name and
    • generates a SQL statement as shown above.

 

 

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.

=== Due date===

Please have the first five assignments prepared before the lab on April 6th.

For SPO3 there is no "Schein". Nevertheless, student are encouraged to do the assignments.

 

 

Ü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 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"

Assignment 1: Inner classes

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?