Sie sind auf Seite 1von 4

Scienti c Programming / Angewandte Mathematik und Informatik

MATSE Ausbildung – FH Aachen

“C#” – Probeklausur – 90 Min.


Prof. Dr. A. Voß

Name, Vorname

Matrikelnr.

Unterschrift

Aufgabe A1 A2 ∑ Note

mögliche Punkte 30 30 60

erreichte Punkte

Allgemeine Randbedingungen und Anforderungen

• Beachten Sie: Bei jeder Aufgabe gibt es Abzüge, wenn das Programm nicht compi-
liert, wenn der Code grob inef zient, kryptisch oder umständlich bzw. unverständ-
lich ist oder wenn Sie einen erfolgreichen Tipp bekommen haben.
• Generell gilt: Sollten Sie bei einer Teilaufgabe nicht auf die gefragte Lösung kommen,
haben aber eine Alternativlösung, so vermerken Sie das im Code und als Hinweis auf
dem Aufgabenblatt! Die Alternative wird mit Abzügen auch gewertet und Sie kom-
men weiter. Gleiches gilt, falls die Aufgabenstellung an einer Stelle unklar sein sollte.
• Solution: Falls keine Solution vorgegeben ist, legen Sie eine eigene Solution mit dem
Namen “cs_<MATRNR>_<NAME>” an, wobei “<MATRNR>” durch Ihre Matrikelnummer
und “<NAME>” durch Ihren klein geschriebenen Nachnamen ohne Umlaute ersetzt
ist. Ansonsten nutzen Sie die vorgegebene Solution.
• Projekte: Falls nichts anderes vorgegeben ist, legen Sie in der Solution je ein Projekt
für die Aufgaben A1, A2,… an. Ansonsten nutzen Sie die vorgegebene Struktur.
• Durchführung: Geben Sie bitte zur Sicherheit Ihren Namen und die Matrikelnummer
im Kopf der jeweiligen, von Ihnen bearbeiteten cs-Dateien an.
• Abgabe (nicht in der Probeklausur!): Sie geben in der Prüfung nur die Program.cs-
Datei(en) per EMail mit Betreff “cs <MATRNR> <NAME>” an <Mailadr. folgt> ab. Zips
des gesamten Verzeichnisses oder der Dateien werden nicht akzeptiert. Bei Bedarf
können Sie nachfragen, ob Ihre EMail angekommen ist.

Viel Erfolg!
fi

fi


C# Prof. Dr. Alexander Voß

