Curriculum Fortgeschrittene Programmierung ◦ ?

Übungen fett, Kurzaufgaben normal.
Ein Klick auf einen roten Hyperlink zeigt die Lösung.

1. Turtle (Repetition zum Curriculum Elementare Programmierung)
2. Punktoperator
3. Move-Methode
4. For Each ... Next-Schleife
5. Kleine Helfer (Excel-Objekthierarchie)
6. Objektvariablen vereinbaren
7. Standardeigenschaften
8. Zwischenresultate II (Objektverweis als Funktionswert)
9. Vertausche
10. Telefonverzeichnis (vordefinierte und benutzerdefinierte Klassen)
11. Instanzen löschen
12. Instanzen erstellen und löschen
13. Geburtstage (benutzerdefinierte Klassen)
14. sortierter Binärbaum
15. Einfügealgorithmus
16. verkettete Liste
17. verkettete Liste debuggen
18. Wörterbuch Standard (verkettete Strukturen)
19. Traversierungsverfahren
20. Inordnungs-Traversierung
21. Breitentraversierung
22. Entwurf
23. Wörterbuch Professional (Baumtraversierungen)

####
Punktoperator

Lernziele

- Objektzugriff mit Punktoperator

Fragen

Die Aufgabe RangeSkelett.xls enthält u.a. drei benannte Zellbereiche auf einem Excel-Tabellenblatt.

1. Welchen Wert besitzt die Variable Nummer nach Ausführung der folgenden Programmzeilen?

   - ..... Nummer = Tabelle1.Range("roterBereich").Cells(3,5)
   - ..... Nummer = Range("roterBereich").Cells(1,3).Value
   - ..... Nummer = Range("roterBereich").Cells(3,1)
   - ..... Nummer = Cells(9,9)
   - ..... Nummer = Range("Startwert")

2. Was ändern die folgenden Zeilen am Tabellenblattinhalt?

   - ..... Tabelle1.Range("roterBereich").Cells(1,1).Value = 8
   - ..... Range("roterBereich").Cells(4,5) = 10
   - ..... Tabelle1.Range("blauerBereich").Cells(1,1).Value = 2
   - ..... Range("blauerBereich").Cells(6,2) = 14
   - ..... Tabelle1.Range("Startwert") = 34
   - ..... Tabelle1.Cells(1,2) = "Arbeiten mit Range-Objekten"

LRange.xls

#### Move-Methode

Lernziele

- Auflistung
- For Each ... Next-Schleife

Fragen

Implementieren Sie das Beispiel Zwischenresultate vollständig in VBA unter Excel. Nehmen Sie die beschriebenen Programmteile in Ereignisprozeduren auf, und ergänzen Sie das Programm um den Algorithmus, der das Arbeitsblatt "Zwischenresultate" um eine Position nach links verschiebt.

LZwischenresultate.xls

#### For Each ... Next-Schleife

Lernziele

- Auflistung
- For Each ... Next-Schleife

Fragen

Schreiben Sie den Verschiebe-Algorithmus des Beispiels Zwischenresultate neu mit Hilfe einer For ... Next-Schleife anstelle der For Each ... Next-Schleife.

#### Objektvariablen vereinbaren

Lernziele

- Objektvariable

Notieren Sie die Anweisungen, die folgende Objektvariablen vereinbaren:

1. auf Prozedurebene eine Variable zum Speichern eines Excel-Tabellenblatts
   ..................................
2. auf Prozedurebene eine Variable zum Speichern eines beliebigen Excel-Objektes
   ..................................
3. auf Projektebene eine Variable zum Speichern eines Excel-Tabellenblattes
   ..................................
4. auf Modulebene eine allgemeine Objektvariable.
   ..................................

#### Standardeigenschaften

Lernziele

- Standardeigenschaften

Der Zugriff auf Objekte, die in der Objekthierarchie weit unten stehen, kann dank der Standardeigenschaften von Objekten teilweise sehr kurz ausfallen.

1. Schreiben Sie die folgenden Anweisungen so kurz wie möglich, indem Sie Standardeigenschaften verwenden. Was bewirken die Anweisungen.

   - Application.ActiveWorkbook.ActiveSheet.Name = "XY"
   - Worksheets.Item("XY").Range("A1:B2").Font.Bold = True

