Überprüfen eines Anagrams

Schwierigkeit 2

Ein Anagram ist ein Satz, der durch Umstellen aller Buchstaben eines anderen Satzes gebildet werden kann. Gross- und Kleinschreibung wird dabei ignoriert. Ebenso spielen Leerzeichen keine Rolle. Aus dem Wort "Desperation" läßt sich zum Beispiel der Satz "A Rope Ends It" bilden. Falls Sie an dieser Aufgabe verzweifeln, sollten Sie sich das allerdings nicht so zu Herzen nehmen.

Schreiben Sie ein Java-Programm, mit dem zwei Zeichenketten daraufhin überprüft werden können, ob sie ein Anagram bilden.

Hinweise:

Lösung

Implementieren Sie Polynome

Diese Aufgabe finden Sie bei Objekt-Orientierung.

Berechnen Sie die Quersumme einer Folge von Ziffern

Schwierigkeit 3

Implementieren Sie eine Java-Methode, die für ein char-Feld bestehend aus den Ziffern '0' bis '9' die Quersumme berechnet und als long-Wert zurückgibt.

Hinweis: Mit char-Werten kann wie mit int-Werten gerechnet werden. Die Ziffern '0' bis '9' haben jeweils eine um Eins grösser werdende binäre Kodierungen im Unicode. Der folgende Ausdruck ist also zum Beispiel immer true: '1' == '0' + 1.

Lösung

Berechnen Sie den kleinsten Abstand zweier benachbarter Zahlen

Schwierigkeit 2

Implementieren Sie eine Java-Methode, die für ein int-Feld den kleinsten Abstand zweier benachbarter Zahlen berechnet und den Index der ersten Zahl zurückgibt (vom ersten Vorkommen, falls es mehrere benachbarte Zahlen mit gleichem Abstand gibt).

Hinweis: Verwenden Sie Math.abs() zum Berechnen des Betrags einer Zahl.

Lösung

Passwort auf seine Qualität überprüfen

Schwierigkeit 2

Gute Passwörter sollten so aufgebaut sein, dass nicht leicht durch massives Ausprobieren aufgrund von Wörterbüchern und Zahlenfolgen erraten werden können.

Ein gutes Passwort sollte zum Beispiel mindestens

"AxB1&a8c" erfüllt zum Beispiel diese Kriterien, "1passw0rt" aber nicht (kein Sonderzeichen und kein Grossbuchstabe).

Implementieren Sie eine Java-Klasse "PasswortChecker" mit einer Java-Methode, die überprüft, ob ein Passwort obige Kriterien erfüllt oder nicht. Das Passwort soll dabei als char-Feld gegeben sein.

Ein Sonderzeichen soll einfach ein Zeichen sein, dass keine Ziffer und kein Unicode-Buchstabe ist. Verwenden Sie die Klasse Character, um einzelne Zeichen zu überprüfen.

Lösung

Passwort aus einem Merksatz erzeugen

Schwierigkeit 2

Damit man sich Passwörter gut merken kann, ohne das diese sich leicht erraten lassen, kann man Passwörter aus Merksätzen bilden. Wir wollen nach folgenden Regeln Passwörter aus Sätzen bilden:

Das Passwort wird als Folge der letzten Zeichen eines jeden Wortes im Satz gebildet. Bei Buchstaben des Unicode-Alphabets soll alternierend mal ein Gross- dann wieder ein Kleinbuchstabe verwendet werden. Der erste Buchstabe soll gross geschrieben werden. Wörter des Satzes sollen alle durch beliebig viele Leerzeichen abgetrennten Teilfolgen sein. Werden Satzzeichen direkt hinter ein Wort geschrieben, so gehören sie zu dem Wort.

"Wenn es regnet, dann wird es nass ." besteht aus den Teilwörtern "Wenn" "es" "regnet," "dann" "wird" "es" "nass" "." und das dazugehörige Passwort ist "Ns,NdSs."

