Pascal-Kurs für Anfänger (Teil 3)
Lernen Sie den Gebrauch der Pascal-Funktionen kennen. Diese ragen weit über den Standard von Basic hinaus. Lesen Sie, wie Sie mit Pascal eigene Datentypen definieren und verarbeiten können.
Pascal besitzt, ähnlich wie Basic, die bekannten Operatoren » + «,»-«, »*« und»/«. Die Division mit »/« darf allerdings nur auf Werte vom Typ REAL angewendet werden. Für die ganzzahlige Division ist der Operator »DIV« zu verwenden. Den Rest einer ganzzahligen Division erhält man mit »MOD«.
Das sieht beispielsweise so aus:
10 DIV 3 ergibt 3
10 MOD 3 ergibt 1
3.15 MOD 5 ist nicht erlaubt
5/2 ergibt 2.5
Die letzte Operation ist gestattet, wenn das Ergebnis einer Real-Variablen zugewiesen wird. In Ausdrücken werden, wie in Basic auch, zuerst die Division und Multiplikation, dann die Addition und Subtraktion bearbeitet. Eine andere Vorrangregelung erreicht man durch das Setzen von Klammern.
Logische Ausdrücke
Ein logischer Ausdruck wird aus den Operatoren AND, OR und NOT gebildet. Er hat als Ergebnis den Wert TRUE oder FALSE und kann einer Variablen vom Typ Boolean zugewiesen werden.
Die folgende Wertetabelle zeigt, welche Ergebnisse die logischen Operatoren liefern. In logischen Ausdrücken werden zuerst NOT, dann AND und zuletzt OR abgearbeitet.
Beispiele:
a = FALSE und b = TRUE
und c = TRUE
NOT a AND b
ergibt TRUE
a OR b AND NOT c
ergibt FALSE
Vergleichsoperatoren haben ebenfalls ein boolesches Ergebnis. Folgende Vergleichsoperatoren sind vorhanden:
= gleich
> größer
< kleiner
= größer gleich
< = kleiner gleich
< > ungleich
Innerhalb eines Ausdruckes werden Vergleichsoperatoren ganz zum Schluß abgearbeitet. 15 * 4 < 20 ergibt FALSE
4 < > 5 ergibt TRUE
Mit Vergleichsoperatoren dürfen alle einfachen Datentypen einschließlich den noch zu besprechenden Aufzählungs- und Ausschnittstyp verglichen werden.
Standardfunktionen
Pascal besitzt eine Reihe von Standardfunktionen für arithmetische Berechnungen und zum Umwandeln von Datentypen. Einen Überblick finden Sie im Bild 1. Vier Standardfunktionen liefern Ergebnisse vom Typ INTEGER:
ABS(X) liefert den absoluten Wert von X
SQR(X) liefert das Quadrat von X
TRUNC® hat als Ergebnis den ganzen Teil eines REAL-Wertes ROUND® ergibt den gerundeten Wert von R
Beispiele:
ABS(3) = 3
ABS(-3) = 3
SQR(2) = 4
TRUNC(5.45) = 5
TRUNC(-5.45) = -5
ROUND(6.5) = 7
ROUND(-6.5) = -7
| Funktion | Parameter | Ergebnis | Bedeutung |
|---|---|---|---|
| ABS(x) | INTEGER | INTEGER | Absolutwert |
| ABS(x) | REAL | REAL | Absolutwert |
| SQR(x) | INTEGER | INTEGER | Quadrat |
| SQR(x) | REAL | REAL | Quadrat |
| SQRT(x) | REAL, INTEGER | REAL | Quadratwurzel |
| LN(x) | REAL, INTEGER | REAL | Nat. Logarithmus |
| EXP(x) | REAL, INTEGER | REAL | e hoch x |
| SIN(x) | REAL, INTEGER | REAL | Sinus |
| COS(x) | REAL, INTEGER | REAL | Cosinus |
| ARCTAN(x) | REAL, INTEGER | REAL | Arcustangens |
| TRUNC(x) | REAL | INTEGER | Ganzzahl von x |
| ROUND(x) | REAL | INTEGER | Rundung von x |
| CHR(x) | INTEGER | CHAR | Umwandlung eines ASCII-Wertes |
| ODD(x) | INTEGER | BOOLEAN | true falls ungerade |
| ORD(x) | skalar * | INTEGER | Position innerhalb eines Datentyps |
| SUCC(x) | skalar * | skalar | vorangehender Wert |
| PRED(x) | skalar * | skalar | folgender Wert |
| * darf nicht vom Typ REAL sein! | |||
Werden bei ABS und SQR REAL-Werte eingesetzt, erhält man auch ein REAL-Ergebnis. Bei den Funktionen SQRT, LN, EXP, SIN, COS und ARCTAN dürfen REAL- und INTEGER-Werte als Argument verwendet werden, das Ergebnis ist auf jeden Fall REAL.
Ein boolesches Ergebnis liefert die Funktion ODD. ODD(X) ist TRUE, falls X ungerade ist, sonst erhält man FALSE.
Zum Datentyp CHAR gibt es vier Standardfunktionen.
ORD©: C ist vom Typ CHAR. Ergebnis ist die Ordnungszahl, durch die intern das Zeichen C dargestellt wird.
ORD('A') = 65
CHR(I) I ist eine positive ganze Zahl. Ergebnis ist das Zeichen, das der Ordnungszahl entspricht.
CHR(36)="$"
ORD und CHAR dürfen auch auf Ausschnitts- und Aufzählungstypen angewendet werden. ORD ist gewissermaßen die Umkehrung von CHAR. Es gilt:
ORD(CHAR(I)) = I und CHAR(ORD©) = C
In den Ausdruck PRED© ist C vom Typ CHAR. Ergebnis ist das Zeichen CHAR (ORD©-1)
Dies entspricht dem Zeichen, welches in der Ordnungszahl eines vorher liegt.
PRED('B') = 'A'
SUCC© Ergebnis ist das auf C folgende Zeichen.
SUCC(A') = 'B'
PRED und SUCC gelten für alle einfachen Datentypen außer REAL. So ergibt beispielsweise SUCC(10) die Zahl 11. Listing 1 enthält ein Beispiel für diese Funktion.
In der Variablenvereinbarung von Pascal muß für jede Variable der Datentyp definiert werden. Es gibt zwei Möglichkeiten, den Datentyp in der Variablenvereinbarung anzugeben. Die Typenangabe steht beispielsweise selbst in der Variablenvereinbarung. Eine weitere Möglichkeit besteht darin, in der Typenvereinbarung einen Datentyp festzulegen. Die Typenvereinbarung muß grundsätzlich vor der Variablenvereinbarung und nach der Konstantenvereinbarung stehen.
Mit der Typenvereinbarung kann der Programmierer eigene Datentypen selbst schaffen. Die Typenvereinbarung kann allerdings auch bei der Variablenvereinbarung getroffen werden. Sie ist eigentlich nur eine Schreiberleichterung.
Eine Pascal-Spezialität besteht darin, daß sich der Benutzer durch Aufzählung eigene Typen definiert. Beispiel:
TYPE farbe = (gruen, gelb, rot, blau);
VAR pinsel,topf : farbe;
Eine Zuweisung auf die Variable erfolgt dann so:
pinsel:= gelb;
topf:=gruen;
Die Vereinbarung eines Aufzählungstyps ohne Typenvereinbarung würde so aussehen:
VAR topf : (gelb,blau,rot)
In der Regel ist aber die erste Version vorzuziehen, weil sie leichter zu verstehen ist; vor allem wenn man mehrere Variablen vom selben Typ vereinbaren will.
Weitere Beispiele zum Aufzählungstyp:
TYPE karte = (pik, kreuz, karo, herz);
woche = (MO,DI,MI,DO,FR, SA,SO);
Beim Aufzählungstyp sind die Standardfunktionen SUCC, PRED und ORD erlaubt.
Es gilt zum Beispiel:
ORD(kreuz) = 1
(Das erste Element vom Typ Karte, nämlich pik, hat den Wert 0)
SUCC(DI) = MI
PRED(FR) = DO
Bei der Vereinbarung von Namen innerhalb der Aufzählung darf man einen Namen nur einmal verwenden. Aufzählungstypen können auch miteinander verglichen werden:
IF tag < SA THEN WRITELN ('Arbeitstag');
Auch innerhalb einer CASE- oder FOR-Anweisung können Aufzählungstypen vorkommen: CASE pinsel of
gelb: WRITE('Sonnenschein');
blau: WRITE('Meer');
gruen: WRITE('Wiese')
END
FOR MO TO FR DO arbeiten;
Der Ausschnittstyp
Will man keinen neuen Typ definieren, sondern einen Unterbereich eines bereits existierenden skalaren Typs, so wird man einen Ausschnitt definieren. In der Typenvereinbarung werden dann die untere und die obere Grenze des Ausschnitts festgelegt:
TYPE Typname =
Untergrenze .. Obergrenze;
Untergrenze und Obergrenze müssen vom gleichen Typ sein und die Untergrenze sollte kleiner als die obere sein. Zum Wertebereich dieses Typs gehören dann alle Elemente zwischen den Grenzen und die Grenzwerte selbst. Ausschnitte vom Typ REAL sind nicht erlaubt!
Beispiele:
TYPE ergebnis = 1..6;
werktag = MO .. FR;
monat = ( JAN, FEB, MRZ, APR, MAI, JUN, JUL, AUG, SEP, OKT, NOV, DEZ);
sommer = JUN .. AUG;
VAR note : ergebnis;
mo : monat; ….
Mit Aufzählungs- und Ausschnittstypen lassen sich Programme besser dokumentieren und lesbarer schreiben. Ein Algorithmus kann mit benutzerdefinierten Typen besser formuliert werden.
Variablen vom Typ Ausschnitt verhindern, daß mit fehlerhaften Werten gerechnet wird. Geht man beispielsweise vom deutschen Notensystem aus, so ist es unsinnig, mit einer Note 7 zu rechnen. Ist die entsprechende Variable wie oben definert, führt eine solche Wertzuweisung zu einer Fehlermeldung.
Strukturierte versus skalare Datentypen
Strukturierte Datentypen werden aus skalaren Datentypen gebildet. Es sind vier Arten von strukturierten Datentypen zu unterscheiden:
- SET (Menge)
- ARRAY (Feld)
- RECORD C (Variablenverbund)
- FILE (Datei)
Zum Datentyp ARRAY gibt es noch eine Sonderform, den Typ STRING. Er wird ähnlich wie ein String in Basic behandelt, ist aber in Standard-Pascal nicht vorgesehen. Zujedem der strukturierten Typen sind Regeln zum Aufbau dieser Typen zu beachten.
Der wesentliche Unterschied zwischen skalaren und strukturierten Typen ist folgender:
Beim skalaren Typ hat jede Variable einen eigenen Namen.
Beim strukturierten Typ besteht eine Variable aus mehreren Komponenten. Diese Komponenten haben keinen eigenen Namen. Der Zugriff auf eine Komponente erfolgt unterschiedlich je nach dem verwendeten Typ.
Mit Mengen arbeiten
Von Mengen hörte man ja in der Schule mehr als genug. Trotzdem sollte dieser Datentyp nicht geringschäztig behandelt werden. Er eignet sich in vielen Fällen zur eleganten Formulierung von Programmen. Allerdings muß man sich darüber im klaren sein, daß alle Programme auch ohne den Typ SET geschrieben werden können.
Die Elemente einer Menge werden alle aus einem Grundtyp gebildet. Eine Variable vom Typ Set hat dann als Wert eine Teilmenge der gesamten Menge. Wer sich noch an Mengenlehre erinnert, dem wird der Begriff Potenzmenge vertraut sein. Diese Potenzmenge enthält als Elemente wiederum Mengen, und zwar alle, die sich aus einer gegebenen Menge bilden lassen. Dazu kommt noch die leere Menge.
Eine Menge muß in der Typenvereinbarung definiert werden: TYPE menge = SET 0F
Grundmenge
Die Grundmenge ist entweder vom Aufzählungstyp oder vom Ausschnittstyp. Esdürfenjedoch keine negativen Integer-Werte vorkommen. Der Wert einer Variablen vom Typ »menge« ist ein Element der Potenzmenge der Grundmenge. Beispiel:
TYPE menge = SET OF [1,2,3];
VAR s: menge;
Die Variable s vom Typ menge kann dann folgende Werte annehmen:
[]. [1], [2], [3], [1,2], [1,3], [2,3], [1,2,3]
Die Anzahl der Elemente der Potenzmenge kann man sich leicht ausrechnen: Zwei hoch Anzahl der Werte der Grundmenge.
Weitere Beispiele für die Vereinbarung von Mengen:
TYPE lotto = SET OF 1..49;
freunde = (Gaby, Peter, Josef, Georg);
runde = SET OF freunde;
buchstabe = 'A'..'Z';
VAR c,a,b: set of buchstabe; paar, gruppe: runde; spiel, zahl: lotto;
Einer Variablen vom Typ SET muß ein Wert im Anweisungsteil des Programms zugewiesen werden. Mengen werden dabei in rechteckige Klammern eingeschlossen. Aufeinanderfolgende Werte sind durch ein Komma zu trennen. Ausschnitte dürfen ebenfalls verwendet werden. Den vereinbarten Variablen werden Werte wie in den folgenden Beispielen zugewiesen: a:= ['ALJD'];
b:= ['B','E','J'];
gruppe: = [Peter, Josef, Georg];
paar: = [Peter,Gaby];
c:=[]; {leere Menge}
Die untere und die obere Grenze einer Menge können durch Ausdrücke angegeben werden:
zahl:=[z DIV 2 .. z*2]
Das Ergebnis dieser Ausdrücke muß natürlich innerhalb der Grundmenge vorkommen.
Die bereits besprochenen Operatoren werden auch auf Mengen angewandt, haben aber dann eine andere Bedeutung.
Die folgenden Beispiele beziehen sich auf die bereits definierten Mengen.
+ entspricht der Vereinigung von Mengen: m:= a + b;
m hat den Wert ['A','B','C','D','E','J']
- entspricht der Differenz zweier Mengen: m: = a - b
m hat den Wert ['A','C','D']
* entspricht dem Durchschnitt zweier Mengen: m: = a * b
(m hat hier den Wert ['B'])
Für die Vergleichsoperatoren gilt:
= entspricht der Gleichheit zweier Mengen.
a = b hat dann den Wert true, wenn beide Variablen die gleichen Elemente enthalten. Im vorliegenden Fall erhält man den Wert false.
< > fragt ab, ob zwei Mengen ungleich sind. Ungleichheit liegt vor, wenn nicht alle Elemente der beiden Mengen gleich sind. < = entspricht der Beziehung Teilmenge.
['A','B'] < = a ist true, weil A und 'B' in a enthalten sind.
= entspricht ebenfalls der Teilmengen-Beziehung.
a > = b ist false, da b keine Teilmenge von a ist.
Beim Datentyp SET gibt es den zusätzlichen Operator »IN«. Er hat ebenfalls einen booleschen Wert als Ergebnis und stellt fest, ob ein Element in einer Menge enthalten ist. Das folgende Beispiel
'A' IN a
hat als Ergebnis true, da das Element A' in der Menge a enthalten ist. Für die Vergleichsoperatoren »<« und »>« gibt es keine Verwendung. Die entsprechende Mengenbeziehung echte Teilmenge kann man leicht mit den anderen Operatoren ausdrücken:
IF a< = b) AND (a< >b) THEN
Die Menge a ist nur dann eine echte Teilmenge, wenn sie in b enthalten und von b verschieden ist. Ein Vergleich der üblichen mathematischen Schreibweise mit der Pascal-Schreibweise ist im Bild 2 zu sehen.
| Der Operator AND | ||
|---|---|---|
| a | b | a AND b |
| FALSE | FALSE | FALSE |
| FALSE | TRUE | FALSE |
| TRUE | FALSE | FALSE |
| TRUE | TRUE | TRUE |
| Der Operator OR | ||
|---|---|---|
| a | b | a OR b |
| FALSE | FALSE | FALSE |
| FALSE | TRUE | TRUE |
| TRUE | FALSE | TRUE |
| TRUE | TRUE | TRUE |
| Der Operator NOT | |
|---|---|
| a | NOT a |
| FALSE | TRUE |
| TRUE | FALSE |
Mengen können nicht direkt ausgegeben werden. Will man die Anzahl der Elemente einer Menge wissen, sind die Elemente der Menge zu zählen wie in Listing 2. Die Anzahl der Elemente darf nicht beliebig groß werden. So erlaubt Profi-Pascal maximal 256 Elemente, Oxford-Pascal nur 128 Elemente.
Mengen werden sehr kompakt als Bitfolge gespeichert. Jedem Bit entspricht ein Element der Menge. Das Bit zeigt an, ob das entsprechende Element vorhanden ist oder nicht. Wegen dieser Art der Speicherung sind Mengenoperationen sehr schnell.
Mengen kann man auch benutzen, ohne sie als Variable zu vereinbaren. Beispiel:
VAR test: 1..10;
test:= 2; …
IF test IN [1..4j THEN …..
ist bedeutend besser als
IF (test=l) OR (test=2) 0R (test=3) OR (test=4) THEN …
Das Beispiel in Listing 2 zeigt die Anwendung von Mengen. Es führt vor, wie elegant man mit Mengen Probleme lösen kann.
Von dem jüdischen Historiker Josephus erzählt die Legende, daß er bei der Eroberung der Stadt Jotapater durch die Römer mit 40 anderen Juden vor den anstürmenden Feinden in ein Haus flüchtete. Josephus’ Kameraden beschlossen, sich nicht den Römern zu ergeben und sich lieber selbst zu töten. Josephus und mit ihm sein Freund wollten am Leben bleiben. Joseph machte deshalb den Vorschlag, die Selbsttötung in einer gewissen Reihenfolge vorzunehmen. Alle sollten sich in einer Reihe aufstellen und dann sollte sich jeder dritte selbst töten. Am Ende der Reihe angelangt, würde das Verfahren von vorne beginnen.
Der Vorschlag wurde angenommen. Josephus und sein Freund nahmen diejenige Stellung ein, bei der sie beim Abzählen die letzten sein würden und blieben am Leben. Das Programm simuliert den Abzählvorgang, indem es eine Menge mit 41 Elementen verwendet. Dann wird jeweils bis drei gezählt und das entsprechende Element aus der Menge entfernt. Wenn sich nur noch zwei Elemente in der Menge befinden, wird der Abzählvorgang beendet. Das Programm läßt sich auch auf Probleme mit einer größeren Grundmenge, einer anderen Schrittweite und einem unterschiedlichen Rest anwenden.
Das Zeichen »#« beendet die Eingabe, da Oxford-Pascal kein EOF (Ende der Eingabedatei) von der Tastatur akzeptiert. Die Funktion eoln erkennt in einem Return das Zeilenende und veranlaßt einen Zeilenvorschub.
Das Programm enthält eine interessante Anwendung der Funktion »SUCC«. Sie wird hier statt des üblichen k: = k + l verwendet. Das Beispielprogramm zeigt auch, wie man Mengen elegant für Abfragezwecke verwenden kann.
(S. Gutschmidt/A. Gruber/cg)PROGRAMM : ZEICHEN 7270 761F ----------------------------------- 7270 : 6F 67 72 61 6D 20 7A 65 E8 7278 : 69 63 68 65 6E 3B 0D 28 9F 7280 : 2A 20 6C 69 65 73 74 20 07 7288 : 7A 65 69 63 68 65 6E 20 27 7290 : 76 6F 6E 20 64 65 72 20 D9 7298 : 74 61 73 74 61 74 75 72 9D 72A0 : 20 75 6E 64 20 7A 61 65 C9 72A8 : 68 6C 74 20 64 69 65 0D A9 72B0 : 20 20 76 6F 72 67 65 66 31 72B8 : 75 6E 64 65 6E 65 6E 20 36 72C0 : 7A 65 69 63 68 65 6E 20 5F 72C8 : 6E 61 63 68 20 6B 61 74 99 72D0 : 65 67 6F 72 69 65 6E 20 CF 72D8 : 2A 29 0D 76 61 72 20 67 A2 72E0 : 72 6F 73 73 2C 20 6B 6C 9F 72E8 : 65 69 6E 2C 20 7A 69 66 6B 72F0 : 66 65 72 2C 20 73 6F 6E 63 72F8 : 64 65 72 7A 65 69 63 68 FB 7300 : 65 6E 3A 20 73 65 74 20 A3 7308 : 6F 66 20 63 68 61 72 3B F1 7310 : 0D 20 20 20 20 67 2C 6B FE 7318 : 2C 7A 2C 73 3A 69 6E 74 8C 7320 : 65 67 65 72 3B 0D 20 20 BD 7328 : 20 20 7A 65 69 63 68 65 C2 7330 : 6E 3A 20 63 68 61 72 3B 02 7338 : 0D 28 2A 20 2A 29 0D 62 CD 7340 : 65 67 69 6E 0D 28 2A 20 7C 7348 : 69 6E 69 74 69 61 6C 69 F7 7350 : 73 69 65 72 65 6E 20 2A BE 7358 : 29 0D 67 72 6F 73 73 3A 05 7360 : 3D 5B 27 41 27 2E 2E 27 28 7368 : 5A 27 5D 3B 0D 6B 6C 65 BD 7370 : 69 6E 3A 3D 5B 27 61 27 09 7378 : 2E 2E 27 7A 27 5D 3B 0D 3B 7380 : 7A 69 66 66 65 72 3A 3D 63 7388 : 5B 27 30 27 2E 2E 27 39 CB 7390 : 27 5D 3B 0D 67 3A 3D 30 74 7398 : 3B 0D 6B 3A 3D 30 3B 0D D8 73A0 : 7A 3A 3D 30 3B 0D 73 3A EB 73A8 : 3D 30 3B 0D 7A 65 69 63 AD 73B0 : 68 65 6E 3A 3D 27 A0 27 8C 73B8 : 3B 0D 28 2A 0D 20 20 20 5C 73C0 : 74 65 73 74 20 75 65 62 5A 73C8 : 65 72 6E 65 68 6D 65 6E 13 73D0 : 20 75 6E 64 20 61 75 73 9D 73D8 : 77 65 72 74 65 6E 0D 2A 7F 73E0 : 29 0D 77 72 69 74 65 6C 65 73E8 : 6E 28 27 67 65 62 65 6E FD 73F0 : 20 73 69 65 20 64 65 6E 68 73F8 : 20 74 65 78 74 20 65 69 6B 7400 : 6E 3A 27 29 3B 0D 72 65 2B 7408 : 61 64 28 7A 65 69 63 68 F5 7410 : 65 6E 29 3B 0D 77 68 69 5F 7418 : 6C 65 20 7A 65 69 63 68 8E 7420 : 65 6E 20 3C 3E 20 27 23 14 7428 : 27 20 64 6F 0D 20 20 62 7D 7430 : 65 67 69 6E 0D 20 20 20 04 7438 : 20 72 65 70 65 61 74 0D 46 7440 : 20 20 20 20 20 20 20 20 40 7448 : 69 66 20 7A 65 69 63 68 3C 7450 : 65 6E 20 69 6E 20 67 72 8C 7458 : 6F 73 73 20 74 68 65 6E 5F 7460 : 20 67 3A 3D 73 75 63 63 A1 7468 : 28 67 29 0D 20 20 20 20 F4 7470 : 20 20 20 20 65 6C 73 65 FF 7478 : 0D 20 20 20 20 20 20 20 65 7480 : 20 69 66 20 7A 65 69 63 32 7488 : 68 65 6E 20 69 6E 20 6B A4 7490 : 6C 65 69 6E 20 74 68 65 E9 7498 : 6E 20 6B 3A 3D 73 75 63 45 74A0 : 63 28 6B 29 0D 20 20 20 AA 74A8 : 20 20 20 20 20 65 6C 73 AA 74B0 : 65 0D 20 20 20 20 20 20 6C 74B8 : 20 20 69 66 20 7A 65 69 4E 74C0 : 63 68 65 6E 20 69 6E 20 C6 74C8 : 7A 69 66 66 65 72 20 74 B1 74D0 : 68 65 6E 20 7A 3A 3D 73 E0 74D8 : 75 63 63 28 7A 29 0D 20 42 74E0 : 20 20 20 20 20 20 20 65 6B 74E8 : 6C 73 65 20 73 3A 3D 73 50 74F0 : 75 63 63 28 73 29 3B 0D 7C 74F8 : 20 20 20 20 72 65 61 64 D5 7500 : 28 7A 65 69 63 68 65 6E D8 7508 : 29 3B 0D 20 20 20 20 75 85 7510 : 6E 74 69 6C 20 65 6F 6C 64 7518 : 6E 3B 0D 20 20 20 72 65 03 7520 : 61 64 6C 6E 0D 65 6E 64 1B 7528 : 3B 0D 28 2A 0D 20 20 20 CC 7530 : 65 72 67 65 62 6E 69 73 7B 7538 : 20 61 75 73 64 72 75 63 4B 7540 : 6B 65 6E 0D 2A 29 0D 77 AA 7548 : 72 69 74 65 6C 6E 3B 0D 7A 7550 : 77 72 69 74 65 6C 6E 28 AD 7558 : 27 67 65 66 75 6E 64 65 80 7560 : 6E 20 77 75 72 64 65 6E 28 7568 : 27 29 3B 0D 77 72 69 74 2E 7570 : 65 6C 6E 28 67 3A 35 2C 21 7578 : 27 20 67 72 6F 73 73 62 FD 7580 : 75 63 68 73 74 61 62 65 D6 7588 : 6E 27 29 3B 0D 77 72 69 65 7590 : 74 65 6C 6E 28 6B 3A 35 D1 7598 : 2C 27 20 6B 6C 65 69 6E 42 75A0 : 62 75 63 68 73 74 61 62 C8 75A8 : 65 6E 27 29 3B 0D 77 72 12 75B0 : 69 74 65 6C 6E 28 7A 3A C1 75B8 : 35 2C 27 20 7A 69 66 66 2B 75C0 : 65 72 6E 27 29 3B 0D 77 6E 75C8 : 72 69 74 65 6C 6E 28 73 7A 75D0 : 3A 35 2C 27 20 73 6F 6E CD 75D8 : 64 65 72 7A 65 69 63 68 DB 75E0 : 65 6E 27 29 3B 0D 77 72 4A 75E8 : 69 74 65 6C 6E 28 67 2B 8E 75F0 : 6B 2B 7A 2B 73 3A 35 2C 2B 75F8 : 27 20 7A 65 69 63 68 65 99 7600 : 6E 20 69 6E 73 67 65 73 95 7608 : 61 6D 74 27 29 0D 65 6E 8F 7610 : 64 2E 20 28 2A 7A 65 69 77 7618 : 63 68 65 6E 2A 29 0D 7C
PROGRAMM : JOSEPH 7270 757D ----------------------------------- 7270 : 6F 67 72 61 6D 20 6A 6F BC 7278 : 73 65 70 68 3B 0D 63 6F 50 7280 : 6E 73 74 20 61 6E 7A 61 FF 7288 : 68 6C 3D 34 31 3B 0D 20 5E 7290 : 20 20 20 20 20 72 65 73 DF 7298 : 74 3D 32 3B 0D 20 20 20 31 72A0 : 20 20 20 61 62 7A 61 65 4F 72A8 : 68 6C 3D 33 3B 0D 76 61 B5 72B0 : 72 20 69 2C 6A 2C 6B 3A 3C 72B8 : 69 6E 74 65 67 65 72 3B 04 72C0 : 0D 20 20 20 20 72 65 69 E7 72C8 : 68 65 3A 73 65 74 20 6F 39 72D0 : 66 20 31 2E 2E 61 6E 7A F5 72D8 : 61 68 6C 3B 0D 62 65 67 38 72E0 : 69 6E 0D 28 2A 69 6E 69 43 72E8 : 74 69 61 6C 69 73 69 65 99 72F0 : 72 65 6E 2A 29 0D 20 20 B1 72F8 : 72 65 69 68 65 3A 3D 5B 58 7300 : 31 2E 2E 61 6E 7A 61 68 11 7308 : 6C 5D 3B 0D 20 69 3A 3D 44 7310 : 61 6E 7A 61 68 6C 3B 0D 64 7318 : 20 6B 3A 3D 61 6E 7A 61 5A 7320 : 68 6C 3B 0D 20 28 2A 77 0A 7328 : 69 65 64 65 72 68 6F 6C 0B 7330 : 65 20 62 69 73 20 6E 75 48 7338 : 72 20 6E 6F 63 68 20 32 A2 7340 : 0D 20 20 20 65 6C 65 6D 94 7348 : 65 6E 74 65 20 69 6E 20 F5 7350 : 64 65 72 20 72 65 69 68 D0 7358 : 65 20 73 69 6E 64 0D 20 56 7360 : 20 20 64 69 65 73 65 20 9E 7368 : 67 65 62 65 6E 20 64 69 13 7370 : 65 20 67 65 73 75 63 68 AD 7378 : 74 65 6E 0D 20 20 20 70 41 7380 : 6F 73 69 74 69 6F 6E 65 28 7388 : 6E 20 61 6E 20 2A 29 0D 3F 7390 : 20 77 68 69 6C 65 20 6B FC 7398 : 3E 72 65 73 74 20 64 6F 90 73A0 : 0D 20 20 20 62 65 67 69 8B 73A8 : 6E 0D 20 20 20 20 66 6F 24 73B0 : 72 20 6A 3A 3D 20 31 20 EE 73B8 : 74 6F 20 61 62 7A 61 65 62 73C0 : 68 6C 20 64 6F 0D 20 20 13 73C8 : 20 20 20 20 20 72 65 70 11 73D0 : 65 61 74 0D 20 20 20 20 68 73D8 : 20 20 20 20 69 66 20 69 32 73E0 : 3C 61 6E 7A 61 68 6C 20 03 73E8 : 74 68 65 6E 20 69 3A 3D 68 73F0 : 69 2B 31 0D 20 20 20 20 A1 73F8 : 20 20 20 20 20 20 65 6C A6 7400 : 73 65 20 69 3A 3D 31 3B 24 7408 : 0D 20 20 20 20 20 20 20 F5 7410 : 75 6E 74 69 6C 20 69 20 B4 7418 : 69 6E 20 72 65 69 68 65 1D 7420 : 3B 0D 20 28 2A 20 64 65 EF 7428 : 72 20 6A 65 77 65 69 6C 13 7430 : 73 20 64 72 69 74 74 65 F2 7438 : 20 77 69 72 64 20 67 65 6C 7440 : 73 74 72 69 63 68 65 6E A3 7448 : 20 2A 29 0D 20 20 20 20 2D 7450 : 72 65 69 68 65 3A 3D 72 DE 7458 : 65 69 68 65 2D 5B 69 5D 47 7460 : 3B 0D 20 20 20 20 6B 3A 53 7468 : 3D 30 3B 0D 20 28 2A 20 5A 7470 : 6A 65 74 7A 74 20 77 69 F2 7478 : 72 64 20 66 65 73 74 67 84 7480 : 65 73 74 65 6C 6C 74 2C BD 7488 : 20 77 69 65 76 69 65 6C 8C 7490 : 65 20 65 6C 65 6D 65 6E 20 7498 : 74 65 20 64 69 65 0D 20 8A 74A0 : 20 20 20 6D 65 6E 67 65 B8 74A8 : 20 6E 6F 63 68 20 65 6E 42 74B0 : 74 68 61 65 6C 74 20 2A 9D 74B8 : 29 0D 20 20 20 20 66 6F EF 74C0 : 72 20 6A 3A 3D 20 31 20 FE 74C8 : 74 6F 20 61 6E 7A 61 68 39 74D0 : 6C 20 64 6F 0D 20 20 20 E6 74D8 : 20 20 20 69 66 20 6A 20 8F 74E0 : 69 6E 20 72 65 69 68 65 E5 74E8 : 20 74 68 65 6E 20 6B 3A 13 74F0 : 3D 6B 2B 31 3B 0D 20 20 B1 74F8 : 65 6E 64 3B 20 28 2A 20 41 7500 : 65 6E 64 65 20 64 65 72 02 7508 : 20 77 68 69 6C 65 2D 73 B9 7510 : 63 68 6C 65 69 66 65 2A 23 7518 : 29 0D 20 20 20 66 6F 72 AC 7520 : 20 6A 3A 3D 20 31 20 74 A1 7528 : 6F 20 61 6E 7A 61 68 6C FB 7530 : 20 64 6F 0D 20 20 20 20 C4 7538 : 20 69 66 20 6A 20 69 6E D5 7540 : 20 72 65 69 68 65 20 74 3B 7548 : 68 65 6E 0D 20 20 20 20 64 7550 : 20 20 20 20 77 72 69 74 26 7558 : 65 6C 6E 28 27 67 65 73 BE 7560 : 75 63 68 74 65 20 70 6F 27 7568 : 73 69 74 69 6F 6E 6E 72 E3 7570 : 2E 3A 20 27 2C 6A 29 0D 7D 7578 : 65 6E 64 2E 0D 99