Aufgabe A1
Sie möchten Zufallszahlen verwenden und entwerfen zu diesem Zweck ein einfaches In-
terface IZufallszahlen und einen Zufallsgenerator Lkg vom Typ Linearer Kongruenzge-
nerator, der sogenannte Pseudozufallszahlen erzeugt. Diese sehen zwar zufällig aus, sind
aber mit einem einfachen Algorithmus deterministisch erzeugt. Da man vergleichsweise
leicht auf die verwendeten Parameter schliessen kann, sind sie für die Kryptographie
ungeeignet – als einfaches Beispiel genügt dieser Typ hier jedoch vollkommen.
Die Berechnung erfolgt nach der Vorschrift zn+1 = (a zn + b) mod m, wobei a, b und m
ganzzahlige Parameter des Verfahrens sind und der Startwert z0 (seed) vorgegeben wird.
Für unser Beispiel wählen wir a=17, b=43, m=64, z0=13 und erhalten so die Folge
(zi)i≥0 = ( 13, 8, 51, 14, 25, … ).
Man sieht, dass zi/m im Intervall [0,1) liegt und so leicht auf ein ganzzahliges Intervall
[min,max] (Achtung: inkl. rechter Seite) abgebildet werden kann. Für min=1, max=6 (Würfel)
ergibt sich so die Folge ( 1, 5, 2, 3, 2, 6, 3, 4, 4, 2, 4, 5, 5, 3, 5, 6, 6, 4, 6, 1, …)
Im Hauptprogramm wird ein Generator rnd16 angelegt und verwendet, Sie müssen aber
die Aufrufe zur Teilaufgabe passend einkommentieren. Nach main sind das Interface, die
Klasse und Teile der Klasse vorbereitet. Bitte dort den eigenen Code einfügen.
a) [4P] IZufallszahlen ist ein öffentliches Interface mit einem Nur-Lese-Property
Zahl vom Typ int und einer Funktion Reset ohne Parameter und Rückgabe. Das
Property Zahl liefert später in der jeweiligen Implementierung des Interfaces die
nächste Zufallszahl und die Funktion Reset setzt den Zufallszahlengenerator zurück.
b) [4P] Die Klasse Lkg implementiert das Interface IZufallszahlen und besitzt einen
Konstruktor, der die Parameter a, b, m, min, max und z0 übergeben bekommt.
Die privaten Attribute dafür sind schon angelegt und bekommen natürlich jeweils
den Wert des passenden Parameters. Das Attribut _z ist der zuletzt berechnete Wert
bzw. z0 zu Beginn.
Kommentieren Sie entsprechenden Code in main ein und erzeugen Sie rnd16.
c) [2P] Gilt im Konstruktor max<min, wird eine sinnvolle Ausnahme geworfen.
d) [6P] Das Property Zahl (aus dem Interface) liefert nun der beschriebenen Vorschrift
entsprechend Pseudozufallszahlen aus dem Bereich [min,max] (inkl. max!) und startet
mit z1. Es ergibt sich für rnd16 die obige Folge. Das können Sie auch in main sehen.
e) [2P] Die Funktion Reset setzt den Generator zurück (z=z0).
f) [4P] Wie bei den LINQ Funktionen möchten Sie das Interface nachträglich um eine
Erweiterungsfunktion Menge erweitern, die mittels Enumerator (und yield) anzahl
Zufallszahlen liefert. Die Verwendung sehen Sie wiederum in main. Nutzen Sie je-
weils auch das Reset in main, damit Sie immer die gleichen Zahlen bekommen.
Achtung: Falls Menge als Erweiterung nicht funktioniert, füllen Sie eine Datenstruktur
oder implementieren Sie eine Memberfunktion und arbeiten Sie damit weiter.
g) [8P] Sammeln Sie mit LINQ alle 1en und 6en aus der obigen Folge in oneOrSix, siehe
main, und geben Sie die Zahlen aus. Die Folge lautet ( 1, 6, 6, 6, 6, 1 ). Gruppieren Sie
danach die Folge nach geraden und ungerade Zahlen in evenOrOdd und geben Sie
die Gruppen aus, siehe main. Die Folgen starten mit ( 2, 2, 6, 4, …) und ( 1, 5, 3, 3, …).




C# Prof. Dr. Alexander Voß

Aufgabe A2
Sie möchten für eine Wetterprognoseanwendung eine Art Wettertextvorlage verwenden,
aus der Sie eine aktuelle (geratene) Wetterprognose für einen bestimmten Tag erstellen
können. Der Text enthält Textstellen, die zu einem späteren Zeitpunkt, je nach Prognose,
mit entsprechenden Inhalten gefüllt werden. Im Text be nden sich Sätze in der Art des
folgenden Beispiels:
“Heute {früh,am Morgen} ist es im {Norden,Süden,Westen,Osten}
zunächst noch {strichweise,stellenweise} {heiter,locker,düster,kühl}
mit Werten zwischen {xy} Grad, bis mittags um die {x} Grad.”
Aus den Textstellen mit Klammern und Textmöglichkeiten ‘{…}’ wird zu einem späteren
Zeitpunkt eine der angegebenen Optionen ausgewählt. Die Angabe von ‘{xy}’ wird durch
eine Temperaturspanne, z.B. ’15 und 21’, und ‘{x}’ durch eine einzelne Temperatur, z.B.
’23’, ersetzt. Der obige Text könnte demnach zu solch einer konkreten Prognose führen:
“Heute am Morgen ist es im Norden zunächst noch stellenweise heiter
mit Werten zwischen 15 und 21 Grad, bis mittags um die 23 Grad.”
Sie können die Gesamtfunktionalität im Hauptprogramm testen.
a) [4P] Die Klasse Wetterprognose bekommt im Konstruktor einen Dateinamen über-
geben. In dieser Datei steht eine Textvorlage wie oben. Der Konstruktor ruft die pri-
vate Methode LadeVorlage auf. Diese liest die Datei ein (Pfad ggf. anpassen) und
speichert den Inhalt in den Properties TextVorlage und TextGenerator, (diese
werden in b) bzw. c) besprochen). Bei Problemen beim Laden der Datei verwenden
Sie den vorbereiteten Text TestVorlage als Ersatz.
b) [4P] Folgende Properties werden benötigt:
• TextVorlage ist ein öffentliches Lese- und privates Schreib-Property vom Typ
string und enthält den in a) gelesenen Text.
• TextGenerator ist ebenfalls ein öffentliches Lese- und privates Schreib-Proper-
ty vom Typ string und enthält einen umgeformten Text. Wie der Setter imple-
mentiert wird, wird in c) beschrieben. Hier legen Sie zusätzlich noch eine private
Membervariable _textGenerator an, in die der umgeformte Text im Setter von
TextGenerator abgelegt und vom Getter zurück gegeben wird.
• Optionen ist ein privates Property vom Typ ‘Liste von string-Array' und enthält
später alle Optionen der TextVorlage – Erklärung dazu ebenfalls in c).
Für TextVorlage und Optionen verwenden Sie “auto-implemented properties”,
also die Form, bei der man kein “backing eld” anlegen muss.
Hier in b) geht es nur darum, die Properties und die Membervariable erst einmal an-
zulegen. Die so vorbereiteten Properties TextGenerator und Optionen haben den
Sinn, später in d) einen konkreten Wetterbericht zu generieren.
c) [10P] Wie erwähnt wird im Setter des Properties TextGenerator der übergebene
Text (value) erst umgeformt und dann in _textGenerator abgelegt. Gleichzeitig
werden die Optionen (die Liste) aufgebaut. Das passiert genau wie folgt:










