Programmieren I - Technische Universität Braunschweig

Werbung
Technische Universität Braunschweig
Institut für Programmierung und Reaktive Systeme
Dr. Werner Struckmann
29. Januar 2015
Programmieren I
Übungsklausur
Hinweise:
• Bringen Sie zur Klausur Ihren Ausweis und Ihren Studierendenausweis mit. Ihren
Raum erfahren Sie ein paar Tage 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 Dezimalzahlen 29 und 92 als Binär-,
Oktal- und Hexadezimalzahlen. Durch welche Bitfolge wird der Int-Wert −29 in Java
gespeichert?
Aufgabe 2: (Grundlagen, Objektorientierung, Ausnahmebehandlung) Bitte kreuzen Sie
an. Alle Fragen dieser Aufgabe beziehen sich auf Java.
wahr
falsch
Unterschiedliche Literale von primitiven Datentypen
stellen stets unterschiedliche Werte dar.
Lokale Variable dürfen niemals den gleichen Bezeichner
besitzen wie Klassen- oder Instanzvariable.
Alle Operatoren sind ein- oder zweistellig.
Eine abstrakte Klasse darf keine konkrete Methode enthalten.
Innerhalb einer Klasse können mehrere Methoden
denselben Bezeichner tragen.
Ein Konstruktor besitzt keinen Rückgabewert.
Die try-catch-Anweisung darf mehr als eine catch-Klausel besitzen.
Mit Hilfe des Schlüsselwortes throws kann eine Ausnahme ausgelöst werden.
Aufgabe 3: (Programmerstellung) Als sphenische Zahlen werden Zahlen bezeichnet, die
genau das Produkt von drei verschiedenen Primzahlen sind.
Beispiel: 30 ist eine sphenische Zahl: 30 = 2 · 3 · 5
70 ist eine sphenische Zahl: 70 = 2 · 5 · 7
60 ist keine sphenische Zahl: 60 = 2 · 2 · 3 · 5
Schreiben Sie eine Java-Methode static boolean sphenisch(int n), die den Wert true
genau dann liefert, falls n eine sphenische Zahl ist. Eine IllegalArgumentException soll
ausgelöst werden, falls n<2 ist.
Aufgabe 4: (Kontrollstrukturen, Operatoren, Felder) Welche der folgenden Schleifen terminieren? Geben Sie im Falle der Terminierung an, welche Werte die Variablen besitzen,
nachdem die jeweiligen Anweisungen ausgeführt wurden.
a)
int x = 7;
int y = 2;
while (x > 0)
y = x + y;
if (x == 5)
if (y < 10)
x = x % y }
{
break;
continue;
3;
Die Schleife terminiert:
b)
int x = 1;
int y = 2;
do {
x = x + y;
switch (x%3) {
case 0 : y =
case 1 : y =
case 2 : y =
default : y =
}
} while (y < 20);
x
x
x
x
Die Schleife terminiert:
ja +
+
+
-
nein x =
y =
x =
y =
1;
2; break;
3; break;
1; break;
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 = 13; voraus.
c)
(x>>3)<<3
Typ:
Wert:
d)
!(x%3==2||x/3>5)
Typ:
Wert:
e)
(x-=3)^3
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] = (11-2*i)%7;
for (int i = a.length-1; i >= 0; i--) a[i] = a[5-a[i]];
a[0] =
a[1] =
a[2] =
a[3] =
a[4] =
a[5] =
–2–
Aufgabe 5: (Programmverständnis) Gegeben seien die Methode
static int wasPassiert(int[][] a) {
int i = 0,
m = a[0].length;
for (int j=1; j<a.length; j++) {
if (a[j].length>=m) {
i = j;
m = a[j].length;
}
}
int x = a[i][0],
y = a[i][0];
for (int r : a[i]) {
if (r>x) x=r;
if (r<y) y=r;
}
return x-y;
}
sowie das Programmfragment
int[][] a = {{3,2},{},{-1,3,5,2},{0},{},{-1,-2,-5,4}};
System.out.println("Ergebnis: "+wasPassiert(a));
a) Welchen Wert berechnet die Methode wasPassiert? Geben Sie den Wert in Abhängigkeit vom Parameter a an.
b) Wie lautet die Ausgabe des Programmfragments?
c) Welche Fehler können bei einem Aufruf der Methode ggf. auftreten? Begründen Sie
Ihre Aussagen.
Aufgabe 6: (Rekursion) Gegeben sei die folgende rekursive Methode:
static int f(int x, int y) {
if (y>=4)
return 1;
else if (x<=1)
return 2;
else
return 3*f(x-2,y+1)-f(x,y+1);
}
Welchen Wert liefert der Aufruf f(3,-1)? 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?
–3–
Aufgabe 7: (Objektorientierung, Fehlerkorrektur) Gegeben seien die Klasse
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Bruchzahl {
private boolean p; // Vorzeichen: true, falls der Bruch >=0
private int z;
// Zähler: z>=0
private n;
// Nenner: n>0
public Bruchzahl(boolean p, int z, int n) {
if ( z<0 && n<=0 ) throw new IllegalArgumentException();
int g = ggt(z,n);
this.p = p;
this.z = z/g;
this.n = n/g;
}
private static int ggt(int a, int b) {
return b==0 ? a : ggt(b,a%b);
}
public Bruchzahl add(Bruchzahl r) { // Addition
int a =
p ?
z :
-z;
int b = r.p ? r.z : -r.z;
int x = a*r.n+b*n;
return new Bruchzahl(x>=0,Math.abs(x),n*r.n);
}
public String toString() {
return (p ? "+" : "-")+z+"/"+n;
}
}
zur Darstellung von Brüchen mit Vorzeichen sowie das folgende Programmstück:
25
26
27
Bruchzahl r1 = new Bruchzahl(false,7,3),
r2 = new Bruchzahl(true,6,5);
System.out.println(add(r1,r2));
a) Die Programmzeilen enthalten Fehler. Markieren Sie die Fehler im Programmtext.
b) Geben Sie die korrigierten Zeilen an. Was gibt das korrigierte Programm aus?
Aufgabe 8: (Programmerstellung) Schreiben Sie eine Methode
static void specialSort(int[] a)
die ein Feld ganzer Zahlen als Parameter erhält und das Feld nach dem Betrag ihrer Elemente sortiert. Falls Elemente den gleichen Betrag besitzen, sollen die negativen Elemente
vor den positiven Elementen stehen.
Beispiel: Falls der Parameter a die Folge (5, 2, −5, 1, 3, −5, −2, 4, 0) ist, soll a in die
Folge (0, 1, −2, 2, 3, 4, −5, −5, 5) umsortiert werden.
Falls das Parameterfeld a keine Werte enthält oder das Null-Objekt ist, soll beim Aufruf der Methode eine IllegalArgumentException ausgelöst werden. Sie dürfen weder
Methoden noch Klassen importieren, aber Hilfsmethoden schreiben. Beschreiben Sie Ihren
Algorithmus.
Herunterladen