Kapitel 8: Fortgeschrittenes Programmieren

READ und DATA

Sie haben zwei Methoden kennengelernt, mit denen man einen Zahlenwert einer Variablen zuordnen kann; durch eine direkte Zuweisung im Programm (z. B. A=2) oder mit einer INPUT-Anweisung. Bei manchen Anwendungen, insbesondere wenn es sich um die Verarbeitung größerer Zahlenmengen handelt, sind jedoch beide Methoden nicht praktikabel. In solchen Fällen ist es sinnvoll, wie im folgenden Programm vorzugehen:

HTML

Das Programm ist so aufgebaut, daß die Zeilen 10 bis 30 wiederholt durchlaufen werden. Jedesmal, wenn die Zeile 10 erreicht wird, liest die READ-Anweisung die nächste Zahl in den DATA-Anweisungen. Bei jedem Durchlauf der Schleife wird ein ZEIGER (oder POINTER) um eine Stelle nach hinten versetzt; auf diese Weise “merkt” sich der Computer, wie weit er mit dem Lesen gekommen ist.

Wenn der Computer alle in den DATA-Anweisungen stehenden Zahlen gelesen hat und beim nächsten Leseversuch keine Daten findet, so bricht er das Programm mit der Fehlermeldung OUT OF DATA ERROR ab.

Folgendes Format muß bei den DATA-Anweisungen eingehalten werden:

Die DATA-Anweisungen können ganze Zahlen, Dezimalbrüche oder Zahlen in wissenschaftlicher Notation enthalten, jedoch keine Variablen oder arithmetischen Operationen. Folgende DATA-Zeile ist unzulässig:

HTML

Auch Strings können in DATA-Anweisungen gespeichert werden; Sie müssen dann allerdings, wie im folgenden Beispiel gezeigt ist, auch die zugehörige READ-Anweisung mit einer String-Variablen versehen:

HTML

Im Gegensatz zum letzten Beispiel haben wir die READ-Anweisung in eine FOR … NEXT-Schleife eingeschlossen, die so oft durchlaufen wird, wie es der Anzahl der Elemente in der DATA-Anweisung entspricht. Wird diese Zahl geändert, so muß auch die Anzahl der Schleifendurchläufe geändert werden. Es ist deswegen in vielen Fällen bequemer, das Ende der Daten durch eine Marke (auch “flag” genannt) zu kennzeichnnen. Diese Marke sollte durch ein Element (Zahl oder String) dargestellt werden, das in Ihren Daten nicht vorkommen kann (z. B. eine negative Zahl, wenn in Ihren DATA-Zeilen das Lebensalter von Personen aufgelistet ist). Mit dem Auftreten dieser Marke kann dann eine Bedingung verknüpft werden, die zum nächsten Programmteil verzweigen läßt.

Wenn Sie die in DATA-Anweisungen gespeicherten Werte in einem Programm mehrfach verwenden wollen, so müssen Sie den Zeiger wieder auf das erste Element zurücksetzen. Dies geschieht mit Hilfe des RESTORE-Befehls. Ergänzen Sie das Programm auf Seite 95 durch die Zeile

HTML

Sie werden die Fehlermeldung OUT OF DATA ERROR erhalten, da nach dem ersten Durchlauf des Programms der DATA-Zeiger auf den letzten String zeigt und nach dem Rücksprung nach Zeile 10 keine Daten mehr findet. Sie müssen deshalb noch folgende Zeile hinzufügen:

HTML

Das Programm läuft nun beliebig lang, da nach jedem Durchlauf der DATA-Zeiger zurückgestellt wird.

Mittelwerte

Das folgende Programm stellt eine praktische Anwendung von READ und DATA dar. Zahlen werden aus DATA-Zeilen eingelesen und der Mittelwert wird berechnet.

HTML

In Zeile 5 werden Schleifenzähler CT und die Zahlensumme T gleich 0 gesetzt. In Zeile 10 werden die Daten gelesen und in Zeile 20 werden sie überprüft ob es sich dabei um eine Marke (“flag”) handelt; in unserem Fall wird die Marke durch eine “- 1” dargestellt. Wenn es sich um gültige Daten handelt, so werden sie aufaddiert (Zeile 30) und der Zähler wird um 1 erhöht (Zeile 25).

Handelt es sich beim gelesenen Datum um eine Endmarkierung, so verzweigt das Programm zur Zeile 50. Dort wird ausgegeben, aus wie vielen Werten der Mittelwert berechnet wird. Zeile 60 führt zur Ausgabe der Summe, und in Zeile 70 wird der Mittelwert berechnet und auf dem Bildschirm ausgedruckt. Wenn Sie das Ende Ihrer DATA-Anweisungen mit einer Marke kennzeichnen, können Sie die Anzahl der Elemente beliebig verändern und brauchen sich keine Gedanken über ihre Anzahl zu machen.