fi

fi




C# Prof. Dr. Alexander Voß

• Jedes Klammernpaar im übergebenen Text (value) ‘{…}’ wird inkl. der enthaltenen
Optionen durch ein ‘#’ ersetzt. Das obige Beispiel führt also so zu “Heute # ist es
im # zunächst noch # # mit Werte zwischen # Grad, bis mittags um die # Grad.”.
Das ist der abzulegende Text für _textGenerator.
• Die Optionen-Liste mit den String-Arrays (aus b)) enthält die möglichen Optionen
für die jeweilige Lücke. Wenn Sie ein Klammernpaar durch ‘#’ ersetzt haben, er-
gänzen Sie die Liste um das String-array mit den entfernten Optionen. Wird später
der Bericht generiert, so entsprechen sich der Index in der Liste und das ‘#’ im
Text und so können dann zufällige Optionen an genau dieser Stelle im Text einge-
fügt werden.
Der Beispieltext generiert so z.B. diese Optionen des ursprünglichen Texts:
(Index 0): [“früh”, ”am Morgen”]
(Index 1): [“Norden”, ”Süden”, ”Westen”, ”Osten”]
(Index 2): [“strichweise”, ”stellenweise”]
(Index 3): [“heiter”, ”locker”, ”düster”, ”kühl”]
(Index 4): [“xy”]
(Index 5): [“x”]
• Gehen Sie davon aus, dass zu jeder gefundenen ‘{‘ auch eine ‘}’ existiert, Sie brau-
chen keinen Syntax-Check zu machen.
d) [12P] Die Klasse besitzt eine öffentliche Funktion ErzeugeBericht, die aus dem
vorbereiteten TextGenerator und den Optionen einen Bericht erzeugt. Diesen Be-
richt gibt sie zurück. Die Strategie zum Erzeugen eines Bericht lautet wie folgt:
• Jedes ‘#’ in Text von TextGenerator wird zufällig durch eine der möglichen Op-
tionen aus dem korrespondierenden Eintrag der Liste Optionen ersetzt.
• Die speziellen Einträge {xy} und {x} werden durch zufällige Temperaturen im Wer-
tebereich 15…25 und 25…40 (für {xy}) bzw. 15…40 (für {x}) ersetzt – siehe Beispiel
im Eingangstext oder am Ende.
e) [0P] Kommentieren Sie die entsprechenden Zeilen in main ein und testen Sie, ob Sie
einen Wetterbericht bekommen. Z.B. diesen:
Heute am Morgen ist es im Norden zunächst noch stellenweise aufgehellt,
sonst überwiegend nebelig und rutschig. Im Tagesverlauf zeigt sich dann
überall der Mond. Zum Nachmittag kann es besonders im Hinterland einige
Gewitterwolken geben. Es bleibt jedoch durchweg kalt. Die Höchstwerte lie-
gen von Schleswig-Holstein bis nach Sachsen zwischen 17 und 32 Grad. An
den Küsten, insbesondere an der Ostsee, werden bei au andigem Wind Wer-
te zwischen 28 und 33 Grad erreicht. Im Westen und Süden werden 34
Grad erwartet, entlang des Rheins, der Mosel und der Saar vereinzelt bis 16
Grad. Entsprechend muss dort mit einer hohen Körpertemperatur gerechnet
werden. Der Wind weht stark, am Nachmittag auch zeitweise mäßig aus
östlichen Richtungen.









fl

Das könnte Ihnen auch gefallen