Programmentwicklung I für Hörer anderer Fachrichtungen

Werbung
Programmentwicklung I für Hörer
anderer Fachrichtungen
-Wintersemester 2003/0422.04.2004
Name :
Vorname :
Matrikelnummer :
Hauptfach :
Nebenfach/Fachrichtung
Hinweise :
1. Überprüfen Sie anhand der aufgedruckten Seitennummern 1 - 19 die Vollständigkeit Ihres
Klausurtextes.
2. Hilfsmittel: bis zu 4 Seiten DIN A4 mit Notizen nach Wahl.
Aufgabe Thema
maximale Punktzahl erreichte Punktzahl
1
Basiswissen
5
2
Ausdrücke
9
3
Kontrollstrukturen
10
4
Syntaxdiagramme
6
5
Methoden; einfache Variable
16
6
Felder
21
7
Rekursion
12
8
Klassen, Vererbung
14
93
-1-
Aufgabe 1
(5 Punkte )
Kennzeichnen Sie die folgenden Aussagen durch Ankreuzen als „wahr“ oder „falsch“.
Bewertung: keine Antwort:
0
Punkte
richtige Antwort:
+0.5 Punkte
falsche Antwort:
-0.5 Punkte
Minimal können 0 Punkte erreicht werden.
wahr
falsch
Jedes Attribut muss mindestens einen der Modifizierer private, public oder
protected besitzen.
Im Rumpf der mit for (int i = 0; i < 10; i++) beginnenden
Schleife darf die Schleifenvariable i nicht geändert werden.
Eine switch-Anweisung wird mit der Anweisung continue verlassen.
Überladene Methoden müssen sich in der Parameterliste unterscheiden.
Die Methode void beispielmethode(...) darf kein return enthalten.
Eine Objektmethode darf nicht auf statische Attribute zugreifen.
Von jeder Klasse kann zur Laufzeit nur jeweils höchstens ein Objekt angelegt
werden.
Jede Klasse besitzt mindestens einen Konstruktor.
Für jede Klasse kann man beliebig viele Konstruktoren implementieren.
Als protected deklarierte Methoden einer Klasse sind nur innerhalb dieser
Klasse benutzbar.
-2-
Aufgabe 2
( 5 + 4 = 9 Punkte )
a) Gehen Sie für jede der folgenden Anweisungen jeweils neu von den folgenden Deklarationen aus:
int n = 10, m = 5, i;
double x = 2.4, y = 3.0;
boolean b = true;
Geben Sie in der folgenden Tabelle die Werte der Variablen nach der Ausführung der jeweiligen
Anweisungen an, sofern sie sich geändert haben.
Anweisung
m
n
i
x
y
b
i = n % 4 + --m % 2;
x *= 2.0 + m / n;
i = (x++ > y) ?
--m :
--n;
b = !(x < y | --n < 2 & m++ == 3);
b = x++ > y && m-- < 5;
b) Geben Sie die beiden folgenden in mathematischer Notation gegebenen Ausdrücke in JavaNotation an. Gehen Sie dabei von der Deklaration double x, y; aus
1
2y sin(2π x) 1
3
*
+ 2 2 −
5 2 + e-x
x +y +1 2
x3 +
(i)
x 2 + y3
x - 2 |y-x|
+
5 (x + 2)
3xy
4
(ii)
-3-
Aufgabe 3
a)
Betrachten Sie nebenstehende
for-Schleife.
( Dabei sind die Methoden f
und g wie folgt spezifiziert: )
boolean f ()
void g ()
( 6 + 4 = 10 Punkte )
boolean b;
int unten, oben;
// Anweisungen zum Einlesen
// von unten und oben
....
for (int i = unten; i < oben; i++) {
b = f();
if (b) break;
g();
}
Ersetzen Sie die for-Schleife durch äquivalente Programmfragmente unter Verwendung
(i) einer while-Schleife
(ii) einer do-while-Schleife.
-4-
Aufgabe 3
(Fortsetzung)
b) Schreiben Sie unter Benutzung der folgenden Deklarationen
int a, b, n;
eine switch-Anweisung, die die in folgender Tabelle beschriebenen Aktionen durchführt:
n
1, 2
3
Aktion(en)
b = a * b ; n = n+1
n=b+a
0, 5
b=2
sonst
n=0
-5-
Aufgabe 4
(3 + 3 = 6 Punkte)
Prüfen Sie anhand der folgenden Syntaxdiagramme, ob folgende Zeichenfolgen Ausdrücke im Sinne
dieser Syntaxdiagramme sind.
Falls die Zeichenfolge ein Ausdruck im Sinne dieser Syntaxdiagramme ist, geben Sie eine Ableitung
an. Andernfalls begründen Sie geeignet, weshalb die Zeichenfolge kein Ausdruck ist.
Beachten Sie dabei: eine nicht erfolgreiche Ableitung ist keine ausreichende Begründung !
Verwenden Sie bei Ableitungen die Anfangsbuchstaben der jeweiligen syntaktischen Strukturen als
Kürzel.
Faktor
Variable
a
Term
b
Faktor
c
Variable
(
Ausdruck
)
[
Ausdruck
]
Ausdruck
Term
*
+
+
/
-
-
a) b * ( a – b / c * (a + b ) )
b) – a – b * ( - c + b / a – c )
-6-
Aufgabe 5
a)
( 6 + 5 + 5 = 16 Punkte )
Schreiben Sie eine Java-Methode zur Berechnung des ganzzahligen Anteils von
und n ≥ 0) entsprechend folgender Spezifikation:
Name:
Parameter:
Rückgabewert:
Wirkung:
Hinweis:
k
n (für k ≥2
kWurzel
2 ganze Zahlen n und k
eine ganze Zahl
Ist n < 0 oder k < 2, so soll –1 als Ergebnis geliefert werden. Andernfalls ist
das Ergebnis [ k n ]; d.h. die größte ganze Zahl z mit zk ≤ n.
Mathematische Standardfunktionen dürfen in dieser Teilaufgabe nicht
benutzt werden.
-7-
Aufgabe 5
b) Die durch
( Fortsetzung)
x0 = beliebige ganze Zahl > 0
 1
