From 77ae06896675cce06e29f1fa3036167c260575b4 Mon Sep 17 00:00:00 2001 From: Johannes Theiner Date: Thu, 3 May 2018 13:00:56 +0200 Subject: [PATCH] Praktikum 3: Aufgabenstellungen --- db_junit.txt | 8 +++ .../hs/java2/praktikum/praktikum1/aufgabe.txt | 19 +++++++ .../hs/java2/praktikum/praktikum2/aufgabe.txt | 41 +++++++++++++++ .../hs/java2/praktikum/praktikum3/aufgabe.txt | 43 ++++++++++++++++ .../hs/java2/praktikum/praktikum4/aufgabe.txt | 50 +++++++++++++++++++ 5 files changed, 161 insertions(+) create mode 100644 db_junit.txt create mode 100644 src/main/java/de/joethei/hs/java2/praktikum/praktikum1/aufgabe.txt create mode 100644 src/main/java/de/joethei/hs/java2/praktikum/praktikum2/aufgabe.txt create mode 100644 src/main/java/de/joethei/hs/java2/praktikum/praktikum3/aufgabe.txt create mode 100644 src/main/java/de/joethei/hs/java2/praktikum/praktikum4/aufgabe.txt diff --git a/db_junit.txt b/db_junit.txt new file mode 100644 index 0000000..59b11ad --- /dev/null +++ b/db_junit.txt @@ -0,0 +1,8 @@ +A1:Relativitätstheorie:Einstein:15 +B2:Quantenmechanik:Heisenberg:17 +C2:Quantenphysik:Planck:5 +T4:Thermodynamik:Kelvin:78 +C2:Theoretische Physik:Kelvin:54 +B2:Thermodynamik:Planck:44 +T4:Quantenphysik:Planck:45 +B2:Elektrodynamik:Kelvin:34 \ No newline at end of file diff --git a/src/main/java/de/joethei/hs/java2/praktikum/praktikum1/aufgabe.txt b/src/main/java/de/joethei/hs/java2/praktikum/praktikum1/aufgabe.txt new file mode 100644 index 0000000..53f7e5c --- /dev/null +++ b/src/main/java/de/joethei/hs/java2/praktikum/praktikum1/aufgabe.txt @@ -0,0 +1,19 @@ +Entwickeln Sie eine Klasse GrosseZahl, die ganze Zahlen >=0 repräsentiert. Negative Zahlen werden zur Vereinfachung nicht berücksichtigt. Die Klasse ist nicht durch den Wertebereich primitiver Typen begrenzt, sondern speichert ein Feld (int-Array, keine ArrayList!) mit den Dezimalziffern einer Zahl. +Definieren Sie folgende Methoden: + + GrosseZahl(String d) + Erzeugt eine Zahl, deren Dezimaldarstellung in d gegeben ist. d besteht ausschließlich aus Dezimalziffern. + GrosseZahl(int i) + Erzeugt eine Zahl mit dem Wert von i. + String toString() + Gibt die Zahl als String zurück. + boolean less(GrosseZahl b) + Liefert true, wenn diese Zahl echt kleiner als b ist. + GrosseZahl add(GrosseZahl b) + Liefert eine neue Zahl mit der Summe dieser Zahl und b. Das this-Objekt wird nicht verändert. + GrosseZahl mult(GrosseZahl b) + Liefert eine neue Zahl mit dem Produkt dieser Zahl und b. Das this-Objekt wird nicht verändert. Hinweis: Sie können dazu die add-Methode nutzen! + GrosseZahl ggT(GrosseZahl b) + Liefert den größten gemeinsamen Teiler (ggt) dieser Zahl und b zurück. Das this-Objekt wird nicht verändert. Die Berechnung muss rekursiv(!) nach dem klassischen euklidischen Algorithmus erfolgen. Nach diesem wird immer die kleinere Zahl von der größeren Zahl abgezogen, bis beide Zahlen gleich groß sind. Dieses Ergebnis ist dann der ggT. + +Die Verwendung der Klasse BigInteger aus der Java-Bibliothek ist für diese Aufgabe nicht erlaubt! Sie dürfen und sollten aber eigene Hilfsmethoden (private) hinzufügen, um sich die Lösung der Aufgaben zu erleichtern. \ No newline at end of file diff --git a/src/main/java/de/joethei/hs/java2/praktikum/praktikum2/aufgabe.txt b/src/main/java/de/joethei/hs/java2/praktikum/praktikum2/aufgabe.txt new file mode 100644 index 0000000..5914e4c --- /dev/null +++ b/src/main/java/de/joethei/hs/java2/praktikum/praktikum2/aufgabe.txt @@ -0,0 +1,41 @@ +Als Buchstabensammlung wird hier eine beliebig große, unveränderliche Sammlung von großen Buchstaben bezeichnet. In einer Sammlung können einzelne Buchstaben fehlen oder mehrfach enthalten sein. Die Reihenfolge ist irrelevant. Eine Sammlung ist zum Beispiel: +(A, B, R, A, K, A, D, A, B, R, A) +Definieren Sie auf der Grundlage einer ArrayList eine Klasse CharCollection, deren Elemente Sammlungen repräsentieren. CharCollection bietet folgende Funktionalität: + + CharCollection(char... cc) + Erzeugt eine neue Sammlung aus einer Liste großer Buchstaben. Eine Sammlung wird zum Beispiel erzeugt mit: + CharCollection cc = new CharCollection('A', 'B', 'R', 'A', 'K', 'A', 'D', 'A', 'B', 'R', 'A'); + CharCollection(String s) + Erzeugt eine neue Sammlung aus den Buchstaben eines Strings aus großen Buchstaben. Die gleiche Sammlung wie im vorhergehenden Punkt wird zum Beispiel erzeugt mit: + CharCollection cc = new CharCollection("ABRAKADABRA"); + int size() + Liefert die Anzahl Buchstaben der Sammlung. Zum Beispiel: + System.out.println(cc.size()); // 11 + int count(char c) + Liefert die Anzahl Vorkommen des Buchstabens c. Beispiele: + System.out.println(cc.count('R')); // 2 + System.out.println(cc.count('X')); // 0 + int different() + Liefert die Anzahl verschiedener Buchstaben in der Sammlung. Zum Beispiel: + System.out.println(cc.different()); // 5 + char top() + Liefert den häufigsten Buchstaben in der Sammlung. Wenn es mehrere Kandidaten gibt, wird irgendeiner davon gewählt. Ein Beispiel: + System.out.println(cc.top()); // A + Eine leere Sammlung liefert das Zeichen mit dem Zeichencode 0zurück. + public String toString() + Liefert eine lesbare Darstellung der Sammlung. + System.out.println(cc); // (A, B, R, A, K, A, D, A, B, R, A) + Die Reihenfolge der Elemente ist irrelevant. + CharCollection moreThan(int m) + Liefert eine neue Sammlung, in der nur noch die Buchstaben enthalten sind, die mehr als m-mal vorkommen. Beispiel: Nur Buchstaben, die wenigstens 2-mal vorkommen, bleiben übrig. K und D fallen heraus: + System.out.println(cc.moreThan(1)); // (A, B, R, A, A, A, B, R, A) + public boolean equals(Object x) + Vergleicht eine Sammlung mit einem anderen Objekt x. Liefert true, wenn x eine Sammlung mit den gleichen Buchstaben ist, und ansonsten false. Die Reihenfolge spielt keine Rolle. + CharCollection except(CharCollection cc) + Liefert eine neue Sammlung aus den Buchstaben dieser Sammlung, wobei alle Buchstaben von cc entfernt sind. Beispiel: + System.out.println(cc.except(new CharCollection("ABRAXAS"))); // (K, D, A, B, R, A) + boolean isSubset(CharCollection cc) + Liefert zurück, ob die als Parameter übergebene Sammlung in der Sammlung enthalten ist, für die die Methode aufgerufen wurde (this). Beispiel: + System.out.println(cc.isSubset(new CharCollection("ABRAAA"))); // true + +Ihre Lösung muss intern als Objektvariable eine List zur Speicherung der Buchstabensammlung verwenden! diff --git a/src/main/java/de/joethei/hs/java2/praktikum/praktikum3/aufgabe.txt b/src/main/java/de/joethei/hs/java2/praktikum/praktikum3/aufgabe.txt new file mode 100644 index 0000000..f01cade --- /dev/null +++ b/src/main/java/de/joethei/hs/java2/praktikum/praktikum3/aufgabe.txt @@ -0,0 +1,43 @@ +In einer Textdatei sind Vorlesungsdaten gespeichert. Jede Zeile besteht aus vier Teilstrings, die mit Doppelpunkten getrennt sind. Der Doppelpunkt kommt sonst nicht vor. Die vier Strings in einer Zeile enthalten der Reihe nach: + + Studiengruppe + Titel der Vorlesung + Dozent + Teilnehmerzahl + +Ein Ausschnitt aus der Datei könnte so aussehen: + + I2:Java 2:Rump:100 + I2:Algorithmen und Datenstrukturen:Totzauer:80 + MT2:Mathematik 2:von Coelln:60 + MT2:Audio-/Videotechnik:Lemke:50 + E2:Mathematik 2:Rabe:70 + + +Die folgende Methode load liest eine solche Datei und liefert sie als Liste von Stringlisten ("Datenbasis") zurück. + +public static List> load(String filename) throws IOException { + List> result = new ArrayList>(); + BufferedReader br = new BufferedReader(new FileReader(filename)); + for (String line=br.readLine(); line!=null; line=br.readLine()) + result.add(Arrays.asList(line.split(":"))); + br.close(); + return result; +} + +Kapseln Sie eine derartige Datenbasis in einer Klasse Vorlesungsverzeichnis im Paket vorlesung mit den folgenden Methoden: + + Konstruktor + Lädt die Datenbasis von einer Datei, deren Name als String übergeben wird. Für alle möglichen Formatfehler in der Datei soll eine TextFileFormatException mit einer aussagekräftigen Fehlermeldung geworfen werden. + public List titles() + Liefert eine alphabetisch sortierte Liste mit den Titeln aller Vorlesungen. + public Set workaholics() + Liefert die Menge derjenigen Dozenten, die zwei oder mehr Vorlesungen halten. + public Map> groupToTitles() + Liefert eine Map, die Studiengruppen auf Listen von Vorlesungstiteln abbildet. Unter dem Schlüssel MT2 wäre für die oben angegebene Datenbasis zum Beispiel als Wert die Liste [Mathematik 2, Audio-/Videotechnik] zu finden. + public Map> multipleTitles() + Liefert eine Map, die Vorlesungen auf Listen von Dozenten, die diese Vorlesungen halten, abbildet. Als Schlüssel werden in der Map nur Vorlesungen verwendet, die von unterschiedlichen Dozenten gehalten werden. Entsprechend der obigen Datenbasis würde in diesem Fall nur ein Eintrag in der Map stehen mit dem Schlüssel Mathematik 2 und dem Wert [von Coelln, Rabe] als Liste. + public List descendingTitles() + Liefert eine nach Teilnehmerzahl absteigend(!) sortierte Liste mit den Titeln aller Vorlesungen. + +Die Klasse Vorlesungsverzeichnis muss die Daten zu den Vorlesungen intern als Objektvariable in einer Set speichern und verarbeiten! \ No newline at end of file diff --git a/src/main/java/de/joethei/hs/java2/praktikum/praktikum4/aufgabe.txt b/src/main/java/de/joethei/hs/java2/praktikum/praktikum4/aufgabe.txt new file mode 100644 index 0000000..c7f446c --- /dev/null +++ b/src/main/java/de/joethei/hs/java2/praktikum/praktikum4/aufgabe.txt @@ -0,0 +1,50 @@ +Entwickeln Sie eine Klasse KlausurenServer, mit der verwaltetet werden kann, welche Klausuren ein(e) Student/-in mitschreiben möchte. Zu einer Mail-Adresse werden dabei die IDs der Klausuren gespeichert, z.B. + + max.mueller@stud.hs-emden-leer.de: 34, 45, 56 + peter.meier@stud.hs-emden-leer.de: 1, 8, 34, 67 + axel.maier@stud.hs-emden-leer.de: 34, 56 + ... + +Intern werden diese Daten als (key,value)-Paare in einer Map gespeichert, wobei als key die Mail-Adresse verwendet wird. Der Konstruktor der Klasse KlausurenServer erhält als Parameter den Port, auf dem Anfragen entgegengenommen werden. Jede Anfrage besteht aus einer Textzeile, die eines der nachfolgend beschriebenen Kommandos enthalten darf, wobei die Kommandos groß oder klein geschrieben werden können. Als Antwort wird eine Textzeile zurückgeschickt, die immer mit 0 (Misserfolg) oder 1 (Erfolg) beginnt. Die (key,value)-Paare sollen auch nach einem Stoppen und Starten des Servers erhalten bleiben und müssen somit in einer Datei gespeichert werden. + + PUT key newvalue -> 1 oldvalue + Trägt unter dem Schlüssel key den Wert newvalue ein. Die Antwort besteht aus einer 1 und dem alten Wert des Schlüssels. Beim ersten Eintrag ist oldvalue ein leerer String. Falls newvalue Leerzeichen enthält, sollen diese entfernt werden. + GET key -> 1 value oder 0 + Liefert den Wert, der unter dem Schlüssel key eingetragen ist. Die IDs der Klausuren werden dabei immer aufsteigend sortiert zurückgegeben. Wenn der Schlüssel nicht bekannt ist, ist die Antwort 0. + DEL key -> 1 oldvalue oder 0 + Löscht Schlüssel und Wert und liefert den gelöschten Wert zurück. Wenn der Schlüssel nicht bekannt war, wird 0 zurückgeliefert. + GETALL -> 1 value oder 0 + Liefert eine Auflistung aller Klausurenwahlen. Wenn die Wahl eines/einer Studierenden in der Wahl eines/einer anderen Studierenden enthalten ist, fällt diese für diese Anfrage weg. Beim obigen Beispiel würde die Wahl von Axel Maier entfallen, da diese Klausuren auch von Max Mueller gewählt wurden. value soll in folgender Form zurückgegeben werden: + [34,45,56],[1,8,34,67] + Falls (noch) keine Klausurenwahlen vorhanden sind, wird 0 zurückgegeben. + STOP -> 1 + Beendet den Dienst und somit den Server. + +Eine main-Methode liest von der Kommandozeile einen Port ein, legt ein KlausurenServer-Objekt an und startet den Server. +Der KlausurenServer arbeitet ähnlich wie ein Webserver. Er verarbeitet jede Anfrage einzeln in einem eigenen Thread(!) und unabhängig von anderen Anfragen. Die Verbindung zum Client wird nach jeder Antwort wieder geschlossen. Ein Client, der mehrere Anfragen abwickeln möchte, muss für jede Anfrage eine neue Verbindung zum Server aufnehmen. Ein solches Protokoll wird als "zustandslos" bezeichnet, weil mit jeder Anfrage eine neue Kommunikationssequenz beginnt, die keine Informationen aus früheren Anfragen voraussetzt. +Praktisch alle Betriebssysteme enthalten einen Telnet-Client, mit dem der Klausurenserver getestet werden kann. Dieser muss bei Windows-Systemen aber ggfls. nachinstalliert werden. Das folgende Beispiel zeigt den Dialog auf einem Unix-System. Der KlausurenServer wurde in einem anderen Terminal gestartet und läuft bereits. Zur Vereinfachung sind die Protokollausgaben des Telnet-Clients ausgeblendet: + +$ telnet localhost 2000 +put max.mueller@stud.hs-emden-leer.de 34,45,56 +1 +$ telnet localhost 2000 +put axel.maier@stud.hs-emden-leer.de 34, 56 +1 +$ telnet localhost 2000 +getall +1 [34,45,56] +$ telnet localhost 2000 +put max.mueller@stud.hs-emden-leer.de 34, 45 +1 34,45,56 +$ telnet localhost 2000 +get max.mueller@stud.hs-emden-leer.de +1 34,45 +$ telnet localhost 2000 +del max.mueller@stud.hs-emden-leer.de +1 34,45 +$ telnet localhost 2000 +get max.mueller@stud.hs-emden-leer.de +0 +$ telnet localhost 2000 +stop +1 \ No newline at end of file