Eine Variation in der Anwendung von READ und DATA besteht darin, daß Sie Elemente aus einer DATA-Anweisung verschiedenen Variablen zuordnen. Sie können in solchen Fällen sogar Zahlen und Strings in den DATAS miteinander mischen, wie es in dem folgenden Programm geschehen ist.

HTML

Sie müssen in solchen Fällen natürlich darauf achten; daß den Stringvariablen bzw. numerischen Variablen auch Strings bzw. Zahlen in den DATA-Anweisungen entsprechen. So erwartet die READ-Anweisung in unserem Programm jeweils einen String und darauffolgend drei Zahlen; dies entspricht auch der Struktur der Daten in den DATA-Zeilen.

Indizierte Variablen

Wir haben bis jetzt nur einfache Variablen der Form A, XY, K1, C$ etc. benutzt. Der Variablenname bestand immer aus einem Buchstaben, oder aus der Kombination eines Buchstabens mit einem zweiten, bzw. mit einer Ziffer.

Die Anzahl der Variablennamen, die Sie auf diese Weise erzeugen können, dürfte in den meisten Fällen ausreichen, aber die Handhabung solcher Variablen in einem Programm ist manchmal recht umständlich. Wir wollen Sie deshalb in das Konzept der indizierten Variablen einführen:

Eine indizierte Variable besteht also aus einem Buchstaben gefolgt von einer in Klammern gesetzten Zahl, dem Index. Gelesen wird diese Zusammenstellung “A von eins”. Passen Sie auf, daß Sie A(1) nicht in einen Topf mit A1 werfen; A1 ist keine indizierte Variable.

Indizierte Variablen bezeichnen, wie die “normalen” Variablen auch, Speicherplätze im Computer, die Sie sich etwa wie numerierte Schachteln vorstellen können.

Wenn Sie jetzt definieren:

HTML

sieht Ihr Speicher so aus:

Information

Indizierte numerische Variable enthalten den Wert 0, wenn ihnen kein anderer Wert zugewiesen wurde. Es gibt jedoch auch die Möglichkeit, Stringvariablen zu indizieren (z. B. B$(2)); solche Variablen enthalten, wenn ihnen kein String zugewiesen wurde “nichts”.

Eine Solche Gruppe indizierter Variablen nennt man ein FELD (oder auch TABELLE). Bis jetzt haben Sie nur die eindimensionalen Felder (mit einem Index) kennengelernt. Später werden wir den mehrdimensionalen Fall behandeln. Indices können komplex zusammengesetzt sein, d. h. sie können z. B. Variablen oder Rechenoperationen enthalten. Erlaubt sind z.B. die folgenden Ausdrücke für indizierte Variablen:

HTML

Die Ausdrücke in den Klammern werden nach den normalen Rechenregeln für arithmetische Operationen (Kapitel 2) ausgeführt. Die Grundbegriffe sind Ihnen nun wahrscheinlich klar. Aber was fängt man mit den indizierten Variablen in einem Programm eigentlich an? Eine Anwendung besteht z. B. darin, Zahlen, die mit READ oder INPUT eingelesen werden, in einer Liste zu speichern. Im nächsten Programm verwenden wir die indizierten Variablen, um einen Mittelwert auf etwas abweichende Art auszurechnen:

HTML

Man hätte dieses Programmierproblem sicher eleganter lösen können, aber hier soll ja illustriert werden, wie die indizierten Variablen angewendet werden können. In Zeile 10 wird gefragt, wieviele Zahlen eingegeben werden sollen. Die zugeordnete Variable X gibt an, wie oft die Schleife durchlaufen werden muß, in der die zu verarbeitenden Werte eingegeben und der indizierten Variablen B(A) zugeordnet werden. Der Wert von A wird bei jedem Schleifendurchlauf um 1 erhöht, und auf diese Weise werden fortlaufend die indizierten Variablen B(1), B(2), B(3)… etc. erzeugt und den eingegebenen Zahlen zugeordnet. Das hat aber zur Folge, daß wir auf diese Zahlen sehr leicht zugreifen können, um sie auszudrucken oder in irgend einer Weise verarbeiten zu lassen. In den Zeilen 50 bis 80 wird z. B. der Mittelwert errechnet. Sie können sich die Zahlen aber auch auf einfache Weise auf dem Bildschirm ausdrucken lassen. Tippen Sie dazu ein:

HTML

(<RETURN>-Taste drücken)

Sie erhalten dann die Inhalte der indizierten Variablen auf dem Bildschirm ausgedruckt.

Dimensionierung

Wenn Sie im obigen Beispiel versucht haben, mehr als 10 Werte einzugeben, so haben Sie die Fehlermeldung BAD SUBSCRIPT ERROR IN 30 erhalten. Sie können Felder bis zu 11 Elementen (das entspricht den Indices 0 bis 10 bei eindimensionalen Feldern) wie normale Variablen benutzen; Felder mit mehr als 11 Elementen müssen jedoch “dimensioniert” werden.

