Praktikum 3: Aufgabenstellungen

This commit is contained in:
Johannes Theiner 2018-05-03 13:00:56 +02:00
parent 735435382b
commit 77ae068966
5 changed files with 161 additions and 0 deletions

8
db_junit.txt Normal file
View File

@ -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

View File

@ -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.

View File

@ -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<Character> zur Speicherung der Buchstabensammlung verwenden!

View File

@ -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<List<String>> load(String filename) throws IOException {
List<List<String>> result = new ArrayList<List<String>>();
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<String> titles()
Liefert eine alphabetisch sortierte Liste mit den Titeln aller Vorlesungen.
public Set<String> workaholics()
Liefert die Menge derjenigen Dozenten, die zwei oder mehr Vorlesungen halten.
public Map<String, List<String>> 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<String, List<String>> 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<String> 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<Vorlesung> speichern und verarbeiten!

View File

@ -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