2. Formulieren Sie die folgenden Anweisungen ungekürzt, d.h. ohne Standardeigenschaften zu verwenden. Welche Datentypen besitzen die Variablen werBinIch... ?

   - werBinIch1 = Cells(1, 1)
   - Set werBinIch2 = Worksheets(1)
   - Set werBinIch3 = Worksheets

#### Zwischenresultate II

Lernziele

- Objektverweise als Funktionswert

Vertiefungsfragen

Ändern Sie das Beispiel LZwischenresultate.xls wie folgt:

1. Lagern Sie den Programmcode, der das Tabellenblatt Zwischenresultate sucht, in eine Funktion sucheBlatt aus. Der Funktionswert soll True sein, falls das Blatt gefunden werden konnte und sonst False. Verwenden Sie die Funktion in den Ereignisprozeduren Tabellenblatt_Klick, nachRechts_Klick und nachLinks_Klick.

2. Verallgemeinern Sie die Funktion sucheBlatt so, dass man als Argument einen beliebigen Tabellenblattnamen angeben kann, nach dem gesucht werden soll. Passen Sie die Funktionsaufrufe entsprechend an.

3. Ändern Sie die Funktion sucheBlatt so ab, dass als Funktionswert ein Verweis auf das gefundene Blatt zurückgegeben wird. Existiert das genannte Tabellenblatt nicht, so soll die Funktion Nothing zurück geben. Passen Sie die Funktionsaufrufe entsprechend an.

4. Worin liegt der Unterschied zwischen den beiden folgenden Zeilen?

   - Set Blatt = sucheBlatt("Zwischenresultate")
   - Set Blatt = Worksheets("Zwischenresultate")

LZwischenresultate II.xls

#### Vertausche

Lernziele

- Objektverweise als Parameter übergeben
- Move-Methode des Worksheet-Objekts

Vertiefungsfragen

Laden Sie die Arbeitsmappe vertauscheSkelett.xls, und schreiben Sie ein Programm, das zwei Tabellenblätter in der Worksheets-Auflistung vertauscht:

1. Studieren Sie den Hilfetext zur Move-Methode des Worksheet-Objekts.
2. Schreiben Sie eine Prozedur vertauscheBlätter, die zwei Verweise auf Tabellenblätter der Worksheets-Auflistung als Parameter entgegen nimmt und die Blätter vertauscht.
3. Schreiben Sie eine Prozedur Test, die zwei Tabellenblätter auswählt und die Prozedur vertauscheBlätter aufruft.

Lvertausche.xls

#### Instanzen löschen

Lernziele

- Instanzen löschen

Beschreiben Sie den Inhalt der Variablen des folgenden Programms, jeweils nach Ausführung der nummerierten Zeilen. Welche Objekte existieren nach jeder Zeile? Begründen Sie Ihre Antworten einmal grafisch und einmal mit Hilfe von Zählern, welche die Verweise auf die Objekte zählen.

    Public Eintrag1 As cEintrag
    Private Eintrag2 As cEintrag

    Sub Test()                     '1
      Dim Temp As cEintrag         '2
      Set Temp = New cEintrag      '3
      Set Eintrag1 = New cEintrag  '4
      Set Eintrag2 = Temp          '5
      Set Temp = Eintrag1          '6
      Set Eintrag1 = Nothing       '7
    End Sub                        '8

#### Instanzen erstellen und löschen

Lernziele

- Auflistung
- Instanzen erstellen und löschen
- Konstruktor, Destruktor
- Objektvariable, Objektverweis

Verständnisfragen

Öffnen Sie die Arbeitsmappe LTelefonverzeichnis.xls aus dem Lösungsverzeichnis, und machen Sie sich mit dem Programm vertraut.

1. Fügen Sie die Namen 'David', 'Beat', 'Carmen' und 'Anna' in dieser Reihenfolge ins Verzeichnis ein, und beobachten Sie dabei den Programmablauf mit dem Debugger. Lassen Sie noch nicht die Liste ausgeben!

   - Wann wird das Verzeichnis-Objekt erstellt?
   - Wie viele Objekte existieren, nachdem die vier Namen eingefügt wurden?

   - Skizzieren Sie die Beziehungen der Objekte untereinander.

     Hinweise: | Wechseln Sie in den Entwurfsmodus und wieder zurück, wenn Sie das Verzeichnis löschen möchten. Ein Klick auf die Zurücksetzen-Schaltfläche löscht ebenfalls alle Objekte.