Fügen Sie zu diesem Zweck die folgende Zeile zu obigem Programm hinzu:

HTML

Hierdurch teilen Sie Ihrem Computer mit, daß Sie maximal 100 Werte eingeben wollen. Sie können aber auch mit einer Variablen dimensionieren. Löschen Sie dazu erst die Zeile 5 (durch Eintippen von 5 und Drücken der <RETURN>-Taste) und geben dann folgende Zeile ein:

HTML

Dadurch wird das Feld exakt so dimensioniert, wie es der Anzahl der Zahlen, die Sie eingeben wollen, entspricht.

Aber bedenken Sie: eine einmal erfolgte Dimensionierung kann im weiteren Verlauf des Programms nicht rückgängig gemacht werden.

Mehrere Dimensionierungen können in folgender Weise zusammengefaßt werden:

HTML

Simulation eines Würfelspiels

Komplizierte Programme können durch Verwendung von indizierten Variablen knapp und einfach geschrieben werden.

Im nächsten Programm wird eine indizierte Variable verwendet, um zu registrieren, wie oft eine bestimmte Zahl gewürfelt wird.

HTML

Ein Element des Feldes F(1) … F(6) wird jeweils um 1 vergrößert, wenn die entsprechende Zahl gewürfelt wird; so wird z. B. bei 2 Augen der Wert von F(2) um 1 erhöht.

In Zeile 10 wird gefragt, wie oft gewürfelt werden soll; die gewünschte Anzahl wird dann in der Variablen X gespeichert.

Eine von Zeile 20 bis Zeile 50 reichende Schleife, in der die Würfe simuliert und die Ergebnisse registriert werden, wird dann X-mal durchlaufen. In Zeile 60 und 70 werden die Ergebnisse in Form einer Tabelle ausgedruckt.

Nach dem Ablauf des Programms kann der Bildschirm etwa wie folgt aussehen:

Untenstehend haben wir ein Programm abgedruckt, welches das gleiche leistet; jedoch ohne indizierte Variablen zu verwenden. Sie brauchen es nicht abzutippen, aber beachten Sie, um wieviel länger es gegenüber dem vorhergehenden Programm ausgefallen ist.

HTML

Die Länge des Programms hat sich von 8 auf 16 Zeilen verdoppelt. Bei größeren Programmen, insbesondere bei einer größeren Zahl von Variablen, kann man noch mehr Zeilen und damit Speicherplatz einsparen.

Zweidimensionale Felder

Das Element eines zweidimensionalen Feldes hat folgende Form:

Anschaulich kann man sich ein solches Feld als ein zweidimensionales Gitter vorstellen:

Hierbei geben die Indices an, in welcher Spalte und welcher Zeile dieser Tabelle das betreffende Element steht.

Wir können uns also vorstellen, daß die 255 in der dritten Zeile und der vierten Spalte unserer Tabelle steht.

Wie die eindimensionalen, müssen auch die mehrdimensionalen Felder dimensioniert werden. Ein Feld von 21 mal 21 Elementen wird z. B. durch DIM A(20,20) dimensioniert.

Was ist nun eine typische Anwendung für ein zweidimensionales Feld? Nehmen wir einmal an, Sie müßten einen Fragebogen entwerfen, der 4 Fragen enthält, auf die je 3 verschiedene Antworten möglich sind. Ihr Fragebogen würde also etwa wie folgt aufgebaut sein:

FRAGE 1: Sind Sie mit Ihrem Chef zufrieden?

1 = JA 2 = NEIN 3 = UNENTSCHIEDEN

… usw.

Die Auswertung eines solchen Fragebogens könnte in Form der folgenden Tabelle geschehen, die wir uns als zweidimensionales Feld denken.

Das zugehörige Auswerteprogramm ist auf Seite 104 abgedruckt.

Viele Programmiertechniken, die wir bis jetzt besprochen haben, sind in diesem Programm zur Anwendung gekommen. Auch wenn Sie das Programm nicht benutzen wollen, sollten Sie versuchen, seinen Aufbau zu verstehen.

Das Kernstück des Programms ist ein Feld aus 4 mal 3 Elementen. In diesen Elementen werden die Antworten gezählt. Aus Gründen der Übersichtlichkeit haben wir dabei die Elemente A(0,0) bis A(0,4) nicht benutzt.

Im Klartext: Wenn auf die Frage 1 die Antwort “JA” gegeben wurde, so wird A(1,1) um 1 vergrößert – Zeile 1, da es sich um Frage 1 handelt und Spalte 1, da die Antwort “JA” lautet. Eine Beantwortung der Frage 3 mit NEIN würde das Element A(3,2) um 1 vergrößern etc.

HTML