Startseite | Serie 3 a / c / mx

Teil 3 - OPL für Anfänger


Felder und Indizes, oder das Programm nimmt brauchbare Gestalt an....

Das Programm generiert nun schon 6 Zufallszahlen, leider sind oft genug Wiederholungen vorhanden. Da das im realen und harten Lottoechteinsatz ziemlich unbrauchbar ist, werden wir heute an einer Lösung dieses Problems arbeiten.
Um die Zahlen mit den bereits gezogenen vergleichen zu können, müssen wir uns also alle gezogenen Zahlen merken.

Wir fügen also folgende Zeile im oberen Bereich unseres Programmes ein:

LOCAL numbers%(6) rem Feld um die gezogenen Zahlen zu speichern

Jetzt brauchen wir noch einen zusätzlichen Zähler, um das zu erzielen wird die Eingabe ,J% hinter LOCAL i% gesetzt. Der Quelltext sollte jetzt etwa so aussehen:

K0301

Das Zeichen % hinter dem Variablennamen definiert die Art (Integer). Die 6 in den Klammern definiert die Feldgröße. In diesem Fall ist die Variable numbers also 6 * vorhanden:

numbers%(1) | numbers%(2) | numbers%(3) | numbers%(4) | numbers%(5) | numbers%(6)

So besteht die Möglichkeit jede gezogene Nummer zwischenzuspeichern und später mit den neu gezogenen Nummern zu vergleichen. Um dies zu bewerkstelligen wird eine neue kleine Schleife benötigt, in der wir die Schleifenvariable j% benutzen werden.
Die Logik soll etwa so sein....

Setze einen Zähler (j%)  auf 1
While j% ist kleiner als, oder gleich die Anzahl der zu ziehenden Nummern
Prüfe ob die gerade zufällig gezogene Nummer (j%) bereits im Feld vorhanden ist
Wenn Ja, gehe zurück und ziehe eine neue Zufallsnummer
Addiere 1 zu j%
Gehe zurück zu While und beginne von neuem mit den Bedingungen

Alles klar? Die Logik sollte unbedingt klar sein bevor die Lektion weiter abgearbeitet wird! Es kann eine Hilfe sein dieses Programmteil auf einem Blatt Papier Zeile für Zeile durchzuarbeiten. Dort muß dann jederzeit ersichtlich sein welche Variable welchen Wert enthält. Der Psion macht auch nichts anderes; nur ein kleines bißchen schneller....

Nun folgt der Code in OPL, diesmal muß ein klein wenig mehr als sonst getippt werden:

K0302

Das Display sollte etwa folgenden Inhalt haben, nun aber die Erweiterungen/Änderungen im Einzelnen:

1. Die Zufallszahl wird nicht direkt ausgedruckt, sondern in der Feldvariablen
abgelegt. Das ist zu späteren Prüfung auf doppelte Zahlen notwendig.

2. Es wurde eine zweite Schleife (j%) innerhalb der ersten (i%) eingefügt.
Das ist der weiter oben beschriebene Test.

3. Anzumerken ist, das die j% Schleife immer nur (i%-1) Durchgänge erzielt.
Das bedeutet, das bei der ersten Zahl die Schleife j% keine Reaktion bewirkt
(j% ist ja 0) und von da ab immer nur eins weniger als i%. Das ist anders auch
nicht notwendig, da bei der ersten Zahl ja keine andere Zahl existiert mit der
man vergleichen müßte!

4. Wurde ein doppelte Zahl entdeckt springt das Programm zu Marke "picknum::",
um den Zufallsgenerator erneut aufzurufen und die Prüfung abzuarbeiten. Für die
Sprungmarke kann jeder Begriff verwendet werden, er sollte jedoch eine gewisse
Aussagekraft haben. Da die ganze Programmiererei im allgemeinen englisch ist,
habe ich hier den englischen Begriff übernommen.
Ferner muß zu unserer Lösung noch gesagt werden, das es eine höchst
unelegante Lösung ist ein GOTO zu verwenden. Aber für dieses Problem
belassen wir es erst mal dabei.

5. Die Printanweisung erfolgt zu dem Zeitpunkt wenn wir genau wissen,
daß die Zahl nicht doppelt vorhanden ist!

So jetzt ist es aber Zeit das Programm zu übersetzten und zu Starten. Wenn bei der Übersetzung noch Fehler auftreten, dann muß das Programm mit dem obigen verglichen werden. Nun ist der Lottozahlengenerator ja schon fertig......

Wenn da nicht noch das Allerwichtigste fehlen würde: Der Copyrightvermerk und die Ausgabe des Programmnamens usw......

Was wir also zuerst mal brauchen ist ein Programmname:
Psionwelt Lottozahlen Generator oder auch "P.L.G."

So fügen wir in der Nähe des Programmbegins folgende Zeilen ein:

PRINT "P.L.G. v0.1 (C) PsionWelt 1998"
PRINT "Ausgabe der Lottonummern:"

K0303

Und am Ende des Programmes vor der Zeile "GET" fügen wir folgende Zeile ein:

PRINT "Drücken Sie bitte eine Taste um das Programm zu beenden"

Nach der Übersetzung und dem erneuten Start sollte auf dem Display folgendes zu sehen sein:

K0304

Das nächste Kapitel unserer Programmiereinführung wird auf dem heutigen Programm aufbauen und sich unter anderem mit der Erstellung einer guten Benutzeroberfläche beschäftigen