2. Beobachten Sie den Programmablauf bei der Suche nach den Namen 'David' und 'Beat'.

   - Wie oft wird die For Each ... Next-Schleife jeweils durchlaufen?

   - Im wievielten Durchlauf werden die gesuchten Namen jeweils gefunden?

     Fragen: | Welche einfache Massnahme könnte die Suche beschleunigen? Wie 'schnell' könnten Sie den Suchalgorithmus damit machen? Schlagen Sie ein Mass vor, mit dem Sie die Geschwindigkeit eines Suchalgorithmus 'fair' und vergleichbar angeben können.

3. Beobachten Sie den Programmablauf beim Auflisten der Namen und Telefonnummern. Verfolgen Sie insbesondere die Ausführung des Sortieralgorithmus.

   - Wie oft wird die Prozedur kleinsterEintrag aufgerufen, und welchen Wert gibt sie jeweils zurück?
   - Wie oft wird die For ... Next-Schleife in der Prozedur kleinsterEintrag jeweils durchlaufen?

   - Die beiden Programmzeilen

         tempVerzeichnis.Add Verzeichnis.Item(min)
         Verzeichnis.Remove min

     in der Prozedur sortiere werden je 4 Mal ausgeführt. Wie viele Objekte existieren jeweils nach Ausführung jeder Zeile?

   - Wie viele Objekte existieren nach Beendigung der Prozedur sortiere?

4. Fügen Sie in das Klassenmodul cEintrag folgende Zeilen ein:

       Private Sub Class_Initialize()
         MsgBox "neues Objekt erstellt"
       End Sub

   - Was bewirkt dieser Programmcode? Wann wird er ausgeführt?
   - Welche Meldungen erwarten Sie, wenn Sie ...
     ... einen Namen ins Verzeichnis hinzufügen (hinzufügen_Klick)?
     ... einen Namen suchen (suchen_Klick)?
     ... sich die Liste ausgeben lassen (auflisten_Klick)?

5. Das Klassenmodul cEintrag enthalte zusätzlich noch folgende Zeilen:

       Private Sub Class_Terminate()
         MsgBox "Objekt " & Name & " wird gelöscht"
       End Sub

   - Was bewirkt dieser Programmcode? Wann wird er ausgeführt?

   - Das Modul Prozeduren enthalte folgende Testprozedur:

         Private Sub Test()
           Dim einVerzeichnis As Collection           ' 1
           Dim einEintrag As cEintrag                 ' 2
           Set einVerzeichnis = New Collection        ' 3
           Set einEintrag = New cEintrag              ' 4
           einEintrag.Name = "Jakob"                  ' 5
           einVerzeichnis.Add einEintrag              ' 6
           Set einEintrag = New cEintrag              ' 7
           einEintrag.Name = "Daniela"                ' 8
           einVerzeichnis.Add einEintrag              ' 9
           Set einEintrag = New cEintrag              '10
           einEintrag.Name = "Kurt"                   '11
           einVerzeichnis.Add einEintrag              '12
           Set einEintrag = New cEintrag              '13
           einEintrag.Name = "Luise"                  '14
           einVerzeichnis.Add einEintrag              '15
           Set einEintrag = Nothing                   '16
           Set einEintrag = einVerzeichnis.Item(3)    '17
           einVerzeichnis.Remove 3                    '18
           Set einEintrag = Nothing                   '19
           Set einEintrag = einVerzeichnis.Item(3)    '20
           einVerzeichnis.Remove 3                    '21
         End Sub                                      '22

     Welche Meldungen erscheinen jeweils nach Ausführung der nummerierten Zeilen? Die Arbeitsmappe TelefonverzeichnisTest.xls enthält das Klassenmodul und die Testprozedur. Überprüfen Sie Ihre Antworten.

     Hinweise: | Machen Sie sich eine Skizze, welche die beteiligten Objekte, Objektvariablen und Objektverweise grafisch darstellt.

#### sortierter Binärbaum

Lernziele

- sortierter Binärbaum

