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.