Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer Programmiertechnik Übungen zu Klassen und -methoden Übung 1 Ein Verfahren, den größten gemeinsamen Teiler (ggT) zweier Zahlen a und b, a <= b, zu bestimmen, besteht darin, für alle Zahlen zwischen 1 und a zu testen, ob sie sowohl a als auch b teilen. Die größte solche Zahl ist der ggT von a und b. Schreiben Sie eine Java-Methode, die den ggT zweier positiver Zahlen nach der oben beschriebenen Brute-Force-Methode berechnet. Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH Übung 2 Der Euklidische Algorithmus zur Berechnung des größten gemeinsamen Teilers zweier Zahlen gründet sich auf die folgende Beobachtung: ggT(a,b) = ggT(a %b, b) Desweiteren ist zu beachten, dass ggT(a,0) = a und ggT(a,b) = ggT(b,a) Schreiben Sie basierend auf diesen Beobachtungen einen rekursiven Algorithmus zur Berechnung des größten gemeinsamen Teilers zweier beliebiger natürlicher Zahlen. Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH Übung 3 Bestimmen Sie die Ausgabe des folgenden Programms: public public class class BooleanMethods BooleanMethods {{ public public static static boolean boolean test1(int test1(int val) val) {{ System.out.println("test1(" System.out.println("test1(" ++ val val ++ ")"); ")"); System.out.println("result: " + (val System.out.println("result: " + (val << 1)); 1)); return val < 1; return val < 1; }} public public static static boolean boolean test2(int test2(int val) val) {{ System.out.println("test2(" System.out.println("test2(" ++ val val ++ ")"); ")"); System.out.println("result: " + (val System.out.println("result: " + (val << 2)); 2)); return val < 2; return val < 2; }} public public static static boolean boolean test3(int test3(int val) val) {{ System.out.println("test3(" System.out.println("test3(" ++ val val ++ ")"); ")"); System.out.println("result: " + (val System.out.println("result: " + (val << 3)); 3)); return val < 3; return val < 3; }} public public static static void void main(String main(String args[]) args[]) {{ if(test1(0) if(test1(0) && && test2(2) test2(2) && && test3(2)) test3(2)) System.out.println("expression System.out.println("expression is is true"); true"); else else System.out.println("expression is Prof. Dr. Oliver Haase, HTWG Konstanz System.out.println("expression is false"); false"); Karl Martin Kern, Seitenbau GmbH } } Bitzer, Seitenbau GmbH Achim } Übung 4 public public class class Signatur Signatur {{ public public static static void void hoppla(long hoppla(long x, x, double double y, y, double double z) z) {{ System.out.println("ldd"); System.out.println("ldd"); }} public public static static void void hoppla(long hoppla(long x, x, long long y, y, double double z) z) {{ System.out.println("lld"); System.out.println("lld"); }} public public static static void void hoppla(long hoppla(long x, x, long long y, y, long long z) z) {{ System.out.println("lll"); System.out.println("lll"); }} public public static static void void hoppla(double hoppla(double x, x, long long y, y, double double z) z) {{ System.out.println("dld"); System.out.println("dld"); }} public public static static void void main main (String[] (String[] args) args) {{ long long aa == 333; 333; double b = double b = 4.44; 4.44; hoppla(a,a,a); hoppla(a,a,a); // // Aufruf Aufruf 11 hoppla(b,b,b); hoppla(b,b,b); // // Aufruf Aufruf 22 welche Aufrufe sind hoppla(a,a,b); hoppla(a,a,b); // // Aufruf Aufruf 33 hoppla(b,b,a); zulässig, welche hoppla(b,b,a); // // Aufruf Aufruf 44 hoppla(a,b,a); // Aufruf 5 hoppla(a,b,a); // Aufruf 5 Ausgaben erzeugen hoppla(a,b,b); // Aufruf 6 hoppla(a,b,b); // Aufruf 6 hoppla(b,a,b); hoppla(b,a,b); // // Aufruf Aufruf 77 hoppla(b,a,a); // Aufruf 8 Prof. Dr. Oliver Haase, HTWG Konstanz // Aufruf 8 hoppla(b,a,a); Karl}Martin Kern, Seitenbau GmbH }Bitzer, Seitenbau GmbH Achim } sie? Übung 5 Was ist falsch in den folgenden Programmzeilen? public public static static void void quadrat(double quadrat(double x) x) {{ return return Math.pow(x, Math.pow(x, 2); 2); }} double[][] double[][] matrix3x3 matrix3x3 == {{ 1.0, 1.0, 2.0, 2.0, 3.0, 3.0, 4.0, 4.0, 5.0, 5.0, 6.0, 6.0, 7.0, 8.0, 9.0 7.0, 8.0, 9.0 }; }; Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH Übung 6 Was ist das Problem mit den folgenden Methoden? public public static static int int komisch(int komisch(int n) n) {{ if if (( nn == == 00 )) return return 1; 1; else else return return nn ** komisch(n-1) komisch(n-1) ** komisch(n-2); komisch(n-2); }} public public static static int int sum(int[] sum(int[] z) z) {{ // // berechnet berechnet die die Summe Summe der der Komponenten Komponenten des des Feldes Feldes zz int int ss == 0, 0, ii == 0; 0; while while (( ii << z.length z.length )) ss == ss ++ z[++i]; z[++i]; return s; return s; }} Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH Übung 7 Warum führt das folgenden Programmfragment zu einem Laufzeitfehler? public public static static int int kehrwertFakul(int kehrwertFakul(int n) n) {{ // // liefert liefert 1/n 1/n ** 1/ 1/ (n-1) (n-1) ** ... ... ** 1/3 1/3 ** 1/2 1/2 return return 1/n 1/n ** kehrwertFakul(n-1); kehrwertFakul(n-1); }} Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH Zusatzübung Schreiben Sie ein Java-Programm, das eine beliebige Anzahl von double–Werten einliest und so in ein Feld abspeichert, dass gleiche Werte hintereinander angeordnet sind und alle positive Zahlen vor allen negativen Zahlen stehen. Gehen Sie wie folgt vor: ● ● ● Schreiben Sie eine Methode enter (mit Parametern d, k und dFeld), die den double-Wert d vor der k-ten Komponente in das Feld einfügt und das dabei entstehende (um eine Komponente verlängerte) Feld als Ergebnis zurückliefert. Ist k gleich der Länge von dFeld, dann ist d nach der letzten Komponente des Feldes dFeld einzufügen. Schreiben Sie eine Methode position (mit Parametern d und dFeld), die zunächst feststellt, ob der double-Wert d in dFeld bereits gespeichert ist. Wenn dies der Fall ist, soll der Feldindex zurückgeliefert werden. Ist d noch nicht in dFeld enthalten, dann soll für positive Werte d die Position 0 und für alle anderen Werte die Position n zurückgeliefert werden, wobei n die Feldlänge ist. Schreiben Sie eine main-Methode, die in einer Schleife double-Werte einliest, und unter Verwendung von position und enter an der richtigen Stelle in ein Feld einfügt. Die Schleife soll bei der Eingabe von 0 abgebrochen werden. Danach ist das Feld auszugeben. Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH