Musterlösung Name, Vorname, Matrikelnummer (Angaben sind freiwillig) Bitte unbedingt leserlich ausfüllen Testklausur – Vorkurs Informatik, 27.09.2011 Testklausur Vorkurs Informatik 27.09.2011 Musterlösung Seite 1 von 10 Musterlösung Name, Vorname, Matrikelnummer (Angaben sind freiwillig) Bitte unbedingt leserlich ausfüllen Testklausur – Vorkurs Informatik, 27.09.2011 Aufgabe 1: [15 Punkte] Algorithmen und Programmierung Gegeben sei folgender Algorithmus: a := 2; b := 1; Solange a < 4, { wenn a gerade, dann b := b + 2.5; a := a + 1; } gib b zurück; a) Welchen Wert haben die Variablen a und b nach jedem Durchlauf der Schleife. [ 7 Punkte ] Durchlauf Wert von a Wert von b 1 2 3 4 3.5 3.5 b) Schreiben Sie den Algorithmus als vollständiges Java-Programm. [ 8 Punkte ] class Programm{ static float algorithmus(){ int a = 2; float b = 1.0f; while (a < 4 ){ if (a % 2 == 0) b = b + 2.5f; a = a + 1; } return b; } public static void main(String [] args){ float x = algorithmus(); } } Seite 2 von 10 Musterlösung Name, Vorname, Matrikelnummer (Angaben sind freiwillig) Bitte unbedingt leserlich ausfüllen Testklausur – Vorkurs Informatik, 27.09.2011 Aufgabe 2: [15 Punkte] Programmierung a) Gegeben sei die Java-Deklaration eines Arrays: double[] Daten = {4.5, 7, 8.5, -2.1, 0.7}; Welchen Wert haben die folgenden Ausdrücke? [ 4 Punkte ] ________________4.5___________________ Daten[0]; Daten[(Daten.length-2)/2]; _________________7__________________ b) Ermitteln Sie den Wahrheitswert des angeführten booleschen Ausdrucks. [ 2 Punkte ] true (8 <= 8) || (16 < 2) false c) Schreiben Sie eine Java-Funktion static void sieben(int n), die alle durch sieben teilbaren Zahlen zwischen 1 und n bestimmt. Die Funktion soll die Zahlen von 1 bis n auf dem Bildschirm ausgeben und alle durch sieben teilbaren Zahlen zusätzlich mit einem Stern markieren. [ 9 Punkte ] static void sieben(int n){ int i = 1; while( i <= n){ if( i % 7 == 0){ System.out.println(i+"*"); } else { System.out.println(i); } i = i +1; } } Seite 3 von 10 Musterlösung Name, Vorname, Matrikelnummer (Angaben sind freiwillig) Bitte unbedingt leserlich ausfüllen Testklausur – Vorkurs Informatik, 27.09.2011 Aufgabe 3: [15 Punkte] Rekursion und Programmierung Die folgende rekursive Berechungsvorschrift liefert den größten gemeinsamen Teiler zweier positiver ganzer Zahlen: x falls x y ggT ( x, y ) ggT ( x y, y ) falls x y ggT ( x, y x) falls x y a) Berechnen Sie ggT(16,6) durch aufeinanderfolgendes Anwenden der Rekursionsvorschrift. (Hinweis: Der erste Schritt ist unten angegeben und soll nun weitergeführt werden. [ 6 Punkte ] Lösung: ggT(16,6) = ggT(10,6) = ggT(4,6) = ggT(4,2) = ggT(2,2) = 2 b) Schreiben Sie eine rekursive Java-Methode ggT, die den größten gemeinsamen Teiler zweier Zahlen x und y gemäß der Berechnungsvorschrift bestimmt. [ 9 Punkte ] static int ggT(int x, int y){ if( x > y ){ return ggT( x - y, y ); } if( x < y ){ return ggT( x, y - x ); } return x; } Seite 4 von 10 Musterlösung Name, Vorname, Matrikelnummer (Angaben sind freiwillig) Bitte unbedingt leserlich ausfüllen Testklausur – Vorkurs Informatik, 27.09.2011 Aufgabe 4: [30 Punkte] Klassen, Objekte und Programmierung a) Entscheiden Sie für folgende Behauptungen, ob sie richtig oder falsch sind. [ 4 Punkte ] 1) In einem Java-Programm können mehrere Objekte einer Klasse vorhanden sein. richtig falsch 2) Ein Java-Programm darf nur aus einer Klassendeklaration bestehen. richtig falsch b) Eine Klasse Aklasse ist wie folgt deklariert: class Aklasse{ float a; String b; Aklasse(float x, String y){ a = x; b = y; } } Stellen Sie graphisch dar, wie sich die Anweisung Aklasse b = new Aklasse(1.4,“neu“); im Speicher auswirkt. [ 4 Punkte ] (Hinweis: Hintergrund der Frage sind die Begriffe Objekt, Objektvariable und Referenz). b 1.4 “neu“ Seite 5 von 10 Musterlösung Name, Vorname, Matrikelnummer (Angaben sind freiwillig) Bitte unbedingt leserlich ausfüllen Testklausur – Vorkurs Informatik, 27.09.2011 c) 1. Deklarieren Sie eine Klasse mit Namen Test. Die Klasse soll ein int-Array a als Attribut haben. Das Array soll nicht instantiiert werden. [ 2 Punkt ] class Test{ int[] a; } 2. Schreiben Sie einen Konstruktor für die Klasse Test, der einen int-Parameter n hat. Der Konstruktor soll das Array a der Klasse Test auf ein Array der Länge n instantiieren. [ 2 Punkte ] Test(int n){ a=new int[n]; } 3. Schreiben Sie eine Methode void invers(), die die Elemente im Array a in umgekehrter Reihenfolge in a speichert. [ 8 Punkte ] Beispiel: a invers a 5 6 2 1 3 4 0 1 2 3 4 5 4 3 1 2 6 5 0 2 1 void invers(){ int buffer, pos; for(int x=0; x<a.length/2; x++){ pos=a.length-x-1; buffer=a[x]; a[x]=a[pos]; a[pos]=buffer; } } Seite 6 von 10 3 4 5 Musterlösung Name, Vorname, Matrikelnummer (Angaben sind freiwillig) Bitte unbedingt leserlich ausfüllen Testklausur – Vorkurs Informatik, 27.09.2011 d) Gegeben sei folgende Deklaration eines Objekttyps class Element{ int wert; Element naechstes; void setzNaechstes(Element next){ naechstes = next; } } Das Ergebnis des Programmstücks Element a = new Element(); lässt sich graphisch so darstellen: a b 6 wert naechstes Ergänzen Sie die Graphik so, dass sie das Ergebnis zeigt, wenn dieses Programmstück so fortgesetzt wird: Element b = new Element(); a.setzNaechstes(b); b.setzNaechstes(new Element()); b.wert = 6; [ 10 Punkte] Seite 7 von 10 Musterlösung Name, Vorname, Matrikelnummer (Angaben sind freiwillig) Bitte unbedingt leserlich ausfüllen Testklausur – Vorkurs Informatik, 27.09.2011 e) Realisieren Sie für die Klasse Element eine Methode summe(Element element), welche ausgehend von einem Element element die Summe der Werte aller in der Liste enthaltenen Elemente berechnet. Die Methode gibt 0 zurück, falls die Liste leer ist, ansonsten die Summe der Werte. [ 10 Punkte] Die Methode summe ist wie folgt deklariert: static int summe(Element element){ } int s = 0; while (element != null) { s = s+ element.wert; element = element.naechstes; } return s; Seite 8 von 10 Musterlösung Name, Vorname, Matrikelnummer (Angaben sind freiwillig) Bitte unbedingt leserlich ausfüllen Testklausur – Vorkurs Informatik, 27.09.2011 Aufgabe 5: [15 Punkte] Algorithmen und Datenstrukturen a) Geben Sie die Folge der Werte der Knoten an, die in dem angegebenen binären Suchbaum besucht werden, wenn in dem gegebenen Baum nach dem Wert 6 gesucht wird. [2 Punkte ] 3 1 7 6 8 Lösung:________________________3, 7, 6__________________________________ b) 1) Für welche der folgenden Kombinationen von Funktionen f(n), g(n) ist die Aussage f(n) = O(g(n)) korrekt: [ 2 Punkte ] i. f(n)= 7n2 + 4, g(n)=n2 richtig falsch ii. f(n) = n4 + 100000 n2, g(n) = n2 richtig falsch iii. f(n) = 5, g(n) = 1 richtig falsch 2) Begründen Sie Ihre Antwort zur Teilaufgabe 1) (f(n)= 7n2 + 4, g(n)=n2). [2 Punkte ] i. f(n) = O(g(n)): c0 , n0 : n n0 : f (n) c0 g (n) , hier c0 8, n0 2 . ii. Für alle Funktionswerte größer 2, wächst die Funktion 8n2 stärker als 7n2+4. iii. Der Funktionsgraph von 8n2 liegt oberhalb von 7n2+4, für alle Funktionswerte größer 2. Seite 9 von 10 Musterlösung Name, Vorname, Matrikelnummer (Angaben sind freiwillig) Bitte unbedingt leserlich ausfüllen Testklausur – Vorkurs Informatik, 27.09.2011 c) Beweisen Sie durch vollständige Induktion, dass die folgende Formel korrekt ist: [ 9 Punkte ] Behauptung: Die Summe S(n)= q 0 q 1 q 2 q n der Potenzzahlen q i von i=0 bis q n1 1 q n1 1 , d.h. S (n) i=n ist gleich q 1 q 1 Induktionsanfang (n=1): q11 1 q 2 1 (q 1)(q 1) S (1) q 1 q 1 q 1 q 1 Induktionsschritt: Annahme: qn 1 q n1 1 S (n 1) , S (n 2) , , S (1) q 1 q 1 q 1 Beweis: q n 1 n q n 1 q n (q 1) S (n) S (n 1) q q q 1 q 1 n q n 1 q n 1 q n q n 1 1 q 1 q 1 Seite 10 von 10