Zwischen-Klausur Praktische Informatik I

Werbung
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
Herunterladen