Übungen¶
Übungsblätter (wochenweise)¶
Übung 0
- Installieren Sie sich - falls noch nicht geschehen - eine Java-Entwicklungsumgebung (siehe Java).
- Installieren Sie sich die IDE Ihrer Wahl (siehe IDE). In den Vorlesungen und Übungen verwende ich Eclipse und beschreibe die Schritte auch für Eclipse.
- Starten Sie Eclipse durch Doppelklick auf das Programmsymbol.
- Erstellen Sie einen Workspace (Arbeitsbereich) in einem gewünschten Ordner (z. B.
Prog1
) im Dateisystem. Achten Sie darauf, dass Sie Schreibrechte in diesem Ordner besitzen. - Anlegen eines Projektordners:
- Auswahl im Menü
File-->New-->Java Project
. - Eingabe des
Project name:
Name des Projektes (z.B.WiSe24
). Klicken auf den ButtonFinish
. - Das Fenster
New module-info.java
können Sie einfach mitCreate
bestätigen.
- Auswahl im Menü
- Erstellen eines neuen Packages (Paketes):
- Öffnen der Projektmappe im
Package Explorer
. - Auswahl des Ordners
src
mit der rechten Maustaste. - Auswahl des Menüpunktes
New --> Package
. - Geben Sie folgenden Paketnamen ein (Paketnamen werden kleingeschrieben)
uebungen.uebung0
(Achten Sie auf den Punkt und dass Sie alles zusammen schreiben).
- Öffnen der Projektmappe im
- Erstellen einer neuen Klasse:
- Öffnen der Projektmappe im Package Explorer.
- Auswahl des Paketes (
uebungen.uebung0
) mit der rechten Maustaste. - Auswahl des Menüpunktes
New --> Class
. - Eingabe des Namens, der gleichzeitig der Klassen- und Dateiname ist:
Uebung0
. Klassennamen werden immer groß geschrieben. - Setzen des Häkchens bei
public static void main()
. (Sollten Sie vergessen haben, das Häkchen zu setzen, dann ist die Klasse, nachdem SieFinish
gedrückt haben, leer. Setzen Sie dann den Cursor zwischen die beiden geschweiften Klammern{ }
, geben dannmain
ein und drücken die Ctrl+Leer-Tasten und anschließend Enter. Dann erscheint diemain()
-Methode) - Klicken auf den Button
Finish
.
- In die
main()
-Methode (zwischen die geschweiften Klammern{
und}
geben Sie ein:System.out.println("Uebung 0"));
. - Drücken Sie dann entweder auf den
-Button oder wählen Sie aus dem Menü
Run --> Run
oder drücken Sie shift+command+f11. In derConsole
in Ihrer IDE (in Eclipse unten) erscheintUebung 0
.
Success
Fertig! Ihre Entwicklungsumgebung ist bereit! Wir können loslegen.
Übung 1
- Erstellen Sie ein package
uebungen.uebung1
. - Erstellen Sie in diesem package eine Klasse
Uebung1
mitmain()
-Methode. - Deklarieren und initialisieren Sie in der
main()
-Methode jeweils eine Variable mit dem Datentypint
,long
,char
,byte
,short
,float
,double
,boolean
undString
. Geben Sie alle Werte einzeln durch Aufruf derprintln()
-Methode aus. Erzeugen Sie dabei folgende Ausgabe (Werte nur Beispiele): - Setzen Sie den Wert Ihrer
int
-Variablen auf2147483647
. Geben Sie den Wert auf der Konsole aus, z.B.:
Versuchen Sie nun den Wert auf2147483648
zu setzen. Was passiert? Warum? - Wiederholen Sie das gleiche mit einer
long
-Variablen. - Weisen Sie Ihrer
char
-Variablen den Wert65
zu. Geben Sie den Wert Ihrerchar
-Variablen aus. Was passiert? Warum? -
Gegeben ist die folgende Klasse:
public class PrinterClass { public static void main(String[] args) { System.out.print("answer="); System.out.println(42); } }
Was wird auf der Konsole ausgegeben?
b) c)
a)
Eine mögliche Lösung für Übung 1
package uebungen.uebung1;
public class Uebung1
{
public static void main(String[] args)
{
int in = 123;
long lo = 456789;
char ch = 'a';
byte by = 127;
short sh = 32767;
float fl = 4.23f; // f notwendig
double d1 = 6.98;
boolean b1 = true;
String s1 = "Hallo!";
System.out.println(" --- Aufgabe 3 -------");
System.out.println();
System.out.print("Wert vom Typ int : ");
System.out.println(in);
System.out.print("Wert vom Typ long : ");
System.out.println(lo);
System.out.print("Wert vom Typ char : ");
System.out.println(ch);
System.out.print("Wert vom Typ byte : ");
System.out.println(by);
System.out.print("Wert vom Typ short : ");
System.out.println(sh);
System.out.print("Wert vom Typ float : ");
System.out.println(fl);
System.out.print("Wert vom Typ double : ");
System.out.println(d1);
System.out.print("Wert vom Typ boolean : ");
System.out.println(b1);
System.out.print("Wert vom Typ String : ");
System.out.println(s1);
System.out.println();
System.out.println(" --- Aufgabe 4 -------");
System.out.println();
in = 2147483647;
System.out.println("Wert vom Typ int : " + in );
//in = 2147483648; // Compilerfehler out of range
System.out.println();
System.out.println(" --- Aufgabe 5 -------");
System.out.println();
lo = 2147483647;
System.out.println("Wert vom Typ long : " + lo );
lo = 2147483648L; // L notwendig, da 2147483648 kein int
System.out.println("Wert vom Typ long : " + lo );
System.out.println();
System.out.println(" --- Aufgabe 6 -------");
System.out.println();
ch = 65;
System.out.println(ch); // A
// 7 a)
}
}
Übung 2
- Erstellen Sie ein package
uebungen.uebung2
. - Erstellen Sie in diesem package eine Klasse
Uebung2
mitmain()
-Methode. -
Deklarieren Sie in
main()
2int
-Variablen und geben Sie Ihnen Werte (die folgenden Werte17
und4
sind nur Beispiele). Erzeugen Sie nun unter Verwendung dieser Variablen folgende Ausgabe (bei anderen Werten natürlich entsprechend anders):
-
Erzeugen Sie nun stattdessen folgende Ausgabe:
-
Beachten Sie, dass Sie den Wert für den Quotienten und für den Rest für
3.
und4.
nur einmal ermitteln sollen. -
Deklarieren Sie sich eine
boolean
-Variable. Der Wert der Variablen solltrue
sein, wenn das Produkt der beidenint
-Variablen aus3.
gerade ist undfalse
, wenn es ungerade ist. -
Probieren Sie die Dvision
100/3
in den folgenden Datentypen:int
,float
,double
. Was stellen Sie fest? -
Prüfen Sie, ob die letzte Ziffer von 2
int
-Variablen gleich ist (danntrue
, sonstfalse
). -
Zusatz: Gegeben sei eine Anzahl von Stunden. Geben Sie aus, wieviel ganze Tage in dieser Anzahl enthalten sind, z.B.
Wieviele Stunden bleiben übrig?
Eine mögliche Lösung für Übung 2
package uebungen.uebung2;
public class Uebung2
{
public static void main(String[] args)
{
System.out.println();
System.out.println("-------------------- 3. -------------------------");
System.out.println();
int i1 = 77;
int i2 = 5;
int quotient = i1/i2;
int rest = i1%i2;
System.out.print(i1 + " geteilt durch " + i2 + " ergibt " + quotient + ". ");
System.out.println("Es bleibt ein Rest von " + rest + ".");
System.out.println();
System.out.println("-------------------- 4. -------------------------");
System.out.println();
System.out.println(i1 + "/" + i2 + " = " + quotient);
System.out.println(i1 + " mod " + i2 + " = " + rest);
System.out.println();
System.out.println("-------------------- 6. -------------------------");
System.out.println();
int product = i1 * i2;
boolean productIsEven = product % 2 == 0;
boolean productIsOdd = !productIsEven; // product % 2 == 1
System.out.println(product + " ist gerade ? " + productIsEven);
System.out.println(product + " ist ungerade ? " + productIsOdd);
System.out.println();
System.out.println("-------------------- 7. -------------------------");
System.out.println();
System.out.println("int : " + 100/3); // int
System.out.println("float : " + 100.0f/3.0f); // float
System.out.println("float : " + 100f/3f); // float
System.out.println("double : " + 100.0/3.0); // double
System.out.println("double : " + 100.0/3); // double
System.out.println("double : " + 100/3.0); // double
System.out.println();
System.out.println("-------------------- 8. -------------------------");
System.out.println();
int lastDigitOfi1 = i1 % 10;
int lastDigitOfi2 = i2 % 10;
boolean lastDigitsAreEqual = (lastDigitOfi1 == lastDigitOfi2);
System.out.println();
System.out.println("-------------------- 9. -------------------------");
System.out.println();
int hours = 34567;
int oneDay = 24;
int days = hours/oneDay;
System.out.println("In " + hours + " Stunden sind " + days + " ganze Tage enthalten.");
System.out.println("Zieht man von den " + hours + " Stunden die " + days + " Tage ab, "
+ "bleiben " + hours%oneDay + " Stunden übrig.");
}
}
Übung 2a (1.11.2024)
- Verwenden Sie erneut die Klasse
Uebung2
aus dem Paketuebungen.uebung2
(oder Sie erstellen sich ein Paketuebungen.uebung2.a
und darin eine KlasseUebung2a
). -
Schreiben Sie eine Methode
Diese Methode soll folgende Ausgabe auf die Konsole erzeugen, z.B. fürprintIntDivision(7, 4);
die Ausgabe z.B. fürprintIntDivision(17, 4);
die Ausgabe Falls kein Rest bleibt, soll die Ausgabe sein: Rufen Sie die Methode entsprechend in dermain()
-Methode auf!
Zusatz: Prüfen Sie, ob der Wert vonnr2
ungleich0
ist. Nur dann ist die Division definiert. Sollte er0
sein, geben SieDivision durch 0 ist nicht definiert!
auf die Konsole aus. -
Schreiben Sie zwei Methoden
Rufen Sie diese Methoden in derpublic static int getQuotient(int nr1, int nr2) {} // und public static int getRemainder(int nr1, int nr2) {}
main()
-Methode auf generieren mit den Aufrufen und unter Verwendung derprintln()
-Methode folgende Ausgaben: -
Besitzen die folgende Methodenaufrufe einem Wert? Wenn ja, welcher?
printIntDivision(17, 4);
getQuotient(17,4);
getRemainder(17,4);
-
Können wir die Methoden
getQuotient(int nr1, int nr2)
undgetRemainder(int nr1, int nr2)
auch in derprintIntDivision(int nr1, int nr2)
-Methode verwenden/aufrufen? Wenn ja, wie? - Schreiben Sie eine Methode
lastDigitsAreEqual(int nr1, int nr2)
, die eintrue
zurückgibt, wennnr1
undnr2
dieselbe letzte Ziffer haben undfalse
sonst.
Zusatz: Schreiben Sie eine Methodelast2DigitsAreEqual(int nr1, int nr2)
, die eintrue
zurückgibt, wennnr1
undnr2
dieselben letzten 2 Ziffern haben. - Schreiben Sie eine Methode
getDays(int hours)
, die für eine gegebene Stundenanzahlhours
zurückgibt, wieviele ganze Tage diese Studnden entsprechen. Schreiben Sie eine MethodegetRemainingHours(int hours)
, die für eine gegebene Stundenanzahlhours
zurückgibt, wieviele Stunden noch verbleiben, wenn man die ganzen Tage darin abzieht. Erstellen Sie inmain()
mit diesen Methoden und derprintln()
-Methode folgende Ausgaben auf der Konsole (Beispielwerte): Wieviele Stunden bleiben übrig? Zusatz: Ändern Siemain()
so, dass für den Fall, dass die Gesamtanzahl der Stunden keinen ganzen Tag enthält, folgende Ausgabe erscheint: Es soll dann auch keine Ausgabe bezüglich der übrig bleibenden Stunden erscheinen.
Eine mögliche Lösung für Übung 2a
package uebungen.uebung2.a;
public class Uebung2a
{
public static void printIntDivision(int nr1, int nr2)
{
if(nr2 == 0)
{
System.out.println("Division durch 0 nicht definiert!");
}
else // nr2 != 0
{
// int quotient = nr1 / nr2;
int quotient = getQuotient(nr1, nr2);
// int rest = nr1 % nr2;
int rest = getRemainder(nr1, nr2);
System.out.print(nr1 + " geteilt durch " + nr2 + " ergibt " + quotient + ".");
if(rest != 0 )
{
System.out.println(" Es bleibt ein Rest von " + rest + ".");
}
else // rest == 0
{
System.out.println(" Es bleibt kein Rest.");
}
} // else nr2 != 0
}
public static int getQuotient(int nr1, int nr2)
{
return nr1 / nr2;
}
public static int getRemainder(int nr1, int nr2)
{
return nr1 % nr2;
}
public static boolean lastDigitsAreEqual(int nr1, int nr2)
{
int lastDigitOfNr1 = nr1 % 10;
int lastDigitOfNr2 = nr2 % 10;
return (lastDigitOfNr1 == lastDigitOfNr2);
}
public static int getDays(int hours)
{
int oneDay = 24;
return hours / oneDay;
}
public static int getRemainingHours(int hours)
{
int oneDay = 24;
return hours % oneDay;
}
public static void printHours2Days(int hours)
{
int days = getDays(hours);
int remainingHours = getRemainingHours(hours);
if(days > 0)
{
System.out.println("In " + hours + " Stunden sind " + days
+ " ganze Tage enthalten.");
System.out.println("Zieht man von den " + hours + " Stunden die "
+ days + " Tage ab, bleiben " + remainingHours + " Stunden übrig.");
}
else // days == 0
{
System.out.println("In " + hours + " Stunden ist kein ganzer Tag enthalten.");
}
}
public static void main(String[] args)
{
System.out.println();
System.out.println("--------------- 2. ----------------");
System.out.println();
printIntDivision(17, 4);
printIntDivision(16, 4);
printIntDivision(16, 0);
System.out.println();
System.out.println("--------------- 3. ----------------");
System.out.println();
int nr1 = 17;
int nr2 = 4;
System.out.println(nr1 + "/" + nr2 + " = " + getQuotient(nr1, nr2));
System.out.println(nr1 + " mod " + nr2 + " = " + getRemainder(nr1, nr2));
nr1 = 15;
nr2 = 5;
System.out.println(nr1 + "/" + nr2 + " = " + getQuotient(nr1, nr2));
System.out.println(nr1 + " mod " + nr2 + " = " + getRemainder(nr1, nr2));
System.out.println();
System.out.println("--------------- 6. ----------------");
System.out.println();
System.out.println(nr1 + ", " + nr2 + " ? " + lastDigitsAreEqual(nr1, nr2));
nr1 = 123;
nr2 = 3;
System.out.println(nr1 + ", " + nr2 + " ? " + lastDigitsAreEqual(nr1, nr2));
System.out.println();
System.out.println("--------------- 7. ----------------");
System.out.println();
int hours = 34567;
// hours = 22;
int days = getDays(hours);
int remainingHours = getRemainingHours(hours);
if(days > 0)
{
System.out.println("In " + hours + " Stunden sind " + days
+ " ganze Tage enthalten.");
System.out.println("Zieht man von den " + hours + " Stunden die "
+ days + " Tage ab, bleiben " + remainingHours + " Stunden übrig.");
}
else // days == 0
{
System.out.println("In " + hours + " Stunden ist kein ganzer Tag enthalten.");
}
printHours2Days(34567);
printHours2Days(22);
}
}
Übung 3
- Erstellen Sie ein package
uebungen.uebung3
. - Erstellen Sie in diesem package eine Klasse
Uebung3
mitmain()
-Methode. -
Schreiben Sie eine Methode
public static void printTimesTables(int nr1, int nr2)
. Bei Aufruf der Methode z.B. fürprintTimesTables(10,10);
soll das kleine Ein-Mal-Eins in der folgenden Form ausgegeben werden:Ausgabe für printTimesTables(10,10);
1 * 1 = 1 1 * 2 = 2 1 * 3 = 3 1 * 4 = 4 1 * 5 = 5 1 * 6 = 6 1 * 7 = 7 1 * 8 = 8 1 * 9 = 9 1 * 10 = 10 2 * 1 = 2 2 * 2 = 4 2 * 3 = 6 2 * 4 = 8 2 * 5 = 10 2 * 6 = 12 2 * 7 = 14 2 * 8 = 16 2 * 9 = 18 2 * 10 = 20 3 * 1 = 3 3 * 2 = 6 3 * 3 = 9 3 * 4 = 12 3 * 5 = 15 3 * 6 = 18 3 * 7 = 21 3 * 8 = 24 3 * 9 = 27 3 * 10 = 30 4 * 1 = 4 4 * 2 = 8 4 * 3 = 12 4 * 4 = 16 4 * 5 = 20 4 * 6 = 24 4 * 7 = 28 4 * 8 = 32 4 * 9 = 36 4 * 10 = 40 5 * 1 = 5 5 * 2 = 10 5 * 3 = 15 5 * 4 = 20 5 * 5 = 25 5 * 6 = 30 5 * 7 = 35 5 * 8 = 40 5 * 9 = 45 5 * 10 = 50 6 * 1 = 6 6 * 2 = 12 6 * 3 = 18 6 * 4 = 24 6 * 5 = 30 6 * 6 = 36 6 * 7 = 42 6 * 8 = 48 6 * 9 = 54 6 * 10 = 60 7 * 1 = 7 7 * 2 = 14 7 * 3 = 21 7 * 4 = 28 7 * 5 = 35 7 * 6 = 42 7 * 7 = 49 7 * 8 = 56 7 * 9 = 63 7 * 10 = 70 8 * 1 = 8 8 * 2 = 16 8 * 3 = 24 8 * 4 = 32 8 * 5 = 40 8 * 6 = 48 8 * 7 = 56 8 * 8 = 64 8 * 9 = 72 8 * 10 = 80 9 * 1 = 9 9 * 2 = 18 9 * 3 = 27 9 * 4 = 36 9 * 5 = 45 9 * 6 = 54 9 * 7 = 63 9 * 8 = 72 9 * 9 = 81 9 * 10 = 90 10 * 1 = 10 10 * 2 = 20 10 * 3 = 30 10 * 4 = 40 10 * 5 = 50 10 * 6 = 60 10 * 7 = 70 10 * 8 = 80 10 * 9 = 90 10 * 10 = 100
-
Schreiben Sie eine Methode
public static void printTimesMatrix(int nr1, int nr2)
. Bei Aufruf der Methode z.B. für printTimesMatrix(10,10) soll das kleine Ein-Mal-Eins in der folgenden Form ausgegeben werden:Ausgabe für printTimesMatrix(10,10);
-
Schreiben Sie eine Methode
public static void printTriangleUp(int height)
. Bei Aufruf der Methode z.B. fürprintTriangleUp(7)
soll folgende Ausgabe erscheinen: -
Geben Sie alle möglichen Kombinationen für 3 ganze Zahlen
x
,y
undz
aus, für die gilt:
Genügt bis hierher. Ab hier Zusatz nur für diejenigen, die bereits früher fertig sind.
-
Zusatz Schreiben Sie eine Umrechnung für eine gegebene Anzahl von Sekunden (
Aber z.B.printSeconds(int seconds)
), z.B.printSeconds(3456789)
:printSeconds(2345678)
: Aber z.B.printSeconds(123456)
: Aber z.B.printSeconds(12345)
:
Eine mögliche Lösung für Übung 3
package uebungen.uebung3;
public class Uebung3
{
public static void printTimesTables(int nr1, int nr2)
{
for(int factor1 = 1; factor1 <= nr1; factor1++)
{
//System.out.println();
//System.out.println("factor1 : " + factor1);
//System.out.println("--> vor innerer Schleife");
for(int factor2 = 1; factor2 <= nr2; factor2++)
{
//System.out.println(" factor2 : " + factor2);
int product = factor1 * factor2;
System.out.println(factor1 + " * " + factor2 + " = " + product);
}
//System.out.println("--> nach innerer Schleife");
System.out.println();
}
}
public static void printTimesMatrix(int nr1, int nr2)
{
for(int factor1 = 1; factor1 <= nr1; factor1++)
{
for(int factor2 = 1; factor2 <= nr2; factor2++)
{
System.out.print(factor1 * factor2 + " ");
}
System.out.println();
}
System.out.println();
}
public static void printTriangleUp(int height)
{
for(int row = 0; row < height; row++)
{
System.out.print(" Zeile " + row + " : ");
for(int stars = 1; stars <= height-row; stars++)
{
System.out.print("* ");
}
System.out.println();
}
System.out.println();
}
public static void main(String[] args)
{
System.out.println();
System.out.println("----------------- 3. --------------------");
System.out.println();
printTimesTables(10,10);
printTimesTables(3,7);
System.out.println();
System.out.println("----------------- 4. --------------------");
System.out.println();
printTimesMatrix(10,10);
printTimesMatrix(3,7);
System.out.println();
System.out.println("----------------- 5. --------------------");
System.out.println();
printTriangleUp(9);
printTriangleUp(4);
System.out.println();
System.out.println("----------------- 6. --------------------");
System.out.println();
for(int x = -36; x <= 36; x++)
{
for(int y = x; y <= 36; y++)
{
for(int z = y; z <= 36; z++)
{
int product = x * y * z;
//if(product == 36 && x <= y && y <= z)
if(product == 36)
{
System.out.println(x + " * " + y + " * " + z + " = " + product );
}
}
}
}
}
}
Übung 4
- Erstellen Sie ein package
uebungen.uebung4
. - Erstellen Sie in diesem package eine Klasse
Uebung4
mitmain()
-Methode. - Implementieren Sie folgende Methoden:
public static boolean isPrime(int number)
– diese Methode prüft, ob die als Parameter übergebenenumber
eine Primzahl ist. Die Methode gibt eintrue
zurück, wennnumber
eine Primzahl ist undfalse
sonst.public static void printPrimeNumbers(int maximum)
– diese Methode gibt alle Primzahlen von 1 bis einschließlichmaximum
wie folgt auf der Konsole aus (Bsp. fürmaximum=61
):d.h. es werden die Zahlen, die Primzahlen sind, ausgegeben und für die anderen Zahlen erscheint nur ein Punkt. Verwenden Sie in der MethodeZahl : 61 .2 3 .5 .7 ...11 .13 ...17 .19 ...23 .....29 .31 .....37 ...41 .43 ...47 .....53 .....59 .61
printPrimenumbers(int)
die MethodeisPrime(int)
.public static int getSmallestDivider(int number)
– diese Methode gibt den kleinsten Teiler zurück, dernumber
ganzzahlig teilt. Istnumber
eine Primzahl, wirdnumber
zurückgegeben. Für den Fall, dassnumber
kleiner als2
ist, geben Sie ebenfallsnumber
zurück.public static String createStringOfPrimeFactorization(int number)
– diese Methode gibt einen String in folgender Form zurück (Bsp. fürnumber=632060
): d.h. alle kleinsten Teiler werden mit dem Multiplikationszeichen verbunden und am Ende erscheint= Wert von number
.- Testen Sie alle Methoden. Rufen Sie insbesondere
printPrimenumbers(int)
undcreateStringOfPrimeFactorization(int)
in dermain()
-Methode auf. - Zusatz Schreiben Sie eine Methode, die für eine natürliche Zahl deren Quersumme ausgibt, z.B.:
crossSum(12345678)
Eine mögliche Lösung für Übung 4
package uebungen.uebung4;
public class Uebung4
{
public static void main(String[] args)
{
System.out.println();
System.out.println("------------------ isPrime ------------------");
System.out.println();
System.out.println(isPrime(17));
System.out.println(isPrime(121));
System.out.println();
System.out.println("--------------- printPrimeNumbers ----------------");
System.out.println();
printPrimeNumbers(1000);
System.out.println();
System.out.println("--------------- createStringOfPrimeFactorization ----------------");
System.out.println();
System.out.println(createStringOfPrimeFactorization(632030));
}
public static void printPrimeNumbers(int maximum)
{
for(int i = 1; i <= maximum; i++)
{
if(isPrime(i))
{
System.out.print(i + " ");
}
else
{
System.out.print(".");
}
if(i % 50 == 0) // alle 50 Zahlen ein Zeilenumbruch
{
System.out.println();
}
}
System.out.println();
}
public static boolean isPrime(int number)
{
if(number < 2)
{
return false; // Methode wird sofort verlassen (keine Primzahl)
}
else
{
for(int divider = 2; divider < number; divider++)
{
if(number % divider == 0)
{
return false; // Methode wird sofort verlassen (keine Primzahl)
}
}
return true; // number ist Primzahl (kein divider war Teiler)
}
}
public static int getSmallestDivider(int number)
{
if(number < 2 || isPrime(number))
{
return number;
}
else
{
for(int divider = 2; divider < number; divider++)
{
if(number % divider == 0)
{
return divider; // ist immer eine Primzahl
// denn falls divider = a * b
// haetten wir schon a oder b zurueckgegeben
}
}
return number; // wird gar nicht erreicht, weiss aber der Compiler nicht
}
}
public static String createStringOfPrimeFactorization(int number)
{
/*
* 2 * 2 * 5 * 11 * 13 * 13 * 17 = 632060
* 632060 --> 2 (632060 / 2 --> 316030)
* 316030 --> 2 (316030 / 2 --> 158015)
* 158015 --> 5 (158015 / 5 --> 31603)
* 31603 --> 11 (31603 / 11 --> 2873)
* ...
* 17 --> 17 ( 17 / 17 --> 1 schluss)
*
*/
int smallestDivider = getSmallestDivider(number);
int quotient = number / smallestDivider;
String s = "" + smallestDivider;
// falls number ist Primzahl, wird Schleife gar nicht betreten
while(quotient > 1)
{
smallestDivider = getSmallestDivider(quotient);
quotient = quotient / smallestDivider;
s = s + " * " + smallestDivider;
}
s = s + " = " + number;
return s;
}
}
Übung 5
- Erstellen Sie ein package
uebungen.uebung5
. - Erstellen Sie in diesem package eine Klasse
Konto
(ohnemain()
-Methode!) - Erstellen Sie in diesem package eine Klasse
Testklasse
mitmain()
-Methode - Erstellen Sie in der Klasse
Konto
zwei Objektvariablenguthaben
vom Typdouble
→ nur in der Klasse sichtbar!pin
vom Typint
→ ebenfalls nur in der Klasse sichtbar!
- Erstellen Sie in der Klasse
Konto
einen Konstruktor fürKonto
- diesem Konstruktor wird als Parameter
int pin
übergeben - mit dem Wert des Parameters wird innerhalb des Konstruktors der Wert von
pin
initialisiert - Initialisieren Sie im Konstruktor auch die Objektvariable
guthaben
. Sie bekommt den Wert0.0
(hierfür haben wir also keinen Parameter, wir setzen den initialen Wert einfach generell auf0.0
)
- diesem Konstruktor wird als Parameter
- Erstellen Sie in der Klasse
Konto
eine Objektmethodeeinzahlen(double betrag)
- diese Objektmethode ist
public
und gibt nichts zurück - in dieser Methode wird der Wert der Objektvariablen
guthaben
um den Wert vonbetrag
erhöht - erzeugen Sie in dieser Methode außerdem eine Ausgabe in der Form:
falls der
betrag
den Wert100.0
hatte. (Optional: Verwenden Sie am besten dieprintf()
-Methode, um stets genau 2 Stellen nach dem Komma des Betrages auszugeben (siehe hier).
- diese Objektmethode ist
- Geben Sie in der
main()
-Methode derTestklasse
ein: und führen Sie dieTestklasse
aus. Es sollten folgende Ausgaben erzeugt werden (fallsprintf()
verwendet wird, ansonsten ist die Ausgabe z.B.100.0 Euro
): - Erstellen Sie in der Klasse
Konto
eine Objektmethodekontoauszug(int pin)
- diese Objektmethode ist
public
und gibt nichts zurück - einen
kontoauszug(int pin)
können Sie nur "ziehen", wenn der Parameterwert vonpin
mit dem Wert der Objektvariablenpin
übereinstimmt - wird der richtige Wert für die
pin
übergeben, geben Sie dasguthaben
in der folgenden Form aus: fallsguthaben
den Wert von300.0
hat. - wird ein falscher Wert für die
pin
übergeben, geben Sie folgende Ausgabe aus:
- diese Objektmethode ist
- Erweitern Sie die
main()
-Methode der Testklasse um folgende Anweisungen: und führen Sie dieTestklasse
aus. Es sollten folgende (weitere) Ausgaben erzeugt werden: - Erstellen Sie in der Klasse
Konto
eine Objektmethodeauszahlen(int pin, double betrag)
- diese Objektmethode ist
public
und gibt nichts zurück - es kann nur etwas ausgezahlt werden, wenn der Parameterwert von
pin
mit dem Wert der Objektvariablenpin
übereinstimmt - stimmen die Werte nicht überein, geben Sie erneut aus.
- stimmt der
pin
-Wert, dann müssen Sie prüfen, ob dasguthaben
reicht, umbetrag
auszuzahlen. Ist nicht genugguthaben
vorhanden, dann geben Sie aus fallsbetrag
den Wert400.0
hatte. - wenn der
pin
-Wert stimmt und genugguthaben
vorhanden ist, um denbetrag
auszuzahlen, dann reduzieren Sieguthaben
um den entsprechendenbetrag
und geben aus falls derbetrag
den Wert100.0
hatte.
- diese Objektmethode ist
- Erweitern Sie die
main()
-Methode der Testklasse um folgende Anweisungen:und führen Sie diek1.auszahlen(1235, 100.0); // Falsche PIN! k1.auszahlen(1234, 100.0); k1.kontoauszug(1234); k1.auszahlen(1234, 300.0); // Guthaben reicht nicht k1.auszahlen(1234, 200.0); k1.kontoauszug(1234);
Testklasse
aus. Es sollten folgende (weitere) Ausgaben erzeugt werden: - Zusatz:
- Erweitern Sie die Klasse um eine weitere Objektvariable
private double dispogrenze
- Initialisieren Sie diese Variable innerhalb des Konstruktors (ohne weiteren Parmeter) auf den Wert
-1000.0
. Sie dürfen somit Ihr Konto um1000.00 Euro
überziehen. - Passen Sie die
auszahlen()
-Methode entsprechend an, so dass es auch möglich ist, einenbetrag
auszuzahlen, so lange man nicht unter diedispogrenze
fällt. - Erstellen Sie eine Methode
public void zinsenZahlen()
.- Erstellen Sie in dieser Methode zwei Konstanten
DISPOZINSEN
vom Typdouble
bekommt den Wert12.0
(soll12%
entsprechen) undGUTHABENZINSEN
vom Typdouble
bekommt den Wert0.5
(soll0.5%
entsprechen)
- Berechnen Sie innerhalb der Methode die Zinsen für das Konto
DISPOZINSEN
werden fällig (werden vonguthaben
abgezogen), fallsguthaben
negativ istGUTHABENZINSEN
werden gewährt (werden zuguthaben
addiert), fallsguthaben
positiv ist- passen Sie den Wert von
guthaben
entsprechend an - erzeugen Sie entsprechende Ausgaben, z.B. bzw.
- Erstellen Sie in dieser Methode zwei Konstanten
- Angenommen, die gesamte
main()
-Methode sieht jetzt so aus:dann sollten Sie folgende Ausgabe erzeugen (gilt nur für Zusatz!):public static void main(String[] args) { Konto k1 = new Konto(1234); k1.einzahlen(100.0); k1.einzahlen(50.0); k1.einzahlen(150.0); k1.kontoauszug(1235); // Falsche PIN! k1.kontoauszug(1234); k1.auszahlen(1235, 100.0); // Falsche PIN! k1.auszahlen(1234, 100.0); k1.kontoauszug(1234); k1.auszahlen(1234, 300.0); k1.auszahlen(1234, 200.0); k1.kontoauszug(1234); k1.einzahlen(150.0); k1.kontoauszug(1234); k1.zinsenZahlen(); k1.kontoauszug(1234); k1.einzahlen(1000.0); k1.kontoauszug(1234); k1.zinsenZahlen(); k1.kontoauszug(1234); }
Es wurden 100,00 Euro eingezahlt. Es wurden 50,00 Euro eingezahlt. Es wurden 150,00 Euro eingezahlt. Falsche PIN! Ihr aktuelles Guthaben betraegt 300,00 Euro. Falsche PIN! Es wurden 100,00 Euro ausgezahlt. Ihr aktuelles Guthaben betraegt 200,00 Euro. Es wurden 300,00 Euro ausgezahlt. Es wurden 200,00 Euro ausgezahlt. Ihr aktuelles Guthaben betraegt -300,00 Euro. Es wurden 150,00 Euro eingezahlt. Ihr aktuelles Guthaben betraegt -150,00 Euro. Ihnen wurden 18,00 Euro Zinsen abgebucht. Ihr aktuelles Guthaben betraegt -168,00 Euro. Es wurden 1000,00 Euro eingezahlt. Ihr aktuelles Guthaben betraegt 832,00 Euro. Ihnen wurden 4,16 Euro Zinsen gutgeschrieben. Ihr aktuelles Guthaben betraegt 836,16 Euro.
- Erweitern Sie die Klasse um eine weitere Objektvariable
Eine mögliche Lösung für Übung 5
package uebungen.uebung5;
public class Konto
{
private double guthaben;
private int pin;
private double dispogrenze;
public Konto(int pin)
{
this.pin = pin;
this.guthaben = 0.0;
this.dispogrenze = -1000;
}
public void einzahlen(double betrag)
{
if(betrag > 0)
{
this.guthaben += betrag;
System.out.printf("Es wurden %6.2f Euro eingezahlt.%n", betrag);
}
else
{
System.out.println("Betrag muss groesser als 0 sein!");
}
}
public void kontoauszug(int pin)
{
if(this.pin == pin) // pin stimmt
{
System.out.printf("Ihr aktuelles Guthaben betraegt %.2f Euro.%n", this.guthaben);
}
else // pin stimmt nicht
{
System.out.println("Falsche PIN!");
}
}
public void auszahlen(int pin, double betrag)
{
if(this.pin == pin) // pin stimmt
{
if(this.guthaben - betrag >= this.dispogrenze) // guthaben reicht
{
this.guthaben -= betrag;
System.out.printf("Es wurden %.2f Euro ausgezahlt.%n", betrag);
}
else // guthaben reicht nicht
{
System.out.printf("Ihr Guthaben reicht nicht, um %.2f Euro auszuzahlen.%n", betrag);
}
}
else // pin stimmt nicht
{
System.out.println("Falsche PIN!");
}
}
public void zinsenZahlen()
{
final double DISPOZINSEN = 12.0;
final double GUTHABENZINSEN = 0.5;
// DISPOZINSEN = 13.0; // Fehler wegen final
double zinsen = 0;
if(this.guthaben > 0) // positives guthaben (Habenzinsen)
{
zinsen = this.guthaben * (GUTHABENZINSEN/100.0); // positiver Wert
}
else // negatives guthaben (Dispozinsen)
{
zinsen = this.guthaben * (DISPOZINSEN/100.0); // negativer Wert
}
this.guthaben += zinsen;
if(zinsen > 0) // Guthabenzinsen - gutgeschrieben
{
System.out.printf("Ihnen wurden %.2f Euro Zinsen gutgeschrieben.%n", zinsen);
}
else // Dispozinsen - abgebucht
{
System.out.printf("Ihnen wurden %.2f Euro Zinsen abgebucht.%n", -zinsen);
}
}
}
package uebungen.uebung5;
public class Testklasse
{
public static void main(String[] args)
{
Konto k1 = new Konto(1234);
k1.einzahlen(100.0);
k1.einzahlen(50.0);
k1.einzahlen(150.0);
k1.kontoauszug(1235); // Falsche PIN!
k1.kontoauszug(1234);
k1.auszahlen(1235, 100.0); // Falsche PIN!
k1.auszahlen(1234, 100.0);
k1.kontoauszug(1234);
k1.auszahlen(1234, 300.0); // Guthaben reicht nicht
k1.auszahlen(1234, 200.0);
k1.kontoauszug(1234);
}
}
Übung 6
- Erstellen Sie ein package
uebungen.uebung6
. - Erstellen Sie in diesem package eine Klasse
Rectangle
(ohnemain()
-Methode!) - Erstellen Sie in diesem package eine Klasse
Testklasse
mitmain()
-Methode -
Erstellen Sie in der Klasse
Rectangle
zwei Objektvariablena
vom Typint
→ nur in der Klasse sichtbar!b
vom Typint
→ ebenfalls nur in der Klasse sichtbar!
a
undb
sollen die Seiten des Rechtecks sein. -
Implementieren Sie einen parameterlosen Konstruktor
Rectangle()
, der für die Seitea
den Wert10
und für die Seiteb
den Wert20
setzt. - Implementieren Sie einen parametrisierten Konstruktor
Rectangle(int a, int b)
, der die Parameterwerte zum Initialisieren der Seiten verwendet. - Implementieren Sie eine Objektmethode
public int area()
, die den Flächeninhalt des Rechtecks zurückgibt. - Implementieren Sie eine Objektmethode
public int perimeter()
, die den Umfang des Rechtecks zurückgibt. - Implementieren Sie eine Objektmethode
public String toString()
, die einenString
mit allen Informationen des Rechtecks in der folgenden Form zurückgibt. - Implementieren Sie eine Objektmethode
public void print()
, die den durchtoString()
erzeugtenString
auf die Konsole ausgibt. - Geben Sie in der
main()
-Methode derTestklasse
ein:und führen Sie die// Objekte erzeugen Rectangle r1 = new Rectangle(); Rectangle r2 = new Rectangle(12, 18); Rectangle r3 = new Rectangle(40, 5); Rectangle r4 = new Rectangle(20, 10); Rectangle r5 = new Rectangle(11, 21); System.out.printf("%n%n--------------- print()-Methode -----------------%n%n"); r1.print(); r2.print(); r3.print(); r4.print(); r5.print();
Testklasse
aus. Es sollten folgende Ausgaben erzeugt werden:--------------- print()-Methode ----------------- Rectangle : ( a=10, b=20, area=200, perimeter=60 ) Rectangle : ( a=12, b=18, area=216, perimeter=60 ) Rectangle : ( a=40, b= 5, area=200, perimeter=90 ) Rectangle : ( a=20, b=10, area=200, perimeter=60 ) Rectangle : ( a=11, b=21, area=231, perimeter=64 )
- Implementieren Sie eine Objektmethode
public boolean sidesAreEqual(Rectangle r)
, die eintrue
zurückgibt, wenn die Seiten des aufrufenden Objektes gleich den Seiten des Rectangler
sind. Beachten Sie, dass das Rechteck auch gedreht noch gleiche Seiten haben soll, alsoa=10, b=20
ist nicht nur mita=10, b=20
gleich, sondern auch mita=20, b=10
. Wenn die Seiten ungleich sind, gibt die Methode einfalse
zurück. - Implementieren Sie eine Objektmethode
public boolean areasAreEqual(Rectangle r)
, die eintrue
zurückgibt, wenn die Flächeninhalte des aufrufenden Objektes und des Rectangler
gleich sind. Ansonstenfalse
. - Implementieren Sie eine Objektmethode
public boolean perimetersAreEqual(Rectangle r)
, die eintrue
zurückgibt, wenn die Umfänge des aufrufenden Objektes und des Rectangler
gleich sind. Ansonstenfalse
. - Implementieren Sie eine Objektmethode
public void printComparison(Rectangle r)
, die die Vergleiche mitr
in der unten dargestellten Form ausgibt. Rufen Sie in der Methode die Methodenprint()
(odertoString()
),sidesAreEqual()
,areasAreEqual()
undperimetersAreEqual()
auf. -
Fügen Sie in der
main()
-Methode derTestklasse
folgende Anweisungen hinzu:und führen Sie dieSystem.out.printf("%n%n---------- printComparison()-Methode ------------%n%n"); r1.printComparison(r2); r1.printComparison(r3); r1.printComparison(r4); r1.printComparison(r5);
Testklasse
aus. Es sollten folgende zusätzliche Ausgaben erzeugt werden:---------- printComparison()-Methode ------------ this Rectangle : ( a=10, b=20, area=200, perimeter=60 ) the other Rectangle : ( a=12, b=18, area=216, perimeter=60 ) sides are not equal areas are not equal perimeters are equal this Rectangle : ( a=10, b=20, area=200, perimeter=60 ) the other Rectangle : ( a=40, b= 5, area=200, perimeter=90 ) sides are not equal areas are equal perimeters are not equal this Rectangle : ( a=10, b=20, area=200, perimeter=60 ) the other Rectangle : ( a=20, b=10, area=200, perimeter=60 ) sides are equal areas are equal perimeters are equal this Rectangle : ( a=10, b=20, area=200, perimeter=60 ) the other Rectangle : ( a=11, b=21, area=231, perimeter=64 ) sides are not equal areas are not equal perimeters are not equal
-
Zusatz:
- Implementieren Sie eine Objektmethode
public double diagonal()
, die die Länge einer Diagonalen des Rechtecks zurückgibt. -
Erweitern Sie die
toString()
-Methode um die Ausgabe dieser Länge wie folgt:Rectangle : ( a=10, b=20, area=200, perimeter=60, diagonal=22,361 ) Rectangle : ( a=12, b=18, area=216, perimeter=60, diagonal=21,633 ) Rectangle : ( a=40, b= 5, area=200, perimeter=90, diagonal=40,311 ) Rectangle : ( a=20, b=10, area=200, perimeter=60, diagonal=22,361 ) Rectangle : ( a=11, b=21, area=231, perimeter=64, diagonal=23,707 )
-
Implementieren Sie eine Objektmethode
public void scale(int factor)
. Diese Methode "skaliert" (vergrößert oder verkleinert) das Rechteck um den Faktorfactor
, genauer gesagt, wird der Flächeninhalt um diesen Faktor skaliert (vergrößert oder verkleinert). Die neuen Seiten sollen das gleiche Verhältnis zueinander haben, wie die alten Seiten. Geben Sie die neuen Seitenlängen in der folgenden Form auf die Konsole aus (siehe nächsten Punktmain()
). - Fügen Sie in der
main()
-Methode derTestklasse
folgende Anweisungen hinzu:und führen Sie dieSystem.out.printf("%n%n--------------- scale()-Methode -----------------%n%n"); r1.scale(2); r2.scale(2); r3.scale(2); r4.scale(2); r5.scale(2); r1.scale(10); r2.scale(10); r3.scale(10); r4.scale(10); r5.scale(10);
Testklasse
aus. Es sollten folgende zusätzliche Ausgaben erzeugt werden:--------------- scale()-Methode ----------------- newArea= 400,00 newA= 14,14 newB= 28,28 check (newA*newB)= 400,00 newArea= 432,00 newA= 16,97 newB= 25,46 check (newA*newB)= 432,00 newArea= 400,00 newA= 56,57 newB= 7,07 check (newA*newB)= 400,00 newArea= 400,00 newA= 28,28 newB= 14,14 check (newA*newB)= 400,00 newArea= 462,00 newA= 15,56 newB= 29,70 check (newA*newB)= 462,00 newArea= 2000,00 newA= 31,62 newB= 63,25 check (newA*newB)=2000,00 newArea= 2160,00 newA= 37,95 newB= 56,92 check (newA*newB)=2160,00 newArea= 2000,00 newA=126,49 newB= 15,81 check (newA*newB)=2000,00 newArea= 2000,00 newA= 63,25 newB= 31,62 check (newA*newB)=2000,00 newArea= 2310,00 newA= 34,79 newB= 66,41 check (newA*newB)=2310,00
Sollte die
scale()
-Methode besser ein neuesRectangle
-Objekt zurückgeben? Wenn ja, dann implementieren Sie es so. - Implementieren Sie eine Objektmethode
Eine mögliche Lösung für Übung 6
package uebungen.uebung6;
public class Rectangle
{
private int a;
private int b;
public Rectangle()
{
this.a = 10;
this.b = 20;
}
public Rectangle(int a, int b)
{
this.a = a;
this.b = b;
}
public int area()
{
return this.a * this.b;
}
public int perimeter()
{
return 2 * (this.a + this.b);
}
public String toString()
{
return String.format("Rectangle : ( a=%2d, b=%2d, area=%3d, perimeter=%2d, diagonal=%.3f )",
this.a, this.b, this.area(), this.perimeter(), this.diagonal());
}
public void print()
{
System.out.println(this.toString());
}
public boolean sidesAreEqual(Rectangle r)
{
return (this.a == r.a && this.b == r.b) ||
(this.a == r.b && this.b == r.a);
}
public boolean areasAreEqual(Rectangle r)
{
return this.area() == r.area();
}
public boolean perimetersAreEqual(Rectangle r)
{
return this.perimeter() == r.perimeter();
}
public void printComparison(Rectangle r)
{
System.out.println("this " + this.toString());
System.out.println("the other " + r.toString());
if(this.sidesAreEqual(r))
{
System.out.println("sides are equal");
}
else
{
System.out.println("sides are not equal");
}
if(this.areasAreEqual(r))
{
System.out.println("areas are equal");
}
else
{
System.out.println("areas are not equal");
}
if(this.perimetersAreEqual(r))
{
System.out.println("perimeters are equal");
}
else
{
System.out.println("perimeters are not equal");
}
System.out.println();
}
public double diagonal()
{
int a2 = this.a * this.a;
int b2 = this.b * this.b;
double d = Math.sqrt(a2+b2);
return d;
}
public void scale(int factor)
{
double areaNew = factor * this.area();
double newA = Math.sqrt(factor * this.a * this.a);
double newB = Math.sqrt(factor * this.b * this.b);
System.out.printf("newArea=%7.2f newA=%6.2f newB=%6.2f", areaNew, newA, newB);
System.out.printf(" check (newA * newB) = %.2f %n", (newA * newB));
}
}
package uebungen.uebung6;
public class Testklasse
{
public static void main(String[] args)
{
// Objekte erzeugen
Rectangle r1 = new Rectangle();
Rectangle r2 = new Rectangle(12, 18);
Rectangle r3 = new Rectangle(40, 5);
Rectangle r4 = new Rectangle(20, 10);
Rectangle r5 = new Rectangle(11, 21);
System.out.printf("%n%n--------------- print()-Methode -----------------%n%n");
r1.print();
r2.print();
r3.print();
r4.print();
r5.print();
System.out.printf("%n%n---------- printComparison()-Methode ------------%n%n");
r1.printComparison(r2);
r1.printComparison(r3);
r1.printComparison(r4);
r1.printComparison(r5);
System.out.printf("%n%n--------------- scale()-Methode -----------------%n%n");
r1.scale(2);
r2.scale(2);
r3.scale(2);
r4.scale(2);
r5.scale(2);
r1.scale(10);
r2.scale(10);
r3.scale(10);
r4.scale(10);
r5.scale(10);
}
}
Übung 7
Info: Wir erstellen uns zwei neue Datentypen Counter
und Clock
. Die Idee der Klasse Counter
soll sein, einen counter
bis zu einem bestimmten limit
hochzuzählen. Bevor der counter
das limit
erreicht, wird er wieder auf 0
gesetzt. Angenommen also das limit
ist 60
und der counter
hat den aktuellen Wert 59
und soll erhöht werden, dann ist der nächste Wert von counter
wieder 0
, da das limit
erreicht wurde. Die Klasse Clock
verwendet zwei Counter
-Objekte, eins für hours
und das andere für minutes
.
- Erstellen Sie ein package
uebungen.uebung7
. - Erstellen Sie in diesem package eine Klasse
Counter
(ohnemain()
-Methode!) - Erstellen Sie in diesem package eine Klasse
Programmklasse
mitmain()
-Methode -
Erstellen Sie in der Klasse
Counter
zwei Objektvariablencounter
vom Typint
→ nur in der Klasse sichtbar!limit
vom Typint
→ ebenfalls 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.
-
-
Überschreiben Sie die 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. -
Geben Sie in der
main()
-Methode derProgrammklasse
ein:und führen Sie dieSystem.out.printf("%n---------------- Test Counter -----------%n%n"); Counter counter = new Counter(60); for(int i=0; i<120; i++) { counter.increase(); System.out.printf("%3d : ", i); counter.print(); }
Testklasse
aus. Es sollten folgende Ausgaben erzeugt werden:Ausgabe auf der Konsole
---------------- Test Counter ----------- 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 im package eine weitere Klasse
Clock
. In der KlasseClock
verwenden Sie zweiCounter
. Der eineCounter
zählt dieminutes
und hat daslimit
60
und der andereCounter
zählt diehours
und 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
! -
Überschreiben Sie die 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. -
Fügen Sie in der
main()
-Methode derProgrammklasse
folgende Anweisungen hinzu:und führen Sie dieSystem.out.printf("%n----------------- Test Clock ------------%n%n"); Clock clock = new Clock(); for(int i=0; i<1600; i++) { clock.increase(); if(i%50==0) { System.out.printf("%4d : ", i); clock.print(); } }
Programmklasse
aus. Es sollten folgende zusätzliche Ausgaben erzeugt werden:Ausgabe auf der Konsole
----------------- Test Clock ------------ 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
Eine mögliche Lösung für Übung 7
package uebungen.uebung7;
public class Counter
{
private int counter;
private int limit;
public Counter(int limit)
{
this.counter = 0;
this.limit = limit;
}
public boolean increase()
{
this.counter++;
if(this.counter == this.limit)
{
this.counter = 0;
return false;
}
return true; // falls this.counter != this.limit
}
@Override
public String toString()
{
// String s = "";
// if(this.counter < 10)
// {
// s += "0" + this.counter; // s = s + "0" + this.counter
// }
// else
// {
// s += this.counter; // s = s + this.counter
// }
// return s;
return String.format("%02d", this.counter);
}
public void print()
{
System.out.println(this.toString());
}
}
package uebungen.uebung7;
public class Clock
{
private Counter minutes;
private Counter hours;
public Clock()
{
this.minutes = new Counter(60);
this.hours = new Counter(24);
}
public void increase()
{
boolean increased = this.minutes.increase();
if(!increased)
{
this.hours.increase();
}
}
@Override
public String toString()
{
return this.hours.toString() + ":" + this.minutes.toString();
}
public void print()
{
System.out.println(this.toString());
}
}
package uebungen.uebung7;
public class Programmklasse
{
public static void main(String[] args)
{
System.out.printf("%n---------------- Test Counter -----------%n%n");
Counter counter = new Counter(60);
for(int i=0; i<120; i++)
{
counter.increase();
System.out.printf("%3d : ", i);
counter.print();
}
System.out.printf("%n----------------- Test Clock ------------%n%n");
Clock clock = new Clock();
for(int i=0; i<1600; i++)
{
clock.increase();
if(i%50==0)
{
System.out.printf("%4d : ", i);
clock.print();
}
}
}
}
Übung 8
- Erstellen Sie ein package
uebungen.uebung8
. - Erstellen Sie in diesem package eine Klasse
Uebung8
mitmain()
-Methode. -
Implementieren Sie eine
public static void print(char[] ca)
-Methode, so dass daschar[] ca
auf die Konsole ausgegeben wird. Achten Sie darauf, dass hinter dem letzten Element kein Komma steht. Testen Sie Ihre Methode auch für ein leeres Array.
Bsp:print(['a', 'b', 'c', 'a', 'c', 'a', 'b', 'c'])
Ausgabe auf Konsole:[a, b, c, a, c, a, b, c]
-
Kopieren Sie die
print
-Methode vollständig und ändern Sie den Typ des Parameters vonchar[]
inint[]
. (Die Methode ist jetzt überladen undprint()
kann jetzt entweder einchar[]
oder einint[]
übergeben werden, welches auf die Konsole ausgegeben wird.)
Bsp:print([4, 2, 8, 1, 6, 2, 4, 1, 8])
Ausgabe auf Konsole:[8, 1, 4, 2, 6, 1, 8, 2, 4]
-
Implementieren Sie eine Methode
public static char[] stringToCharArray(String s)
. Diese Methode wandelt einenString
in einchar[]
um, so dass jedes Zeichen des Strings imchar[]
enthalten ist. Daschar[]
wird zurückgegeben. Tipps: die Länge eines Strings wird mit der Objektmethodelength()
ermittelt. Die einzelnen Zeichen eines Strings können mithilfe dercharAt(index)
-Objektmethode von Strings ermittelt werden. Siehe String
Bsp.:stringToCharArray("hallo!")
→['h','a','l','l','o','!']
-
Implementieren Sie eine Methode
public static int[] minAndMax(int[] iarr)
, der einint
-Array als Parameter übergeben wird und die ein zweielementiges Array zurückgibt. Das erste Element des zurückgegeben Arrays ist das Minimum des als Parameter übergebenen Arrays und das zweite Element ist das Maximum.
Bsp.:minAndMax([4,2,8,1,6,2,4,1,8])
→[1,8]
minAndMax([4])
→[4,4]
-
Implementieren Sie eine Methode
public static int[] reverse(int[] iarr)
, der einint
-Array übergeben wird und die die Reihenfolge der Elemente des Arrays umdreht (das letzte zuerst usw.) Das neuerstellte Array wird zurückgegeben.
Bsp.:reverse([4,2,8,1,6,2,4,1,8])
→[8,1,4,2,6,1,8,2,4]
reverse([4])
→[4]
-
Zusatz:
- Implementieren Sie eine Methode
public static char[] filter(char[] carr, char filter)
, der als Parameter einchar
-Array und einchar
übergeben wird. Die Methode soll einchar
-Array zurückgeben, das dem als Parameter übergeben Array entspricht, außer dass jedes Vorkommen des als Parameter übergebencarr
entfernt wurde
Bsp:filter(['a', 'b', 'c', 'a', 'c', 'a', 'b', 'c'], 'c')
→['a', 'b', 'a', 'a', 'b']
- Implementieren Sie eine Methode
public static boolean containsDoublets(char[] ca)
die eintrue
zurückgibt, wenn mindestens ein Wert inca
mindestens zwei Mal vorkommt (wenn Sie schon dabei sind, können Sie sich auch überlegen, wenn genau ein Wert genau zwei Mal vorkommt - oder mindestens ein Wert genau zwei Mal - oder genau ein Wert mindestens zwei Mal) undfalse
sonst.
- Implementieren Sie eine Methode
Eine mögliche Lösung für Übung 8
package uebungen.uebung8;
public class Uebung8 {
public static void print(char[] ca)
{
System.out.print("[");
// Ausgabe der Werte von ca
for(int index = 0; index < ca.length; index++ )
{
System.out.print(ca[index]);
if(index < ca.length-1)
{
System.out.print(", ");
}
}
System.out.println("]");
}
public static void print(int[] ia)
{
System.out.print("[");
// Ausgabe der Werte von ia
for(int index = 0; index < ia.length; index++ )
{
System.out.print(ia[index]);
if(index < ia.length-1)
{
System.out.print(", ");
}
}
System.out.println("]");
}
public static char[] stringToCharArray(String s)
{
/*
* ca hat dieselbe Laenge wie der String
* (gleichviele Zeichen)
*/
char[] ca = new char[s.length()];
for (int index = 0; index < ca.length; index++)
{
ca[index] = s.charAt(index);
}
return ca;
}
public static int[] reverse(int[] iarr)
{
int[] ia = new int[iarr.length];
/*
* ia wird von links nach rechts durchlaufen
* iarr von rechts nach links
*/
for (int index = 0; index < ia.length; index++)
{
ia[index] = iarr[iarr.length-1 - index];
}
return ia;
}
public static char[] filter(char[] carr, char filter)
{
/*
* neues Array erzeugen -- Idee:
* 1. neues Array erzeugen (char[])
* 2. aber wie lang ist das neue Array?
* 3. Laenge von neuen Array ist (Laenge von carr - Anzahl des Vorkommens von filter in carr)
*/
// wie oft kommt filter in carr vor?
int counter = 0;
for (int index = 0; index < carr.length; index++)
{
if(carr[index] == filter)
{
counter++;
}
}
// jetzt wissen wir, wie oft filter in carr vorkommt: counter
int laengeVomNeuenArray = carr.length - counter;
// jetzt kann das neue Array erzeugt werden (jetzt kennen wir die Laenge)
char[] filterArray = new char[laengeVomNeuenArray];
/*
* neues Array befuellen -- Idee:
* 1. wir laufen durch das komplette carr (for-Schleife)
* 2. fuer jedes Element aus carr pruefen, ob es dem filter entspricht
* 2a. wenn es nicht filter entspricht, dann kopieren
* 2b. wenn es filter entspricht, dann wird es nicht kopiert
* 3. wichtig: unterschiedlich indexCarr und indexNeuesArray (haben ja auch unter-
* schiedliche Laengen)
*/
// jetzt befuellen - zunaechst for-Schleife fuer carr
int indexFilterArray = 0;
for (int indexCarr = 0; indexCarr < carr.length; indexCarr++)
{
if(carr[indexCarr] != filter)
{
// dann kopieren (sonst nicht)
// das geht nicht: --> filterArray[indexCarr] = carr[indexCarr];
filterArray[indexFilterArray] = carr[indexCarr];
indexFilterArray++;
}
}
return filterArray;
}
public static int[] minAndMax(int[] iarr)
{
// wir koennen davon ausgehen, dass iarr.length mind. 1 ist
int curMin = iarr[0];
int curMax = iarr[0];
for (int index = 0; index < iarr.length; index++)
{
if(iarr[index] < curMin)
{
curMin = iarr[index]; // iarr[index] ist nun mein neues aktuelles Minimum
}
if(iarr[index] > curMax)
{
curMax = iarr[index]; // iarr[index] ist nun mein neues aktuelles Maximum
}
}
// entweder so:
/*
* int[] minAndMax = new int[2];
* minAndMax[0] = curMin;
* minAndMax[1] = curMax;
* return minAndMax;
*/
// oder so:
/*
* int[] minAndMax = { curMin, curMax };
* return minAndMax;
*/
// oder so:
return new int[]{ curMin, curMax };
}
public static void main(String[] args)
{
char[] ca1 = {'a', 'b', 'c', 'a', 'c', 'a', 'b', 'c'};
char[] ca2 = new char[0];
int[] ia1 = {4,2,8,1,6,2,4,1,8};
int[] ia2 = { 4 };
System.out.printf("%n%n------------------ print() --------------------%n%n");
print(ca1);
print(ca2);
print(ia1);
print(ia2);
System.out.printf("%n%n------------ stringToCharArray()---------------%n%n");
char[] ca3 = stringToCharArray("Hallo FIW!");
print(ca3);
System.out.printf("%n%n----------------- reverse() -------------------%n%n");
int[] ia3 = reverse(ia1);
print(ia1);
print(ia3);
System.out.printf("%n%n------------------ filter() -------------------%n%n");
print(ca1);
char[] ca4 = filter(ca1, 'c');
print(ca4);
char[] ca5 = filter(ca1, 'a');
print(ca5);
char[] ca6 = filter(ca1, 'b');
print(ca6);
char[] ca7 = filter(ca1, 'd');
print(ca7);
System.out.println();
print(ca3);
char[] ca8 = filter(ca3, 'l');
print(ca8);
char[] ca9 = stringToCharArray("superlangerTeststringzumFiltern kann auch Leerzeichen enthalten oder alle möglichen Zeichen ?%$§!*");
print(ca9);
print(u1.filter(ca9, 'e'));
System.out.printf("%n%n----------------- minAndMax() ----------------%n%n");
print(ia1);
int[] mm1 = minAndMax(ia1);
print(mm1);
System.out.println();
print(ia2);
int[] mm2 = minAndMax(ia2);
print(mm2);
}
}
Übung 9
- Erstellen Sie ein package
uebungen.uebung9
. - Erstellen Sie in diesem package eine Klasse
Uebung9
mitmain()
-Methode. -
Vorabinformation:
-
Wir implementieren Würfe eines Würfels. Alle Würfe werden in einem Array
statistics
gespeichert. Das Array hat die Länge 6 und beschreibt, wie oft eine 1, wie oft eine 2, ..., wie oft eine 6 gewürfelt wurde.
-
-
Erstellen Sie sich in der
main()
-Methode zunächst dasstatistics
-Array. Alle Elemente des Arrays sind vom Typint
und es hat die Länge6
. -
Implementieren Sie folgende Methoden:
-
Implementieren Sie eine
public static int throwDice()
-Methode, die eine Zufallszahl aus dem Wertebereich[1, ... , 6]
erzeugt und zurückgibt. -
Implementieren Sie eine Methode
public static void printThrow(int cast)
, die den Wert des übergebenen Wurfes (cast
) wie folgt ausgibt (Beispielcast==5
): -
Testen Sie beide Methoden, indem Sie in der
main()
-Methode eingeben:System.out.printf("%n%n------------------- Test throwDice and printThrow -------------------%n%n"); for(int index=0; index<10; index++) { int cast = throwDice(); printThrow(cast); }
Sie sollten eine Ausgabe in folgender Form bekommen (Zufallszahlen):
------------------- Test throwDice and printThrow ------------------- Es wurde eine 5 gewuerfelt Es wurde eine 4 gewuerfelt Es wurde eine 6 gewuerfelt Es wurde eine 5 gewuerfelt Es wurde eine 3 gewuerfelt Es wurde eine 4 gewuerfelt Es wurde eine 1 gewuerfelt Es wurde eine 5 gewuerfelt Es wurde eine 6 gewuerfelt Es wurde eine 6 gewuerfelt
-
Implementieren Sie eine Methode
public static void insertIntoStatistics(int[] statistics, int cast)
. Dasstatistics
-Array wird als Parameter übergeben und auch der gewürfeltecast
. Imstatistics
-Array wird der Wert an der Stelle um1
erhöht, der dem Wurfcast
entspricht. D.h. wurde eine1
gewürfelt, wird der Wert im Index0
um1
erhöht, wurde eine2
gewürfelt, der Wert im Index1
usw. (siehe auch oben die Abbildung zustatistics
) -
Implementieren Sie eine Methode
public static void printStatistics(int[] statistics)
, die dasstatistics
-Array wie folgt auf die Konsole ausgibt.Angenommen, das
statistics
-Array ist so befüllt:[ 3,8,4,5,8,2 ]
, dann ist die Ausgabe auf der Konsole: -
Testen Sie beide Methoden, indem Sie in der
main()
-Methode eingeben:System.out.printf("%n%n------------------ Test insert- and printStatistics -----------------%n%n"); for(int index=0; index<100; index++) { int cast = throwDice(); insertIntoStatistics(statistics, cast); } printStatistics(statistics);
Es wird angenommen, dass Sie das
statistics
-Array bereits gleich am Anfang in dermain()
erzeugt haben - wenn nicht, können Sie das auch hier machen.Sie sollten eine Ausgabe in folgender Form bekommen (Zufallszahlen):
-
Implementieren Sie eine Methode
public static int sumOfStatistics(int[] statistics)
, die eine Summe über alle Werte imstatistics
-Array wie folgt berechnet:Beispiel: Angenommen, das Array ist so befüllt:
[ 3,8,4,5,8,2 ]
, dann ist die Summe:3x1 + 8x2 + 4x3 + 5x4 + 8x5 + 2x6 = 3 + 16 + 12 + 20 + 40 + 12 = 103
. Die Summe103
wird zurückgegeben. -
Testen Sie die Methode, indem Sie in der
main()
-Methode eingeben:System.out.printf("%n%n--------------------- Test sumOfStatistics --------------------------%n%n"); printStatistics(statistics); int sumTest = sumOfStatistics(statistics); System.out.println("Summe = " + sumTest);
Das
statistics
-Array ist ja bereits oben befüllt worden, das müssen wir hier also nicht mehr machen. Sie sollten eine Ausgabe in folgender Form bekommen (Zufallszahlen): -
Zusatz: Implementieren Sie eine Methode
public static int throwDiceUntilTarget(int target, int[] statistics)
, die so lange einen Würfel würfelt, bis als Summe der Augen dastarget
erreicht ist. Die Anzahl der Würfe wird zurückgegeben. In dieser Methode erfolgen folgende Aufrufe:- nach jedem Wurf (
throwDice()
) wird der Wurf ausgegeben (printThrow()
) - jeder Wurf wird in das
statistics
-Array eingetragen (insertIntoStatistics()
) - nach jedem Wurf wird die Summme aller Augen aller bisherigen Würfe ermittelt (
sumOfStatistics()
). - so lange die Summe kleiner ist als das
target
, wird weiter gewürfelt
- nach jedem Wurf (
-
Testen Sie die Methode, indem Sie in der
main()
-Methode eingeben:System.out.printf("%n%n------------------- Test throwDiceUntilTarget -----------------------%n%n"); statistics = new int[6]; // altes Array war schon befuellt final int TARGET = 100; int tries = throwDiceUntilTarget(TARGET, statistics); printStatistics(statistics); int sum = sumOfStatistics(statistics); System.out.println("Es wurden " + tries + " Versuche benötigt, um " + sum + " Punkte zu erzielen.");
Da das
statistics
-Array zuvor bereits befüllt war, erstellen wir es für das Testen dieser Methode nochmal neu. Sie sollten eine Ausgabe in folgender Form bekommen (Zufallszahlen):------------------- Test throwDiceUntilTarget ----------------------- Es wurde eine 5 gewuerfelt Es wurde eine 1 gewuerfelt Es wurde eine 5 gewuerfelt Es wurde eine 3 gewuerfelt Es wurde eine 5 gewuerfelt Es wurde eine 2 gewuerfelt Es wurde eine 5 gewuerfelt Es wurde eine 3 gewuerfelt Es wurde eine 4 gewuerfelt Es wurde eine 3 gewuerfelt Es wurde eine 3 gewuerfelt Es wurde eine 3 gewuerfelt Es wurde eine 1 gewuerfelt Es wurde eine 1 gewuerfelt Es wurde eine 2 gewuerfelt Es wurde eine 3 gewuerfelt Es wurde eine 6 gewuerfelt Es wurde eine 3 gewuerfelt Es wurde eine 3 gewuerfelt Es wurde eine 2 gewuerfelt Es wurde eine 3 gewuerfelt Es wurde eine 2 gewuerfelt Es wurde eine 6 gewuerfelt Es wurde eine 4 gewuerfelt Es wurde eine 3 gewuerfelt Es wurde eine 1 gewuerfelt Es wurde eine 4 gewuerfelt Es wurde eine 3 gewuerfelt Es wurde eine 4 gewuerfelt Es wurde eine 1 gewuerfelt Es wurde eine 6 gewuerfelt [ (5 x 1), (4 x 2), (11 x 3), (4 x 4), (4 x 5), (3 x 6) ] Es wurden 31 Versuche benötigt, um 100 Punkte zu erzielen.
Es muss das
target
nicht exakt getroffen werden, das ist Zufall. Es stoppt, sobald100
oder mehr Punkte erreicht wurden.
-
Eine mögliche Lösung für Übung 9
package uebungen.uebung9;
import java.util.Random;
public class Uebung9
{
public static int throwDice()
{
Random r = new Random();
int cast = r.nextInt(6) + 1; // bound [0 ... bound-1]
// 6 [0 ... 5]
// +1 [1 ... 6]
return cast;
}
public static void printThrow(int cast)
{
System.out.println("Es wurde eine " + cast + " gewuerfelt.");
}
public static void insertIntoStatistics(int[] statistics, int cast)
{
int index = cast - 1;
if(index >= 0 && index < statistics.length)
{
statistics[index]++;
}
else
{
System.out.println("index " + index +
" existiert nicht im Array der Laenge " +
statistics.length);
}
}
public static void printStatistics(int[] statistics)
{
System.out.print("[ ");
for (int index = 0; index < statistics.length; index++)
{
System.out.print("(" + statistics[index] + " x " + (index+1) + ")");
if(index < statistics.length - 1)
{
System.out.print(", ");
}
}
System.out.println(" ]");
}
public static int sumOfStatistics(int[] statistics)
{
int sum = 0;
for (int index = 0; index < statistics.length; index++)
{
sum = sum + statistics[index] * (index + 1);
}
return sum;
}
public static int throwDiceUntilTarget(int target, int[] statistics)
{
int nrOfThrows = 0;
int cast = throwDice();
printThrow(cast);
insertIntoStatistics(statistics, cast);
int currentSum = sumOfStatistics(statistics);
nrOfThrows++;
while(currentSum < target)
{
cast = throwDice();
printThrow(cast);
insertIntoStatistics(statistics, cast);
currentSum = sumOfStatistics(statistics);
nrOfThrows++;
}
return nrOfThrows;
}
public static void main(String[] args)
{
int[] statistics = new int[6];
System.out.printf("%n%n------------------- Test throwDice and printThrow -------------------%n%n");
for(int index=0; index<10; index++)
{
int cast = throwDice();
printThrow(cast);
}
System.out.printf("%n%n------------------ Test insert- and printStatistics -----------------%n%n");
for(int index=0; index<100; index++)
{
int cast = throwDice();
insertIntoStatistics(statistics, cast);
}
printStatistics(statistics);
System.out.printf("%n%n--------------------- Test sumOfStatistics --------------------------%n%n");
printStatistics(statistics);
int sumTest = sumOfStatistics(statistics);
System.out.println("Summe = " + sumTest);
System.out.printf("%n%n------------------- Test throwDiceUntilTarget -----------------------%n%n");
statistics = new int[6]; // altes Array war schon befuellt
final int TARGET = 100;
int tries = throwDiceUntilTarget(TARGET, statistics);
printStatistics(statistics);
int sum = sumOfStatistics(statistics);
System.out.println("Es wurden " + tries + " Versuche benötigt, um " + sum + " Punkte zu erzielen.");
}
}
Übung 10
- Erstellen Sie ein package
uebungen.uebung10
. -
Erstellen Sie in diesem package eine Klasse
Lottery
mit-
der privaten Objektvariablen
drawingResults
vom Typint[]
.
Information: Lottery steht für eine Lotterie, bei der aus 9 Zahlen (1..9) 5 Zahlen zufällig gelost werden (5 aus 9). Das ArraydrawingResults
dient zum Speichern der gezogenen 5 Zahlen. -
Schreiben Sie für die Klasse
Lottery
einen parameterlosen Konstruktor. In diesem Konstruktor wird das ArraydrawingResults
mit der Länge 5 erzeugt. - Schreiben Sie eine Objektmethode
contains(int number)
. Diese Methode gibt eintrue
zurück, wennnumber
indrawingResults
enthalten ist undfalse
sonst. - Schreiben Sie eine Objektmethode
drawing()
. In dieser Methode werden die 5 Zufallszahlen gezogen (5 aus 9). Sie benötigen dafür ein Objekt der KlasseRandom
(Random
muss ausjava.util
importiert werden). „Ziehen“ Sie nun zufällig 5 Zufallszahlen aus dem Bereich1..9
(1 und 9 inklusive) und speichern Sie diese im ArraydrawingResults
.
Achtung: Die gleiche Zahl darf nicht doppelt gezogen (gespeichert) werden! D.h. die 5 im Array gespeicherten Zufallszahlen müssen sich voneinander unterscheiden! -
Schreiben Sie eine Objektmethode
sort()
. Diese Methode sortiert das ArraydrawingResults
aufsteigend (von klein nach groß). -
Überschreiben Sie die Objektmethode
toString()
, die dasdrawingResult
-Array alsString
in folgender Form zurückgibt (Beispielwerte für den Fall, dass1, 3, 5, 6, 7
gezogen wurden):- das
dawingResult
-Array wird zunächst sortiert - ist die Zahl im Array enthalten, wird sie als Wert angezeigt
- ist die Zahl nicht enthalten, wird ein
-
angezeigt - d.h. es werden immer die 5 gezogenen Zahlen ausgegeben und 4 Striche.
- das
-
Schreiben Sie eine Objektmethode
print()
, die den vontoString()
zurückgegebenenString
auf der Konsole ausgibt.
-
-
Erstellen Sie im gleichen package eine Klasse
Programmklasse
mitmain()
-Methode.- Erzeugen Sie in der
main()
-Methode in einer Schleife10
Objekte der KlasseLottery
und rufen (auch in der Schleife) jeweils diedrawing()
und dieprint()
-Methode auf. Es entsteht folgende Ausgabe (Beispielwerte sind zufällig und unterscheiden sich!):
- Erzeugen Sie in der
-
Zusatz::
- Implementieren Sie in der Klasse
Lottery
eine ObjektmethodeisEqual(Lottery other)
, die eintrue
zurückgibt, wenn das aufrufende Objekt das gleichedrawingResults
-Array enthält, wieother
(also die Werte darin jeweils gleich sind).
Tipp: Implementieren Sie die Methode am einfachsten so, dass Sie die beiden drawingResult-Arrays erst sortieren und dann die sortierten Arrays elementweise miteinander vergleichen. - Erzeugen Sie ein Objekt von
Lottery
und rufen für dieses Objekt diedrawing()
-Methode auf. Erzeugen Sie in einer Schleife so lange ein weiteres Objekt vonLottery
und rufen dafür diedrawing()
-Methode auf, bis die beiden Objekte die gleichen gezogenen Zahlen enthalten, d.h. lautisEqual()
-Methode gleich sind. Geben Sie dann beide Objekte mithilfe derprint()
-Methode aus. Es entsteht folgende Ausgabe (zufällige Beispielwerte):
- Implementieren Sie in der Klasse
Eine mögliche Lösung für Übung 10
package uebungen.uebung10;
import java.util.Random;
public class Lottery
{
private int[] drawingResults;
public Lottery()
{
this.drawingResults = new int[5];
}
public boolean contains(int number)
{
for (int index = 0; index < this.drawingResults.length; index++)
{
if(this.drawingResults[index] == number)
{
return true;
}
}
return false;
}
public void drawing()
{
Random r = new Random();
for (int index = 0; index < this.drawingResults.length; index++)
{
int newValue = r.nextInt(9) + 1;
while(this.contains(newValue))
{
newValue = r.nextInt(9) + 1;
}
this.drawingResults[index] = newValue;
}
}
public void printArray()
{
String s = "[ ";
for (int index = 0; index < this.drawingResults.length; index++)
{
s += this.drawingResults[index];
if(index < this.drawingResults.length-1)
{
s += ", ";
}
}
s += " ]";
//System.out.println(s);
System.out.println(this.toString());
}
public void sort()
{
for (int bubble = 0; bubble < this.drawingResults.length-1; bubble++)
{
for (int index = 0; index < this.drawingResults.length-1-bubble; index++)
{
if(this.drawingResults[index] > this.drawingResults[index+1])
{
int tmp = this.drawingResults[index];
this.drawingResults[index] = this.drawingResults[index+1];
this.drawingResults[index+1] = tmp;
}
}
}
}
@Override
public String toString()
{
String s = "( ";
for(int number=1; number<10; number++)
{
if(this.contains(number))
{
s += number + " ";
}
else
{
s += "- ";
}
}
s += ")";
return s;
}
public void print()
{
System.out.println(this.toString());
}
@Override
public boolean equals(Object o)
{
if(o == null) return false;
if(this == o) return true;
if(this.getClass() != o.getClass()) return false;
// jetzt wissen wir, dass o vom Lauzeittyp Lottery ist
// o.contains() geht nicht, da o vom Compilertyp Object ist
Lottery lo = (Lottery)o; // lo und o zeigen auf dasselbe Objekt
for (int index = 0; index < this.drawingResults.length; index++)
{
if(!lo.contains(this.drawingResults[index]))
{
return false;
}
}
return true;
}
}
package uebungen.uebung10;
public class Programmklasse
{
public static void main(String[] args)
{
for(int i=0; i<10; i++)
{
Lottery lo = new Lottery();
lo.drawing();
lo.sort();
lo.print();
}
System.out.printf("%n%n--------- Zusatz ------------%n%n");
Lottery lo1 = new Lottery();
lo1.drawing();
lo1.print();
Lottery lo2 = new Lottery();
lo2.drawing();
while(!lo1.isEqual(lo2))
{
lo2 = new Lottery(); // damit das Array wieder leer ist
lo2.drawing();
}
lo2.print();
}
}
Eine mögliche Lösung für Übung 12 (Fahrzeug)
package klausurvorbereitung.fahrzeug.b;
import java.util.Random;
public class Fahrzeug
{
private String marke;
private int kmStand;
private int maxV;
private double verbrauch;
public Fahrzeug(String marke, int maxV, double verbrauch)
{
this.marke = marke;
this.maxV = maxV;
this.verbrauch = verbrauch;
this.kmStand = 0;
}
public void fahren()
{
Random r = new Random();
this.kmStand += r.nextInt(1000);
}
public double gesamtVerbrauch()
{
return this.kmStand * this.verbrauch / 100.0;
}
public String getMarke()
{
return this.marke;
}
public int getKmStand()
{
return this.kmStand;
}
public int getMaxV()
{
return this.maxV;
}
public double getVerbrauch()
{
return this.verbrauch;
}
@Override
public String toString()
{
return String.format("%-4s %3dkm/h %4.1fl/100km %7dkm %8.2fl",
this.marke, this.maxV, this.verbrauch, this.kmStand,
this.gesamtVerbrauch());
}
public void print()
{
System.out.println(this.toString());
}
@Override
public boolean equals(Object o)
{
if(o == null) return false;
if(this == o) return true;
if(this.getClass() != o.getClass()) return false;
Fahrzeug other = (Fahrzeug)o;
return this.marke.equals(other.marke)
&& this.kmStand == other.kmStand;
}
}
package klausurvorbereitung.fahrzeug.b;
import java.util.Random;
public class Fuhrpark
{
private Fahrzeug[] fuhrpark;
private int anzahl;
public Fuhrpark(int groesse)
{
this.fuhrpark = new Fahrzeug[groesse];
this.anzahl = 0;
}
public void fahrzeugKaufen()
{
Random r = new Random();
int zufZahl = r.nextInt(400) + 50;
if(zufZahl <= 250)
{
// Auto
this.fuhrpark[this.anzahl] = new Auto("A"+this.anzahl, zufZahl, zufZahl/10.0);
}
else
{
// LKW
this.fuhrpark[this.anzahl] = new LKW(zufZahl/10.0);
}
this.anzahl++;
}
public void fahrzeugKaufen(Fahrzeug fahrzeug)
{
this.fuhrpark[this.anzahl] = fahrzeug;
this.anzahl++;
}
@Override
public String toString()
{
String s = String.format("Im Fuhrpark sind %d Fahrzeuge :%n", this.anzahl);
s += String.format("---------------------------%n");
for(int index=0; index < this.anzahl; index++)
{
s += String.format("%s %n", this.fuhrpark[index].toString());
}
s += String.format("---------------------------%n%n");
return s;
}
public void reisenImMonat(int anzahlReisen)
{
Random r = new Random();
for(int anz = 0; anz < anzahlReisen; anz++)
{
int indexZuf = r.nextInt(this.anzahl);
this.fuhrpark[indexZuf].fahren();
}
}
}
package klausurvorbereitung.fahrzeug.b;
import java.util.Random;
public class Programmklasse
{
public static void main(String[] args)
{
Fahrzeug[] fahrzeuge = new Fahrzeug[4];
fahrzeuge[0] = new Fahrzeug("A", 250, 10.0);
fahrzeuge[1] = new Fahrzeug("B", 200, 8.5);
fahrzeuge[2] = new Fahrzeug("C", 160, 6.5);
fahrzeuge[3] = new Fahrzeug("D", 180, 7.0);
for (int index = 0; index < fahrzeuge.length; index++)
{
fahrzeuge[index].print();
}
System.out.println();
Random r = new Random();
for(int fahrt = 0; fahrt < 100; fahrt++)
{
int indexZuf = r.nextInt(fahrzeuge.length);
fahrzeuge[indexZuf].fahren();
}
for (int index = 0; index < fahrzeuge.length; index++)
{
fahrzeuge[index].print();
}
System.out.println();
Fuhrpark fp1 = new Fuhrpark(20);
System.out.println(fp1.toString());
for(int anz = 0; anz < 15; anz++)
{
fp1.fahrzeugKaufen();
}
fp1.fahrzeugKaufen(new Auto("B", 200, 8.5));
fp1.fahrzeugKaufen(new LKW(35.5));
System.out.println(fp1.toString());
fp1.reisenImMonat(75);
System.out.println(fp1.toString());
}
}
Übung 13
Implementieren Sie eine Methode, die überprüft, ob ein gegebener String doppelte Zeichen enthält. Von der String
-Klasse dürfen nur die Methoden length()
und charAt(int)
verwendet werden.
- Was ist Ihre algorithmische Idee?
- Welche Hilfsmethoden benötigen Sie?
Zusatz (Es dürfen weiterhin nur die Methoden length()
und charAt(int)
von der Klasse String
verwendet werden)