1. Sie sollen den Begriff 'eltern' in den oben abgebildeten Baum einfügen. Wie bleibt der Baum sortiert?

   1. Als rechter Nachfolger von 'blatt'
   2. Als linker Nachfolger von 'knoten'
   3. Als linker Nachfolger von 'ast'

2. Fügen Sie folgende Begriffe der Reihe nach in den abgebildetetn Baum ein, und skizzieren Sie das Ergebnis.

   1. 'eltern', 'mutter', 'vater'
   2. 'vater', 'mutter', 'eltern'
   3. 'eltern', 'vater', 'mutter'

3. Konstruieren Sie einen alternativen sortierten Binärbaum für die sieben im Bild genannten Begriffe. Beschreiben Sie Ihr Vorgehen rezeptartig. Wie viele verschiedene Bäume kann es bei sieben Begriffen schätzungsweise geben?

#### Einfügealgorithmus

Lernziele

- sortierter Binärbaum

Der folgende Entwurfscode beschreibt einen Algorithums für das Einfügen von Elementen in einen sortierten Binärbaum.

    FügeHinzu Begriff
      FALLS Baum noch keinen Wurzelknoten hat
        erzeuge Wurzelknoten
        fülle Begriff ein.
      SONST
        gehe zu Wurzelknoten
        WIEDERHOLE BIS Begriff = Begriff im aktuellen Knoten
          FALLS Begriff < Begriff im aktuellen Knoten
            FALLS Knoten keinen linken Nachfolger hat
              erzeuge linken Nachfolgerknoten
              fülle Begriff ein
            gehe zu linkem Nachfolgerknoten.
          SONST
            FALLS Knoten keinen rechten Nachfolger hat
              erzeuge rechten Nachfolgerknoten
              fülle Begriff ein
            gehe zu rechtem Nachfolgerknoten.

Was passiert, wenn man versucht, mit dem beschriebenen Einfügealgorithmus einen Begriff einzufügen, der bereits im Baum vorhanden ist?

#### verkettete Liste

Lernziele

- verkettete Liste

Jedes Element einer verketteten Liste ist nur über den Verweis von seinem Vorgängern aus erreichbar. Wird versehentlich ein solcher Verweis gelöscht, so sind alle nachfolgenden Elemente verloren. Reist beispielsweise die unten skizzierte Kette zwischen 'beat' und 'clara', so sind die Elemente 'clara', 'david' und 'eva' nie mehr erreichbar.

1. Formulieren Sie entwurfssprachlich einen Algorithmus, der ...

   1. das Element 'karl' in die unten abgebildete verkettete Liste so hinter 'beat' einfügt, dass die Kette nicht abreist.
   2. das Element 'beat' aus der abgebildeten verketteten Liste so löscht, dass die Kette nicht abreist. Der Löschalgorithmus ist komplizierter als der Einfügealgorithmus. Worin liegt das Problem, und welche Erweiterung an der Datenstruktur könnte dieses Problem beseitigen?
   3. das Element 'clara' in der abgebildeten verketteten Liste sucht.

2. Verallgemeinern Sie die drei Algorithmen und implementieren Sie sie in Visual Basic. Verwenden Sie die Arbeitsmappe verketteteListeSkelett.xls.

LverketteteListe.xls

#### Verkettete Liste debuggen

Lernziele

- verkettete Liste
- Debuggen

Vertiefungsfragen

Laden Sie die Arbeitsmappe LverketteteListe.xls aus dem Lösungsverzeichnis, und wechseln Sie in die Programmierumgebung.

1. Machen Sie sich mit dem Programmcode vertraut.

   - Aus welchen Modulen setzt sich das Projekt zusammen?
   - Welche Funktion hat das Modul cZelle?
   - Welche Prozeduren implementiert das Modul Prozeduren, und wozu wird die Variable Anfang benötigt?

