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.
BlueJ vs. Eclipse¶
Die ersten Wochen verwenden wir als Entwicklungsumgebung BlueJ. Für die Aufgaben, die wir mit BlueJ lösen, werde ich Ihnen jeweils Hinweise zur Abgabe für jede Aufgabe einzeln geben.
Sobald wir Eclipse verwenden, 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.WS21
(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.WS21
) →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:package aufgaben.aufgabe1; /** * * @author Jörn Freiheit * * Diese Klasse gibt auf die Konsole ein Rhombus (eine Raute) aus. * Der Rhombus ist entweder gefuellt oder ungefuellt. * */ public class Aufgabe1 { // hier Ihre Implementierung }
- 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!
Code Review¶
Für jede abgegebene Aufgabe wird Ihnen die Lösung einer Kommilitonin zum Review zugewiesen. Analysieren Sie den Code Ihrer Kommilitonin und geben Sie ihr dazu eine Rückmeldung! Es genügen 2 bis 3 Review-Kommentare. Zur offiziellen Abgabe einer Aufgabe gehören also
- das Hochladen der eigenen Lösung,
- das Analysieren/Kommentieren einer fremden Lösung.
Hinweise zum Review:¶
- Es geht nicht darum, das Programm zu überarbeiten, sondern darum es nachzuvollziehen und Ihrer Kommilitonin eine Rückmeldung und eventuell Anregungen zu geben.
- Weisen Sie sowohl auf Stärken als auch auf Schwächen des Quelltexts hin.
- Worauf Sie u.a. achten können:
- Ist der Quelltext gut strukturiert und verständlich?
- Haben Variablen und Methoden passende Namen? Werden die Namen konsistent verwendet?
- Werden Konventionen eingehalten? Beispiel: Klassennamen starten immer mit Großbuchstaben, Objektnamen immer mit Kleinbuchstaben
- Ist das Programm übersichtlich formatiert? Beispiel: kein horizontales Scrolling nötig
- Machen Sie ggf. Vorschläge für (alternative) Lösungen.
- Gehen Sie respektvoll miteinander um, es gibt keinen Grund, unhöflich zu sein.
- Lesen Sie Ihre Kommentare noch einmal durch, bevor Sie sie an Ihre Kommilitonin weitergeben.
Aufgaben¶
Aufgabe 1 (Abgabe bis 25.10.2021 24:00 Uhr)¶
Aufgabe1 - Square mit Circles
- Verwenden Sie BlueJ und öffnen Sie das Projekt
picture
aus demexamples
-Ordner von BlueJ. Speichern Sie das Projekt als Projektaufgabe1
ab. Die KlassePicture
können Sie wie folgt anpassen:/** * Aufgabe 1 * */ public class Picture { /** * Constructor for objects of class Picture */ public Picture() {// nothing to do... instance variables are automatically set to null } /** * Draw this picture. */ public void draw() { Square s1 = new Square(); Circle c1 = new Circle(); Circle c2 = new Circle(); Circle c3 = new Circle(); Circle c4 = new Circle(); // hier die Implementierung } }
-
Programmieren Sie die
draw()
-Methode so, dass folgendes Bild gezeichnet wird:Die Größen bleiben Ihnen überlassen, aber die vier Kreise sollen das gelbe Quadrat vollständig ausfüllen. Den Titel des Fensters müssen Sie nicht ändern (geht aber in der Klasse
Canvas
). -
Erstellen Sie sich eine Testklasse
PictureTest
, in der es eine TestmethodetestDraw()
gibt, die diedraw()
-Methode für einPicture
-Objekt ausführt. - Zippen Sie Ihr Projekt
aufgabe1
und laden es in Moodle hoch.
Aufgabe 2 (Abgabe bis 01.11.2021 24:00 Uhr)¶
Aufgabe2 - Methoden und Ausgaben
- Erstellen Sie sich ein neues Projekt
aufgabe2
und darin eine neue KlasseAufgabe2
, die wie folgt aussieht:public class Aufgabe2 { public Aufgabe2() { } public void start() { // rufen Sie hier Ihre Methoden auf: } }
- Implementieren Sie eine Methode
computeSum(double number1, double number2)
, die die Summe der beiden Zahlennumber1
undnumber2
alsdouble
zurückgibt. - Implementieren Sie eine Methode
printSum(double number1, double number2
, die die Summe der beiden Zahlennumber1
undnumber2
in der folgenden Form ausgibt. Die Ausgabe sieht für die Beispielwertenumber1 = 4.0
undnumber2 = 5.0
so aus:Rufen Sie in der4.0 + 5.0 = 9.0
printSum(double number1, double number2
-Methode die MethodecomputeSum(double number1, double number2)
auf! - Implementieren Sie ähnliche Methoden auch für die Subtraktion, Multiplikation und Division von zwei
double
-Zahlen. Verwenden Sie jeweils diecomputeXXX()
-Methoden in denprintXXX()
-Methoden. - Erstellen Sie eine Methode
printComputations(double number1, double number2)
, in der alle vierprintXXX()
-Methoden aufgerufen werden, so dass durch den Aufruf derprintComputations(double number1, double number2)
-Methode folgende Ausgabe erscheint (Beispielwerte4.0
und5.0
):4.0 + 5.0 = 9.0 4.0 - 5.0 = -1.0 4.0 * 5.0 = 20.0 4.0 / 5.0 = 0.8
- Zippen Sie Ihr Projekt
aufgabe2
und laden es in Moodle hoch.
Aufgabe 3 (Abgabe bis 08.11.2021 24:00 Uhr)¶
Aufgabe3 - Rechteck
- Erstellen Sie sich ein neues Projekt
aufgabe3
und darin eine neue KlasseAufgabe3
, die wie folgt aussieht:public class Aufgabe3 { public Aufgabe3() { } public void start() { // rufen Sie hier Ihre Methoden auf: } }
- Implementieren Sie eine Methode
public void printRectangle(int width, int height, boolean filled){}
- Ist der Parameterwert von
filled
true
, dann soll ein Rechteck wie folgt auf die Konsole ausgegeben werden (Beispielausgabe fürwidth=11
undheight=5
):*********** *********** *********** *********** ***********
- Ist der Parameterwert von
filled
false
, dann soll das Rechteck ungefüllt sein, also so:*********** * * * * * * ***********
- Die obere Ausgabe ist also durch die Anweisung
printRectangle(11, 5, true);
und die untere durch die AnweisungprintRectangle(11, 5, false);
entstanden. - Tipp:: Schreiben Sie sich zwei weitere Methoden
public void printRectangleFilled(int width, int height){}
undpublic void printRectangleUnfilled(int width, int height){}
, die Sie entsprechend des Wertes vonfilled
aufrufen. In der einen Methode erstellen Sie das ausgefüllte Rechteck und in der anderen das 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. Werte für
width
undheight
je100
) positive Zahlen (also> 0
) funktionieren. Insbesondere sind die Tests fürwidth=1
undheight=1
bzw.height=2
interessant. - Zippen Sie Ihr Projekt
aufgabe3
und laden es in Moodle hoch. Viel Spaß und viel Erfolg!
Aufgabe 4 (Abgabe bis 15.11.2021 24:00 Uhr)¶
Aufgabe4 - Rhombus
- Erstellen Sie sich ein neues Projekt
aufgabe4
und darin eine neue KlasseAufgabe4
, die wie folgt aussieht:public class Aufgabe4 { public Aufgabe4() { } public void start() { // rufen Sie hier Ihre Methoden auf: } }
- Implementieren Sie eine Methode
public 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 `int height = 2 * upperHalf +1;
- 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)
- Tipp:: Schreiben Sie sich zwei weitere Methoden
public void printRhombusFilled(int upperHalf){}
undpublic 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
100
) positive Zahlen (also> 0
) vonupperHalf
funktionieren. Insbesondere sind die Tests fürupperhalf == 1
interssant. - Zippen Sie Ihr Projekt
aufgabe4
und laden es in Moodle hoch. Viel Spaß und viel Erfolg!
Aufgabe 5 (Abgabe bis 22.11.2021 24:00 Uhr)¶
Aufgabe5 - Knobeleien
- Diese Aufgabe ist hauptsächlich dazu da, um das algorithmische Denken zu schulen. Sie werden im Netz jeweils viele Lösungen finden, aber Sie sollten versuchen, alleine auf eine Lösung zu kommen. Versuchen Sie es! Ich gebe zu jeder Aufgabe kleine Tipps.
- Erstellen Sie sich ein neues Projekt
aufgabe5
und darin eine neue KlasseAufgabe5
, die wie folgt aussieht:public class Aufgabe5 { public Aufgabe5() { } public void start() { // rufen Sie hier Ihre Methoden auf: } }
- Implementieren Sie eine Methode
public int computeChecksum(int number){}
. Diese Methode berechnet die Quersumme der Zahlnumber
und gibt diese zurück. Hier ein paar Beispiele:Tipp: "Laufen" Sie am besten von hinten nach vorne durch die Zahlnumber: 123456 -> checksum: 21 number: -123456 -> checksum: -21 number: 0 -> checksum: 0 number: 2147483647 -> checksum: 46 number: -2147483648 -> checksum: -47
number
und lösen immer die letzte Ziffer von der Zahl, um diese dann zur Quersumme zu addieren. Welchen Operator kennen Sie, um als Ergebnis die letzte Ziffer einer Dezimalzahl zu erhalten? Wie lange müssen Sie "laufen"? -
Implementieren Sie eine Methode
public void printCombinations36(){}
. Diese Methode gibt alle Kombinationen für 3 ganze Zahlenx
,y
undz
auf der Konsole aus, für die Folgendes gilt:Tipp: Überlegen Sie sich zuerst, wie man z.B. alle Kombinationen ermitteln kann, wennx <= y <= z und x * y * z = 36
x
,y
undz
jeweils Werte zwischen-50
und50
(das ist aber nicht der endgültige Wertebereich!!! - Sie können gerne auch anders anfangen) annehmen können (das sind dann100^3
, also1000000
Kombinationen). Überlegen Sie dann, wie Sie diese Wertebereiche mithilfe der beiden Bedingungen einschränken können. Es gibt übrigens 28 Kombinationen, für die die beiden obigen Bedingungen gelten.
Wenn Sie diese beiden Aufgaben erledigt haben, dann haben Sie genug geknobelt. Herzlichen Glückwunsch - Aufgabe erfüllt! Nur für diejenigen unter Ihnen, die vom Knobeln nicht genug bekommen können, gibt es die folgende Zusatzaufgabe. Ist aber wirklich keine Pflicht, sondern soll nur Vergnügen sein :-)
-
Zusatzaufgabe: Implementieren Sie eine Methode
public void printPrimeFactors(int number){}
, die für die übergebene Zahlnumber
die Primzahlfaktorzerlegung auf die Konsole ausgibt, also z.B. so:Tipp:: Nützliche Methoden sind sicherlich480 --> 2 2 2 2 2 3 5 17 --> 17 12345 --> 3 5 823
boolean isPrime(int number)
undboolean isDivider(int factor, int number)
, wobei Letztere prüft, obfactor
ein ganzzahliger Teiler vonnumber
ist. Achten Sie darauf, dass wenn Sie einen Primfaktor gefunden haben, es auch derselbe Primfaktor wiederholt sein kann. Ist knifflig!
Aufgabe 6 (Abgabe bis 29.11.2021 24:00 Uhr)¶
Aufgabe6 - Triangle
-
Wir erstellen uns einen neuen Datentyp
Triangle
-
Erstellen Sie sich ein neues Projekt
aufgabe6
und darin eine neue KlasseTriangle
sowie dafür eine TestklasseTestTriangle
mit einertestTriangle()
-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
print()
, die die Seitenlängen des Dreiecks in der folgenden Form ausgibt:für den Fall, dass die SeitenlängenSeiten : a=3, b=4, c=5
3
,4
und5
sind. -
Wenn Sie jetzt in der
testTriangle()
-Methode der TestklasseTestTriangle
folgende Anweisungen ausführendann sollte die Ausgabe ungefähr so aussehen:Triangle t1 = new Triangle(3, 4, 5); Triangle t2 = new Triangle(4, 4, 7); Triangle t3 = new Triangle(5, 5, 5); Triangle t4 = new Triangle(4, 5, 3); Triangle t5 = new Triangle(4, 3, 5); Triangle t6 = new Triangle(3, 4, 5); t1.print(); t2.print(); t3.print(); t4.print(); t5.print(); t6.print();
Seiten : a=3, b=4, c=5 Seiten : a=4, b=4, c=7 Seiten : a=5, b=5, c=5 Seiten : a=4, b=5, c=3 Seiten : a=4, b=3, c=5 Seiten : a=3, b=4, c=5
-
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))- 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
testTriangle()
-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.
Wenn Sie das geschafft haben, dann haben Sie die Aufgabe erfüllt! Herzlichen Glückwunsch! Die folgenden Aufgaben sind optional (kann auch sein, dass wir die Objektvergleiche noch gar nicht haben, dann wird es erst recht knifflig :-) ):
-
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
testTriangle()
-Methode der TestklasseTestTriangle
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
-
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
testTriangle()
.
- 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 7 (Abgabe bis 6.12.2021 24:00 Uhr)¶
Aufgabe7 - Time
-
Wir erstellen uns einen neuen Datentyp
Time
-
Erstellen Sie sich ein neues Projekt
aufgabe7
und darin eine neue KlasseTime
sowie dafür eine TestklasseTimeTest
mit einertestTime()
-Methode. -
In der Klasse
Time
erstellen Sie zwei Objektvariablenhours
undminutes
, jeweils vom Typint
und beideprivate
. -
Erstellen Sie einen parameterlosen Konstruktor, der die Objektvariablen mit jeweils
0
initialisiert. -
Implementieren Sie eine Methode
public void changeTime(int diffMinutes)
. Dieser Methode wird als Parameterwert eine Anzahl von Minuten übergeben, um die sich die aktuelle Zeit ändern soll. Beachten Sie:- die Objektvariable
minutes
soll nur Werte von0
bis59
annehmen dürfen,- die Objektvariable
hours
soll nur Werte von0
bis23
annehmen dürfen, diffMinutes
kann auch negativ sein.
- die Objektvariable
- die Objektvariable
-
Implementieren Sie eine Methode
public String timeToString()
. Diese Methode gibt die aktuelle Zeit in der Formhh:mm
als String zurück. Beachten Sie:- Sowohl die Stunden als auch die Minuten haben eventuelle führende Nullen, d.h. Beispiele für den Rückgabestring können auch
01:00
sein oder09:09
.
- Sowohl die Stunden als auch die Minuten haben eventuelle führende Nullen, d.h. Beispiele für den Rückgabestring können auch
-
Implementieren Sie eine Methode
public void printTime()
. Diese Methode gibt die aktuelle Uhrzeit unter Verwendung der MethodetimeToString()
auf die Konsole aus. -
Wenn Sie die Testmethode
testTime()
z.B. wie folgt implementieren:dann sollte folgende Ausgabe auf der Konsole erscheinen:@Test public void testTime() { Time t1 = new Time(); t1.printTime(); t1.changeTime(30); t1.printTime(); t1.changeTime(30); t1.printTime(); t1.changeTime(60); t1.printTime(); t1.changeTime(600); t1.printTime(); t1.changeTime(660); t1.printTime(); t1.changeTime(60); t1.printTime(); t1.changeTime(-60); t1.printTime(); }
00:00 00:30 01:00 02:00 12:00 23:00 00:00 23:00
-
Insbesondere für die
changeTime()
-Methode sollten Sie erst ausführlich überlegen, ehe Sie losprogrammieren. Nicht vergessen, dass Zettel und Stift die wichtigsten Werkzeuge der Programmiererin sind! -
Viel Spaß und viel Erfolg!
Aufgabe 8 (Abgabe bis 13.12.2021 24:00 Uhr)¶
Aufgabe8 - Counter und Clock
-
Wir erstellen uns zwei neue Datentypen
Counter
undClock
-
Erstellen Sie sich ein neues Projekt
aufgabe8
und darin eine neue KlasseCounter
sowie eine Programm-/TestklasseProgramclass
mit einerstart()
-Methode. -
Die Idee der Klasse
Counter
soll sein, einencounter
bis zu einem bestimmtenlimit
hochzuzählen. Bevor dercounter
daslimit
erreicht, wird er wieder auf0
gesetzt. Angenommen also daslimit
ist60
und dercounter
hat den aktuellen Wert59
und soll erhöht werden, dann ist der nächste Wert voncounter
wieder0
, da daslimit
erreicht wurde. -
In der Klasse
Counter
erstellen Sie zwei Objektvariablencounter
undlimit
, jeweils vom Typint
(beide nur in der Klasse sichtbar). -
Erstellen Sie einen parametrisierten Konstruktor
public Counter(int limit)
, der dencounter
auf0
initialisiert und daslimit
auf den Parameterwert. -
Implementieren Sie eine Methode
public boolean increase()
. Diese Methode soll den Wert voncounter
um1
erhöhen. Es muss jedoch geprüft werden, ob eventuell daslimit
erreicht wurde. Sollte dies der Fall sein, wird der Wert voncounter
wieder auf0
gesetzt. Wird dercounter
tatsächlich um1
erhöht, gibt die Methode eintrue
zurück, wurde der Wert voncounter
jedoch auf0
gesetzt, gibt die Methodefalse
zurück. Beispiel:- Angenommen
counter
hat den Wert58
und daslimit
ist60
. Dann ist der neue Wert voncounter
59
und die Methode gibttrue
zurück.- Angenommen
counter
hat den Wert59
und daslimit
ist60
. Dann ist der neue Wert voncounter
0
und die Methode gibtfalse
zurück.
- Angenommen
- Angenommen
-
Implementieren Sie eine Methode
public String toString()
. Diese Methode gibt den Wert voncounter
als zweistelligen String zurück. Beachten Sie- Ist der Wert von
counter
einstellig, z.B.5
, dann soll der String"05"
zurückgegeben werden.
- Ist der Wert von
-
Implementieren Sie eine Methode
public void print()
. Diese Methode gibt den aktuellen Wert voncounter
unter Verwendung der MethodetoString()
auf die Konsole aus. -
Wenn Sie die Methode
start()
in derProgramclass
z.B. wie folgt implementieren:dann sollte folgende Ausgabe auf der Konsole erscheinen:public void start() { Counter counter = new Counter(60); for(int i=0; i<120; i++) { counter.increase(); System.out.printf("%3d : ", i); counter.print(); } }
Ausgabe auf der Konsole
0 : 01 1 : 02 2 : 03 3 : 04 4 : 05 5 : 06 6 : 07 7 : 08 8 : 09 9 : 10 10 : 11 11 : 12 12 : 13 13 : 14 14 : 15 15 : 16 16 : 17 17 : 18 18 : 19 19 : 20 20 : 21 21 : 22 22 : 23 23 : 24 24 : 25 25 : 26 26 : 27 27 : 28 28 : 29 29 : 30 30 : 31 31 : 32 32 : 33 33 : 34 34 : 35 35 : 36 36 : 37 37 : 38 38 : 39 39 : 40 40 : 41 41 : 42 42 : 43 43 : 44 44 : 45 45 : 46 46 : 47 47 : 48 48 : 49 49 : 50 50 : 51 51 : 52 52 : 53 53 : 54 54 : 55 55 : 56 56 : 57 57 : 58 58 : 59 59 : 00 60 : 01 61 : 02 62 : 03 63 : 04 64 : 05 65 : 06 66 : 07 67 : 08 68 : 09 69 : 10 70 : 11 71 : 12 72 : 13 73 : 14 74 : 15 75 : 16 76 : 17 77 : 18 78 : 19 79 : 20 80 : 21 81 : 22 82 : 23 83 : 24 84 : 25 85 : 26 86 : 27 87 : 28 88 : 29 89 : 30 90 : 31 91 : 32 92 : 33 93 : 34 94 : 35 95 : 36 96 : 37 97 : 38 98 : 39 99 : 40 100 : 41 101 : 42 102 : 43 103 : 44 104 : 45 105 : 46 106 : 47 107 : 48 108 : 49 109 : 50 110 : 51 111 : 52 112 : 53 113 : 54 114 : 55 115 : 56 116 : 57 117 : 58 118 : 59 119 : 00
-
Erstellen Sie sich im Projekt
aufgabe8
eine weitere KlasseClock
. -
In der Klasse
Clock
verwenden Sie zweiCounter
. Der eineCounter
zählt dieminutes
und hat daslimit
60
und der andereCounter
zählt diehours
udn hat daslimit
24
. -
In der Klasse
Clock
erstellen Sie zwei Objektvariablenminutes
undhours
, jeweils vom TypCounter
(beide nur in der Klasse sichtbar). -
Erstellen Sie einen parameterlosen Konstruktor
public Clock()
. Darin erzeugen Sie fürminutes
dasCounter
-Objekt mit demlimit
60
und fürhours
dasCounter
-Objekt mit demlimit
24
. -
Implementieren Sie eine Methode
public void increase()
. Diese Methode soll den Wert vonminutes
um1
erhöhen. Sollte jedoch daslimit
vonminutes
erreicht sein, wird auchhours
um1
erhöht. Nutzen Sie dieincrease()
-Methode vonCounter
! -
Implementieren Sie eine Methode
public String toString()
. Diese Methode gibt die Werte vonminutes
undhours
in der Formhh:mm
als String zurück, also z.B."23:59"
oder"01:09"
. Nutzen Sie dietoString()
-Methode vonCounter
! -
Implementieren Sie eine Methode
public void print()
. Diese Methode gibt den aktuellen Wert vonClock
unter Verwendung der MethodetoString()
auf die Konsole aus. -
Wenn Sie die Methode
start()
in derProgramclass
z.B. wie folgt erweitern (der Test vonCounter
ist hier gelöscht):dann sollte folgende Ausgabe auf der Konsole erscheinen:public void start() { Clock clock = new Clock(); for(int i=0; i<1600; i++) { clock.increase(); if(i%50==0) { System.out.printf("%4d : ", i); clock.print(); } } }
Ausgabe auf der Konsole
0 : 00:01 50 : 00:51 100 : 01:41 150 : 02:31 200 : 03:21 250 : 04:11 300 : 05:01 350 : 05:51 400 : 06:41 450 : 07:31 500 : 08:21 550 : 09:11 600 : 10:01 650 : 10:51 700 : 11:41 750 : 12:31 800 : 13:21 850 : 14:11 900 : 15:01 950 : 15:51 1000 : 16:41 1050 : 17:31 1100 : 18:21 1150 : 19:11 1200 : 20:01 1250 : 20:51 1300 : 21:41 1350 : 22:31 1400 : 23:21 1450 : 00:11 1500 : 01:01 1550 : 01:51
-
Viel Spaß und viel Erfolg!
Aufgabe 9 (Abgabe bis 03.01.2022 24:00 Uhr)¶
Aufgabe9 - Bruch
-
Wir erstellen uns einen Datentyp
Bruch
(extra mal etwas Mathematisches ;-)) -
Erstellen Sie sich ein neues Projekt
aufgabe9
und darin eine neue KlasseBruch
sowie eine Programm-/TestklasseProgramclass
mit einermain()
-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ück (annotieren Sie diese Methode als überschrieben!)public 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 derProgramclass
-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!
main()
-Methode aus. Es sollten folgende Augaben entstehen:------------------------- Rechnen ----------------------------------- 3/7 + 4/8 = 13/14 2/5 - 5/11 = -3/55 3/7 * 2/5 = 6/35 4/8 / 3/7 = 7/6 1/1 + 5/11 = 16/11 3/7 - 3/7 = 0/1
-
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 derProgramclass
-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));
main()
-Methode aus. Es sollten folgende weitere Ausgaben entstehen:------------------------- Vergleichen ----------------------------------- 3/7 > 4/8 ? false 3/7 < 4/8 ? true 3/7 == 4/8 ? false 2/5 > 5/11 ? false 2/5 < 5/11 ? true 2/5 == 5/11 ? false 1/1 > 1/1 ? false 1/1 < 1/1 ? false 1/1 == 1/1 ? true
-
Zusatzaufgabe: Überschreiben Sie für
Bruch
die Methodenpublic boolean equals(Object o)
undpublic int hashCode()
. -
Viel Spaß und viel Erfolg!
Aufgabe 10 (Abgabe bis 10.01.2022 24:00 Uhr)¶
Aufgabe 10 - Arrays ausgeben
-
Lösen Sie die Aufgabe mit Eclipse oder einer IDE Ihrer Wahl. Wir geben Arrays in verschiedenen Arten auf der Konsole aus.
-
Erstellen Sie sich ein package
aufgaben.aufgabe10
und in diesem package zwei KlassenProgrammklasse
(mitmain()
-Methode) undAufgabe10
. -
Implementieren Sie in der Klasse
Aufgabe10
eine Methodepublic 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 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:Random r = new Random(); // java.util.Random importieren Aufgab10 a10 = new Aufgabe10(); int length = r.nextInt(10)+10; int[] arr1 = a10.createAndFillArray(length, 20, 30); System.out.printf("%n%n%n----------- printArray -----------------%n%n%n"); a10.printArray(arr1);
-
Implementieren Sie eine Methode
public void printTable(int[] a)
. Diese gibt das Arraya
als Tabelle in folgender Form aus:| Index : | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | |------------|------|------|------|------|------|------|------|------|------|------|------|------|------|------| | Wert : | 27 | 30 | 25 | 26 | 23 | 20 | 30 | 30 | 22 | 21 | 29 | 29 | 21 | 20 |
-
Rufen Sie in der
main()
die MethodeprintTable()
wie folgt auf:System.out.printf("%n%n%n----------- printTable -----------------%n%n%n"); a10.printTable(arr1);
-
Implementieren Sie eine Methode
public 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:System.out.printf("%n%n%n----------- printHorizontal ------------%n%n%n"); a10.printHorizontal(arr1);
- 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 void printUpsideDown(int[] a)
oder eine Methodepublic 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:System.out.printf("%n%n%n----------- printUpsideDown ------------%n%n%n"); a10.printUpsideDown(arr1); System.out.printf("%n%n%n----------- printVertical --------------%n%n%n"); a10.printVertical(arr1);
-
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 11 (Abgabe bis 17.01.2022 24:00 Uhr)¶
Aufgabe 11 - Arrays befüllen
-
Lösen Sie die Aufgabe mit Eclipse oder einer IDE Ihrer Wahl. Wir befüllen ein
char
-Array, aber das ist leider gar nicht so einfach ;-) -
Erstellen Sie sich ein package
aufgaben.aufgabe11
und in diesem package zwei KlassenProgrammklasse
(mitmain()
-Methode) undAufgabe11
. -
einleitende Vorbetrachtung: angenommen, wir haben die folgende Schleife:
1 2 3 4 5
for(int asciiValue = 97; asciiValue<123; asciiValue++) { char c = (char) asciiValue; System.out.print(c + " "); }
-
Durch diese wird uns das gesamte Alphabet in Kleinbuchstaben ausgegeben:
a b c d e f g h i j k l m n o p q r s t u v w x y z
-
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 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 boolean contains(char[] ca, char c)
. Diese gibt eintrue
zurück, wennc
inca
enthalten ist und einfalse
, wenn nicht. -
Schreiben Sie eine Methode
public 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 void print(char[] a)
, die ein übergebeneschar[]
in der Form[ 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 ]
ausgibt.
-
Geben Sie in Ihre
main()
-Methode folgende Anweisungen ein:Aufgabe11 a11 = new Aufgabe11(); System.out.printf("%n%n----------------- Erzeugen ------------------%n%n"); char[] ca1 = a11.createAndFillCharArray(); a11.print(ca1); System.out.printf("%n%n----------------- Sortieren ------------------%n%n"); char[] ca2 = a11.sort(ca1); a11.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 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 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:w..........w (11) e.e (2) i..i (3) h............h (13) n..............................n (31) a........a (9) c..c (3) h...........................................................h (60) t....t (5) e.....e (6) nn (1)
Die Ausgabe erfolgte durch den Aufruf von
findWord("weihnachten");
. Ganz links in der Zeile steht immer das Zeichen des Strings, das gerade betrachtet wird. Dann kommen für jeden fehlgeschlagenen Versuch, durchgetMissingLetter()
das'w' zurück zu bekommen, die Ausgabe eines Punktes. Sollte
getMissingLetter()das
'w'` 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 12 (Abgabe bis 24.01.2022 24:00 Uhr)¶
Aufgabe 12 - 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.aufgabe12
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!