Inhaltsverzeichnis

Aufgaben

1. Formulieren Sie einige der Lösungen der Aufgaben früherer Abschnitte als Prozeduren oder Funktionen. Überlegen Sie, welche Parameter diese Prozeduren benötigen. Beachten Sie dabei die Unterschiede zwischen Variablen- und Wertparametern. Diese Prozeduren können Sie bei Bedarf als Include-Files (s. Abschnitt 4.4.6.4) auf einer Diskette speichern und später in eigenen Programmen verwenden. Beispiele:

PROCEDURE BLOCKSATZ(VAR S: STRING; N: INTEGER;
     RECHTS: BOOLEAN);
(* Formatiere die Textzeile in S im Blocksatz auf *)
(* N Spalten. Falls RECHTS=TRUE, werden Leer-     *)
(* stellen von rechts, ansonsten von links be-    *)
(* ginnend in den Wortzwischenräumen eingefügt.   *)
 
CONST N      = ...
TYPE ELEMENT = ...
FELD: ARRAY [1..N] OF ELEMENT;
 
PROCEDURE BUBBLESORT(VAR A: FELD);
(* Sortiere das Feld A aufsteigend mit dem Algo- *)
(* rithmus BUBBLESORT.                           *)
 
FUNCTION POSITION(VAR A: FELD; W: ELEMENT): INTEGER;
(* Suche das Element W im aufsteigend sortierten *)
(* Array A. Das Funktionsergebnis ist der Index  *)
(* im Intervall 1..N. Wird W nicht gefunden, so  *)
(* ist das Funktionsergebnis die Zahl 0.         *)

Solche kommentierten Prozedurrümpfe sind eine geeignete Methode, um beim Entwurf größerer Programme die Teilaufgaben überschaubar aufzuteilen. Andererseits sind sie ein gutes Dokumentationshilfsmittel, um die Struktur eines bestehenden Programmes zu erläutern, da man die Details des Anweisungsteils einer Prozedur oder Funktion bei Bedarf ignorieren kann.

2. Zur Darstellung von Meßwerten und statistischen Daten sind Balkendiagramme und Tortendiagramme besonders geeignet. Entwickeln Sie Prozeduren, die möglichst allgemein verwendbare beschriftete Balken- und Tortendiagramme zeichnen. Bei Bedarf können Sie die Diagramme auch dreidimensional ausgeben.>

Bild 54: Balken- und Tortendiagramme

Vielleicht helfen Ihnen beim Programmieren die folgenden Prozedurrümpfe und Anmerkungen:

Besonders problematisch ist die Beschriftung von Grafiken, da der C-128 auch im Grafikmodus bei der Ausgabe von Texten an ein 40*25 Zeichen Raster gebunden ist. Damit ist jedes Zeichen auf dem Grafikbildschirm 8 * 8 Pixel groß. Dementsprechend ist es sinnvoll, Grafiken an dieses 8*8 Raster anzupassen.

CONST MAXTEILE = 12;
      ZEICHENHOEHE  = 8; (* Pixel pro Zeichen *)
      ZEICHENBREITE = 8; (* Pixel pro Zeichen *)
 
TYPE TWERTE = ARRAY[1..MAXTEILE] OF REAL;
     TLEGENDE = ARRAY[1..MAXTEILE] OF STRING[8];

PROCEDURE BALKENDIAGRAMM (N      : INTEGER;
 MAX    : REAL;
 VAR B  : TWERTE;
 VAR L  : TLEGENDE;
 ORGX   : INTEGER;
 ORGY   : INTEGER;
 BREITE : INTEGER;
 ABSTAND: INTEGER);
(* Zeichne ein Balkendiagramm aus N Werten in B mit  *)
(* der Beschriftung L. Ausser den Balken wird noch   *)
(* eine X- und Y-Achse gezeichnet. ORGX und ORGY     *)
(* legen den Ursprung in Zeichenpositionen im 40*25  *)
(* Raster fest. Auch die Breite und der Abstand der  *)
(* Balken werden in Zeichenpositionen angegeben.     *)

Das Balkendiagramm soll eine feste Höhe von 150 Pixeln auf dem Bildschirm besitzen. Dabei definiert MAX den maximalen Wert, den ein Balken voller Größe besitzen müßte. Die Werte in B werden dementsprechend mit einem Proportionalitätsfaktor multipliziert, um die Höhe jedes Balkens zu bestimmen. Mit ORGX und ORGY kann das Diagramm auf dem Bildschirm verschoben werden. Zur Anpassung der Balkenbreite an die darunterstehenden Texte werden die Parameter BREITE und ABSTAND in Zeichenpositionen angegeben.

PROCEDURE TORTE (N         : INTEGER;
  VAR T                    : TWERTE;
  VAR L                    : TLEGENDE;
  ORGX, ORGY, RADIUS, HOEHE: INTEGER)