2. Wechseln Sie ins Modul Prozeduren, setzen Sie den Cursor auf die Variable Anfang, und klicken Sie auf die Schaltfläche in der Debugger-Symbolleiste (oder drücken Sie <Umschalt> + <F9>). Bestätigen Sie den Dialog, der erscheint, mit der Schaltfläche 'Hinzufügen'. Sie können nun im Fenster Überwachungsausdrücke den Inhalt der Variablen Anfang bei der Programmausführung jederzeit ansehen.

   - Platzieren Sie den Cursor auf die Prozedur Test und durchlaufen Sie die Prozedur mit Prozedurschritten ( oder <Umschalt> + <F8>). Beobachten Sie den Inhalt der Variablen Anfang. Achten Sie darauf, dass Sie die Datenstruktur immer mit expandieren.
   - Klicken Sie in der Debugger-Symbolleiste auf die Schaltfläche Zurücksetzen (), um die Variableninhalte wieder zu löschen.
   - Fügen Sie die Variable suche in der Prozedur suche zu den Überwachungsausdrücken hinzu, und lassen Sie die Testprozedur noch einmal durchlaufen. Verwenden Sie diesmal Einzelschritte ( bzw. <F8>), sobald die Prozedur suchen aufgerufen werden soll. Verfolgen Sie den Ablauf des Suchalgorithmus.

#### Traversierungsverfahren

Lernziele

- Baumtraversierungen

Das folgende Bild zeigt zwei sortierte Beispielbäume.

1. In welcher Reihenfolge werden die Knoten in den folgenden vier Traversierungsverfahren zurückgegeben?

   - Breitentraversierung
     ........................................
   - Präordnungs-Traversierung
     ........................................
   - Inordnungs-Traversierung
     ........................................
   - Postordnungs-Traversierung
     ........................................

2. Formulieren Sie umgangssprachlich eine Vorschrift, die das erste Element nach der Inordnungs-Traversierung zurückgibt. Beginnen Sie dazu bei der Wurzel, und überlegen Sie sich, welchem Ast Sie jeweils folgen, wenn ein Knoten ...

   - einen linken und einen rechten Nachfolger hat.
   - nur einen linken Nachfolger hat.
   - nur einen rechten Nachfolger hat.
   - keinen Nachfolger hat.
   - Was machen Sie, wenn der Baum leer ist, d.h. kein Wurzel hat?

3. Formulieren Sie umgangssprachlich eine Vorschrift, die bei einem gegebenen Element das nächste Element nach der Inordnungs-Traversierung zurückgibt. Betrachten Sie dazu wieder die vier oben genannten Fälle, d.h. wenn der gegebene Knoten ...

   - einen linken und einen rechten Nachfolger hat.
   - nur einen linken Nachfolger hat.
   - nur einen rechten Nachfolger hat.
   - keinen Nachfolger hat.
   - Was machen Sie, wenn der gegebene Knoten bereits der letzte war?

4. Belegen Sie die Richtigkeit Ihrer Algorithmen anhand der beiden Beispielbäume.

#### Inordnungs-Traversierung

Lernziele

- Inordnungs-Traversierung

Betrachten Sie den folgenden Beispielbaum, und begründen Sie die folgenden Aussagen mit Hilfe der Entwurfscodes für die Methoden OErster und ONächster.

    OErsterRek(Baum)

      'Abbruchbedingung
      FALLS Baum leer ist
        gib Nothing zurück.
      SONST FALLS Baum KEINEN linken Nachfolger hat
        gib Baum zurück.

      'Reduktion
      SONST
        gibt ersten Eintrag von linkem Teilbaum von Baum zurück.

    ONächster(Knoten)
      FALLS Knoten einen rechten Teilbaum hat
        gib ersten Eintrag des rechten Teilbaumes zurück.
      SONST
        beginne bei Knoten
        WIEDERHOLE BIS Begriff > Begriff in Knoten
          klettere einen Knoten hoch
          FALLS neuer Knoten leer ist
            gibt Nothing zurück
            brich ab.
        gib aktuellen Knoten zurück.

1. g ist der erste Knoten des Baumes.
2. m ist der Nachfolger von l.
3. k ist der Nachfolger von h.
4. g kann nicht der Nachfolger von l sein.
5. p kann nicht der Nachfolger von l sein.
6. x ist der letzte Knoten des Baumes.

#### Breitentraversierung

Lernziele

- Breitentraversierung

Betrachten Sie die beiden Binärbäume.

1. Erstellen Sie nach dem Breitentraversierungsverfahren je eine Sequenz für die Elemente dieser beiden Bäume. Rekonstruieren Sie anschliessend aus Ihren Sequenzen von Elementen mit Hilfe des Einfügealgorithmus die Bäume, und vergleichen Sie sie mit den Originalen.

