Informatik I WS2004/2005

Werbung
Informatik I WS2004/2005
Prof. Dr. W. May
Dipl.-Inform. Kerstin Richter
Ausgegeben am: 03.12.2004
Übungsblatt 6
Abgabe bis:
17.12.2004
Dipl.-Inform. Oliver Fritzen
Thema: Java - Schleifen, Arrays, Rekursion
Die Praxis-Aufgaben auf diesem Übungsblatt bearbeiten Sie bitte am Rechner und führen Sie Ihrem Tutor vor. Eine Bearbeitung in Zweier-Teams innerhalb
Ihrer Übungsgruppe ist möglich. Nutzen Sie auch das Angebot der abendlichen Freien Übungen.
Aufgabe 1 (Praktisch: 15 Punkte):
Java
Schreiben Sie ein Java-Programm mit folgenden Eigenschaften:
Das Programm ermittelt zufällig eine Zahl zwischen 1 und 100. Diese soll vom Benutzer des Programms erraten werden, indem nach jedem Rateversuch des Bedieners eine
Ausgabe erscheint mit dem Hinweis: die Zahl ist zu klein, die Zahl ist zu groß oder die Zahl ist richtig.
Beispiel:
> Geben Sie eine Zahl ein: 50
> Die Zahl ist zu groß.
> Geben Sie eine Zahl ein: 20
> Die Zahl ist zu klein.
> Geben Sie eine Zahl ein: 30
> Die Zahl ist zu groß.
> Geben Sie eine Zahl ein: 25
> Die Zahl ist richtig.
Aufgabe 2 (Praktisch: 20 Punkte):
Einfache und iterierte Quersumme in Java
Schreiben Sie eine Java-Klasse mit einer Methode, die für eine natürliche Zahl die Quersumme berechnet und ausgibt (Die Quersumme einer Zahl ist die Summer ihrer
Ziffern, die Quersumme von 99 wäre also 9+9 = 18). Die Berechnung soll dabei nicht direkt im Hauptprogramm erfolgen, sondern in einer Methode quersumme(int n).
Testen Sie die Funktion mittels der Zahlen 42, 3678 und 6947859. Benutzen Sie dazu eine eigene Test-Klasse.
Ergänzen Sie ihr Java-Programm indem Sie eine Methode hinzufügen die die iterierte Quersumme einer Zahl berechnet. Die iterierte Quersumme erhält man wenn man
so lange wiederholt die Quersumme bildet, bis das Ergebnis einstellig ist. Die iterierte Quersumme von 99 wäre also 99
9+9 = 18
1+8 = 9.
Die Methode darf die Methode quersumme(int n) aufrufen.
Berechnen Sie anschließend die iterierten Quersummen von 42, 3678 und 6947859. Benutzen Sie dazu die selbe Test-Klasse wie oben.
Lösung
public class Quersumme {
public static int quersumme(int n) {
int summe = 0;
while (n > 0) {
summe = summe + n % 10;
n = n / 10;
}
return summe;
}
public static int iterierteQuersumme(int n) {
int summe = quersumme(n);
while (summe > 10) {
summe = quersumme(summe);
}
return summe;
}
}
public class QuersummeTest {
public static void main(String[] args) {
System.out.println("Quersumme von 42: " + Quersumme.quersumme(42));
System.out.println("Quersumme von 3678: " + Quersumme.quersumme(3678));
System.out.println("Quersumme von 6947859" + Quersumme.quersumme(6947859));
System.out.println("Iterierte Quersumme von 42: "
+ Quersumme.iterierteQuersumme(42));
System.out.println("Iterierte Quersumme von 3678: "
+ Quersumme.iterierteQuersumme(3678));
System.out.println("Iterierte Quersumme von 6947859: "
+ Quersumme.iterierteQuersumme(6947859));
}
}
Aufgabe 3 (Praktisch: 25 Punkte):
Java
Schreiben Sie ein Java-Programm, das eine natürliche Zahl z (1 = z = 999) einliest und ihren Wert in natürlicher Sprache auf den Bildschirm schreibt, also z.B. bei Eingabe z
= 598 das Wort "fünfhundertachtundneunzig".
Lösung
Hinweis: Übliche Fehler dabei sind z.B.
16 (sechszehn)
17 (siebenzehn)
20 (undzwanzig)
21 (einsundzwanzig)
31 (einsunddreissig)
etc.
public class EinsBis999 {
public static void print(int n) {
int hunderter = (n / 100) % 10;
int zehner = (n / 10) % 10;
int einer = n % 10;
switch (hunderter) {
case 0 :
break;
case 1 :
System.out.print("Einhundert");
break;
case 2 :
System.out.print("Zweihundert");
break;
case 3 :
System.out.print("Dreihundert");
break;
case 4 :
System.out.print("Vierhundert");
break;
case 5 :
System.out.print("Fuenfhundert");
break;
case 6 :
System.out.print("Sechshundert");
break;
case 7 :
System.out.print("Siebenhundert");
break;
case 8 :
System.out.print("Achthundert");
break;
case 9 :
System.out.print("Neunhundert");
break;
default :
break;
}
switch (einer) {
case 0 :if(zehner==1)System.out.print("zehn");
break;
case 1 :
switch (zehner) {
case 0 :
System.out.print("eins");
break;
case 1 :
System.out.print("elf");
break;
default :
System.out.print("einund");
break;
}
break;
case 2 :
switch (zehner) {
case 0 :
System.out.print("zwei");
break;
case 1 :
System.out.print("zwoelf");
break;
default :
System.out.print("zweiund");
break;
}
break;
case 3 :
switch (zehner) {
case 0 :
System.out.print("drei");
break;
case 1 :
System.out.print("dreizehn");
break;
default :
System.out.print("dreiund");
break;
}
break;
case 4 :
switch (zehner) {
case 0 :
System.out.print("vier");
break;
case 1 :
System.out.print("vierzehn");
break;
default :
System.out.print("vierund");
break;
}
break;
case 5 :
switch (zehner) {
case 0 :
System.out.print("fuenf");
break;
case 1 :
System.out.print("fuenfzehn");
break;
default :
System.out.print("fuenfund");
break;
case
case
case
case
}
break;
6 :
switch (zehner) {
case 0 :
System.out.print("sechs");
break;
case 1 :
System.out.print("sechzehn");
break;
default :
System.out.print("sechsund");
break;
}
break;
7 :
switch (zehner) {
case 0 :
System.out.print("sieben");
break;
case 1 :
System.out.print("siebzehn");
break;
default :
System.out.print("siebenund");
break;
}
break;
8 :
switch (zehner) {
case 0 :
System.out.print("acht");
break;
case 1 :
System.out.print("achtzehn");
break;
default :
System.out.print("achtund");
break;
}
break;
9 :
switch (zehner) {
case 0 :
System.out.print("neun");
break;
case 1 :
System.out.print("neunzehn");
break;
default :
System.out.print("neunund");
break;
}
break;
}
switch (zehner) {
case 0 :
break;
case 1 :
break;
case 2 :
System.out.print("zwanzig");
break;
case 3 :
System.out.print("dreissig");
break;
case 4 :
System.out.print("vierzig");
break;
case 5 :
System.out.print("fuenfzig");
break;
case 6 :
System.out.print("sechzig");
break;
case 7 :
System.out.print("siebzig");
break;
case 8 :
System.out.print("achtzig");
break;
case 9 :
System.out.print("neunzig");
break;
}
System.out.println();
}
}
Aufgabe 4 (Praktisch: 40 Punkte):
Permutationen
Schreiben Sie eine Java-Klasse Permutation mit einer Methode permute, die ein int-Array der Länge n als Eingabe hat und alle Permutationen der Zahlen im Array ausgibt.
Als Permutationen einer Menge bezeichnet man Vertauschungen der einzelnen Elemente. Beispiel:
public class PermutationTest {
public static void main(String[] args) {
int[] k = {1,2,3};
Permutation.permute(k);
}
}
Die main-Methode soll alle Kombinationen von Vertauschungen der Zahlen 1,2 und 3 auf den Bildschirm ausgeben:
1
1
2
2
3
3
2
3
1
3
2
1
3
2
3
1
1
2
Sie können davon ausgehen, dass die einzelnen Zahlen paarweise verschieden sind (d.h. sie brauchen sich nicht um Duplikate zu kümmern).
Testen Sie Ihr Programm mit den Werten {1,2,3} und {1,2,3,4}.
Hinweis: Für ein Array x enthät x.length die Länge des Arrays x.
Lösung
public class Permutation {
public static void permute(int[] number) {
permute_rec(number, 0);
}
public static void permute_rec(int[] number, int from) {
int[] new_number = new int[number.length];
for (int i = from; i < number.length; i++) {
/*
* kopiere das number nach new_number (noetig, da die alte ordnung
* VOR dem vertauschen noch fuer den rek. aufruf benoetigt wird)
*/
for (int j = 0; j < number.length; j++)
new_number[j] = number[j];
// tausche new_number[i] und new_number[from]
int temp = new_number[i];
new_number[i] = new_number[from];
new_number[from] = temp;
// rekursiver Aufruf
permute_rec(new_number, from + 1);
}
// ausgabe des arrays nur dann wenn die rekursion am zeilenende angekommen ist
if (from == number.length)
output(number);
}
// Ausgaberoutine
public static void output(int[] number) {
for (int i = 0; i < number.length; i++)
System.out.print(number[i] + " ");
System.out.println();
}
public class PermutationTest {
public static void main(String[] args) {
int[] k1 = {1,2,3};
int[] k2 = {1,2,3,4};
Permutation.permute(k1);
Permutation.permute(k2);
}
}
}
Herunterladen