Aufgaben¶
Hier finden Sie die Aufgaben. Die Abgabefristen der einzelnen Aufgaben stehen hier. Beachten Sie die nachfolgenden Hinweise zum Hochladen der Aufgaben.
Hinweise zur Abgabe der Aufgaben¶
Die Aufgaben laden Sie in Moodle unter dem Reiter "Aufgaben" hoch. Dort ist für jede Aufgabe eine Moodle-Aufgabe erstellt. Beachten Sie, dass ein Hochladen nach Ablauf der Abgabefrist nicht mehr möglich ist.
Bitte laden Sie weder Lösungen hoch, die Sie mithilfe von KI erstellt haben, noch die Lösung, die vollständig der Lösung aus dem Tutorium entspricht! Ein Hochladen einer Lösung ist nicht zwingend notwendig! Es geht mir darum, Ihre Lösungen bzw. Lösungsversuche zu betrachten, um Schwerpunkte in der Vorlesung setzen zu können. Ihnen sollte es darum gehen, möglichst viel selbständig zu programmieren und versuchen, eigene Lösungen zu entwickeln. Am Ende sollen Sie programmieren und nicht fremde Lösungen in Moodle hochladen können. Es ist viel mehr wert, es versucht zu haben und nicht fertig geworden zu sein, als es gar nicht erst selbständig versucht zu haben. Sie lernen Programmieren nur durch Programmieren! Es gibt keinen anderen Weg.
Eclipse¶
Sie sind in der Wahl Ihrer Entwicklungsumgebung frei. Ich verwende in der Veranstaltung Eclipse. Dafür gelten die folgenden Hinweise:
- Achten Sie darauf, dass Sie die Quelldateien (also die
.java
-Dateien aus demsrc
-Verzeichnis) hochladen. - Ihre Klassen erstellen Sie immer in einem package
aufgaben.aufgabeX
. Das heißt, Aufgabe1 ist im packageaufgaben.aufgabe1
, Aufgabe2 im packageaufgaben.aufgabe2
usw. - In Ihrem
workspace
gibt es dann einen Ordner für Ihr Java-Projekt, z.B.WS24
(je nachdem, wie Sie Ihr Java-Projekt genannt haben) und darin befindet sich einbin
- und einsrc
-Ordner. In demsrc
-Ordner befindet sich dann ein Ordneraufgaben
und darin ein Ordneraufgaben1
(für Aufgabe1). Darin befindet sich Ihre.java
-Datei, die Sie hochladen sollen. Angenommen, Sie haben Ihre KlasseAufgabe1
genannt, dann heißt die Klasse alsoAufgabe1.java
. Sie folgen also dem Pfadworkspace
→ Java-Projekt (z.B.WS24
) →src
→aufgaben
→aufgabe
X. - Wenn Ihre Lösung aus mehreren Klassen (mehreren
.java
-Dateien) besteht, können Sie entweder die Dateien einzeln hochladen oder Sie zippen Ihre Dateien (am besten dann denaufgabeX
-Ordner und laden das.zip
-File hoch. - In Ihrer Lösung (Ihrer/n Klasse/n) fügen Sie direkt oberhalb Ihrer Klassendefinition einen JavaDoc-Kommentar ein (
/** ... */
). Dieser enthält ein@author
-Tag. dahinter schreiben Sie Ihren Namen. Das sieht dann z.B. so aus: - Sie können Ihre Aufgaben zu zweit lösen. Tragen Sie dann hinter das
@author
-Tag beide Namen ein und laden Sie bitte beide die Lösung in Moodle hoch!
Aufgaben¶
Aufgabe1 - Rhombus
- Erstellen Sie eine Klasse
Aufgabe1
mitmain()
-Methode im packageaufgaben.aufgabe1
- Implementieren Sie eine Methode
public static void printRhombus(int upperHalf, boolean filled){}
- Ist der Parameterwert von
filled
true
, dann soll ein Rhombus (eine Raute) wie folgt auf die Konsole ausgegeben werden: - Ist der Parameterwert von
filled
false
, dann soll der Rhombus ungefüllt sein, also so: - der Wert für
upperHalf
gibt die Höhe einer Hälfte des Rhombus an. Die Gesamthöhe des Rhombus berechnet sich aus ` - In unserem oben gezeigten Beispiel ist der Wert von
upperHalf
5
und die Gesamthöhe des Rhombus11
. - Die obere Ausgabe ist also durch die Anweisung
printRhombus(5, true);
und die untere durch die AnweisungprintRhombus(5, false);
entstanden. - Die Berechnung der Höhe aus dem Parameterwert
upperHalf
hat die Vorteile,- dass die Höhe dadurch immer eine ungerade Zahl ist (was notwendig ist) und
- dass Sie den Wert
upperHalf
gut verwenden können (was ebenfalls notwendig ist, wie Sie merken werden)
-
Tipps::
-
Fangen Sie auf keinen Fall gleich an zu programmieren, sondern überlegen sich mithilfe von Zettel und Stift z.B. die Antworten auf folgende Fragen:
- Wieviele Zeilen hat der Rhombus insgesamt für einen gegebenen Wert von
upperHalf
? - Wenn die obere Hälfte des Rhombus gezeichnet wird und Sie sind in Zeile
i
, wieviele Leerzeichen werden zunächst ausgegeben und wieviele Sterne folgen dann? - Wieviele Sterne müssen Sie in der mittleren Zeile ausgeben?
- Wenn die untere Hälfte des Rhombus gezeichnet wird und Sie sind in Zeile
i
, wieviele Leerzeichen werden zunächst ausgegeben und wieviele Sterne folgen dann?
- Wieviele Zeilen hat der Rhombus insgesamt für einen gegebenen Wert von
-
Zerlegen Sie den Rhombus gedanklich in drei Teile: eine obere Hälfte, die mittlere Zeile und eine untere Hälfte.
- Schreiben Sie sich zwei weitere Methoden
public static void printRhombusFilled(int upperHalf){}
undpublic static void printRhombusUnfilled(int upperHalf){}
, die Sie entsprechend des Wertes vonfilled
aufrufen. In der einen Methode erstellen Sie die ausgefüllte Raute und in der anderen die ungefüllte. Dann wird Ihr Programm nicht zu unübersichtlich. Fangen Sie am besten mit der ausgefüllten an, die ist etwas leichter.
-
-
Das Programm soll für beliebige (nicht so große - max. Wert
50
) positive Zahlen (also> 0
) vonupperHalf
funktionieren. Insbesondere sind die Tests fürupperhalf == 1
interessant. - Viel Spaß und viel Erfolg!
Aufgabe2 - Numbers
- Erstellen Sie eine Klasse
Aufgabe2
mitmain()
-Methode im packageaufgaben.aufgabe2
. - Bei der Lösung der Aufgabe soll nicht der Datentyp
String
verwendet werden! -
Implementieren Sie eine Methode
public static int lengthOfNumber(int number){}
. Diese Methode gibt die Länge vonnumber
zurück, d.h. die Anzahl der Ziffern in der Zahl. Beachten Sie: fürnumber == 0
soll jedoch0
zurückgegeben werden.
Beispiele:
-
Implementieren Sie eine Methode
public static int firstDigit(int number){}
. Diese Methode gibt die erste Ziffer vonnumber
zurück.
Beispiele:
-
Implementieren Sie eine Methode
public static int powerOf10ToN(int n){}
. Diese Methode gibt den Wert für10 ^ n
zurück. Sie können davon ausgehen, dassn >= 0
gilt.
Beispiele:
-
Implementieren Sie eine Methode
public static int cutFirstDigit(int number){}
. Diese Methode entfernt vonnumber
die erste Ziffer. Für-10 < number < 10
wird0
zurückgegeben.
Beispiele:
-
Implementieren Sie eine Methode
public static boolean secondDigitIsZero(int number){}
. Diese Methode gibt eintrue
zurück, wenn die zweite Ziffer innumber
eine0
ist. Sonstfalse
.
Beispiele:
-
Testen Sie alle Methoden ausführlich in der
main()
-Methode. -
Viel Spaß und viel Erfolg!
Aufgabe 3 - Triangle
-
Wir erstellen uns einen neuen Datentyp
Triangle
-
Erstellen Sie im package
aufgaben.aufgabe3
eine KlasseTriangle
ohnemain()
-Methode und eine KlasseTestklasse
mitmain()
-Methode. -
In der Klasse
Triangle
erstellen Sie drei Objektvariablena
,b
undc
jeweils vom Typint
und alleprivate
. Das sollen die Seiten unseres Dreiecks sein. -
Erstellen Sie einen Konstruktor, dem drei Parameterwerte übergeben werden
pa
,pb
undpc
alle vom Typint
. Mit diesen Werten werden die Objektvariablen initialisiert. -
Schreiben Sie eine Objektmethode
für den Fall, dass die Seitenlängenprint()
, die die Seitenlängen des Dreiecks in der folgenden Form ausgibt:3
,4
und5
sind. -
Wenn Sie jetzt in der
dann sollte die Ausgabe ungefähr so aussehen:main()
-Methode derTestklasse
folgende Anweisungen ausführen -
Erstellen Sie in der Klasse
Triangle
eine Objektmethodepublic int circumference()
, die den Umfang des Dreiecks zurückgibt (also die Summe der drei Seitenlängen). -
Erstellen Sie in der Klasse
Triangle
eine Objektmethodepublic double area()
, die den Flaecheninhalt des Dreiecks zurückgibt. Der FlächeninhaltA
eines Dreiecks lässt sich nach der Heron'schen Formel wie folgt berechnen:- `A = Math.sqrt(s * (s-a) * (s-b) * (s-c)) (siehe Klasse Math)
- wobei
s = (a + b + c) / 2
- Achten Sie darauf, dass Sie stets mit
double
rechnen! - Beachten Sie, dass in einem Dreieck keine Seite länger sein darf als die Summe der beiden anderen. Für die oben in der
main()
-Methode erstellten Objekte gilt das aber. Wir müssen deshalb nichts weiter beachten.
-
Erweitern Sie die Objektmethode
print()
nun so, dass auch der Umfang und der Flaecheninhalt in der folgenden Form ausgegeben werden (Sie können in dieprint()
-methode auch die Leerzeile integrieren):Seiten : a=3, b=4, c=5 Umfang : 12 Flaecheninhalt : 6.0 Seiten : a=4, b=4, c=7 Umfang : 15 Flaecheninhalt : 6.777720855862979 Seiten : a=5, b=5, c=5 Umfang : 15 Flaecheninhalt : 10.825317547305483 Seiten : a=4, b=5, c=3 Umfang : 12 Flaecheninhalt : 6.0 Seiten : a=4, b=3, c=5 Umfang : 12 Flaecheninhalt : 6.0 Seiten : a=3, b=4, c=5 Umfang : 12 Flaecheninhalt : 6.0
-
Erstellen Sie in der Klasse
Triangle
eine Objektmethodepublic boolean equilateral()
, die eintrue
zurückgibt, wenn das Dreieck gleichseitig ist (also alle Seiten des Dreiecks gleich lang sind) undfalse
sonst. -
Erstellen Sie in der Klasse
Triangle
eine Objektmethodepublic boolean isosceles()
, die eintrue
zurückgibt, wenn das Dreieck gleichschenklig ist (also zwei Seiten des Dreiecks gleich lang sind) undfalse
sonst. -
Erweitern Sie die Objektmethode
print()
nun so, dass die Prüfungen, ob sich um ein gleichseitiges oder gleichschenkliges (oder unregelmäßiges) Dreieck handelt, in der folgenden Form ausgegeben werden:Seiten : a=3, b=4, c=5 Umfang : 12 Flaecheninhalt : 6.0 Das Dreieck ist unregelmaessig. Seiten : a=4, b=4, c=7 Umfang : 15 Flaecheninhalt : 6.777720855862979 Das Dreieck ist gleichschenklig. Seiten : a=5, b=5, c=5 Umfang : 15 Flaecheninhalt : 10.825317547305483 Das Dreieck ist gleichseitig. Seiten : a=4, b=5, c=3 Umfang : 12 Flaecheninhalt : 6.0 Das Dreieck ist unregelmaessig. Seiten : a=4, b=3, c=5 Umfang : 12 Flaecheninhalt : 6.0 Das Dreieck ist unregelmaessig. Seiten : a=3, b=4, c=5 Umfang : 12 Flaecheninhalt : 6.0 Das Dreieck ist unregelmaessig.
-
Erstellen Sie in der Klasse
Triangle
eine Objektmethodepublic boolean sameCircumference(Triangle t)
, die eintrue
zurückgibt, wenn das aufrufende Objekt den gleichen Umfang hat wiet
undfalse
sonst. -
Erstellen Sie in der Klasse
Triangle
eine Objektmethodepublic boolean isSmaller(Triangle t)
, die eintrue
zurückgibt, wenn das aufrufende Objekt einen kleineren Flächeninhalt hat, alst
undfalse
sonst. -
Erstellen Sie in der Klasse
Triangle
eine Objektmethodepublic boolean isBigger(Triangle t)
, die eintrue
zurückgibt, wenn das aufrufende Objekt einen größeren Flächeninhalt hat, alst
undfalse
sonst. -
Testen Sie in der
main()
-Methode derTestklasse
die drei zuletztgeschriebenen Methoden, so dass folgende Ausgaben erzeugt werden:t1 und t2 gleicher Umfang ? : false t1 und t3 gleicher Umfang ? : false t2 und t3 gleicher Umfang ? : true t1 kleiner als t2 ? : true t2 kleiner als t1 ? : false t1 kleiner als t4 ? : false t4 kleiner als t1 ? : false t1 groesser als t2 ? : false t2 groesser als t1 ? : true t1 groesser als t4 ? : false t4 groesser als t1 ? : false
- Wenn Sie das geschafft haben, dann haben Sie die Aufgabe erfüllt! Herzlichen Glückwunsch! Die folgende(n) Aufgabe(n) sind optional :
-
Erstellen Sie in der Klasse
Triangle
eine Objektmethodepublic boolean sidesAreEqual(Triangle t)
, die eintrue
zurückgibt, wenn das aufrufende Objekt die gleichen Seitenlängen hat wiet
undfalse
sonst.- Beachten Sie, dass folgende Dreiecke mit z.B. dem Dreieck (
a=3, b=4, c=5
) gleich sein sollen: (a=3, b=4, c=5
), aber auch (a=4, b=5, c=3
), aber auch (a=5, b=3, c=4
) → die "Benennung" der Seiten ist also egal - Jedoch soll z.B. (
a=4, b=3, c=5
) nicht gleich zu (a=3, b=4, c=5
) sein - für die obigen Objekte soll somit gelten:
Erzeugen Sie diese Ausgabe in
t1 und t2 gleiche Seiten ? : false t1 und t4 gleiche Seiten ? : true t1 und t5 gleiche Seiten ? : false t1 und t6 gleiche Seiten ? : true
main()
.
- Beachten Sie, dass folgende Dreiecke mit z.B. dem Dreieck (
-
Erstellen Sie in der Klasse
Triangle
eine Objektmethodepublic boolean isRightAngled()
, die eintrue
zurückgibt, wenn das Dreieck rechtwinklig ist undfalse
sonst.- der Satz des Pythagoras besagt, dass in einem rechtwinkligen Dreieck gilt:
a^2 + b^2 = c^2
- es gilt aber auch die Umkehrung, d.h. wenn von 2 Seiten die Summe der Quadrate dem Quadrat der dritten Seite entspricht, dann ist das Dreieck rechtwinklig
- der Satz des Pythagoras besagt, dass in einem rechtwinkligen Dreieck gilt:
-
Erweitern Sie die Objektmethode
print()
nun so, dass die Prüfungen, ob sich um ein rechtwinkliges Dreieck handelt, in der folgenden Form ausgegeben werden:Seiten : a=3, b=4, c=5 Umfang : 12 Flaecheninhalt : 6.0 Das Dreieck ist unregelmaessig. Das Dreieck ist rechtwinklig. Seiten : a=4, b=4, c=7 Umfang : 15 Flaecheninhalt : 6.777720855862979 Das Dreieck ist gleichschenklig. Das Dreieck ist nicht rechtwinklig. Seiten : a=5, b=5, c=5 Umfang : 15 Flaecheninhalt : 10.825317547305483 Das Dreieck ist gleichseitig. Das Dreieck ist nicht rechtwinklig. Seiten : a=4, b=5, c=3 Umfang : 12 Flaecheninhalt : 6.0 Das Dreieck ist unregelmaessig. Das Dreieck ist rechtwinklig. Seiten : a=4, b=3, c=5 Umfang : 12 Flaecheninhalt : 6.0 Das Dreieck ist unregelmaessig. Das Dreieck ist rechtwinklig. Seiten : a=3, b=4, c=5 Umfang : 12 Flaecheninhalt : 6.0 Das Dreieck ist unregelmaessig. Das Dreieck ist rechtwinklig.
-
Viel Spaß und viel Erfolg!
Aufgabe 4 - Bruch
-
Wir erstellen uns einen neuen Datentyp
Bruch
-
Erstellen Sie im package
aufgaben.aufgabe4
eine KlasseBruch
ohnemain()
-Methode und eine KlasseBruchTest
mitmain()
-Methode. -
In der Klasse
Bruch
erstellen Sie zwei Objektvariablenzaehler
undnenner
jeweils vom Typint
undprivate
. -
Implementieren Sie für die Klasse
Bruch
zwei verschiedene Konstruktoren- parameterlos →
zaehler
undnenner
erhalten jeweils den Wert1
- mit zwei Parametern (
int zaehler, int nenner
) → entspr. Werte der Objektvariablen
- parameterlos →
-
Implementieren Sie folgende Objektmethoden
public Bruch plus(Bruch b)
→ gibt den gekürzten Bruch aus der Addition eines Bruchs mitb
zurückpublic Bruch minus(Bruch b)
→ gibt den gekürzten Bruch aus der Subtraktion eines Bruchs mitb
zurückpublic Bruch mal(Bruch b)
→ gibt den gekürzten Bruch aus der Multiplikation eines Bruchs mitb
zurückpublic Bruch geteilt(Bruch b)
→ gibt den gekürzten Bruch aus der Division eines Bruchs mitb
zurückpublic Bruch kuerzen()
→ gibt den gekürzten Bruch zurück (Sie brauchen dazu denggT
) _public String toString()
→ gibt einen Bruch alsString
in der Formzaehler / nenner
zurückpublic int ggT(int zahl1, int zahl2)
→ gibt den größten gemeinsamen Teiler (ggT) der beiden Zahlenzahl1
undzahl2
alsint
zurück - siehe Euklidischer Algorithmus
-
Geben Sie in die
main()
-Methode derBruchTest
-Klasse mindestens folgende Anweisungen ein:und führen Sie dieBruch b1 = new Bruch(3,7); Bruch b2 = new Bruch(4,8); Bruch b3 = new Bruch(2,5); Bruch b4 = new Bruch(5,11); Bruch b5 = new Bruch(); System.out.printf("%n%n------------------------- Rechnen -----------------------------------%n%n"); System.out.printf("%5s + %5s = %5s %n", b1.toString(), b2.toString(), b1.plus(b2).toString()); System.out.printf("%5s - %5s = %5s %n", b3.toString(), b4.toString(), b3.minus(b4).toString()); System.out.printf("%5s * %5s = %5s %n", b1.toString(), b3.toString(), b1.mal(b3).toString()); System.out.printf("%5s / %5s = %5s %n", b2.toString(), b1.toString(), b2.geteilt(b1).toString()); System.out.printf("%5s + %5s = %5s %n", b5.toString(), b4.toString(), b5.plus(b4).toString()); System.out.printf("%5s - %5s = %5s %n", b1.toString(), b1.toString(), b1.minus(b1).toString()); // nenner sollte ungleich 0 bleiben!
BruchTest
-Klasse aus. Es sollten folgende Augaben entstehen:
- Wenn Sie das geschafft haben, dann haben Sie die Aufgabe erfüllt! Herzlichen Glückwunsch! Die folgende(n) Aufgabe(n) sind optional :
-
Implementieren Sie folgende Objektmethoden
public boolean istGroesser(Bruch b)
→ gibttrue
zurück, wenn der aufrufende Bruch größer alsb
ist,false
sonstpublic boolean istKleiner(Bruch b)
→ gibttrue
zurück, wenn der aufrufende Bruch kleiner alsb
ist,false
sonstpublic boolean istGleich(Bruch b)
→ gibttrue
zurück, wenn der aufrufende Bruch gleichb
ist,false
sonst
-
Geben Sie in die
main()
-Methode derBruchTest
-Klasse mindestens folgende weitere Anweisungen ein:und führen Sie dieSystem.out.printf("%n%n------------------------- Vergleichen -----------------------------------%n%n"); System.out.printf("%5s > %5s ? %b %n", b1.toString(), b2.toString(), b1.istGroesser(b2)); System.out.printf("%5s < %5s ? %b %n", b1.toString(), b2.toString(), b1.istKleiner(b2)); System.out.printf("%5s == %5s ? %b %n", b1.toString(), b2.toString(), b1.istGleich(b2)); System.out.printf("%5s > %5s ? %b %n", b3.toString(), b4.toString(), b3.istGroesser(b4)); System.out.printf("%5s < %5s ? %b %n", b3.toString(), b4.toString(), b3.istKleiner(b4)); System.out.printf("%5s == %5s ? %b %n", b3.toString(), b4.toString(), b3.istGleich(b4)); System.out.printf("%5s > %5s ? %b %n", b5.toString(), b5.toString(), b5.istGroesser(b5)); System.out.printf("%5s < %5s ? %b %n", b5.toString(), b5.toString(), b5.istKleiner(b5)); System.out.printf("%5s == %5s ? %b %n", b5.toString(), b5.toString(), b5.istGleich(b5));
BruchTest
-Klasse aus. Es sollten folgende weitere Augaben entstehen: -
Viel Spaß und viel Erfolg!
Aufgabe 5 - Doppelt-verkettete Liste
-
Wir erstellen uns einen neuen Datentyp
ListElement
. Dieser Datentyp wird für ein Element aus einer doppelt verketteten Liste verwendet. Eine Liste kann aus vielenListElement
-Elementen bestehen. EinListElement
hat einen Vorgänger (predecessor
) und einen Nachfolger (successor
) in der Liste. Nur das erste Element hat keinen Vorgänger und das letzte Element hat keinen Nachfolger. -
Erstellen Sie im package
aufgaben.aufgabe5
eine KlasseListElement
ohnemain()
-Methode und eine KlasseProgrammklasse
mitmain()
-Methode. -
In der Klasse
ListElement
erstellen Sie fünf nur in der Klasse sichtbare Objektvariablen:value
vom Typchar
hasPredecessor
vom Typboolean
hasSuccessor
vom Typboolean
predecessor
vom TypListElement
undsuccessor
vom TypListElement
-
Implementieren Sie für die Klasse
ListElement
einen Konstruktor, dem ein Zeichen (char
) als Parameter übergeben wird. Dieses Zeichen wird verwendet, um der Objektvariablenvalue
einen Wert zuzuweisen. Setzen Sie außerdem die ObjektvariablenhasPredecessor
undhasSuccessor
jeweils auffalse
. -
Implementieren Sie die Objektmethode
public void insertBefore(ListElement element)
. Durch Aufruf dieser Methode soll das aufrufendeListElement
-Objekt vor dasListElement
-Objektelement
in die Liste eingefügt werden. Dabei sind mehrere Dinge zu beachten:-
Angenommen, wir haben zwei einzelne
ListElement
-Objektel1
undl2
. Dann entsteht durchli.insertBefore(l2)
die Listel1 <--> l2
. Das heißt,l2
wird dersuccessor
vonl1
undl1
wird derpredecessor
vonl2
. Setzen Sie entsprechend auch die Variablenwerte fürhasSuccessor
undhasPredecessor
. -
Angenommen, wir haben ein einzelnes
ListElement
-Objektl1
und eine Liste aus lauterListElement
-Objektenl2 <--> l3 <--> l4 <--> l5
. Dann- ensteht durch
l1.insertBefore(l2)
die Listel1 <--> l2 <--> l3 <--> l4 <--> l5
und alles ist, wie im Fall zuvor, d.h.l1
ist derpredecessor
vonl2
undl2
ist dersuccessor
vonl1
. - entsteht durch
l1.insertBefore(l3)
die Listel2 <--> l1 <--> l3 <--> l4 <--> l5
. Das bedeutet, dassl3
dersuccessor
vonl1
wird undl1
derpredecessor
vonl3
. Der altepredecessor
vonl3
(l2
) wird der neuepredecessor
vonl1
undl1
wird der neuesuccessor
vonl2
.
- ensteht durch
-
Angenommen, wir haben eine Liste aus lauter
ListElement
-Objektenl1 <--> l2 <--> l3
und ein einzelnesListElement
-Objektl4
. Dann- ensteht sowohl durch
l1.insertBefore(l4)
als auch durchl2.insertBefore(l4)
als auch durchl3.insertBefore(l4)
die Listel1 <--> l2 <--> l3 <--> l4
.
- ensteht sowohl durch
-
Angenommen, wir haben eine Liste aus lauter
ListElement
-Objektenl1 <--> l2 <--> l3
und eine Liste aus lauterListElement
-Objektenl4 <--> l5 <--> l6 <--> l7
. Dann- ensteht durch
l1.insertBefore(l4)
die Listel1 <--> l2 <--> l3 <--> l4 <--> l5 <--> l6 <--> l7
. Das heißt, es wird die gesamte Liste, die mitl1
beginnt, vorl4
eingefügt (und damit vor die Listel4 <--> l5 <--> l6 <--> l7
). - entsteht durch
l1.insertBefore(l6)
die Listel4 <--> l5 <--> l1 <--> l2 <--> l3 <--> l6 <--> l7
. - übrigens: wenn Sie für die gebebenen Lsten z.B.
l2.insertBefore(l5)
aufrufen, dann fälltl1
weg, d.h. die entstehende Liste istl4 <--> l2 <--> l5 <--> l6 <--> l7
. Sie können sich überlegen, ob das überhaupt ein richtiges Verhalten ist oder ob es ein besseres gibt.
- ensteht durch
-
-
Tipp: Beginnen Sie mit der Implementierung des ersten (und einfachsten) Falls. Fügen Sie dann die weiteren Fälle schrittweise hinzu. Sie werden feststellen, dass Sie gar nicht viele Fallunterscheidungen machen müssen. Ich bin z.B. mit einem
if
und einerwhile
-Schleife ausgekommen und die gesamte Methode hat nur ca. 10 Zeilen. -
Implementieren Sie die Objektmethode
public void print()
. Diese Methode soll denvalue
des aufrufendenListElement
-Objektes auf die Konsole ausgeben (ohne Zeilenumbruch) und dann dieprint()
-Methode dessuccessor
-Elementes aufrufen. Nur wenn das aufrufendeListElement
keinensuccessor
hat (Ende der Liste), wird der Wert des Objektes mit Zeilenumbruch ausgegeben und keine weitereprint()
-Methode aufgerufen. -
Geben Sie in die
main()
-Methode derProgrammklasse
mindestens folgende Anweisungen ein:und führen Sie dieListElement l1 = new ListElement('W'); ListElement l2 = new ListElement('e'); ListElement l3 = new ListElement('i'); ListElement l4 = new ListElement('h'); ListElement l5 = new ListElement('n'); ListElement l6 = new ListElement('a'); ListElement l7 = new ListElement('c'); ListElement l8 = new ListElement('h'); ListElement l9 = new ListElement('t'); ListElement l10 = new ListElement('e'); ListElement l11 = new ListElement('n'); System.out.printf("? : %15s", "W == ");l1.print(); l1.insertBefore(l2); // W-e System.out.printf("? : %15s", "We == ");l1.print(); l5.insertBefore(l6); // n-a l5.insertBefore(l7); // na-c l7.insertBefore(l8); // nac-h l6.insertBefore(l9); // nach-t System.out.printf("? : %15s", "nacht == ");l5.print(); l1.insertBefore(l5); // We-nacht System.out.printf("? : %15s", "Wenacht == ");l1.print(); l10.insertBefore(l11); // e-n l9.insertBefore(l10); // Wenacht-en System.out.printf("? : %15s", "Wenachten == ");l1.print(); System.out.printf("? : %15s", "nachten == ");l5.print(); l3.insertBefore(l5); // We-i-nachten System.out.printf("? : %15s", "inachten == ");l3.print(); System.out.printf("? : %15s", "Weinachten == ");l1.print(); l4.insertBefore(l5); // Wei-h-nachten System.out.printf("? : %15s", "Weihnachten == ");l1.print();
Programmklasse
aus. Es sollten folgende Augaben entstehen:
-
Wenn Sie das geschafft haben, dann haben Sie die Aufgabe erfüllt! Herzlichen Glückwunsch! Die folgende Aufgabe ist optional :
- Fügen Sie der Klasse
ListElement
die Objektvariableprivate int index
hinzu und sorgen Sie dafür, dass in einer verketteten Liste dieListElement
-Objekte den jeweils passenden Index entsprechend ihrer Position in der Liste haben (beginnend bei0
). Also in der Listel1 <--> l2 <--> l3 <--> l4 <--> l5
hatl1
den Index0
,l2
den Index1
,l3
den Index2
usw. Wenn Sie dafür selbständig eine Lösung entwickelt haben, dann schicken Sie mir bitte eine E-Mail mit der Lösung.
- Fügen Sie der Klasse
- Viel Spaß und viel Erfolg!
Aufgabe 6 - Arrays ausgeben
-
Wir geben Arrays in verschiedenen Arten auf der Konsole aus.
-
Implementieren Sie eine Methode
public static int[] createAndFillArray(int length, int fromInclusive, int toInclusive)
. Diese Methode soll genau so sein, wie diecreateAndFillArray(int length, int bound)
-Methode in Methoden mit Array als Rückgabe mit dem einzigen Unterschied, dass wir nicht denbound
angeben (der sorgt ja dafür, dass wir Zufallswerte aus dem Bereich[0, 1, ... , bound-1]
erzeugen), sondernfromInclusive
undtoExclusive
, so dass wir Zufallswerte aus dem Wertebereich[fromInclusive, ... , toInclusive]
erzeugen. Siehe dazu auchnextInt(bound)
. -
Implementieren Sie eine Methode
public static void printArray(int[] a)
so, dass sie einint
-Array in der Form[ 27, 30, 25, 26, 23, 20, 30, 30, 22, 21, 29, 29, 21, 20 ]
(also Werte durch Komma getrennt in eckigen Klammern) ausgibt. Siehe dazu Ausgabe von Arrays. -
Rufen Sie in der
main()
die beiden Methoden wie folgt auf: -
Implementieren Sie eine Methode
public static void printTable(int[] a)
. Diese gibt das Arraya
als Tabelle in folgender Form aus: -
Rufen Sie in der
main()
die MethodeprintTable()
wie folgt auf: -
Implementieren Sie eine Methode
public static void printHorizontal(int[] a)
. Diese gibt das Arraya
in folgender Form aus:Das heißt, für jeden Wert im Array wird die entsprechende Anzahl von Sternen ausgegeben. Ganz links steht jeweils der Index, unter dem der Wert im Array gespeichert wird.| 0 | *************************** | 1 | ****************************** | 2 | ************************* | 3 | ************************** | 4 | *********************** | 5 | ******************** | 6 | ****************************** | 7 | ****************************** | 8 | ********************** | 9 | ********************* | 10 | ***************************** | 11 | ***************************** | 12 | ********************* | 13 | ******************** |
-
Rufen Sie in der
main()
die MethodeprintTable()
wie folgt auf:
- Wenn Sie das geschafft haben, dann haben Sie die Aufgabe erfüllt! Herzlichen Glückwunsch! Die folgende(n) Aufgabe(n) sind optional :
-
Implementieren Sie eine Methode
public static void printUpsideDown(int[] a)
oder eine Methodepublic static void printVertical(int[] a)
(beide gleicher Aufwand). Diese geben das Arraya
in folgender Form aus:----------- printUpsideDown ------------ | 0 1 2 3 4 5 6 7 8 9 10 11 12 13 ----+---------------------------------------------------------------------- 1 | * * * * * * * * * * * * * * 2 | * * * * * * * * * * * * * * 3 | * * * * * * * * * * * * * * 4 | * * * * * * * * * * * * * * 5 | * * * * * * * * * * * * * * 6 | * * * * * * * * * * * * * * 7 | * * * * * * * * * * * * * * 8 | * * * * * * * * * * * * * * 9 | * * * * * * * * * * * * * * 10 | * * * * * * * * * * * * * * 11 | * * * * * * * * * * * * * * 12 | * * * * * * * * * * * * * * 13 | * * * * * * * * * * * * * * 14 | * * * * * * * * * * * * * * 15 | * * * * * * * * * * * * * * 16 | * * * * * * * * * * * * * * 17 | * * * * * * * * * * * * * * 18 | * * * * * * * * * * * * * * 19 | * * * * * * * * * * * * * * 20 | * * * * * * * * * * * * * * 21 | * * * * * * * * * * * * 22 | * * * * * * * * * * 23 | * * * * * * * * * 24 | * * * * * * * * 25 | * * * * * * * * 26 | * * * * * * * 27 | * * * * * * 28 | * * * * * 29 | * * * * * 30 | * * * ----------- printVertical -------------- 30 | * * * 29 | * * * * * 28 | * * * * * 27 | * * * * * * 26 | * * * * * * * 25 | * * * * * * * * 24 | * * * * * * * * 23 | * * * * * * * * * 22 | * * * * * * * * * * 21 | * * * * * * * * * * * * 20 | * * * * * * * * * * * * * * 19 | * * * * * * * * * * * * * * 18 | * * * * * * * * * * * * * * 17 | * * * * * * * * * * * * * * 16 | * * * * * * * * * * * * * * 15 | * * * * * * * * * * * * * * 14 | * * * * * * * * * * * * * * 13 | * * * * * * * * * * * * * * 12 | * * * * * * * * * * * * * * 11 | * * * * * * * * * * * * * * 10 | * * * * * * * * * * * * * * 9 | * * * * * * * * * * * * * * 8 | * * * * * * * * * * * * * * 7 | * * * * * * * * * * * * * * 6 | * * * * * * * * * * * * * * 5 | * * * * * * * * * * * * * * 4 | * * * * * * * * * * * * * * 3 | * * * * * * * * * * * * * * 2 | * * * * * * * * * * * * * * 1 | * * * * * * * * * * * * * * ----+---------------------------------------------------------------------- | 0 1 2 3 4 5 6 7 8 9 10 11 12 13
-
Rufen Sie in der
main()
die beiden Methoden (oder die, die Sie implememntiert haben) wie folgt auf: -
Tipps zum Lösen der Zusatzaufgabe:
- Sie müssen zunächst ermitteln, welcher der größte Wert innerhalb des Arrays ist, denn dieser gibt Ihnen die Anzahl der Zeilen im Diagramm vor.
- Stellen Sie sich das Problem als eine Matrix aus Zeilen und Spalten vor. Die Spalten lassen sich auf den Index des Arrays mappen und die Zeilen auf die Werte im Array.
-
Viel Spaß und viel Erfolg!
Aufgabe 7 - Arrays befüllen
-
Wir befüllen ein
char
-Array, aber das ist leider gar nicht so einfach ;-) -
einleitende Vorbetrachtung: angenommen, wir haben die folgende Schleife:
-
Durch diese wird uns das gesamte Alphabet in Kleinbuchstaben ausgegeben:
-
Kopieren Sie die Schleife einfach in Ihre
main()
-Methode und führen Sie sie aus, dann erhalten Sie obige Ausgabe. Dahinter steckt, dass wir derint
-VariablenasciiValue
den ASCII-Code der Kleinbuchstaben zuweisen (beginnend bei97
- das ist eina
). Siehe z.B. hier. Der letzte kleine Buchstabez
hat den ASCII-Wert122
, deshalb läuft die Schleife auch bis<123
. In Zeile3
der Schleife findet eine Typkonvertierung statt. Aus demint
wird einchar
. Dies geschieht durch den Typkonvertierungsoperator(char)
. In Zeile4
wird das Zeichenc
vom Typchar
ausgegeben. -
Aufgabe Die Aufgabe ist es nun, ein
char
-Array zu befüllen. Es gelten folgende Bedingungen:- das Array hat (nur) die Länge
25
- in dem Array darf es keine Doppelungen geben (also kein Zeichen darf doppelt enthalten sein)
- die Zeichen werden zufällig erzeugt, d.h. mithilfe der Klasse
Random
und der MethodenextInt(bound)
, die Werte zwischen97
und einschließlich122
erzeugen soll
- das Array hat (nur) die Länge
-
Schreiben Sie dafür eine Methode
public static char[] createAndFillCharArray()
- in dieser Methode erzeugen Sie das
char[]
der Länge25
, - ein
Random
-Objekt, mit dem Sie unter Verwendung dernextInt(bound)
-Methode zufällig Zahlen zwischen97
und einschließlich122
erzeugen, - die erzeugten
int
-Werte konvertieren Sie mithilfe des(char)
-Typecast-Operators nachchar
, - dann befüllen Sie das
char[]
→ passen Sie aber auf, dass Sie kein Zeichen hinzufügen, das bereits im Array enthalten ist → dazu benötigen Sie diecontains()
-Methode:
- in dieser Methode erzeugen Sie das
-
Schreiben Sie eine Methode
public static boolean contains(char[] ca, char c)
. Diese gibt eintrue
zurück, wennc
inca
enthalten ist und einfalse
, wenn nicht. -
Schreiben Sie eine Methode
public static char[] sort(char[] a)
. Diese gibt einchar[]
zurück, welches sortiert ist. Das übergebene Arraya
ist unsortiert. Siehe dazu Sortieren von Arrays. -
Schreiben Sie eine Methode
public static void print(char[] a)
, die ein übergebeneschar[]
in der Formausgibt. Kennen wir aus Übung 8, aber gute Übung, es nochmal zu machen.
-
Geben Sie in Ihre
main()
-Methode folgende Anweisungen ein:System.out.printf("%n%n----------------- Erzeugen ------------------%n%n"); char[] ca1 = createAndFillCharArray(); print(ca1); System.out.printf("%n%n----------------- Sortieren ------------------%n%n"); char[] ca2 = sort(ca1); print(ca2);
Es sollten Ausgaben in der Form:
----------------- Erzeugen ------------------ [ o, g, f, p, a, c, s, i, e, q, h, l, t, r, w, z, v, x, y, u, b, j, k, m, n ] ----------------- Sortieren ------------------ [ a, b, c, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z ]
erscheinen. Beachten Sie, dass die Einträge im Array zufällig erzeugt wurden. Beachten Sie außerdem, dass ein Buchstabe aus dem Alphabet fehlt, hier z.B.
d
(das Array hat die Länge25
, das Alphabet hat26
Buchstaben).
- Wenn Sie das geschafft haben, dann haben Sie die Aufgabe erfüllt! Herzlichen Glückwunsch! Die folgende(n) Aufgabe(n) sind optional :
-
Schreiben Sie eine Methode
public static char getMissingLetter(char[] a)
. Dieser Methode wird ein durch die obige MethodecreateAndFillCharArray()
erstellteschar
-Array übergeben. Das Array hat also die Länge25
hat und aus dem Alphabet fehlt genau ein kleiner Buchstabe. Finden Sie den Buchstaben und geben ihn zurück. -
Schreiben Sie eine Methode
public static void findWord(String word)
. Dieser Methode wird eine Zeichenkette übergeben, die nur aus Buchstaben besteht. Sie können annehmen, dass es nur kleine Buchstaben sind, Sie können aber erstmal dietoLowerCase()
-Methode anwenden (siehe String). Rufen Sie für jedes Zeichen aus dem String die beiden MethodencreateAndFillCharArray()
undgetMissingLetter()
auf, bis das von dergetMissingLetter()
-Methode zurückgegebene Zeichen dem Zeichen des Strings entspricht, das Sie gerade betrachten. Eine Ausgabe als Beispiel:P..........p (11) r.r (2) o..o (3) g............g (13) r..............................r (31) a........a (9) m..m (3) m...........................................................m (60) i....i (5) e.....e (6) rr (1) e......e (7) n............n (13)
Die Ausgabe erfolgte durch den Aufruf von
findWord("Programmieren");
. Ganz links in der Zeile steht immer das Zeichen des Strings, das gerade betrachtet wird. Dann kommen für jeden fehlgeschlagenen Versuch, durchgetMissingLetter()
das'p' zurück zu bekommen, die Ausgabe eines Punktes. Sollte
getMissingLetter()das
'p'` zurückgeben, wird es ausgegeben und außerdem noch in Klammern die Anzahl der Versuche. Der Cursor wechselt in die nächste Zeile und das nächste Zeichen des Strings ist dran. -
Viel Spaß und viel Erfolg!
Aufgabe 8 - SortedArray
-
Wir erstellen uns einen neuen Datentyp
SortedArray
-
Idee: Ein Objekt dieser Klasse beschreibt (enthält) ein
int
-Array, in dem- die Elemente aufsteigend sortiert sind und
- kein Element doppelt vorkommt.
Das Array ist stets genau so groß, so viele Elemente es enthält!
-
Erstellen Sie im package
aufgaben.aufgabe7
eine KlasseSortedArray
ohnemain()
-Methode und eine KlasseSortedArrayTest
mitmain()
-Methode. -
In der Klasse
SortedArray
erstellen Sie eine Objektvariables
vom Typint[]
(private
). -
Implementieren Sie für die Klasse
SortedArray
zwei verschiedene Konstruktoren- parameterlos → der Konstruktor erzeugt ein leeres Array
s
(mit der Länge0
) - mit einem Parameter (
int element
) → der Konstruktor erzeugt ein einelementiges Arrays
(mit der Länge1
), wobeis[0]
den Wert vonelement
annimmt.
- parameterlos → der Konstruktor erzeugt ein leeres Array
-
Implementieren Sie eine Objektmethode
public boolean insert(int element)
. Diese Methode gibt einfalse
zurück, wennelement
bereits ins
enthalten ist. Dann wird daselement
nicht dem Array hinzugefügt. Die Methode gibttrue
zurück, wennelement
ins
eingefügt wurde. Umelement
einzufügen, wird ein neues Array fürs
erzeugt, in dem alle vorherigen Werte auss
und das neueelement
(an der richtigen Stelle einsortiert) enthalten sind. -
Implementieren Sie eine Objektmethode
public boolean delete(int element)
. Diese Methode gibt einfalse
zurück, wennelement
nicht ins
enthalten ist. Die Methode gibttrue
zurück, wennelement
auss
gelöscht wurde. Beachten Sie, dass nach Löschen auss
die Länge vons
um eins kleiner ist, als vor dem Löschen. Es muss also auch hier wieder ein neues Array erzeugt werden, welches nach dem Löschen dem "Wert" vons
entspricht. -
Implementieren Sie eine Objektmethode
public void print()
, die das Arrays
in der Form[ 4, 5, 9 ]
(Beispielwerte) ausgibt. -
Tipp:
- Um zu überprüfen, ob ein
int element
ins
enthalten ist, sollten Sie sich eine Methodeboolean contains(int element)
schreiben (diese kannprivate
sein, wenn sie nur innerhalb der Klasse verwendet werden soll; sogenannte Servicemethode). - Angenommen, Sie haben zwei Arrays:
s = [ 4, 9 ]
undcopy = [ 4, 5, 9]
, dann gilt nachs = copy;
, dasss == [ 4, 5, 9 ]
.
- Um zu überprüfen, ob ein
-
Geben Sie in die
main()
-Methode derSortedArrayTest
-Klasse mindestens folgende Anweisungen ein:und führen Sie dieSystem.out.printf("%n%n------------------------- Test a1 -----------------------------------%n%n"); SortedArray a1 = new SortedArray(); a1.print(); a1.delete(5); a1.print(); a1.insert(5); a1.print(); a1.insert(7); a1.print(); a1.delete(5); a1.print(); a1.insert(6); a1.print(); a1.insert(4); a1.print(); a1.insert(8); a1.print(); a1.delete(8); a1.print(); a1.delete(6); a1.print(); System.out.printf("%n%n------------------------- Test a2 -----------------------------------%n%n"); SortedArray a2 = new SortedArray(9); a2.print(); a2.insert(5); a2.print(); a2.insert(9); a2.print(); a2.insert(5); a2.print(); a2.insert(4); a2.print(); a2.insert(4); a2.print(); a2.delete(5); a2.print(); a2.delete(9); a2.print(); a2.delete(4); a2.print(); a2.delete(4); a2.print();
SortedArrayTest
-Klasse aus. Es sollten folgende Augaben entstehen:------------------------- Test a1 ----------------------------------- [ ] [ ] [ 5 ] [ 5, 7 ] [ 7 ] [ 6, 7 ] [ 4, 6, 7 ] [ 4, 6, 7, 8 ] [ 4, 6, 7 ] [ 4, 7 ] ------------------------- Test a2 ----------------------------------- [ 9 ] [ 5, 9 ] [ 5, 9 ] [ 5, 9 ] [ 4, 5, 9 ] [ 4, 5, 9 ] [ 4, 9 ] [ 4 ] [ ] [ ]
- Viel Spaß und viel Erfolg!