2. Erstellen Sie nach dem Inordnungs-Tiefentraversierungsverfahren je eine Sequenz für die Elemente der beiden Bäume. Beschreiben Sie anschliessend ein Verfahren, das aus diesen Sequenzen wieder gute, d.h. möglichst ausbalancierte Bäume aufbauen kann.

#### Entwurf

Lernziele

- Anwendung entwerfen
- Abstraktion
- Klassen und Objekte identifizieren
- Datentypen wählen

Verwenden Sie für die Aufgaben Papier und Bleistift, und diskutieren Sie Ihre Lösungen mit Ihrem Nachbarn oder Ihrer Nachbarin. Es gibt meist keine eindeutige Antworten.

Vertiefungsfragen

1. Die Übungsaufgabe "Turtle" implementiert einfache Turtlegrafik-Befehle in einem Standardmodul und stellt sie zur Verfügung. Welche Vorteile hätte man, wenn man anstelle des Standardmoduls ein Klassenmodul verwenden würde?

2. Sie sollen eine Anwendung entwickeln, welche die Leistungen aller Studierenden einer Fakultät verwaltet. Welche der drei Datenstrukturen wählen Sie für folgende Daten? (Begründen Sie Ihre Antworten.)

   Datenfeld fester Grösse verkettete Liste sortierter Binärbaum | Alle Studierenden und ihre persönliche Daten wie Name und Adresse Alle zulässigen Noten (nur ganze und halbe Noten) Alle Wahlfächer Die Leistungen eines Studenten oder einer Studentin Alle Dozierenden Alle Veranstaltungen, in denen Kreditpunkte erworben werden können Alle Veranstaltungstypen (z.B. Vorlesung, Seminar oder Lizarbeit)

3. Angenommen, Sie sollen ein Zeichenprogramm entwickeln, das einfach zu bedienen ist. Sie kommen zum Schluss, dass es für die Benutzer wohl am einfachsten ist, wenn sie mit ihren gewohnten Werkzeugen wie Papier und Bleistift arbeiten können. Sie entschliessen sich deshalb für einen objektorientierten Ansatz.

   Sie identifizieren drei Gruppen von Werkzeugen:

   1. Gegenstände, auf die gezeichnet wird (z.B. Papier).
   2. Werkzeuge, mit denen gezeichnet wird (z.B. Bleistift).
   3. Werkzeuge, die eine Form beschreiben (z.B. Kreisschablone).

   Der folgende Entwurfscode illustriert an einem Beispiel, wie Sie gedenken, mit den Objekten dieser drei Gruppen zu arbeiten.

       Nimm oder erstelle roten Bleistift der Dicke 3.
       Nimm oder erstelle Kreisschablone mit Mittelpunkt 50/60 und Radius 30.
       Nimm oder erstelle weisses Papier im Format A4 quer.
       Zeichne auf Papier mit Kreisschablone und Bleistift.

   1. Nennen Sie für jede Werkzeuggruppe reale Gegenstände, von denen Sie abstrahieren können. Nennen Sie weitere Gegenstände, die Sie im Programm abbilden könnten, die aber in keine der drei Gruppen passen.

   2. Nennen Sie Eigenschaften dieser Gegenstände, die Ihr Programm implementieren muss. Nennen Sie Attribute der Gegenstände, die Ihr Programm ignorieren kann.

   3. Nennen Sie die Klassenmodule, die Sie benötigen, um ihre Gegenstände im Programm abzubilden. Aus welchen Klassen kann man die im Entwurfscode verwendeten Objekte erstellen?

   4. Welche Eigenschaften implementieren Sie als öffentliche Variablen, bei welchen verwenden Sie Property-Prozeduren? Skizzieren Sie die Implementation jener Eigenschaften, die im Entwurfscode verwendet werden.

   5. Das Zeichnen sei Aufgabe der Objekte der Gruppe i. Die 'zeichnen'-Methode nimmt je ein Objekt der Gruppen ii und iii entgegen und stellt das gewünschte auf dem Bildschirm dar. Notieren Sie den Prozedurkopf der Methode 'zeichnen' in VBA.

   6. Skizzieren Sie die Implementation des obigen Entwurfcodes in VBA.

©abo