Programmieren I - Technische Universität Braunschweig

Werbung
Technische Universität Braunschweig
Institut für Programmierung und Reaktive Systeme
Dr. Werner Struckmann
30. Januar 2014
Programmieren I
Übungsklausur
Hinweise:
• Bringen Sie zur Klausur Ihren Ausweis und Ihren Studierendenausweis mit. Ihren
Raum erfahren Sie ca. eine Woche vor der Klausur auf der Web-Seite dieser Veranstaltung. Während der Klausur dürfen Sie keine Unterlagen benutzen.
• Eine Übungsklausur kann aus Umfangsgründen nicht den gesamten Stoff der Vorlesung abdecken.
Aufgabe 1: (Zahldarstellung) Schreiben Sie die Dezimalzahl 47 als Binär-, Oktal- und
Hexadezimalzahl. Durch welche Bitfolge wird der byte-Wert −47 in Java gespeichert?
a) 47 als Binärzahl:
b) 47 als Oktalzahl:
c) 47 als Hexadezimalzahl:
d) Darstellung von −47:
Aufgabe 2: (Grundlagen, Objektorientierung) Diese Fragen beziehen sich auf Java.
Die Deklaration int d = ’s’; erzeugt eine Fehlermeldung.
Jede Klasse kann zu einer Unterklasse abgeleitet werden.
Zwei abgeleitete Klassen können die gleiche Basisklasse besitzen.
Es kann Variablen geben, die während ihrer Existenz nicht immer
auf Objekte des gleichen Typs verweisen müssen.
Statische Methoden dürfen den this-Zeiger nicht verwenden.
In der Anweisung return e muss der Typ des Ausdrucks
e stets vom Rückgabetyp der zugehörigen Methode sein.
Für jede Klasse existiert ein Konstruktor ohne Parameter.
Interfaces dürfen nur Methoden enthalten.
Der größte Wert vom Typ short ist 215 − 1.
Jede Klassendefinition muss einen Konstruktor enthalten.
Es ist möglich, dass ein Interface nur Konstanten enthält.
wahr
falsch
Aufgabe 3: (Kontrollstrukturen, Operatoren, Felder) Welche der folgenden Schleifen terminieren? Geben Sie im Falle der Terminierung an, welche Werte die Variablen a und b
besitzen, nachdem die jeweiligen Anweisungen ausgeführt wurden.
a)
int a = 1;
int b = 2;
while (a < 6) {
a = a + 2;
switch (a%3) {
case 0 : b = a-b;
case 1 : b = a*b;
}
}
Die Schleife terminiert:
b)
ja nein a =
b =
a =
b =
int a = 1;
int b = 2;
do {
a = a + 2;
b = a + b;
if ((b % 3) == 0) continue;
b = b + 1;
if ((b % 3) == 2) break;
} while (a!=0);
Die Schleife terminiert:
ja nein Geben Sie für jeden der folgenden Ausdrücke den Typ und den Wert des Ausdrucks an.
Setzen Sie vor jedem Ausdruck die Deklaration int x = 11; voraus.
c)
(x-=2)*(x+=2)
Typ:
Wert:
d)
(x>>1)^2
Typ:
Wert:
e)
2*x/2==x/2*2
Typ:
Wert:
Es sei a durch int[] a = new int[6] deklariert. Geben Sie den Inhalt des Felds nach
Ausführung der beiden folgenden Anweisungen an:
f)
for (int i = 0; i < a.length; i++)
a[i] = (4*(i+1))%5;
for (int i = a.length-1; i >= 0; i--) a[i] = a[1+a[i]];
a[0] =
a[1] =
a[2] =
a[3] =
a[4] =
a[5] =
–2–
Aufgabe 4: (Programmverständnis) Gegeben seien die Methode
static int wasPassiert(int[] a) {
int[] b = new int[a.length];
for (int i=0; i<a.length; i++)
b[i] = a[i];
for (int j=1; j<b.length; j++) {
int k = b[j],
i = j-1;
while (i>=0 && b[i]>k) {
b[i+1] = b[i];
i--;
}
b[i+1] = k;
}
int c = 0;
for (int i=0; i<b.length-1; i++)
if (b[i+1]-b[i]>c) c = b[i+1]-b[i];
return c;
}
sowie das Programmfragment
int[] a = {0,4,6,0,1,8,13};
System.out.println("("+wasPassiert(a)+")");
a) Beschreiben Sie den Rückgabewert der Methode wasPassiert in Abhängigkeit vom
Parameter a.
b) Wie lautet die Ausgabe des Programmfragments?
Aufgabe 5: (Rekursion) Gegeben sei die folgende rekursive Methode:
static int f(int x, int y) {
if (y <= 1)
return 1;
else if (x == 0)
return 2;
else
return f(x-2,y/2) - 2*f(x-2,y);
}
Welchen Wert liefert der Aufruf f(4,13)? In welcher Reihenfolge und mit welchen Parametern wird f dabei aufgerufen? Geben Sie die Reihenfolge der Aufrufe explizit an. Wie groß
ist die maximale Rekursionstiefe, d. h. die maximale Anzahl gleichzeitig aktiver Aufrufe?
Terminiert für alle x ≥ 0, y ≥ 0 der Aufruf f(x,y) mit der Rückgabe eines int-Wertes?
Begründen Sie Ihre Antwort.
–3–
Aufgabe 6: (Felder, Programmerstellung) Eine Zahl wird Palindrom genannt, falls ihre
Dezimaldarstellung von vorne und von hinten gelesen die gleiche Ziffernfolge besitzt. Beispielsweise sind 7, -121, 4554, 0 und 66 Palindrome. 20, 31 und 23 sind keine Palindrome.
Schreiben Sie eine Methode static void palindrom(int[] a), die ein Feld ganzer
Zahlen als Parameter erhält und die die Palindrome des Feldes ausgibt. Falls das Parameterfeld a die Zahlen (7, 23, -121, 4554, 0, 66, 31, 20) enthält, sollen also 7, -121, 4554, 0
und 66 ausgegeben werden.
Falls das Parameterfeld a keine Werte enthält, soll beim Aufruf der Methode eine Fehlermeldung ausgegeben werden. Sie dürfen keine Klassen importieren. Eigene Hilfsmethoden
dürfen Sie erstellen. Erläutern Sie Ihren Algorithmus.
Aufgabe 7: (Programmverständnis, Fehlerkorrektur) Gegeben sei die Klasse Rational
zur Darstellung von rationalen Zahlen, deren Zähler und Nenner positiv sind. Die Methode add soll den Parameter r zur aktuellen Zahl addieren. Die Methode compareTo soll
rationale Zahlen ihrer Größe nach vergleichen.
01 class Rational extends Comparable {
02
private int x, y;
03
public Rational(int x, int y) {
04
if (x<=0 || y<=0) System.out.println("Eingabefehler.");
05
g = ggt(x,y);
06
this.x = x/g;
07
this.y = y/g;
08
}
09
private static int ggt(int a, int b) {
10
while ((b != 0)) {
11
int r = a % b;
12
a = b;
13
b = r;
14
}
15
return a;
16
}
17
public Rational add(Rational r) {
18
int z = x*r.y+r.x*y,
19
n = y*r.x;
20
return Rational(z, n);
21
}
22
public String toString() {
23
return "("+x+"/"+y+")";
24
}
25
public int compareTo(Object o) {
26
return x*o.y-o.x*y;
27
}
28 }
Außerdem sei das folgende Programmfragment gegeben:
29
30
31
32
Rational r1 = new Rational(2,3),
r2 = new Rational(5,4);
System.out.println(add(r1,r2));
System.out.println(r1.compareTo(r2));
Die Programmzeilen enthalten Fehler. Markieren Sie die Fehler im Programmtext. Geben
Sie die korrigierten Zeilen an. Was gibt das korrigierte Programm aus?
–4–
Herunterladen