Prof. Dr. M. Sommer M. Vincon Zwischen-Klausur Praktische Informatik I ! Lösung ! WS 2007/08 Bitte folgendes in Druckbuchstaben ausfüllen: Nachname: Vorname: Matrikelnummer: Studiengang: Sind Sie in einem Bachelor- oder Lehramts-Studiengang eingeschrieben (Antwort bitte ankreuzen)? Ja/Nein Bitte beachten Sie: • Zugelassen sind alle nicht-elektronischen Hilfsmittel außer den Banknachbarn. • Bei Aufgaben, wo falsche Antworten -1P geben, gibt keine Antwort auf eine Frage jeweils nur 0P und nicht auch -1P. • Bitte tragen Sie auf jedem Blatt der Klausur Ihren Namen ein! • Halten Sie Studentenausweis und Lichtbildausweis bereit. • Wenn Sie einen unbenoteten Schein aus einer früheren Vorlesung Praktische Informatik 1 besitzen, so zeigen Sie diesen und die Ausweise unaufgefordert vor. Viel Erfolg ! Aufgabe 1: Richtig oder Falsch? (I) _____/ 10 Punkte Aufgabe 2: Zahlensysteme und Java-Ausdrücke _____/ 9 Punkte Aufgabe 3: L-Systeme und EBNF _____/ 8 Punkte Aufgabe 4: Algorithmen _____/ 10 Punkte Aufgabe 5: Schleifen und Arrays _____/ 10 Punkte Aufgabe 6: Boolsche Algebra und Wahrheitstafeln _____/ Aufgabe 7: Fehlersuche und Klassen-Modellierung _____/ 10 Punkte Aufgabe 8: Richtig oder Falsch? (II) _____/ Ergebnis Klausur Erreichte Punkzahl 6 Punkte 7 Punkte Max. Punkte 70 Name, Vorname: _______________________, __________________________ Aufgabe 1: Richtig oder Falsch? (I) _____/ 10 Punkte Kreuzen Sie bei den folgenden Aussagen „Richtig“ oder „Falsch“ an. Für jede richtige Auswahl gibt es 1P. Bitte beachten Sie, dass jede falsche Antwort mit –1P in die Wertung eingeht! Jede nicht gegebene Antwort wird aber nur als 0P gewertet. Sollten Sie eine negative Punktzahl erreichen, wird diese Aufgabe mit 0P gewertet. Geben Sie keine zusätzlichen Erläuterungen oder Einschränkungen zu Ihrer Auswahl an! Nr. Aussage Richtig Falsch X 1 Sa und So sind mit folgender Definition keine Arbeitstage: enum WochenTag { Mo, Di, Mi, Do, Fr, Sa, So; boolean istArbeitstag(){ return this.ordinal() > 4; } } 2 Mit 6 Bit kann man 64 verschiedene Werte und Möglichkeiten codieren. X X 3 Ein Algorithmus ist determiniert, wenn es zu jeder möglichen Eingabe genau einen, vorher bestimmbaren Ablauf gibt. 4 Das Ergebnis von “1“+(1+1) ist “12“ X X 5 Das Ergebnis von “(1+1)“+1 ist “21“ X 6 In folgendem Code-Fragment wird der Schleifenrumpf kein einziges Mal durchlaufen: boolean x = false; while(x = true){x=false;} X 7 Das Ergebnis von (-8 >>> 2) ist -2 8 Jede primitiv rekursive Funktion ist berechenbar 9 “abcbbc”.matches(“ab+c”) ergibt false 10 Die Klasse Math kann nur benutzt werden, wenn sie vorher per import-Anweisung importiert wurde. X X X Seite 2/15 Name, Vorname: _______________________, __________________________ Aufgabe 2: Zahlensysteme und Java-Ausdrücke _____/ 9 Punkte a) Füllen Sie die leeren Zellen der folgenden Tabelle aus. Gehen Sie dabei in jeder Zeile von der gegebenen Darstellung der Zahl aus und rechnen Sie die Zahl in die fehlenden Darstellungen um. (2P) Binär Oktal 1110111 167 10110001 261 Dezimal Hexadezimal 77 119 177 B1 b) Geben Sie die 2er-Komplementdarstellung mit sechs Bits der folgenden Zahl an:(1P) Dezimal: -17 2er-Komplement: 1 0 1 1 1 1 c) Füllen Sie die letzte Spalte der folgenden Tabelle mit der jeweiligen Ausgabe der System.out.println-Anweisung aus. (6P) Nr. Anweisung Ausgabe 1 int x = 1, y = 2; System.out.println(x++ * ++y - x); 1 2 int x = 1, y = 2; System.out.println(x < y ? y++ / y | x : ++x); 1 3 int x = 1, y = 2, z; System.out.println(x + (z = x << y) - y | z); 7 Seite 3/15 Name, Vorname: _______________________, __________________________ Aufgabe 3: L-Systeme und EBNF a) Gegeben sei das folgende L-System _____/ 8 Punkte (4P) Alphabet: { F, + , - } Startregel: F--F--F Regel 1: F => F+F--F+F (1P) Wie sieht das Ergebnis der 1. Ersetzung aus, d.h. wenn die Regel 1 genau einmal auf jede Ersetzungsmöglichkeit in der Startregel angewendet wurde? F+F--F+F -- F+F--F+F -- F+F--F+F Wenn man die Ergebnisse grafisch interpretiert, als würde man mit den Buchstaben einen Stift steuern, dann haben die Buchstaben die folgende Bedeutung: F + - Bewege den Stift in die eingestellte Richtung bzw. Orientierung und ziehe dabei eine gerade Linie mit einer festen Länge, der Stift bleibt danach in der erreichten Position stehen Drehe die Richtung des Stiftes um 60 Grad gegen den Uhrzeigersinn Drehe die Richtung des Stiftes um 60 Grad mit dem Uhrzeigersinn. Das Zeichnen der Startregel würde dann wie folgt aussehen: Seite 4/15 Name, Vorname: _______________________, __________________________ (3P) Wie sieht ungefähr das Bild (ohne Hilfslinien und Winkel) aus, wenn Sie das Ergebnis der 1. Ersetzung mit den obigen Vorschriften zeichnen wollen? Seite 5/15 Name, Vorname: _______________________, __________________________ b) Gegeben seien die folgenden EBNF-Regeln: (4P) Programm = `PROGRAM` Bezeichner `BEGIN` { Zuweisung [`;`] } `END` `.` ; Bezeichner = Buchstabe { ( Buchstabe | Ziffer ) } ; Zahl = [ `-` ] Ziffer { Ziffer } ; String = `"` { Buchstabe | Ziffer} `"` ; Zuweisung = Bezeichner `:=` ( Zahl | Bezeichner | String ) ; Buchstabe = `A` | `B` | `C` | `D` | `E` | `F` | `G` | `H` | `I` | `J` | `K` | `L` | `M` | `N` | `O` | `P` | `Q` | `R` | `S` | `T` | `U` | `V` | `W` | `X` | `Y` | `Z` ; Ziffer = `0` | `1` | `2` | `3` | `4` | `5` | `6` | `7` | `8` | `9` ; Geben Sie für die folgenden Beispiele an, ob sie sich mit den gegebenen EBNFRegeln aus Programm ableiten lassen. Für jede richtige Antwort gibt es 1P. Bitte beachten Sie, dass jede falsche Antwort mit –1P in die Wertung eingeht! Jede nicht gegebene Antwort wird aber nur als 0P gewertet. Sollten Sie eine negative Punktzahl erreichen, wird diese Teilaufgabe mit 0P gewertet. Geben Sie keine zusätzlichen Erläuterungen oder Einschränkungen zu den angekreuzten Antworten an! Bemerkung: Nr. Der besseren Lesbarkeit halber wurden die Wörter der Programme durch Leerzeichen getrennt. SATZ JA NEIN 1 PROGRAM TEST BEGIN TEST := 01; END. X 2 PROGRAM TEST BEGIN TEST := TEST; END. X 3 PROGRAM TEST BEGIN TEST := "-01"; END. 4 PROGRAM TEST BEGIN TEST := 01 TEST2 := "FF" END. X X Seite 6/15 Name, Vorname: _______________________, __________________________ Aufgabe 4: Algorithmen _____/ 10 Punkte a) Formulieren Sie in einfachen Sätzen ausführlich und unmissverständlich einen Algorithmus (ohne Vor- und Nachbedingung), mit dem Sie eine Division mit Rest von zwei Zahlen m und n auf dem Papier durchführen. (5P) Einmal am Beispiel 189 und 11, das Endergebnis wäre 17, Rest 2 und die schriftliche Rechnung sähe dann zum Beispiel wie folgt aus 189 : 11 = 017 0 18 11 79 77 02 Algorithmus zum Beispiel 1) Betrachte aktuellen Rest r (am Anfang 1. Ziffer des Dividenden) 2) Bestimme Quotientenziffer qi, so dass gilt r - qi*n <= n und r – (qi -1) *n > n 3) Schreibe qi zum Divisionsergebnis 4) Schreibe qi*n unter den Rest r 4) Bestimme den neuen Rest r als alten Rest r minus qi*n (r - qi*n) 5) Nimm die nächste Ziffer des Dividenden dazu und gehe zurück zu 1), wenn es keine nächste Ziffer gibt, dann gib r als Rest aus Seite 7/15 Name, Vorname: _______________________, __________________________ b) Gegeben sei das folgende Unterprogramm a, das mit zwei natürlichen Zahlen m (5P) und n als Eingabe aufgerufen wird: public static int a(int m, int n){ if ( m > 99 || n > 99 || m < 0 || n < 0) return -1; int z11,z12,z21,z22; z11 z12 z21 z22 = = = = m m n n % / % / 10; 10; 10; 10; return (z12*z22)·100 + (z11*z22 + z12 * z21)·10 + z11 * z21; } Was wird durch a in Abhängigkeit von m und n berechnet (abgesehen von dem Rückgabewert -1)? a(m, n) = m*n Beschreiben Sie kurz, wie der gegebene Algorithmus a(m, n) berechnet: Der Algorithmus gibt -1 zurück, wenn eine der beiden Zahlen < 0 oder > 99 ist, er arbeitet also auf Zahlen zwischen 0 und 99. Die Zahlen werden dann jeweils in ihre beiden Ziffern zerlegt und diese dann geeignet multipliziert und addiert, um letztendlich das Produkt aus m und n zu bilden. Oder besser … sei m = z12·10 + z11 und n = z22·10 + z21 Ist beispielsweise m = 78 und n = 21, so lautet die Zerlegung in Ziffern z12 = 7 und z11 = 8 sowie z22 = 2 und z21 = 1. Jetzt überlegen wir uns, wie das Produkt m*n in Ziffern ausgedrückt aussieht: m*n = (z12·10 + z11) · (z22·10 + z21) = (z12·z22)·100 + (z11·z22 + z12·z21)·10 + z11·z22 Seite 8/15 Name, Vorname: _______________________, __________________________ Aufgabe 5: Schleifen und Arrays In dieser Aufgabe soll ein kurzes Programm entwickelt werden, welches die Multiplikation von großen Zahlen wie man sie üblicherweise aus der Schule kennt, nachbildet. Ein Beispiel sehen wir in der Abbildung rechts. Zur Durchführung der Multiplikation wollen wir mit Arrays und Schleifen arbeiten. Vervollständigen Sie das Gerüst. _____/ 10 Punkte 5678*4321 5678 11356 17034 22712 + 24534638 int[] zahl1 = nimmBeliebigeZahl(), zahl2 = nimmBeliebigeZahl(); int[][] rechentafel = new int[zahl2.length][ zahl1.length+zahl2.length]; int[] ergebnis = new int[zahl1.length+zahl2.length]; for(int i = zahl2.length-1;i>=0;i--){ for(int j = zahl1.length-1;j >= 0;j--){ int erg = zahl2[i] * zahl1[j] + rechentafel[zahl2.length-i-1] [zahl1.length+zahl2.length+1-(zahl1.length-j)-(zahl2.length-i)]; int z1 = erg % 10; int z2 = erg / 10; rechentafel[zahl2.length-i-1] [zahl1.length+zahl2.length+1-(zahl1.length-j)-(zahl2.length-i)] = z1; if(z2 > 0) rechentafel[zahl2.length-i-1] [zahl1.length+zahl2.length-(zahl1.length-j)-(zahl2.length-i)] = z2; } } for(int i = ergebnis.length-1; i >= 0;i--){ Seite 9/15 Name, Vorname: _______________________, __________________________ for(int j = 0; j < rechentafel.length;j++){ ergebnis[i] += rechentafel [j][i]; } while(ergebnis[i] > 9){ ergebnis[i-1] += ergebnis[i] / 10; ergebnis[i] = ergebnis[i] % 10; } } Seite 10/15 Name, Vorname: _______________________, __________________________ Aufgabe 6: Boolsche Algebra und Wahrheitstafeln _____/ 6 Punkte In der zweiwertigen Logik unterscheidet man nur die Wahrheitswerte W (für wahr) und F (für falsch). Diese kann man in Wahrheitstafeln zum einfachen Beweis von Rechenregeln benutzen. Beispiel: Seien A, B beliebige Aussagen. Wir benutzen die Symbole ¬ für NOT, ∧ für AND und ∨ für OR. Wir wollen nun die Gültigkeit der (trivialen) Aussage A ∨ (A ∧ ¬ B) ⇔ A mit einer Wahrheitstafel beweisen. Diese sieht wie folgt aus: A F F W W B F W F W A F F W W ∨ ( A ∧ ¬ B ) ⇔ F F F W F W F F F F W W W W W W F W W W F F W W A F F W W In den ersten beiden Spalten werden alle Kombinationen von A und B (und im Zweifelsfall C) durchgespielt, die man dann auf alle Vorkommen von A und B (und C) überträgt. Danach füllt man die anderen Spalten der Tabelle nach den Präzedenzregeln für (geklammerte) boolesche Operationen aus, d.h. im Beispiel erst die Spalte für ¬, dann ∧ und ∨ und schließlich die Spalte für ⇔. Steht in dieser zuletzt ausgefüllten Spalte überall ein W, ist die Aussage bewiesen. Beweisen oder Widerlegen Sie mit Hilfe von Wahrheitstafeln: a) (2P) A ∧ (¬A ∨ B) ⇒ B b) (2P) A ∨ B ⇔ (A ⇒ C) ⇒ B c) (2P) (A ∨ ¬A) ∧ C ⇔ (B ∧ ¬B) XOR C A F F W W B F W F W A ∧ ( ¬ A ∨ B ) ⇒ B F F W W F W F W F F F W W W F F F F W W W W F W F W F W W W W W Seite 11/15 Name, Vorname: _______________________, __________________________ A F F F F W W W W A F F F F W W W W B F F W W F F W W B F F W W F F W W C F W F W F W F W C F W F W F W F W A ∨ B ⇔ ( A ⇒ C )⇒ B F F F F W W W W W W W W F W F W F F W W W W W W F F W W F F W W W W W W W F W W F F F F W W W W ( A ∨ ¬ A ) ∧ C F F F F W W W W W W W W W W W W W W W W F F F F F F F F W W W W F W F W F W F W F W F W F W F W F W F W F W F W F F W W W F W W F F W W F F W W ⇔ ( B ∧ ¬ B ) XOR C W W W W W W W W F F W W F F W W F F F F F F F F W W F F W W F F F F W W F F W W F W F W F W F W F W F W F W F W Seite 12/15 Name, Vorname: _______________________, __________________________ Aufgabe 7: Fehlersuche und Klassen-Modellierung _____/ 10 Punkte a) Die folgende Java-Klasse enthält einige Fehler. Geben Sie die Zeilennummer jedes Fehlers (möglichst in der Zeile, wo sie auch der Compiler erkennt) mit einer kurzen Fehlerbeschreibung an. Bitte markieren bzw. korrigieren Sie die Fehler nicht im angegebenen Code! Geben Sie nicht mehr als 8 Fehler an, da falsch angegebene Fehler sonst zu Punktabzug führen. (7P) public class Test{ /* 1 */ private int[] b /* 2 */ public Test(int b){ this.b=b; } /* 3 */ /* 4 */ public int op1 (int c) { if( c < 0 || c >= b.length()) return -1; return b(c); } /* /* /* /* public boolean op2(int c) for(int c = 0; i < b.length;i++) if(n[i] == c) return true; return false; } 5 6 7 8 */ */ */ */ /* 9 /* 10 /* 11 /* 12 /* 13 */ */ */ */ */ } Zeile 2: Semikolon vergessen Zeile 4: Der Parameter b ist kein Array Zeile 6: length ist ein Feld und keine Methode eines Arrays Zeile 8: b(c) wäre eine Methode, ist aber Array Zeile 9: Es fehlt die öffnende { Zeile 10: c wird noch einmal deklariert, es sollte aber i sein Zeile 11: Es gibt kein Array mit Namen n Seite 13/15 Name, Vorname: _______________________, __________________________ b) Entwerfen Sie eine Klasse, die einen ganzzahligen Bruch modelliert und darstellt. Die Klasse soll zwei Variablen vom Typ int enthalten (für Zähler und für Nenner) und mit Datenkapselung arbeiten. Außerdem braucht sie auch noch einen Konstruktor. (3P) class Bruch{ private int zaehler; private int nenner; public Bruch(int n, int z){ zaehler=z; nenner=n; } public void setZaehler(int z){ zaehler=z; } public void setNenner(int n){ nenner=n; } public int getZaehler(){ return zaehler; } public int getNenner(){ return nenner; } } Seite 14/15 Name, Vorname: _______________________, __________________________ Aufgabe 8: Richtig oder Falsch? (II) _____/ 7 Punkte Kreuzen Sie bei den folgenden Aussagen „Richtig“ oder „Falsch“ an. Für jede richtige Auswahl gibt es 1P. Bitte beachten Sie, dass jede falsche Antwort mit –1P in die Wertung eingeht! Jede nicht gegebene Antwort wird aber nur als 0P gewertet. Sollten Sie in einer Teilaufgabe eine negative Punktzahl erreichen, wird diese Teilaufgabe mit 0P gewertet. Geben Sie keine zusätzlichen Erläuterungen oder Einschränkungen zu Ihrer Auswahl an! a) Geben sie an, ob die folgenden Anweisungen und Ausdrücke in einem syntaktisch korrekten Java-Programm (außerhalb von Kommentaren oder Strings) vorkommen dürfen. (5P) Nr. Java-Ausdruck bzw. –Anweisung Richtig 1 n*fak(n-1) X 2 a + (b = c) X 3 a.mitte.x = 3; X 4 (n > 1)?true:false X 5 "ab".equals("ab") X Falsch b) Gegeben sei die folgende Methode: (2P) public void Shift(int a) { while (a % 2 > 0) a <<= 1; } Welche der folgenden Aussagen ist richtig? Das Ankreuzen von mehreren Antworten führt zu Punktabzügen. 1 Der Schleifenrumpf läuft genau einmal 2 Der Schleifenrumpf läuft mehr als einmal 3 Der Schleifenrumpf läuft höchstens einmal X 4 Der Schleifenrumpf läuft kein einziges Mal Seite 15/15