Implementieren Sie eine Java-Klasse "PasswortGenerator" mit einer Java-Methode, die zu einem Satz gegeben als String ein Passwort nach obiger Methode zurückgibt (String).

Verwenden Sie split() von String, um die Teilwörter zu erzeugen. Beachten Sie auch die anderen Methoden von String.

Lösung

Ein Generator, um zufällige Namen zu erzeugen

Schwierigkeit 1

Entwerfen und Implementieren Sie eine Java-Klasse, mit deren Objekte fortwährend zufällige Namen bestehend aus Vor- und Nachnamen erzeugt werden können. Der Name soll in 50% aller Aufrufe einen weiblichen und einen männlichen Vornamen haben. In 10% aller Aufrufe soll der Vorname ein Doppelname, wie „Franz Josef“, sein. Ein Doppelname bestehend aus zwei identischen Namen darf dabei nicht erzeugt werden. In 15% aller Aufrufe soll der Nachname aus zwei mit Bindestrich zusammengesetzten einzelnen Nachnamen sein, etwa „Meier-Müller“. Ein aus zwei identischen Nachnamen zusammengesetzter Nachname darf dabei nicht erzeugt werden.

Gehen Sie bei dieser Aufgabe wie folgt schrittweise vor.

1. Schritt:

Überlegen Sie sich einen ersten Entwurf, mit privaten Methoden, mit denen jeweils ein zufälliger männlicher, weiblicher Vorname und ein zufälliger Nachname erzeugt und zurückgegeben werden. Implementieren Sie diesen Entwurf und überprüfen Sie in einer main-Methode in dieser Klasse.

2. Schritt:

Erweitern Sie Ihren Entwurf, um eine öffentliche Methode, die nun Namen wie oben beschrieben erzeugen und zurückgeben soll. Streichen Sie die main-Methode aus dem ersten Schritt und geben Sie in einer main-Methode in einer zusätzlichen Klasse 1000 zufällig erzeugt Namen aus. Die Ausgabe sieht also etwa wie folgt aus

Hadrian Steiner-Jakobi
Udo Sommer
Jo Hintz
André Schultheiß
Rupert Richter
Ernst Wurm
Ludwig Herrmann-Thomas
Julian Adrienne Wolfram-Ossege

3. Schritt:

Überlegen Sie sich, wie sie die Anforderung, dass 10% aller erzeugten Namen einen Doppelnamen und 15% aller Aufrufe einen zusammengesetzten Nachnamen enthalten sollen, mit einer JUnit Testklasse statistisch möglichst genau überprüfen können und implementieren Sie jeweils eine entsprechende Testmethode dazu. Sehen Sie sich dazu die Methoden der Klasse String an.

Laden Sie sich als Basis für Ihre Implementierung die Klasse ZufallsnamenGenerator.java (UTF-8) herunter. Sie enthält bereits eine umfangreiche Liste von Vor- und Nachnamen. Beachten Sie auch die zusätzlichen Implementierungshinweise in dieser Klasse.

Lösung

Implementieren Sie quadratische Matrizen

Schwierigkeit 2

Entwerfen und Implementieren Sie eine Java-Klasse, die quadratische Matrizen mit double-Werten repräsentieren. Matrizen sollen als zwei-dimensionale Felder mit Feldtyp double repräsentiert werden. Zwei Matrizen sollen addiert und multipliziert werden können.

Die Summe einer Matrix m1 und Matrix m2 ist die Summe der entsprechenden Werte m1[i][j] + m2[i][j].

Das Produkt einer matrix m1 und Matrix m2 mit Dimension n ist für den Wert an Position i,j die Summe m1[i][k] * m2[k][j] für alle 0 < k < n.

Lösung

Implementieren Sie deterministische endliche Automaten

Schwierigkeit 2

