lectures/ 1616ss/ Informatik_2/ Klausuren

Informatik 2 für Regenerative Energien
Klausur vom 28. September 2016
Jörn Loviscach
Versionsstand: 28. September 2016, 10:58
This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Germany License. To view a copy of this
license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/de/ or send a letter to Creative Commons, 171 Second Street, Suite 300, San
Francisco, California, 94105, USA.
15 Punkte für die erste Aufgabe; 3 Punkte für alle weiteren Aufgaben. Mindestpunktzahl zum Bestehen: 20 Punkte. Hilfsmittel: maximal vier einseitig oder zwei
beidseitig beschriftete DIN-A4-Spickzettel beliebigen Inhalts, möglichst selbst verfasst oder zusammengestellt; kein Skript, keine anderen Texte, kein Taschenrechner,
kein Computer (auch nicht wearable), kein Handy und Ähnliches.
Name
Vorname
Matrikelnummer
E-Mail-Adresse
1. Im C#-Programmlisting im Anhang sind 15 Fehler, darunter keine Tippfehler
und höchstens ein Fehler pro Zeile. Erstellen Sie eine Liste mit 15 Zeilen aus
den Fehlern und ihren jeweiligen Korrekturen, nach dem folgenden Muster:
Zeile
123
543
korrekter Programmtext
public void foo()
int a = 42;
2. Die Methode Test.Teste des (korrigierten) Code aus dem Programmlisting
im Anhang wird ausgeführt. Was steht am Ende in den Variablen x, y und
z? Beschreiben Sie gegebenenfalls, wie Sie zu Ihrer Antwort kommen.
3. Noch ist es mit dem korrigierten Code aus dem Programmlisting möglich,
dass dieselbe Person zwei Exemplare desselben Buchs ausleiht. Verhindern
Sie das mit einer Exception.
4. In der Methode NehmeZurück der Klasse Buch des korrigierten Code aus
dem Programmlisting ist es möglich, dass die Person, die das Buch zurückgibt, nicht diejenige ist, die das Buch ausgeliehen hat. Ist das ein Problem?
Falls ja, beschreiben Sie grob (ca. drei Sätze) eine Möglichkeit, das Programm
diesbezüglich zu verbessern.
1
2
5. Schreiben Sie für die Klasse Bibliothek im korrigierten Code aus dem
Anhang diese öffentliche Methode:
List<string> SucheKomplettEntlieheneBücher()
Sie soll eine Liste der Titel aller Buchtitel zurückgeben, von denen aktuell
alle Exemplare ausgeliehen sind. Gegebenenfalls sind in anderen Klassen
Änderungen nötig.
6. Schreiben Sie von der Klasse Ausleihvorgang im korrigierten Code aus
dem Anhang eine abgeleitete Klasse UnbefristeterAusleihvorgang.
Hier soll die Ausleihe beliebig lang sein dürfen. Gegebenenfalls sind auch in
der Klasse Ausleihvorgang Änderungen nötig. Hinweis: int.MaxValue
ist die größtmögliche int-Zahl und DateTime.MaxValue ist der Zeitpunkt, der nach allen anderen Zeitpunkten liegt.
7. Schreiben Sie ein fehlerfrei compilierbares C#-Programm, das diesem Diagramm entspricht. Die Methoden geben, wenn nötig, Phantasiewerte zurück.
8. Welche Zahlen stehen nach Ausführung dieses C#-Programmfragments in
den Variablen x, y und z? Geben Sie möglichst auch Zwischenschritte an,
damit Ihr Gedankengang nachvollziehbar ist.
Stack<List<int>> a = new Stack<List<int>>();
List<int> b = new List<int>();
b.Add(1);
b.Add(2);
a.Push(b);
a.Push(b);
List<int> c = new List<int>();
c.Add(3);
a.Push(c);
b.Add(4);
int x = a.Pop()[0];
int y = a.Pop()[0];
int z = a.Pop()[0];
3
Dieses Listing enthält 15 Fehler!
Die soll ein Programm zur Verwaltung der Ausleihen einer Bibliothek sein. Von
jedem Buch kann es mehrere Exemplare geben. Wenn man ein Buch vormerkt,
muss man dazu nicht ein bestimmtes Exemplar des Buchs wählen.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
c l a s s Test
{
p u b l i c s t a t i c void Teste ( )
{
Buch b1 = new Buch ( " Elektrotechnik " , 1 0 ) ;
Buch b2 = new Buch ( " Englisch " , 1 ) ;
Buch b3 = new NichtVerlängerbaresBuch ( " Chemie " , 2 ) ;
B i b l i o t h e k bib = new B i b l i o t h e k ( 3 ) ;
bib . FügeBuchHinzu ( b1 ) ;
bib . FügeBuchHinzu ( b2 ) ;
bib . FügeBuchHinzu ( b3 ) ;
Person p1 = new Person ( " Anton " ) ;
Person p2 = new Person ( " Berta " ) ;
Person p3 = new Person ( " Carla " ) ;
b2 . LeiheAusFallsMöglich ( p1 ) ;
b o o l x = b2 . LeiheAusFallsMöglich ( p2 ) ;
b1 . MerkeVor ( p1 ) ;
b2 . MerkeVor ( p3 ) ;
b o o l y = b2 . VerlängereFallsMöglich ( p1 ) ;
b2 . NehmeZurück ( p1 ) ;
s t r i n g z = bib . FindeErfüllbareReservierungen ( ) ;
}
}
24
25
26
27
28
29
30
31
32
a b s t r a c t c l a s s Buch
{
static string t i t e l ;
p u b l i c s t r i n g T i t e l { get { return t i t e l ; } }
i n t anzahlExemplare ;
tageLeihfrist = 30;
List <Ausleihvorgang > ausleihen = new List <Ausleihvorgang > ( ) ;
List <Person > vormerkungen = new List <Person > ( ) ;
33
34
35
36
37
38
p u b l i c void Buch ( s t r i n g t i t e l , i n t anzahlExemplare )
{
this . t i t e l = t i t e l ;
t h i s . anzahlExemplare = anzahlExemplare ;
}
39
40
41
42
43
44
45
46
p u b l i c b o o l LeiheAusFallsMöglich ( Person person )
{
List <Person > e r f ü l l b a r = FindeErfüllbareReservierungen ( ) ;
i f ( e r f ü l l b a r . Contains ( person ) )
{
ausleihen . Add ( new Ausleihvorgang ( person , t a g e L e i h f r i s t ) ) ;
vormerkungen . Remove ( person ) ;
4
return true ;
}
e l s e i f ( ausleihen . Count + vormerkungen . Count < anzahlExemplare )
{
ausleihen . Add ( new Ausleihvorgang ( person , t a g e L e i h f r i s t ) ) ;
return true ;
}
else
{
return f a l s e ;
}
47
48
49
50
51
52
53
54
55
56
57
58
}
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// Nur dann verlängerbar , wenn genügend Exemplare n i c h t vorgemerkt .
p u b l i c v i r t u a l b o o l VerlängereFallsMöglich ( Person person )
{
i f ( anzahlExemplare >= ausleihen . Count + vormerkungen . Count )
{
f o r e a c h ( var a u s l e i h e in ausleihen )
{
i f ( a u s l e i h e . DiePerson == person )
{
a u s l e i h e . Verlängere ( t a g e L e i h f r i s t ) ;
return true ;
}
}
return f a l s e ;
}
else
{
return f a l s e ;
}
}
80
81
82
83
84
85
86
87
88
89
90
91
p u b l i c void NehmeZurück ( Person person )
{
Ausleihvorgang a = 0 ;
f o r e a c h ( var a u s l e i h e in ausleihen )
{
i f ( a u s l e i h e . DiePerson = person )
{
a = ausleihe ;
break ;
}
}
92
i f ( a == n u l l )
{
ausleihen . Remove ( a ) ;
}
93
94
95
96
97
}
5
98
p u b l i c void MerkeVor ( Person person )
{
vormerkungen . Add ( person ) ;
}
99
100
101
102
103
p u b l i c void EntferneVormerkung ( Person person )
{
vormerkungen . Remove ( person ) ;
}
104
105
106
107
108
p u b l i c List <Person > FindeErfüllbareReservierungen ( )
{
List <Person > e r f ü l l b a r = List <Person > ( ) ;
109
110
111
112
f o r ( i n t i = 0 ; i < vormerkungen . Count
&& i < anzahlExemplare − ausleihen . Count ; i ++)
{
e r f ü l l b a r . Add ( vormerkungen [ i ] ) ;
}
113
114
115
116
117
118
return ;
119
}
120
121
}
122
123
124
125
126
127
c l a s s NichtVerlängerbaresBuch : Buch
{
p u b l i c NichtVerlängerbaresBuch ( s t r i n g t i t e l , i n t anzahlExemplare )
: base ( t i t e l , anzahlExemplare )
{ }
128
p u b l i c b o o l VerlängereFallsMöglich ( Person person )
{
return f a l s e ;
}
129
130
131
132
133
}
134
135
136
137
138
c l a s s Person
{
s t r i n g name ;
p u b l i c s t r i n g Name { get { return name ; } }
139
p u b l i c Person ( s t r i n g name )
{
t h i s . name = name ;
}
140
141
142
143
144
}
145
146
147
148
c l a s s Ausleihvorgang
{
Person person ;
6
p u b l i c Person DiePerson { get { return person ; } }
DateTime e n d e L e i h f r i s t ;
p u b l i c DateTime EndeLeihfrist { get { return e n d e L e i h f r i s t ; } }
149
150
151
152
p u b l i c Ausleihvorgang ( Person person , i n t t a g e L e i h f r i s t )
{
t h i s . person = person ;
e n d e L e i h f r i s t = DateTime .Now. AddDays ( t a g e L e i h f r i s t ) ; // k o r r e k t
}
153
154
155
156
157
158
p u b l i c void Verlängere ( i n t tage )
{
e n d e L e i h f r i s t = e n d e L e i h f r i s t . AddDays ( tage ) ;
}
159
160
161
162
163
}
164
165
166
167
class Bibliothek
{
List <Buch> bücher = new List <Buch > ;
168
p u b l i c void FügeBuchHinzu ( buch )
{
Add ( buch ) ;
}
169
170
171
172
173
p u b l i c s t r i n g FindeErfüllbareReservierungen ( )
{
string resultat = " " ;
174
175
176
177
f o r e a c h ( buch in
{
List <Person >
f o r e a c h ( var
{
resultat
}
}
178
179
180
181
182
183
184
185
186
return r e s u l t a t ;
187
}
188
189
}
bücher )
e r f ü l l b a r = buch . FindeErfüllbareReservierungen ( ) ;
person in e r f ü l l b a r )
+= person .Name + " : " + buch . T i t e l + " ; " ;