Name: Vorname: Matrikelnummer: Stud.-Abschnitt: Klausur zur Lehrveranstaltung Technische Informatik für Ingenieure WS 2005/06 21. Februar 2006 Aufgabe mögliche Punkte 1 2 3 4 5 Summe 15 15 20 25 15 90 erreichte Punkte Note: Hinweise: • Diese Klausur umfaßt 5 Aufgaben und 10 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): (15 Punkte) Das folgende Java Programm Primzahl enthält insgesamt 15 Syntax- und Typisierungsfehler. Markieren Sie davon mindestens 12 Fehler deutlich im Programmtext und korrigieren Sie diese eindeutig. 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. Geben Sie in der Tabelle darunter zusätzlich für drei Fehler Ihrer Wahl eine kurze Erläuterung des Fehlers 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 gibt es 0,5 Punkte • Für jeden fälschlich markierten Fehler werden 0,5 Punkte abgezogen • Für jede richtige Korrektur gibt es 0,5 Punkte • Für jede falsche Korrektur werden 0,5 Punkte abgezogen • Für jede richtige Erläuterung gibt es 1 Punkt (maximal 3 Punkte) Maximal können sie in dieser Aufgabe 15 Punkte erreichen; eine negative Punktzahl für diese Aufgabe insgesamt ist nicht möglich (im schlimmsten Fall erhalten Sie 0 Punkte). 1. public class Primzahl ( 2. public static void main(String[] args) { zahl int; boolean teilerGefunden+1; Out.print("Wie viele Zahlen wollen sie testen? "), int wiederholung = In.readDouble(); 3. 4. 5. 6. 7. 8. for (int i = 0.0; i < wiederholung; i+) { teilerGefunden = = false; Out.println("Geben Sie eine Zahl ein:"); In.readInt() = zahl; 9. 10. 11. 12. 13. for (int t = 2; t ** t <= zahl; t++) { if (zahl % t = 0) { teilerGefunden = true; break; } } 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. ) } } else if (true = teilerGefunden) { Out.println(" ist keine Primzahl."); } Else { Out.println(" ist Primzahl."); } -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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Tragen Sie die Erläuterung der Fehler in die folgende Tabelle ein. Es reicht, wenn Sie drei Fehler näher erläutern! Nr. Zeile Fehler Erläuterung 1 2 3 -3- Name: Vorname: Matrikelnummer: Stud.-Abschnitt: Aufgabe 2 (Ausdrücke und Typisierung): (15 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! a und b sind Variablen vom Typ int a) 5 (23.0 + b) b) a - - b c) 5.0 + < 10 d) (a) / 10.0D - b e) a == 5 f) "abc" + 5 + 10 + "def" g) 10 % 2 = 5 h) (a +) 23 * b (b) Geben Sie für die folgenden Ausdrücke den Syntaxbaum mit Auswertungsformular an. Beschriften Sie dabei jedes Zwischenergebnis mit seinem Typ! a) (1 / 10) * 20.0 b) "abc" + 5 * 10 + "def" (c) Erläutern Sie kurz den Begriff der "strengen Typisierung" in Java! -4- Name: Vorname: Matrikelnummer: Stud.-Abschnitt: Aufgabe 3 (Kontrollstrukturen): (20 Punkte) (a) Schreiben Sie ein Programm, das Ihnen bei der Auswahl eines Geschenks für eine Person hilft. Nach dem Start des Programms soll der Benutzer die Werte für die zwei Variablen weiblich und alter eingeben. Die Variable weiblich gibt dabei an, ob die Person weiblich (weiblich==true) oder männlich (weiblich==false) ist; die Variable alter gibt das Alter der Zielperson in Jahren an. Ihr Programm soll dann die folgenden Ausgaben am Bildschirm liefern: 1. „Puppe“ für weibliche Personen unter 12 Jahren 2. „Schuhe“ für weibliche Personen zwischen 12 und 29 Jahren (Grenzen inklusive) 3. „Socken“ für alle anderen weiblichen Personen 4. „Matchboxauto“ für männliche Personen unter 18 Jahren 5. „Ferrari“ für männliche Personen zwischen 18 und 32 Jahren (Grenzen inklusive) 6. „Krawatte“ für alle anderen männlichen Personen Ergänzen Sie dazu den folgenden Programmtext auf geeignete Weise: public class Geschenk { public static void main(String[] args) { boolean weiblich = In.readBoolean(); int alter = In.readInt(); } } -5- Name: Vorname: Matrikelnummer: Stud.-Abschnitt: Aufgabe 3 (Fortsetzung) (b) Gegeben ist eine Funktion f wie unten definiert. Schreiben Sie ein Java-Programm, das zu einer vom Benutzer eingegebenen Zahl n den folgenden Wert berechnet und am Bildschirm ausgibt: f(1) + f(2) + f(3) + … + f(n) Ergänzen Sie dazu den folgenden Programmtext auf geeignete Weise: public class FunktionsSumme { public static double f(int n) { return 1.0 / (n*n); } public static void main(String[] args) { } } -6- Name: Vorname: Matrikelnummer: Stud.-Abschnitt: Aufgabe 4 (Arrays und Funktionen): (25 Punkte) (a) Formulieren Sie ein Programm, das für ein Array von ganzen Zahlen int[] a und eine vom Benutzer eingegebene ganze Zahl int n den Index des ersten Elementes im Array a am Bildschirm ausgibt, in dem die Zahl n gespeichert ist. Wenn die Zahl n in dem Array nicht vorkommt, soll -1 am Bildschirm ausgegeben werden. Formulieren Sie Ihr Programm so allgemein, daß es für jedes Array funktioniert und nicht nur für das unten angegebene Array. Ergänzen Sie dazu den folgenden Programmtext auf geeignete Weise. public class Index { public static void main(String[] args) { int[] a = { 7, 0, 3, 5, 8, 3, -4, 9 }; int n = In.readInt(); } } -7- Name: Vorname: Matrikelnummer: Stud.-Abschnitt: Aufgabe 4 (Fortsetzung) (b) Formulieren Sie eine Funktion count, die ein Array von Zahlen double[] zahlen und zwei Zahlen double ug und double og als Argumente nimmt. Die Funktion soll die Anzahl der Elemente des Arrays zählen, die in dem geschlossenen Intervall [ug ; og] liegen (einschließlich der Grenzen), und diese Anzahl als Ergebnis zurück geben. Geben Sie einen geeigneten Rückgabetyp für diese Funktion an. Ergänzen Sie dazu den folgenden Programmtext auf geeignete Weise. public static ___ count(double[] zahlen, double ug, double og) { } -8- Name: Vorname: Matrikelnummer: Stud.-Abschnitt: Aufgabe 5 (Programmverständnis): (15 Punkte) Gegeben ist die folgende Funktion public static int s(int[] feld, int x) { int unten=0, mitte=0, oben=feld.length; while (unten<oben) { mitte=(unten+oben)/2; if (feld[mitte]==x) { return mitte; } if (feld[mitte]>x) { oben=mitte; } else { unten=mitte+1; } } } return -1; (a) Berechnen Sie den Rückgabewert der Funktion s bei einem Aufruf mit den Parametern int[] feld mit Index Inhalt 0 3 1 23 2 34 3 38 4 40 5 59 6 72 7 97 und int x mit 23 sowie 51. Füllen sie dazu die folgenden Tabellen aus (soweit wie nötig): x = 23: Schleifendurchlauf vor 1. nach 1. nach 2. nach 3. nach 4. nach 5. nach 6. Rückgabewert: x = 51 Schleifendurchlauf vor 1. nach 1. nach 2. nach 3. nach 4. nach 5. nach 6. Rückgabewert: unten mitte oben unten mitte oben -9- Name: Vorname: Matrikelnummer: Stud.-Abschnitt: Aufgabe 5 (Fortsetzung) (b) Beschreiben Sie die Aufgabe, die die Funktion s erfüllt. Gehen Sie dabei davon aus, dass die Funktion immer mit einem sortierten Array feld aufgerufen wird. Hinweis: Die Funktion s ist sinnvoll und enthält keine „Gemeinheiten“ oder verborgene Fehler. - 10 -