x n gerade
x n+1 =  2 x n
3x n +1 x n ungerade
für n ≥ 0
definierte Folge natürlicher Zahlen endet nach einer nicht vorhersehbaren Zahl von Schritten
immer bei 1 (glaubt man wenigstens!).
Beispiel: x0 = 3 ⇒ erzeugte Folge: 3, 10, 5, 16, 8, 4, 2, 1
( 8 Folgenglieder bis zum Erreichen der 1)
Schreiben Sie eine Java-Methode entsprechend folgender Spezifikation:
Name:
Parameter:
Rückgabewert:
Wirkung:
a5b
eine ganze Zahl
eine ganze Zahl
Ist der Parameter ≤ 1, so wird als Ergebnis 0 zurückgereicht.
Ist der Parameter > 1, so werden der Reihe nach die obigen Folgenglieder bis
zum erstmaligen Erreichen der 1 berechnet und auf dem Bildschirm
ausgegeben.
Als Funktionswert wird die Anzahl der Glieder dieser Folge zurückgereicht.
-8-
Aufgabe 5
( Fortsetzung)
2i+1
∞
x3 x5 x 7
i x
+ − + .... = ∑ (-1)
für |x| < 1
c) Es ist arctg x =x 3 5 7
2i+1
i=0
Schreiben Sie eine Java-Methode myarctan entsprechend folgender Spezifikation:
Name:
Parameter:
Rückgabewert:
Wirkung:
Hinweis:
myarctan
x (reelle Zahl)
reelle Zahl
Für |x| < 1 werden so viele Summanden dieser Reihe aufsummiert, bis sich
aufgrund der Rechengenauigkeit die Partialsumme nicht mehr ändert. Diese
soll dann als Ergebnis zurückgegeben werden.
Für x ≥ 1 soll π/2 und für x ≤ -1 soll – π/2 als Ergebnis zurückgegeben
werden.
In dieser Aufgabe darf aus der Standard-Mathematikbibliothek Math lediglich
die Konstante Math.PI benutzt werden.
-9-
Aufgabe 6 (Felder)
a)
( 6 + 8 + 7 = 21 Punkte)
Gehen Sie davon aus, dass die (hier nicht weiter spezifizierte) Methode ausgeben bei
Übergabe eines eindimensionalen Feldes die Komponenten der Reihe nach ausgibt.
Was wird unter dieser Voraussetzung bei folgendem Programmstück ausgegeben?
int[] feld = {1,2,3,4};
int[][] matrix = {{5,6},{7,8,9},{10,11,12,13}};
System.out.print("a : ");ausgeben(feld);
System.out.print("b : ");ausgeben(matrix[1]);
feld = matrix[0];
feld[1] = 99;
System.out.print("c : ");ausgeben(feld);
System.out.print("d : ");ausgeben(matrix[0]);
for (int i = 1; i < matrix.length; i++)
matrix[i-1] = matrix[i];
matrix[matrix.length-1] = feld;
System.out.print("e : ");ausgeben(matrix[0]);
System.out.print("f : ");ausgeben(matrix[1]);
System.out.print("g : ");ausgeben(matrix[2]);
a:
1
2
3
4
b:
c:
d:
e:
f:
g:
- 10 -
Aufgabe 6
(Fortsetzung)
b) Schreiben Sie eine Java-Methode zum Mischen zweier aufsteigend sortierter Felder ganzer
Zahlen entsprechend folgender Spezifikation:
Name:
Parameter:
Rückgabewert:
Wirkung:
Beispiel:
Hinweis:
mischen
f1, f2 (Felder ganzer Zahlen)
ein Feld ganzer Zahlen
Sind f1 und f2 beide aufsteigend sortiert, so werden die Einträge in f1
und f2 zu einem aufsteigend sortierten Feld zusammengemischt, das dann
als Ergebnis zurückgereicht wird.
Ist eines der Felder f1 bzw. f2 nicht aufsteigend sortiert, so wird null
zurückgereicht.
f1 = {1, 4, 7, 8}, f2 = {3, 6} ⇒ Ergebnis: {1, 3, 4, 6, 7, 8}
Sie können beim Schreiben dieser Methode davon ausgehen, dass eine
Methode boolean istsortiert(int[] f) zur Verfügung steht,
die für das ganzzahlige Feld f feststellt, ob f aufsteigend sortiert ist.
- 11 -
Aufgabe 6
c)
(Fortsetzung)
Schreiben Sie eine Java-Methode entsprechend folgender Spezifikation:
Name:
Parameter:
Rückgabewert:
Wirkung:
Beispiel:
Hinweis:
mittelwert
matrix (zweidimensionales Feld ganzer Zahlen)
ein eindimensionales Feld reeller Zahlen
Die Methode ermittelt für jede Zeile der übergebenen Matrix getrennt den
Mittelwert der Einträge und speichert diesen in der entsprechenden
Komponente des Rückgabefeldes. Weiterhin wird der Mittelwert aller
Komponenten von matrix bestimmt und als letzte Komponente im
Rückgabefeld eingetragen.
1 2 3