(* Zeichne ein Tortendiagramm mit N Segmenten, die   *)
(* mit den Texten in L beschriftet werden. ORGX und  *)
(* ORGY legen den Mittelpunkt der Torte fest. HOEHE  *)
(* bestimmt die 'Dicke' der dreidimensionalen Torte  *)

Die Größe jedes Segmentes der Torte erhält man, indem man zunächst die Werte in T von 1 bis N aufaddiert. Dieser Wert entspricht einem Segment des Winkels 2*PI (6.2831853). Anschließend kann man durch einfache Dreisatzrechnung die Winkelgröße jedes Segmentes berechnen. Wenn Sie ein dreidimensionales Diagramm zeichnen möchten, müssen Sie außerdem nur bei den »vorne« sichtbaren Segmenten einen Strich am »Rand« der Torte zeichnen. Besonders aufwendig ist die Plazierung der Texte zu den Segmenten. Dabei sollten Sie vom Mittelpunkt jedes Segmentes einen Strich zum zugehörigen Text ziehen. Dieser Text befindet sich bei Segmenten, deren Mittelpunktswinkel kleiner als PI (3.1415926) ist, auf der rechten Seite (sonst links von der Torte).

Soll die Textverteilung bei beliebigen Segmentgrößen »gut« aussehen, müssen Sie verhindern, daß sich die Texte nebeneinanderliegender Segmente überlappen. Wahrscheinlich ist diese Textverteilung die aufwendigste Teilaufgabe bei der Programmierung.

Bei beiden Diagrammtypen können Sie noch die Umrandungen mit dem Befehl PAINT ausfüllen. Jedoch müssen Sie den Startpunkt zum Ausmalen innerhalb der Umrandung wählen.

3. Welches Ergebnis liefert die folgende Funktion?

FUNCTION GENAUIGKEIT: REAL;
  VAR R: REAL;
BEGIN
  R:= 1.0;
  REPEAT 
    R:= R * 0.5
  UNTIL R+1.0 <= 1.0;
  GENAUIGKEIT:= R
END; (* GENAUIGKEIT *)

Sollte Ihnen die etwas eigenartige Bedingung am Ende der Repeat-Anweisung Schwierigkeiten bereiten, sollten Sie Abschnitt 2.6 über die Darstellung reeller Zahlen im Computer zu Rate ziehen.

4. Das Standardbeispiel für die Anwendung rekursiver Prozeduren sind die Türme von Hanoi: Gegeben sind drei Stäbe und N Scheiben, die auf die Stäbe gesteckt werden können. Die Scheiben sind der Größe nach numeriert. Zu Beginn sind alle N Scheiben der Größe nach sortiert zu einem Turm auf dem ersten Stab gestapelt (s. Bild 55).

Bild 55: Die Türme von Hanoi

Die Aufgabe ist nun, den Turm in der gleichen Form auf Stab 3 aufzubauen. Dabei darf jedoch in jedem Schritt nur eine Scheibe von einem Stab zum anderen verlegt werden. Außerdem darf nie eine größere Scheibe auf einer kleineren liegen. Eine Lösung für 3 Scheiben sieht z.B. folgendermaßen aus:

Scheibe (1) von 1 nach 3
Scheibe (2) von 1 nach 2
Scheibe (1) von 3 nach 2
Scheibe (3) von 1 nach 3
Scheibe (1) von 2 nach 1
Scheibe (2) von 2 nach 3
Scheibe (1) von 1 nach 3
Schreiben Sie eine rekursive Prozedur, die einen Turm der Höhe N von 1 nach 3 verlegt und dabei den Lösungsweg wie oben angegeben protokolliert. Die Idee zu einer rekursiven Lösung besteht darin, daß zuerst ein Turm der Höhe N-1 von 1 auf den Hilfsstab 2 gebracht werden muß, um die Scheibe N von 1 nach 3 zu verlegen. Anschließend kann man den Turm der Höhe N-1 von 2 nach 3 bewegen und hat somit die Aufgabe gelöst.

Der Algorithmus läßt sich mit sehr wenigen Anweisungen ohne die Verwendung eines Arrays programmieren. Erst wenn Sie die rekursive Lösung gefunden haben, sollten Sie sich überlegen, wie man das Verlegen der Scheiben grafisch darstellen könnte. Entweder verwenden Sie dann ein Array, das die momentane Anordnung aller Scheiben speichert, oder Sie übergeben alternativ der rekursiven Prozedur zusätzlich die Höhe jedes Turmes.

5. Haben Sie bereits in BASIC programmiert, sollten Sie einige Ihrer BASIC-Programme in Pascal neu formulieren. Inzwischen ist Ihr Wissen in Pascal so weit gediehen, daß Sie zu jeder Kontroll- und Datenstruktur in BASIC das Gegenstück in Pascal kennen. Wahrscheinlich werden Sie erkennen, daß Sie durch die Blockstruktur von Pascal gezwungen sind, den Programmablauf völlig neu zu organisieren.

Inhaltsverzeichnis