Algorithmen und Programmierung Fachgebiet Telematik/Rechnernetze WS 12/13 Prof. Dr.-Ing. Günter Schäfer Übungsblatt 3 Aufgabe 1 3 Punkte Gegeben seien drei Zahlenvariablen a, b und c, welche Sie beim Programmaufruf als Kommandozeilenparameter übergeben bekommen. a) Schreiben Sie ein Java-Programm Numbers, das von diesen drei Zahlen die Summe, das Produkt und das arithmetische Mittel berechnet und ausgibt. Weiterhin soll der Median ausgegeben werden. b) Entwerfen Sie einen Algorithmus Sort, der die Variableninhalte so umordnet, dass a ≤ b ≤ c ist. Formulieren Sie den Algorithmus zuerst als Pseudocode oder als Struktogramm. Setzen Sie ihn anschließend in Java um. c) Geben Sie Testdaten für die drei Zahlen an, um alle möglichen unterschiedlichen Fälle für die Sortierung zu testen. Aufgabe 2 2 Punkte Bitte schreiben Sie einen applikativen Algorithmus zur Berechnung der Potenz xy (x, y ∈ N ∪ {0}). Dieser Algorithmus soll keine Multiplikation durchführen. Schreiben Sie stattdessen bitte die zugehörige Funktion zur Multiplikation mit Hilfe von einzelnen Additionen. Aufgabe 3 3 Punkte Eine Zeitangabe erfolgt normalerweise in der Form h:min:sec. a) Schreiben Sie ein Java Programm Time, das eine gegebene Zahl von Sekunden in die Darstellung h:min:sec umwandelt und ausgibt. Beispielsweise soll für s = 14567 ausgegeben werden: 04:02:47. b) In einem Laborexperiment sollen im Abstand von 700 Sekunden Messungen erfolgen und protokolliert werden. Schreiben Sie ein Programm, das ein Vordruck zum Eintragen von 20 Messungen auf dem Bildschirm in folgender Form ausgibt: Nr. Sekunden h:min:sec 1 700 00:11:40 2 1400 00:23:20 ... ... ... 20 14000 03:53:20 Wie muss man das Programm verändern, damit im Formular alle Zeiten innerhalb der ersten fünf Stunden protokolliert werden? UB3.tex @ 23. Oktober 2012 : 17:18 Aufgabe 4 2 Punkte Welche Funktion wird durch die folgende Definition realisiert? Beschreiben Sie die Auswertung an einem Beispiel (mit mindestens fünf Schritten! ;-D). f(x, y) = if y = 0 then x else f(x - 1, y - 1) fi Aufgabe 5 3 Punkte √ Newton hat für die Berechnung der Quadratwurzel a , a > 0 die folgende Näherungsformel angegeben: x2n xn · 3− xn+1 := 2 a Bitte schreiben Sie eine Methode, die diese Näherungsformel implementiert. Die Iteration ist mit x0 = 1 zu beginnen und soll abbrechen, wenn die Abweichung zwischen x2n und a weniger als 10−7 beträgt. Betten Sie diese Methode in eine Rahmenpogramm ein, welches ein beliebiges a als Kommandozeilenparameter annimmt, dafür die Quadratwurzel berechnet und anschließend ausgibt. Auf bestehende Methoden der Java-Bibliotheken wie Math.pow(), Math.abs() und Math.sqrt() greifen Sie in diesem Fall bitte nicht zu. Aufgabe 6 4 Punkte Implementieren Sie folgende applikativen Algorithmen in Java: a) f(x) = if x>100 then x-10 else f(f(x+11)) fi b) g(x) = if x=1 then 1 else g(h(x)) fi h(x) = if even(x) then x/2 else 3*x+1 fi Was berechnen die Funktionen f(x) und g(x)? Gibt es Fälle, in denen eine der Funktionen nicht terminiert? Aufgabe 7 2 Punkte 2004 hatte Indien 1.033 Millionen Einwohner bei einem jährlichen Bevölkerungswachstum von 1,51%. China dagegen hatte 1.279 Millionen Einwohner bei einem jährlichen Bevölkerungswachstum von 0,73%. Erstellen Sie ein Java-Programm, das für jedes Jahr die Jahreszahl und die Einwohnerzahlen der beiden Länder ausgibt, bis die Einwohnerzahl Indiens die von China übertrifft. Geben Sie dieses Jahr in Ihrer Lösung an. Aufgabe 8 2 Punkte Geben Sie an, welche Variablen an den mit /* 1 */, /* 2 */, /* 3 */ und /* 4 */ gekennzeichneten Stellen im folgenden Programm existieren und welche davon sichtbar 2 sind. Begründen Sie Ihre Antwort. Verwenden Sie für die Begründung der Sichtbarkeit die aus der Vorlesung bekannte Darstellung. public class Klasse { static int number = 5; static int compute2(int z) { /∗ 1 ∗/ if (z % 2 == 0) { return z + 1; } else { int y = number + 5; System.out.println(”y = ” + y); /∗ 2 ∗/ return z − 1; } } static int compute1(int x) { /∗ 3 ∗/ int y = x ∗ compute2(number); return y; } public static void main(String [ ] args) { if (args.length<1){ System.out.println(”Usage java Klasse <par:int>”); System.exit(−1); } int number = Integer.parseInt(args [0]); /∗ 4 ∗/ System.out.println(compute1(number)); } } 3