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); } } }