Uebungsblatt 5
Uebungsblatt 5
Strukturiertes Programmieren
WS 2023/24
Hinweise:
1. Abgabe immer via Moodle bis zum nächsten Montag 12:00 (nicht später!).
2. Bearbeitungszeit: ca. 8h
3. Maximale Punktzahl: 7 Punkte
1 Wiederholung (2h)
Arbeiten Sie das Skript (Folien) zur laufenden Vorlesung durch; insbesondere die Teile, die nicht in der Übung
behandelt werden
Alles klar soweit? Was
ist unklar geblieben?
Investierte Zeit neben
den 6 Präsenzstunden
(4V+2Ü):
Zusammengearbeitet
mit:
1
2 Funktionale Abstraktion (1h / 2P)
Zerlegen und strukturieren Sie ihre Algorithmen zur Ausgabe der Sternenbilder aus der
letzten Übungsserie (Aufgabe 4: Schleifen und Verzweigungen) in sinnvolle und
geeignete Funktionen so weit wie möglich.
Im Folgenden sehen sie den mathematischen Algorithmus zur Berechnung einer Fibonacci-
Zahl:
1, 𝑘=0
𝐹𝑖𝑏(𝑘) { 1, 𝑘=1
𝐹𝑖𝑏(𝑘 − 1) + 𝐹𝑖𝑏(𝑘 − 2), 𝑘>1
Anmerkung: In dieser Aufgabe geht es darum, den Umgang mit zweidimensionalen Feldern zu
praktizieren.
Anmerkung für JAVA-Profis: Sie können für diese Aufgabe auch eine Klasse namens “CA”
(cellular automaton) definieren. D.h. die unten gelisteten Funktionen werden dann zu
Methoden dieser Klasse. Machen Sie sich klar, warum in diesem Fall die Methoden nicht als
static deklariert werden sollten. Es geht aber auch mit static.
(a) Deklarieren Sie ein zweidimensionales Feld C von “boolean” Werten.
(b) Schreiben Sie eine Funktion, die ein Feld der Größe m × n erzeugt und zurück liefert (m: Anzahl
der Zeilen, n: Anzahl an Spalten).
(c) Schreiben Sie eine Funktion, die die jedes Element der i-te Zeile eines Feldes jeweils zufällig
(mit Wahrscheinlichkeit p) mit “true” und ansonsten mit “false” befüllt (also, für jedes Element der
Zeile neu würfeln). Hinweis: Math.random() liefert eine Pseudozufallszahl zwischen 0 und 1.
(d) Schreiben Sie eine Funktion, die alle Elemente aller Zeilen eines Feldes jeweils zufällig mit
Wahrscheinlichkeit p mit “true” und ansonsten mit “false” befüllt.
(e) Schreiben Sie eine Funktion, die den Inhalt des Feldes als geeigneten Text auf dem Bildschirm
ausgibt.
(f) Schreiben Sie eine Funktion, die die i-te Zeile des Feldes nach folgendem Schema beschreibt:
k läuft dabei von 0 bis n − 1. Für das i gilt dann offensichtlich 0 < i < m. Die Funktion f bildet
drei boolean-Werte auf einen boolean-Wert ab. mod ist der Rest der Division durch n, in JAVA
also %.
(g) Wie viele verschiedene mathematische Funktionen f: {true, false}3 → {true, false} gibt es?
(h) Initialisieren Sie die 0-te Zeile des Feldes mit zufälligen Werten (Funktion aus (c), zum Beispiel
p = 0.5) und alle weiteren Zeilen iterativ (aufsteigend) mit Hilfe der Funktion aus (f).
(i) Finden Sie eine interessante Funktion f. Und geben Sie die Funktion sowie ein typisches Feld
aus.
(j) Optional für Profis (1 Zusatzpunkt): Ob eine Funktion interessant ist, kann mit Hilfe der Entropie
gemessen werden: Gegeben ein Feld C, sei p0, p1 die (geschätzte) Wahrscheinlichkeit, dass eine
Zelle “false” bzw. “true” ist (dazu einfach durchzählen), die Entropie berechnet sich dann als:
2
H(p) = −(p0 log2 p0 + p1 log2 p1). (1)
Finden Sie eine Funktion f, die eine möglichst hohe Entropie liefert (insbesondere, wenn man mit nur
einer einzigen wahren Zelle anfängt).
Hinweise 1: Nicht hier hängen bleiben. Wenn es Schwierigkeiten gibt, Beispiele für zweidimensionale
Felder ansehen und nachprogrammieren. Testen Sie jeden kleinsten Implementierungsschritt. Also
immer wieder den Compiler aktvieren. Am besten mit einer JAVA IDE!