Wir betrachten zur Vereinfachung Automaten, deren Zustände Zahlen von 1..n sind. 1 ist immer der Anfangszustand, n immer der Endzustand. Bei Zustandsübergänge wird immer genau ein char-Wert eingelesen. Folgende Abbildung zeigt ein Beispiel eines solchen Automatens:
Beispiel eines deterministischen endlichen Automats

Die Zustandsübergänge können mit einem zwei-dimensionalen Feld uebergaenge repräsentiert werden, so das für einen Zustand z und das nächste einzulesende Zeichen c der Folgezustand uebergaenge[z][c] ist. Falls kein Übergang existiert, dann soll 0 im Feld an entsprechender Stelle sein. Wir schränken uns bei den Zeichen auf dem ASCII-Zeichensatz ein. Obiger Automat kann dann wie folgt "erzeugt" werden:

int [ ][ ] uebergaenge = new int[5][128];
uebergaenge[1]['a'] = 3;
uebergaenge[1]['b'] = 2;
uebergaenge[2]['a'] = 4;
uebergaenge[3]['b'] = 4;
uebergaenge[4]['c'] = 3;

Implementieren Sie eine Java-Klasse EndlicherAutomat mit einer Java-Methode boolean akzeptiert(char [] eingabe), die genau dann true zurückgibt, wenn der Automat die Zeichenfolge aktzeptiert. Das Feld, welches den Automaten charakterisiert, soll im Konstruktor übergeben werden.

Lösung

Prüfziffern von Euro-Geldscheinen berechnen

Schwierigkeit 2

Untere linke Ecke einer 50-Euro-Banknote mit der Seriennummer. Der Traum eines jeden Studenten. 10 Stück davon und die Studiengebühren sind bezahlt

Euro-Banknoten haben eine eindeutige Seriennummer, die aus einem führenden Buchstaben, 10 Ziffern und einer Prüfziffer bestehen. Beispiel: Z 6016220022 6 (Leerzeichen zur Übersicht hinzugefügt).

Der führende Buchstabe codiert die nationale Zentralbank (NZB), die den Geldschein im Umlauf gebracht hat. Sie wird NZB-Nummer genannt.

Die Prüfziffer berechnet sich wie folgt:

Implementieren Sie eine Java-Funktion, die für eine Seriennummer (gegeben als String oder char-Feld seriennummer) die Prüfziffer berechnet und zurückgibt. Die Seriennummer sei im Feld in umgekehrter Reihenfolge gegeben: seriennummer[0] ist also der Buchstabe, seriennummer[11] die Prüfziffer. Der Buchstabe ist immer gross. Fehlerfälle brauchen nicht berücksichtigt werden.

Auf der Vorderseite der Banknote (sehr klein gedruckt und im Bild versteckt) befindet sich noch eine weitere Nummer: der Plattencode. Sie besteht aus einem Buchstabe, gefolgt von drei Zahlen, einem Buchstaben und wieder einer Ziffer. Beispiel: T 003 G1.

Der führende Buchstabe codiert die Druckerrei, welche den Geldschein gedruckt hat. Die drei Zahlen identifizieren die Druckplatte. Der Rest die Position der Geldnote auf der Druckfahne A1 (oben links) bis J6 (unten rechts).

Lösung

Klammerung überprüfen

Schwierigkeit 2

Implementieren Sie eine Java-Funktion, die für eine Zeichenkette (oder char-Feld) überprüft, ob die dort enthaltenen runden Klammern den Regeln einer vollständigen Klammerung wie bei einem Ausdruck entsprechen. Das heißt: Für jede öffnende Klammer '(' muss eine nachfolgende schließende Klammer ')' existieren und die runden Klammern müssen korrekt verschachtelt sein. Zeichen ausser den runden Klammern sollen ignoriert werden.

Folgendes sind korrekt geklammerte Zeichenketten: "()", "", "(()(a)( ()((c))))". Diese nicht: "(()", "a (()()) a)".

Lösung