Name: Vorname: Matrikelnummer: Stud.-Abschnitt: Klausur zur Lehrveranstaltung Technische Informatik für Ingenieure WS 2006/07 22. Februar 2007 Musterlösung (in rot) Aufgabe mögliche Punkte 1 2 3 4 5 Summe 12 17 26 20 15 90 erreichte Punkte Note: Hinweise: • Diese Klausur umfaßt 5 Aufgaben und 8 Seiten. • Überprüfen Sie Ihre Klausur bitte auf Vollständigkeit! • Schreiben Sie bitte Ihren Namen auf jede Seite dieser Klausur und ggf. auf weitere von Ihnen benutzte Zusatzblätter! • Es sind keine Hilfsmittel erlaubt. • Nehmen Sie sich Zeit, die Klausuraufgaben vollständig durchzulesen. • Sie können insgesamt 90 Punkte erreichen; zum Bestehen der Klausur müssen sie mindestens 45 Punkte erreichen. • Die Bearbeitungszeit beträgt 90 Minuten. Viel Erfolg bei der Bearbeitung der Aufgaben! -1- Name: Vorname: Matrikelnummer: Stud.-Abschnitt: Aufgabe 1 (Syntax): (12 Punkte) Das folgende Java Programm Bubblesort enthält insgesamt 15 Syntax- und Typisierungsfehler. Markieren Sie davon mindestens 12 Fehler deutlich im Programmtext und korrigieren Sie diese eindeutig ohne Hinzufügen neuer Anweisungen. Tragen Sie die im Programmtext markierten Fehler in die Tabelle auf der Seite gegenüber ein und geben Sie die jeweilige Zeilennummer und die Korrektur an. Hinweis: Das Programm soll nicht auf seine Korrektheit hin überprüft werden; die Fehler sollen lediglich syntaktisch korrigiert werden. Bewertung: • Für jeden korrekt markierten Fehler erhalten Sie 0,5 Punkte • Für jeden fälschlich markierten Fehler werden 0,5 Punkte abgezogen • Für jede richtige Korrektur erhalten Sie 0,5 Punkte • Für jede falsche Korrektur werden 0,5 Punkte abgezogen Maximal können sie in dieser Aufgabe 12 Punkte erreichen; eine negative Punktzahl für diese Aufgabe insgesamt ist nicht möglich (im schlimmsten Fall erhalten Sie 0 Punkte). 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. public class Bubblesort { public static void main(String[] args) ( sortiert boolean; int() a = new int[] { 2, 4, 6, 1, 5, 3 }; do { sortiert = true; for (int i == 0; i < a.length - 1; i++) { if (a[i] > a[i + 1]) { int h = a[i]; a[i] = a[i + 1] a[i + 1] = h; sortiert := false; } } } while (boolean sortiert == false); Out.print(Das sortierte Array: ); For (int i = 0.0; i < a.length; i+) { if (int < a.length - 1) { Out.print(a(i) + ", "); } Else { Out.print(a[i]); } }} } } -2- Name: Vorname: Matrikelnummer: Stud.-Abschnitt: Aufgabe 1 (Fortsetzung) Tragen Sie die Fehler und die Korrekturen in die folgende Tabelle ein. Es reicht, wenn Sie 12 Fehler angeben und korrigieren! Nr. Zeile Fehler Korrektur 1 3. ( { 2 4. sortiert boolean; boolean sortiert; 3 5. int() a int[] a 4 9. int i == 0 int i = 0 5 12. a[i] = a[i + 1] a[i] = a[i + 1]; 6 15. := = 7 18. boolean sortiert boolean löschen 8 20. Out.print(Text); Out.print("Text"); 9 22. For for 10 22. int i = 0.0; int i = 0; 11 22. i+ i++ 12 23. int < a.length i < a.length 13 24. a(i) a[i] 14 25. Else else 15 28. }} } Erläuterung der Fehler: Nr. Zeile Fehler Erläuterung 1 3. ( Der Rumpf einer Klasse muss in {} eingeschlossen sein. 2 4. sortiert boolean; 3 5. int() a 4 9. int i == 0 5 12. a[i] = a[i + 1] 6 15. := Bei der Deklaration von Variablen muss der Typ vor dem Namen der Variablen stehen. Bei der Deklaration von Arrays wird ein Array durch [] gekennzeichnet. Bei der Initialisierung muss eine Zuweisung erfolgen, ein boolescher Ausdruck ist nicht zulässig. Jede Anweisung muss mit einem Semikolon abgeschlossen werden. In Java erfolgt eine Zuweisung durch das Gleichheitszeichen. -3- Name: Vorname: Matrikelnummer: Stud.-Abschnitt: Variablen dürfen nur einmal deklariert werden. Die Variable sortiert wird bereits in Zeile 4 deklariert. Ein String-Literal muss von Gänsefüßchen "" eingeschlossen sein. 7 18. boolean sortiert 8 20. Out.print(Text); 9 22. For Das Schlüsselwort for ist falsch geschrieben. 10 22. int i = 0.0; Der int-Variable i darf kein Double-Wert zugewiesen werden. 11 22. i+ i+ ist kein zulässiger Ausdruck. 12 23. int < a.length 13 24. a(i) 14 25. Else Das Schlüsselwort else ist falsch geschrieben. 15 28. }} Zu jeder öffnenden Klammer gehört genau eine schließende Klammer und umgekehrt. Bei einem booleschen Ausdruck müssen auf der linken und rechten Seite gültige Ausdrücke stehen. Der Zugriff auf das Element eines Arrays erfolgt durch den Index in eckigen Klammern a[i]. -4- Name: Vorname: Matrikelnummer: Stud.-Abschnitt: Aufgabe 2 (Ausdrücke und Typisierung): (17 Punkte) (a) Welche dieser Zeichenketten sind gemäß der Definition der Programmiersprache Java korrekte Ausdrücke? Geben Sie für jeden korrekten Ausdruck seinen Typ an! Dabei sind a und b Variablen vom Typ int. korrekt Ja Nein korrekt Typ Ja Typ Nein a) -(a + b) x int b) a - - b == 5 c) a++ * --b x int d) 5 + ((b * 12.0D) e) (15.0 b) - a x f) "ab" + 7 * 10 x String g) b % a = 8 x h) a – (b) < - 3 x boolean x boolean x (b) Geben Sie für die folgenden Ausdrücke den Syntaxbaum mit Auswertungsformular an und werten Sie es für die Werte a = 1 und b = -10 aus. Beschriften Sie jedes Zwischenergebnis mit seinem Typ! Dabei sind a und b Variablen vom Typ int. a) 10 - a * (20.0 + b) b) "ab" + 7 / 10 + "14" 0.0 - double "ab014" + String 10 10.0 * double 10 "ab0" String "14" "14" + int String 1 int 10.0 + double a "ab" String 20.0 double 20.0 0 / int “ab“ -10 b 10 int 7 int 7 (c) Was Erläutern Sie kurz den Begriff der Backus-Naur-Form (BNF)! Wozu dient sie? Die Backus-Naur-Form (BNF) dient zur Definition der Syntax einer Sprache. Oder: Die Backus-Naur-Form definiert die Regeln zum Formulieren korrekter Ausdrücke. -5- 10 int Name: Vorname: Matrikelnummer: Stud.-Abschnitt: Aufgabe 3 (Kontrollstrukturen): (26 Punkte) (a) Schreiben Sie ein Programm, welches das Verhalten des Einsiedlers ONE im Lippischen Hochgebirge beschreibt. ONE lebt nach strengen Verhaltensregeln. Er verlässt seine Höhle nur unter folgenden Bedingungen: • • • Wenn ONE dringend etwas zu essen braucht, geht er unabhängig von Uhrzeit und Wetter immer raus (zum Jagen oder Fischen). Nachts geht er raus, wenn der Strom ausgefallen ist (der Fernseher läuft nicht mehr). Tagsüber geht er bei Temperaturen ab 20°C raus (er kann sich in der Sonne bräunen). Nach dem Start des Programms soll der Benutzer die Werte für die Variablen esIstNacht, stromIstAusgefallen, ichHabeHunger und temperatur eingeben. Die Temperatur wird in Grad Celsius angegeben. Ihr Programm soll ausgeben, ob ONE bei den gegebenen Bedingungen aus seiner Höhle geht oder nicht. Ergänzen Sie dazu den folgenden Programmtext auf geeignete Weise: public class Rausgehen { public static void main(String[] args) { Out.print("Ist es Nacht?"); boolean esIstNacht = In.readBoolean(); Out.print("Ist der Strom ausgefallen?"); boolean stromIstAusgefallen = In.readBoolean(); Out.print("Habe ich Hunger?"); boolean ichHabeHunger = In.readBoolean(); Out.print("Welche Temperatur ist draußen?"); int temperatur = In.readInt(); boolean ichGeheRaus = false; if (ichHabeHunger) { ichGeheRaus = true; } else if (esIstNacht) { if (stromIstAusgefallen) { ichGeheRaus = true; } } else { // es ist Tag if (temperatur >= 20) { ichGeheRaus = true; } } if (ichGeheRaus) { Out.println("Ich gehe raus."); } else { Out.println("Ich bleibe in der Höhle."); } } } -6- Name: Vorname: Matrikelnummer: Stud.-Abschnitt: Aufgabe 3 (Fortsetzung – Kontrollstrukturen und Funktionen) (b) Schreiben Sie ein Java-Programm, das eine vom Benutzer einzugebende Zahl n einliest und anschließend die Summe aller Primzahlen zwischen 1 und n (1 und n eingeschlossen) berechnet und ausgibt. Bevor die Summe ausgegeben wird, soll auch jede der aufsummierten Primzahlen ausgegeben werden. Ergänzen Sie dazu den folgenden Programmtext auf geeignete Weise. Die Funktion primzahl ist gegeben und muss von Ihnen nicht implementiert werden. Verwenden Sie diese, um die Aufgabe zu erfüllen. Die Funktion primzahl gibt true zurück, wenn die als Parameter übergebene Zahl eine Primzahl ist, ansonsten false. public class PrimzahlSumme { public static boolean primzahl(int zahl) { // Gibt true zurück, wenn zahl eine Primzahl ist, sonst false. // Funktion primzahl muss von Ihnen NICHT implementiert werden! ... } public static void main(String[] args) { Out.print("Bitte geben Sie die Zahl n ein:"); int n = In.readInt(); int summe = 0; for (int i = 1; i <= n; i++) { if (primzahl(i)) { summe = summe + i; Out.print(i + " "); } } Out.println(); Out.println("Das Ergebnis ist " + summe + "."); } } -7- Name: Vorname: Matrikelnummer: Stud.-Abschnitt: Aufgabe 4 (Arrays und Funktionen): (20 Punkte) Der Student Martin Mustermann hat für die Funktion f(x)=x3-2x2-19x+20 die folgenden Nullstellen gefunden: -2, 0, 5. Diese Werte hat er in einem Array von ganzen Zahlen int[] nullstellen gespeichert. Formulieren Sie ein Programm, das für die oben genannte Funktion f überprüft, ob das Array nullstellen wenigstens eine Nullstelle enthält. Ihr Programm soll dazu die erste Nullstelle im Array bestimmen und diese am Bildschirm ausgeben: „Zahl xxx ist eine Nullstelle der betrachteten Funktion“. Wenn das Array keine Nullstelle der Funktion enthält, soll Ihr Programm die folgende Meldung ausgeben: „Keine Nullstelle gefunden“. Ergänzen Sie dazu die unten angegebene Funktion f, die für das Argument x den Wert des Polynoms berechnet, auf geeignete Weise. Ergänzen Sie auch das Hauptprogramm entsprechend. Formulieren Sie Ihr Programm so allgemein, dass es für jedes Array von ganzen Zahlen funktioniert und nicht nur für das unten angegebene Array. Um Probleme mit Rundungsfehlern zu vermeiden, soll Ihr Programm nur mit ganzen Zahlen arbeiten. Berücksichtigen Sie das insbesondere bei der Deklaration der Funktion f. Hinweis: In Java gibt es keine Potenzoperation. Sie kann aber mit Hilfe der Multiplikation ausgedrückt werden. public class Nullstellenpruefer { public static int f(int x){ return x*x*x-2*x*x-19*x+20; } public static void main(String[] args){ int[] nullstellen = {-2, 0, 5}; for(int i = 0; i < nullstellen.length; i++){ if(f(nullstellen[i]) == 0){ Out.println("Zahl " + nullstellen[i]+ " ist eine Nullstelle der betrachteten"+ " Funktion"); return; } } Out.println("Keine Nullstelle wurde gefunden"); } } -8- Name: Vorname: Matrikelnummer: Stud.-Abschnitt: Aufgabe 5 (Programmverständnis): (15 Punkte) Gegeben ist die folgende Funktion: public static void s(int n) { boolean[] a = new boolean [n+1]; for (int i = 2; i*i <= n; i = i + 1) { if (!a[i]) { int x = i * i; while (x <= n) { a[x] = true; x = x + i; } } } for (int j = 2; j <= n; j++) { if(!a[j]) { Out.print(j + " "); } } } (a) Bestimmen sie welche Werte das Array a für n=16 beim Beenden der Funktion besitzt. Welche Werte gibt diese Funktion auf die Konsole aus? Tragen Sie für die erste der beiden for-Schleifen für jeden Schleifendurchlauf den Wert der Laufvariablen i sowie den Inhalt des Arrays a am Ende des jeweiligen Schleifendurchlaufs in die nachfolgende Tabelle ein! Kennzeichnen Sie die Elemente des Arrays a mit dem Wert true mit einem großen T und die Elemente mit dem Wert false mit einem großen F! Es reicht, wenn Sie nur die Elemente auf diese Weise kennzeichnen, die sich in dem Schleifendurchlauf verändert haben. Schleifendurchlauf i Beginn 1 2 2 3 3 4 Array a 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 F F F F F F F F F F F T T T F T T 4 5 6 7 8 Ausgabe auf dem Bildschirm: 2 3 5 7 11 13 (b) Beschreiben Sie kurz, welche Aufgabe die Funktion s erfüllt! Die Funktion gibt die Primzahlen von 1 bis n auf dem Bildschirm aus. -9- F T T F F F T F T T