matrix =  4 0 2 4  ⇒ Ergebnis: ( 2, 2.5, 1, 2 )
1 1



Sie können beim Schreiben dieser Methode davon ausgehen, dass das
übergebene Feld mindestens eine Zeile und in jeder Zeile mindestens einen
Eintrag hat.
- 12 -
Aufgabe 7
(4+ 4 + 4 = 12 Punkte )
a) Betrachten Sie folgende Java-Methoden:
int a(int aa) {
System.out.println("in a: "+aa);
if (aa==0) return 0;
switch ( aa % 3) {
case 0: return a(c(aa/2));
case 1: return b(aa/3+1);
case 2: return c(aa-4);
}
return 0;
}
int b(int bb) {
System.out.println("in b: "+bb);
if (bb==0) return 0;
switch ( bb % 2) {
case 0: return b(a(bb/2));
case 1: return c(bb/2+1);
}
return 0;
}
Was wird beim Aufruf a(11) ausgegeben?
- 13 -
int c(int cc) {
System.out.println("in c: "+cc);
if (cc==0) return 0;
switch ( cc % 3) {
case 0: return b(a(cc/2));
case 1: return c(cc/2);
case 2: return a(b(cc+4));
}
return 0;
}
Aufgabe 7
(Fortsetzung)
()
() ( )( )
b) Die Binomialkoeffizienten n sind für 0 ≤ k ≤ n rekursiv definiert durch:
k
n = n = 1; n = n-1 + n-1 für n ≥ 1 und 1 ≤ k ≤ n-1
0
n
k
k-1
k
() ()
()
Schreiben Sie eine rekursive Java-Methode zum Berechnen der Binomialkoeffizienten n nach
k
diesem Schema. Ist für die Parameter n und k die Bedingung 0 ≤ k ≤ n nicht erfüllt, so soll 0
als Funktionswert zurückgereicht werden.
- 14 -
Aufgabe 7
(Fortsetzung)
c) Ein Palindrom ist eine Zeichenkette, die von vorn und hinten gelesen gleich ist
(Beispiel: lagerregal).
Offensichtlich gilt:
- Zeichenketten der Länge 0 oder 1 sind Palindrome.
- Eine Zeichenkette s der Länge ≥ 2 ist ein Palindrom, falls der erste und der letzte Buchstabe
übereinstimmen und der Rest ein Palindrom ist. (lagerregal à l agerrega l )
Schreiben Sie eine rekursive Java-Methode entsprechend folgender Spezifikation, die unter
Benutzung dieser Eigenschaft feststellt, ob der übergebene String ein Palindrom ist.
Name:
Parameter:
Rückgabewert:
Wirkung:
palindrom
s (String)
true / false
Ist s ein Palindrom, so wird true zurückgegeben
Hinweis: In der Klasse String stehen folgende Methoden zur Verfügung, die hier benutzt
werden können ( die Indizierung in Strings entspricht der Indizierung von Feldern):
int length()
liefert die Länge eines Strings (Beispiel: "hallo".length() = 5)
substring(int beginIndex, int endIndex)
liefert den Teilstring ab einschließlich beginIndex bis ausschließlich endIndex.
(Beispiel: "hallo".substring(1,4) = "all" )
char charAt(int index)
liefert das Zeichen an der genannten Position (Beispiel: "hallo".charAt(1) = 'a')
- 15 -
Aufgabe 8
(3 + 5 + 6 = 14 Punkte)
Gehen Sie in dieser Aufgabe davon aus, dass ein Klasse Adresse zur Verfügung steht, die u.a.
folgende Methoden enthält:
•
•
String toString()
Adresse copy()
liefert einen String mit den Adressangaben
liefert eine Kopie der aktuellen Adresse
a) Entwerfen Sie eine Klasse Gebaeude entsprechend folgender Spezifikation:
Attribute:
adr (Adresse)
besitzer (String)
Konstruktor:
Der Konstruktor erhält die Adresse und den Besitzer als Parameter und setzt
die Attribute entsprechend. Für die Adresse wird eine Kopie des entsprechenden
Parameters angelegt.
Methode:
String toString ()
liefert einen String mit dem Besitzer und den Adressangaben.
Auf die Attribute darf nur mit Methoden der Klasse, auf die Methode darf von überall her
zugegriffen werden.
- 16 -
Aufgabe 8
(Fortsetzung)
b) Entwerfen Sie eine Klasse Wohnung entsprechend folgender Spezifikation:
Attribute:
flaeche, miete (double)
mieter (String)
vermietet (boolean)
Konstruktor:
Der Konstruktor erhält als Parameter die Fläche. Das Attribut flaeche wird
entsprechend dem Parameter gesetzt ( eine Überprüfung auf Fläche > 0 ist nicht
erforderlich). miete wird mit 0, vermietet wird mit false und mieter
wird mit dem leeren String vorbesetzt.
Methoden:
String toString ()
liefert einen String mit allen Angaben zur Wohnung
double miete ()
liefert die Miete
boolean istVermietet()
liefert die Angabe, ob die Wohnung vermietet ist
void vermieten (String neuerMieter)
falls die Wohnung nicht vermietet ist, wird sie an den neuen Mieter
vermietet (d.h. die Attribute werden entsprechend gesetzt). Ist sie bereits
vermietet, so wird lediglich eine entsprechende Meldung ausgegeben.
Auf die Attribute darf nur mit Methoden der Klasse, auf die Methoden darf von überall her
zugegriffen werden.
- 17 -
Aufgabe 8
c)
(Fortsetzung)
Erweitern Sie die Klasse Gebaeude zu einer Klasse Miethaus entsprechend folgender
Spezifikation:
zusätzliches Attribut:
wohnungen (Feld von Wohnungen; siehe Teil b))
Konstruktor:
Der Konstruktor erhält die Parameter wie der Konstruktor von Gebaeude und
zusätzlich ein Feld von Wohnungen und setzt die Attribute entsprechend.
Methoden:
double miete ()
liefert die Gesamtmiete aller aktuell vermieteten Wohnungen
String toString ()
liefert einen String, der die Angaben zum Gebäude und zu allen Wohnungen
enthält
Auf die Attribute darf nur mit Methoden der Klasse, auf die Methoden darf von überall her
zugegriffen werden.
- 18 -
Zusatzblatt
- 19 -
Herunterladen