Collatzfolgenstatistik
Diese Aufgabe besteht aus vier aufeinander aufbauenden Teilaufgaben, die in verschiedenen Phasen eines Excel-VBA-Kurses bearbeitet werden können. Folgende Bereiche der Programmierung werden berührt:
- benutzerdefinierte Funktionen
- Prinzip der Delegation
- Prinzip des Einwickelns
- Formulargestaltung
- Validierung von Eingaben
- Formatieren von Tabellen mit wiederverwendbaren Prozeduren
- Schichtenarchitektur
Collatzfolge
Eine Collatzfolge beginnt mit einer beliebigen natürlichen Zahl a0 (Startzahl). Für die folgenden Glieder der Folge gilt:
ai+1 = ai / 2 falls ai eine gerade Zahl ist
3 ai + 1 falls ai eine ungerade Zahl ist
Gewöhnlich lässt man die Folge mit der ersten auftretenden 1 enden. Für die Startzahl 6 ergibt sich demnach die Folge
6, 3, 10, 5, 16, 8, 4, 2, 1
Lässt man die Folge weiterlaufen, so wird sie nach der ersten 1 periodisch:
6, 3, 10, 5, 16, 8, 4, 2, 1, 4, 2, 1, 4, 2, 1, ...
Im Rahmen der folgenden Aufgaben sollen die Folgen jeweils mit der ersten 1 enden. Die Aufgaben bauen aufeinander auf und sollten deshalb in der angegebenen Reihenfolge gelöst werden
Aufgabe 1: Funktion, welche Kennwerte einer Collatzfolge ermittelt
Die Funktion soll für die Collatzfolge mit der Startzahl z die folgenden Kennwerte ermitteln:
·
- Die Startzahl
- Anzahl der Folgenglieder
- Anzahl ungerader Folgenglieder
- Anzahl gerader Folgenglieder
- Das höchste Folgenglied
Die Kopfzeile der Funktion soll lauten:
Public Function Collatzkennzahlen (ByVal z as Long) As Long()
Beispiel:
Für z = 6 enthält das von der Funktion gelieferte Array die Elemente {6, 9, 3, 6, 16}. Die Reihenfolge entspricht der obigen Aufzählung der Kennwerte.
Wie die Kopfzeile zeigt, kann die Funktion als benutzerdefinierte Funktion (UDF) eingesetzt werden. Sie lässt sich deshalb leicht von einem Arbeitsblatt aus testen. Beachten Sie, dass Sie beim Testen für das Ergebnis fünf Zellen nebeneinander auswählen müssen. Außerdem müssen Sie, wie bei allen Array-Funktionen, zusätzlich die Tastenkombination <Strg> + <↑> drücken, wenn Sie nach der Eingabe des Parameters z die Eingabetaste betätigen.
Aufgabe 2: Funktion, welche die Kennzahlen für die Startzahlen von ug bis og liefert
Die zu programmierende Funktion soll die in Aufgabe 1 genannten Kennwerte für alle Collatzfolgen ermitteln, welche sich aus den Startzahlen in dem vom Benutzer vorgegebenen Bereich [ug, og] ergeben. Sie hat die Kopfzeile:
Public Function CollatzKWB(ByVal ug As Long, ByVal og As Long) as Long()
Das Array, das diese Funktion liefert, ist zweidimensional, ist also eine Matrix bzw. eine Tabelle. Für jede Startzahl im Bereich von ug bis og enthält diese Matrix eine Zeile. Die Anzahl der Spalten ist fünf; für jeden Kennwert eine Spalte.
Auch diese Funktion taugt als UDF und ist deshalb von einem Arbeitsblatt aus testbar. Vor dem Aufruf der Funktion müssen sie einen Bereich markieren, der fünf Spalten umfasst und für jede ganze Zahl im Bereich [ug, og] eine Zeile.
Beispiel:
Für ug = 6 und og = 7 wird folgende Tabelle geliefert:

Hinweis zur Programmierung:
Wenden Sie das Prinzip der Delegation an, indem Sie aus der Funktion CollatzKWB heraus die im Rahmen der ersten Aufgabe programmierte Funktion Collatzkennzahlen aufrufen.
Aufgabe 3: Funktion, welche die Kennzahlenmatrix mit Überschrift liefert
Es soll nun eine Funktion geschrieben werden, welche die bereits aus Aufgabe 2 bekannte Kennwertematrix mit Spaltenüberschriften liefert. Auch diese Funktion soll als UDF tauglich sein. Ihre Ausgabe auf einem Arbeitsblatt für ug = 6 und og = 7 könnte folgendermaßen aussehen:

Natürlich kann der Funktionstyp hier kein Long-Array sein. Wir müssen Variant verwenden:
Public Function CollatzKWBH(ByVal ug As Long, ByVal og As Long) as Variant
Wenn Sie diese Funktion programmieren, sollten Sie die Einwickeltechnik verwenden.
Aufgabe 4: Anwendung mit Benutzerführung (UI)
Schreiben Sie nun ein kleines Programm, welches mit Hilfe eines Formulars den Startzahlenbereich vom Benutzer abfragt und dann die Kennzahlentabelle auf einem Arbeitsblatt ausgibt. Lassen Sie den Benutzer auch den Namen des Arbeitsblatts wählen, auf das die Ausgabe erfolgen soll und formatieren Sie die Ausgabetabelle (Linien, u.U. auch Farben).
Für ug und og sollen folgende Grenzen gelten:
2 ≤ ug ≤ 10 000 000
2 ≤ og ≤ 10 000 000
Die Eingaben des Benutzers sollen validiert werden. Dabei ist auch zu sicher zu stellen, dass die Differenz og – ug ≥ 0 und nicht größer als 1 Million ist (damit die Statistik auf das Arbeitsblatt passt).
Aufgabe 5: Anwendung mit Benutzerführung (UI)
wie bei Aufgabe 4, jedoch soll die Ausgabe der Kennzahlen in ein Listenfeld (eine ListBox) auf dem Formular erfolgen.