0100 ca9f 0202 ... TURBO1.OK
.PL72
.MT1
.MB3
.FM1
.FO                                                              
.HE                                       TURBO-Pascal  Seite #
.PN13
.PO8


2. Grundlegende Sprachelemente



2.1 Grundsymbole

Das  Grundvokabular  von TURBO-Pascal besteht aus  Grundsymbolen, 
die zu folgenden Klassen zusammengefasst sind:

<Buchstaben>    ::= A|B|C|D|E|F|G|H|I|J|K|L|M|
                    N|O|P|Q|R|S|T|U|V|W|X|Y|Z|
                    a|b|c|d|e|f|g|h|i|j|k|l|m|
                    n|o|p|q|r|s|t|u|v|w|x|y|z|_
                 
<Ziffern>       ::= 0|1|2|3|4|5|6|7|8|9 

<Sonderzeichen> ::= +|-|*|/|=|^|<|>|(|)|[|]|{|}|
                    .|,|:|;|'|@|$

Es gibt weiterhin einige Operatoren, die aus zwei Symbolen bestehen:

Zuweisungsoperator:     :=
Vergleichsoperatoren:   <>   <=   >=      
Teilbereichsbegrenzer:  ..
Klammern:               (. .) gleichbedeutend mit [ ]
Kommentar:              (* *) gleichbedeutend mit { }



2.2 Reservierte Worte

Folgende  Worte sind in TURBO-Pascal fest definiert  und  duerfen 
nur  fuer die entsprechenden Zwecke verwendet werden.  Mit  Stern 
versehene Worte sind nicht in Standard-Pascal enthalten:

    *absolute  and       array     begin     case      const
     div       do        downto    else      end      *external
     file     *forward   function  goto      if        in
    *inline    label     mod       nil       not       of 
     or        packed    procedure programm  record    repeat
     set      *shl      *shr      *string    then      to
     type      until     var       while     with     *xor



2.3 Begrenzer

Sprachelemente  muessen  durch  wenigstens  einen  der  folgenden 
Begrenzer getrennt werden:

     <space>,
     Zeilenende,
     Kommentar



2.4 Programmzeilen

Die  maximale  Laenge einer Programmzeile betraegt  127  Zeichen. 
Alle weiteren Zeichen werden ignoriert.
.pa

2.5 Standardbezeichner

TURBO-Pascal  verwendet  eine Anzahl von Standardbezeichnern  als 
Namen fuer Konstante, Typen, Variable, Prozeduren und Funktionen. 
Jeder dieser Bezeichner kann umdefiniert werden.  Man sollte dies 
jedoch grundsaetzlich nicht tun, um von vornherein Missverstaend-
nisse und Probleme beim Austausch von Programmen zuvermeiden.  Es 
wird  deshalb die Umdefinition von Standardbezeichnern nicht  er-
laubt. Als Standardbezeichner werden verwendet:

     Abs       ArcTan    Assign    Aux       AuxInPtr  AuxOutPtr
     Bdos      BdosHL    BlockRead BlockWriteBios      BiosHL
     Boolean   Buflen    Byte      Chain     Char      Chr       
     Close     ClrEOL    ClrScr    Con       ConInPtr  ConOutPtr 
     Concat    ConstPtr  Copy      Cos       CrtExit   CrtInit   
     DelLine   Deley     Delete    Dispose   EOF       EOLN      
     Erase     Execute   Exp       False     FilePos   FileSize  
     FillChar  Flush     Frac      GetMem    GotoXY    HeapPtr   
     Hi        HighVideo IOresult  Input     Insline   Insert    
     Int       Integer   Kbd       KeyPressedLength    Ln        
     Lo        Lst       LstOutPtr Mark      MaxInt    Mem       
     MemAvail  Move      New       NormVideo Odd       Ord       
     Output    Overlay   Pi        Port      Pos       Pred
     Ptr       Random    Randomize Read      Readln    Real
     RecurPtr  Release   Rename    Reset     Rewrite   Round     
     Seek      Sin       SizeOf    Sqr       Sqrt      StackPtr
     Str       Succ      Swap      Text      Truc      True
     Trunc     UpCase    Usr       UsrInPtr  UsrOutPrt Val
     Write     Writeln
.pa

3.Standard-Scalartypen

Eine  Datentyp-Definition  legt  die Menge der  Werte  fest,  die 
Variable des entsprechenden Typs annehmen koennen und ordnet  dem 
Typ einen Bezeichner zu.
Jede  Variable  im  Programm muss einem und  nur  einem  Datentyp 
zugeordent  sein.  Obwohl  Datentypen in  TURBO-Pascal  gaenzlich 
veraendert   werden  koennen,   werden  sie  alle  aus  einfachen 
(unstrukturierten) Typen aufgebaut.  
Ein einfacher Typ kann entweder vom Programierer definiert werden 
(er heisst dann definierter Scalartyp) oder er ist ein  Standard-
Scalartyp: Integer, Real, Boolean, Char oder Byte.

3.1 Integer

Integer  sind ganze Zahlen.  In TURBO-Pascal ist ihr Wertebereich 
von                 -32768 bis 32767
Im Speicher benoetigen sie 2 Bytes. Ex ist zu beachten:
    -Ueberlauf von Integerzahlen wird nicht angezeigt.
    -Zwischenergebnisse muessen sich innerhalb des Wertebereiches 
     halten,  sonst ergeben sich falsche Werte. So ist beispiels-
     weise 1000*100/50 nicht 2000 sondern -621 !

3.2 Byte

Im Speicher benoetigt dieser Typ genau 1 Byte. Er ist ein Teilbe-
reich vom Typ Integer mit einem Wertebereich von:
                    0  bis  255.
Bytes  sind deshalb mit Integervariablen kompatibel  und  koennen 
statt  dessen  definiert werden.  In Ausdruecken koennen sie  ge-
mischt auftreten und Integervariablen koennen auch Bytes zugewie-
sen werden.

3.3 Real

Der absolute Wertebereich reicht fuer Realzahlen von
                    1E-38  bis  1E+38                
(dabei  bedeutet  E:  "mal  10 hoch") mit einer Mantisse  von  11 
signifikanten Zeichen. Der Typ benoetigt im Speicher 6 Bytes.
Bei  Ueberlauf  haelt das Programm an und meldet  einen  Ausfueh-
rungsfehler. Ein Unterlauf ergibt den Wert Null.
Obgleich  Realzahlen  ein Standardtyp sind,  sollte man  folgende 
Unterschiede zu den anderen Standardtypen beachten:

1)   Sie  duerfen in den Funktionen Pred und Suc nicht als  Argu-
     mente auftreten.
2)   Sie  duerfen  nicht als Indexzahlen in  Bereichen  verwendet 
     werden.
3)   Sie duerfen nicht den Grundtyp einer Menge definieren.
4)   Sie  duerfen  nicht zur Steuerung von If und Case  verwendet 
     werden.
5)   Von ihnen duerfen keine Teilbereiche definiert werden.


3.4 Boolean

Eine  Boolesche Variable kann entweder den Wert wahr oder  falsch 
haben:  (True | False).  Es ist festgelegt,  dass False<True ist. 
Der Type benoetigt im Speicher 1 Byte.

3.5 Char

Die  Werte  dieses Typs sind die in 2.1  definierte  Zeichenmenge 
(ASCII-Zeichen).  Die  Menge  ist entsprechend  ihrem  ASCII-Wert 
geordnet.  Den normalen ASCII-Zeichen sind Zahlenwerte von  0-255 
zugeordnet. Der Typ benoetigt im Speicher 1 Byte.


4. Nutzerdefinierte Sprachelemente

4.1 Bezeichner

Bezeichner werden zur Bezeichnung von Marken,  Konstanten, Typen, 
Variablen, Prozeduren und Funktionen verwendet.

     <Bezeichner> ::= <Buchstabe>{<Buchstabe>|<Ziffer>}

Ein Bezeichner besteht also aus einem Buchstaben,  dem Buchstaben 
und  Ziffern folgen koennen.  Die Laenge ist maximal 127  Zeichen 
und alle Zeichen sind signifikant.

Beispiel:
     TORBO
     square
     person_counted
     BirthDate
     3teWurzel           falsch! Ziffer am Anfang.
     zwei Worte          falsch! Leerzeichen unerlaubt.

Bei  TURBO-Pascal gibt es zwischen grossen und kleinen Buchstaben 
keinen Unterschied. So sind
          SehrlangeDefinition = SEHRLANGEDEFINITION
identisch,  aber  der linke Bezeichner duerfte wohl klar leichter 
zu lesen sein.


4.2 Zahlen

Zahlen sind Konstante der Typen Integer und  Real.  Integerzahlen 
sind ganze Zahlen, die dezimal und hexadezimal dargestellt werden 
koennen.  Hexadezimale  Integerzahlen werden durch vorangestellte 
$-Zeichen erklaert. 
Dezimalzahlen  haben  einen  Bereich  von -32768 .. +32767.
Hexadezimalzahlen haben einen Bereich von  $0000 .. $FFFF.
Unmittelbar vor einer Dezimalzahl darf ein Vorzeichen stehen.

Beispiele:
     1
     12345
     -345
     $ABC
     $123
     $12c
     $12G           Falsch! G keine Hexadezimalzahl.
     $12.3          Falsch! Punkt keine Hexadezimalzahl.

Der Bereich der Realzahlen betraegt 1E-38 ..  1E+38 mit 11 signi-
fikannten  Ziffern.  Die  Exponentialdarstellung  kann  verwendet 
werden  mit  E  als "mal 10  hoch".  Eine  Integerkonstante  gilt 
ueberall dort, wo eine Realzahl gueltig ist. Trennzeichen duerfen 
nicht  innerhalb  von Zahlen stehen.  Unmittelbar vor einer  Zahl 
darf ein Vorzeichen stehen.

Beispiele:
     1.0
     1234.5678
     -0.024
     1E6
     2E-7
     -1.2345678901E+12
     1                   erlaubt, ist aber eine Integerkonstante.
.pa

4.3 Zeichenkette

Eine  Zeichenkettenkonstante ist eine Folge von Zeichen,  die  in 
Hochkomma eingeschlossen sind:
          'Dies ist eine Zeichenketten '
In einer Zeichenkette kann auch ein Hochkomma enthalten sein, nur 
muss man es dann an der betreffenden Stelle zweimal angeben.
Zeichenketten,  die  nur aus einem Zeichen bestehen sind vom  Typ 
Char. Eine Zeichenkette ist kompatibel mit einem Bereich von Char 
mit gleicher Laenge.  Alle Zeichenkettenkonstanten sind mit allen 
Zeichenkettentypen kompatibel.

Beispiele:
     'TURBO'
     'Du wirst''s sehen!'
     ''''
     '.'
     ''                       leere Zeichenkette.

4.3.1 CXTRL-Steuerzeichen

TURBO-Pascal  erlaubt die Verwendung von  CTRL-Steuerzeichen  als 
Zeichenketten. Dabei gibt es zwei Moeglichkeiten der Darstellung: 

1)   als  #-Symbol  gefolgt  von einer dezimal  oder  hexadezimal 
     Zahl.  Damit wird ein Zeichen mit dem entsprechenden  ASCII-
     Wert  definiert.
2)   als ^-Symbol gefolgt von einem ASCII-Zeichen. Damit wird das 
     entsprechende CTRL-Zeichen definiert.

Beispiele:
     #10       entspricht     CTRL-J oder LINE FEED
     #$1B      entspricht     CTRL-[ oder ESCAPE
     ^G        entspricht     CTRL-G oder BELL

Folgen von Steuerzeichen koennen ohne Begrenzer aneinandergehaengt 
werden:

Beispiele:
     #13#10
     #27^U#20
     ^G^G^G^G

Steuerzeichen  koennen  auch mit anderen  Zeichenketten  gemischt 
auftreten:

Beispiele:
     'Wach auf!'^G^G^G'Bitte, wach auf! '


4.4 Kommentare

Kommentare  koennen  ueberall im Programm  stehen,  wo  Begrenzer 
stehen  koennen.   Sie werden durch geschweifte Klammern { } oder 
durch (* *) begrenzt.

Beispiele:
     {Das ist ein Kommentar}
     (* das ist das gleiche *)

Es  koennen  in  Kommentaren nicht Kommentare  mit  den  gleichen 
Begrenzern eingeschlossen werden.  Aber es ist erlaubt in Kommen-
taren mit { } Kommentare mit (* *) einzuschliessen und umgekehrt. 
Damit kann man Quelltexte, die Kommentare enthalten in Kommentar-
klammern  einschliessen und damit im Quelltext bei der  Ueberset-
zung verschwinden lassen.
.pa

4.5 Compiler-Direktiven

Einige   der  Optionen  des  Compilers  werden  durch  Direktiven 
gesteuert.  Sie werden in den Quelltext als Kommentare mit  einer 
speziellen  Syntax eingefuegt.  Sie koennen ueberall dort im Text 
stehen, wo Kommentare stehen koennen.
Eine  Compiler-Direktive besteht aus einer oeffnenden  Kommentar-
Klammer der unmittelbar ein $-Zeichen und eine Compiler-Direktive 
oder  eine  Liste derartiger Direktiven folgt,  die  durch  Komma 
untereinander  getrennt  sind.  Die Syntax  der  Direktiv-Zeichen 
selbst  haengt von der speziellen Direktive ab,  die im Anhang  E 
beschrieben sind.

Beispiele:
     {$I-} 
     {$I E:INCLUDE.FIL}
     {$R-,B+,V-}
.pa

5. Programmkopf und Programmblock

Ein Pascal-Programm besteht aus dem
          - Programmkopf, dem der
          - Programmblock folgt.
Der Programmblock selbst besteht aus dem
          - Deklarationsteil und dem 
          - Anweisungsteil.
Im  Deklarationsteil werden alle lokalen Objekte  des  Programmes 
definiert  und  im Anweisungteil stehen alle  Aktionen,  die  mit 
diesen Objekten ausgefuehrt werden sollen.


5.1 Programmkopf

In  TURBO-Pascal  ist der Programmkopf voellig unverbindlich  und 
hat  fuer  das Programm keinerlei Bedeutung.  Wenn  er  angegeben 
wird, und dies ist sehr zu empfehlen, sollte er ausser dem reser-
vierten Namen Program den Programmnamen und in der Parameterliste 
die speziell verwendeten Ein- und Ausgabegeraete  enthalten.  Die 
Liste  Parameter  besteht aus einer Folge  von  Bezeichnern,  die 
durch Komma getrennt und in runde Klammern eingeschlossen sind.

Beipiele:
     Program Circles;
     Program Rechnung(Input,Output)
     Program Druck(Input,Drucker)

5.2 Deklarationsteil

Der Deklarationsteil eines Blockes definiert alle Bezeichner, die 
im  Anweisungsteil des Blockes und in dem in ihm  moeglicherweise 
enthaltenen Bloecken verwendet werden.  Er besteht aus fuenf Tei-
len:
     1) Markenvereinbarungsteil
     2) Konstantendefinitionsteil
     3) Typdefinitionsteil
     4) Variablenvereinbarungsteil
     5) Prozedur- und Funktionsvereinbarungsteil

Waehrend  Standard-Pascal festlegt,  dass jeder dieser Teile  nur 
Null  oder einmal und nur in der oben angegeben Ordnung auftreten 
darf,  erlaubt TURBO-Pascal,  dass obige fuenf Teile mehrmals  in 
beliebiger Ordnung im Deklarationsteil auftreten duerfen.

5.2.1 Markenvereinbarungsteil

Jede   Anweisung  ein  einem  Programm  kann  durch  eine   Marke 
gekennzeichnet  werden.  Dadurch  wird es moeglich  mittels  eine 
GOTO-Anweisung direkt zu dieser Anweisung zu verzweigen.
Eine  Marke  besteht aus einem  Markennamen,  gefolgt  von  einem 
Doppelpunkt.  Bevor eine Marke verwendet werden darf, muss sie im 
Markenvereinbarungsteil definiert sein. Die Definition beginn mit 
dem reservierten Wort Label,  dem eine Liste von Markennamen, die 
alle durch Kommas voneinander getrennt sind,  folgt und die durch 
ein Semikolon abgeschlossen wird.

Beispiel:
     Label 10,error,999,Quit;

Waehrend  Standard-Pascal  nur maximal vierstellige ganze  Zahlen 
als  Markannamen  zulaesst,   erlaubt  TURBO-Pascal  sowohl   die 
Verwendung von Ziffern als auch von Bezeichnern.

.pa


 
5.2.2 Konstantendefinitionsteil

Der  Konstantendefinitionsteil  enthaelt die  Definitionen  aller 
Synomyme  fuer  Konstanten,  die in einem  Block  auftreten.  Die 
Definition  beginnt  mit dem reservierten Wort  const,  dem  eine 
Liste von Konstantenzuweisungen folgt,  die durch Semikolon  von-
einander  getrennt  sind.  Jede Konstantenzuweisung  besteht  aus 
einem Bezeichner ,  dem ein Gleichheitszeichen und eine Konstante 
folgt.

Beispiel:
     const
          Limit = 255;
          Max = 1024;
          PassWord = 'SESAM';
          CursHome = ^['V';

In TURBO-Pascal gibt es folgende fest definierten Konstante,  die 
ohne vorherige Definition verwendet werden koennen:
                         
    Name      Typ       Wert
     Pi        Real      -3.1415926536E+00
     False     Boolean   Wahrheitswert: falsch
     True      Boolean   Wahrheitswert: richtig
     Maxint    Integer   32767

Im Konstantendefinitionsteil koennen auch typ-definierte Konstan-
ten vereinbart werden (siehe 13).




5.2.3 Typdefinitionsteil

Ein  Datentyp kann in Pascal entweder direkt im  Variablendefini-
tionsteil  oder durch einen Typbezeichner beschrieben werden.  Es 
gibt  bestimmte festgelegte Typbezeichner,  aber der Nutzer  kann 
durch  Verwendung der Typdefinition diese Liste  beliebig  erwei-
tern. 
Die  Typdefinition  beginnt mit dem reservierten Wort  type,  dem 
eine oder mehrere Zuweisungen folgen, die durch Semikolon vonein-
ander  getrennt  werden.  Jede Zuweisung besteht aus  einem  Typ-
Bezeichner, dem ein Gleichheitszeichen und ein Typ folgt.

Beispiele:
     type
          Number = Integer;
          Tag = (Montag,Dienstag,Mittwoch,Donnerstag,
                 Freitag,Sonnabend,Sonntag);
          List = array[1..10] of Real;
.pa

5.2.4 Variablenvereinbarungsteil

Jede in einem Programm auftretende Variable muss vorher definiert 
werden. Die Definition muss im Text vor der ersten Verwendung der 
Variablen auftreten,  d.h. die Variable muss dem Compiler bekannt 
sein, bevor sie verwendet wird.
Eine Variablenvereinbarung beginnt mit dem reservierten Wort Var, 
dem ein oder mehrere Bezeichner folgen,  die durch Kommas vonein-
ander getrennt sind.  Dieser Liste folgt ein Doppelpunkt und  ein 
Typ. Damit werden von dem spezifizierten Typ neue Variable aufge-
baut,  denen  als Namen die spezifizierten Bezeichner  zugewiesen 
sind.  Der  Gueltigkeitsbereich der Bezeichner ist der Block,  in 
dem sie definiert wurden.  Zu diesem Gueltigkeitsbereich gehoeren 
auch alle Bloecke, die in dem genannten Block enthalten sind. Man 
beachte jedoch, dass in jedem solchen Block, der in einem anderen 
enthalten ist,  andere Variable definiert werden koennen, die die 
gleichen Bezeichner verwenden.  Diese Variable heissen dann lokal 
zu  diesem Block und zu anderen Bloecken,  die in  ihm  enthalten 
sind.  Variable,  die  ausserhalb eines Blockes definiert wurden, 
heissen  globale  Variable und sind,  wenn  lokale  Variable  mit 
gleichem  Bezeichner  auftreten in diesem Block dann  nicht  mehr 
zugaenglich.

Beispiel:
Var
     Result,Intermediate,SubTotal:Real;
     I,J,X,Y:Integer;
     Accepted,Valid:Boolean;
     Period:Tag
     Buffer:array[0..127] of Byte




5.2.5 Prozedur- und Funktionsvereinbarungsteil

Eine  Prozedurvereinbarung  dient der Definition  einer  Prozedur 
innerhalb  einer  anderen Prozedur oder eines  Programmes  (siehe 
16.2).  Eine Prozedur wird durch eine Prozeduranweisung aktiviert 
(siehe  7.1.2) und nach der Ausfuehrung dieser  Prozeduranweisung 
wird das Programm mit der Anweisung fortgesetzt,  die unmittelbar 
der Call-Anweisung der Prozedur folgt.
Eine  Funktionsvereinbarung  dient zur Defintion eines  Programm-
teiles, das eine Variable berechnet und zurueckgibt (siehe 16.3). 
Eine Funktion wird aktiviert, wenn sein Bezeichner als Teil eines 
Ausdruckes auftritt (siehe 6.2).


5.3 Anweisungsteil

Der Anweisungsteil ist der letzte Teil eines Blockes. Er spezifi-
ziert  die Aktionen,  die durch das Programm ausgefuehrt  werden. 
Der  Anweisungsteil besteht aus einer Verbundanweisung,  der  ein 
Punkt '.' folgt. Eine Verbundanweisung besteht aus dem reservier-
ten Wort begin,  dem eine Liste von einzelnen Anweisungen  folgt. 
Diese  sind in der Liste durch Semikolon voneinander getrennt und 
werden durch das reservierte Wort end abgeschlossen.

.pa



6. Ausdruecke

Ausdruecke  sind Konstruktionen,  die Regeln fuer das Rechnen mit 
den  vorliegenden  Werten von Variablen und die  Erzeugung  neuer 
Werte durch Anwendung von Operatoren zum Inhalt haben. Sie beste-
hen aus Operanden,  d.h.  Variablen,  Konstanten und Funktionsbe-
zeichnungen,  die mittels der unten definierten Operatoren kombi-
niert  werden.  Dieser Abschnitt beschreibt,  wie Ausdruecke  aus 
Standard-Skalartypen  Integer,  Real,  Boolean und Char  gebildet 
werden.  Ausdruecke,  die definierte Skalartypen, Stringtypen und 
Mengentypen  enthalten,  werden in 8.1,  9.2 und 12.2  respektive 
definiert.


6.1 Operatoren

Operatoren koennen entsprechend ihrer Rangfolge in fuenf  Katego-
rien eingeteilt werden:
     1) Minusvorzeichen (Minus mit einem Operanden).
     2) Not Operator.
     3) Multiplikationsoperatoren: *,/,div,mod,and,shl,shr.
     4) Additionsoperatoren: +,-,or,xor.
     5) Vergleichsoperatoren: =,<>,<,>,<=,>=,in.

Folgen  von  Operatoren  gleichen Ranges werden  von  links  nach 
rechts abgearbeitet. 
Ausdruecke  in Klammern werden zuerst  abgearbeitet,  unabhaengig 
von  den  davor oder dahinter stehenden  Operatoren.  Sind  beide 
Operanden eines Multiplikations- oder Additionsoperators vom  Typ 
Integer,  dann  ist auch das Ergebnis vom Integertyp.  Wenn einer 
oder beide Operanden vom Typ Real sind,  dann ist auch das Ergeb-
nis vom Realtyp.


6.1.1 Minuszeichen

Das  Minuszeichen bezeichnet die Negation des Operanden,  der vom 
Typ Integer oder Real sein muss.


6.1.2 NOT-Operator

Der  NOT-Operator  negiert den logichen  Wert  eines  Booleschen 
Operanden:
     not True  = False
     not False = True

TURBO-Pascal  erlaubt  auch die Anwendung des  NOT-Operators  auf 
Integer-Operanden.  In diesem Falle erfolgt die Negation der ein-
zelnen Bits.

Beispiele:
     not 0     = -1
     not -15   = 14
     not $2345 = $DCBA
.pa



6.1.3 Multiplikationsoperanden

Operator  Operation                Operandentypen      Ergebnistyp
 *        Multiplikation           Real,Real           Real
 *        Multiplikation           Integer,Integer     Integer
 *        Multiplikation           Integer,Real        Real
 /        Division                 Real,Real           Real
 /        Division                 Integer,Real        Real
 /        Disision                 Integer,Integer     Real
 div      Ganzzahlige Division     Integer             Integer
 mod      Modulo                   Integer             Integer
 and      Arithmetisches and       Integer             Integer
 and      Logisches and            Boolean             Boolean
 shl      Shift links              Integer             Integer
 shr      Shift rechts             Integer             Integer

Beispiele:
     123*456        =    492 falsch, Ueberlauf der Integerzahl!
     123/4          =    30.75          
     123 div 4      =    30
     12 mod 5       =    2
     true and false =    falsch
     12  and 22     =    4
     2   shl 7      =    256
     256 shr 7      =    2



6.1.4 Additionsoperatoren

Operator  Operation                Operandentypen      Ergebnistyp
 +        Addition                 Real,Real           Real
 +        Addition                 Real,Integer        Real
 +        Addition                 Integer,Integer     Integer
 -        Subtraktion              Real,Real           Real
 -        Subtraktion              Real,Integer        Real
 -        Subtraktion              Integer,Integer     Integer
 or       Arithmetisches or        Integer,Integer     Integer
 or       Logisches or             Boolean,Boolean     Boolean
 xor      Arithmetisches xor       Integer,Integer     Integer
 xor      Logisches xor            Boolean,Boolean     Boolean

Beispiele:
     123 + 456      =    579
     456 - 123.0    =    333.0
     true or false  =    True
     12 or 22       =    30
     true xor false =    True
     12 xor 22      =    26
.pa


6.1.5 Vergleichsoperatoren

Vergleichsoperatoren   koennen  mit  allen  Standardtypen   Real, 
Integer,  Boolean,  Char und Byte verbunden werden. Operanden vom 
Typ  Integer,  Real  und Byte  koennen  gemischt  auftreten.  Der 
Ergebnistyp ist stets Boolean, d.h. True oder False.
Es bedeuten:
     =    gleich                   <>   nicht gleich
     <    groesser als             >    kleiner als
     <=   kleiner oder gleich      >=   groesser oder gleich

Beispiele:
     a =  b    True,wenn      a    gleich    b
     a <> b    True,wenn      a    ungleich  b
     a >  b    True,wenn      a    groesser  b
     a <  b    True,wenn      a    kleiner   b
     a >= b    True,wenn      a    groesser oder gleich  b
     a <= b    True,wenn      a    kleiner  oder gleich  b



6.2 Funktionsaufruf

Ein  Funktionsaufruf besteht aus einem  Funktionsbezeichner,  dem 
eine  wahlfreie  Parameterliste folgt.  Diese Liste  besteht  aus 
einer oder mehreren Variablen oder Ausdruecken,  die durch  Komma 
voneinander getrennt und insgesamt in runde Klammern eingeschlos-
sen sind. 
Das  Auftreten  eines Funktionsaufrufes im Programm  bewirkt  die 
Aktivierung der Funktion, die durch sie bezeichnet wird. Wenn die 
Funktion keine Standardfunktion ist, muss sie vor der Aktivierung 
definiert sein.

Beispiele:
 Round(PlotPos)
 Writeln(Pi * (Sqr(R)))
 (Max(x,y) < 25) and (Z > Sqrt(x*y))
 Volumen(Radius,Hoehe)

.pa



7.Anweisungen

Der  Anweisungsteil eines Programmes,  einer Prozedur oder  einer 
Funktion  definiert  die algorithmischen Aktionen als Folge  aus-
fuehrbarer Anweisungen.  Diese Folge besteht aus Anweisungen, die 
durch  Semikolon voneinander getrennt sind.  Sie beginnt mit  dem 
reservierten Wort begin und endet mit dem reservierten Wort  end. 
Anweisungen  in Pascal sind entweder einfache oder  strukturierte 
Anweisungen.


7.1 Einfache Anweisungen

Einfache Anweisungen sind Anweisungen,  die keine weiteren Anwei-
sungen enthalten. Es sind dies die 
               Ergibtanweisung,
               Prozeduranweisung,
               Sprunganweisung und
               Leeranweisung.


7.1.1 Ergibtanweisung

Die Ergibtanweisung ist die fundamentalste aller Anweisungen. Sie 
wird  verwendet,  um einer bestimmten Variablen einen  bestimmten 
Wert  zuzuweisen.  Eine Ergibtanweisung besteht aus einem Variab-
lenbezeichner,  dem  Ergibtoperator := und einem  Ausdruck.  Eine 
Zuweisung  ist moeglich zu Variablen von beliebigem  Typ  (ausser 
Files),  wenn der Ausdruck vom gleiche Typ ist.  Es gibt nur eine 
Ausnahme:  Ist  die Variable vom Realtyp,  kann der Ausdruck  vom 
Integertyp sein.

Beispiele:
     Angle    :=   Angle * Pi;
     AccessOk :=   False;
     Entry    :=   Answer = Password; 
     SpherVol :=   4 * Pi * R * R;
     UpCas    :=   (Ch > 'A') and (Num <= 'Z')


7.1.2 Prozeduranweisung

Eine Prozeduranweisung dient der Aktivierung einer Standardproze-
dur oder einer vorher vom Nutzer definierten Prozedur. Die Anwei-
sung besteht aus dem Prozedurbezeichner, dem wahlweise eine Para-
meterliste  folgt.  Diese  Liste besteht aus Variablen oder  Aus-
druecken,  die  durch  Komma voneinander getrennt und  in  runden 
Klammern eingeschlossen sind. Wird die Prozedur bei der Programm-
ausfuehrung  erreicht,  geht die Steuerung an die Prozedur  ueber 
und  die angegebenen Parameterwerte werden uebergeben.  Wenn  die 
Prozedur ausgefuehrt wurde, wird das Programm mit der Ausfuehrung 
der dieser Prozedur folgenden Anweisung fortgesetzt.

Beispiele:
      Find(Name,Adresse);
     Sort(Adresse);
     UpperCase(Text);
     UpdateLastFile(LastRecord);

.pa

7.1.3 Sprunganweisung

Eine Sprunganweisung besteht aus dem reservierten Wort goto,  dem 
ein  Markenbezeichner folgt.  Sie dient der Fortfuehrung des Pro-
grammes an der Stelle im Programmtext, an der die Marke steht.
Es gelten folgende Einschraenkungen:
     1) Jede Marke muss durch eine Markenvereinbarung im Kopf des 
     Blockes  definiert und durch Kennzeichnung  einer  Anweisung 
     festgelegt sein.
     2) Der Gueltigkeitsbereich einer Marke ist der Block, in dem 
     die  Marke definiert ist.  Deshalb ist es nicht moeglich  in 
     oder aus einer Prozedur oder Funktion zu springen.


7.1.4 Leeranweisung

Eine  Leeranweisung  ist eine Anweisung,  die aus  keinem  Symbol 
besteht  und  die  nichts macht.  Sie kann  entstehen,  wenn  die 
Pascal-Syntax eine Anweisung verlangt, aber keine vom Algorithmus 
her benoetigt wird.

Beispiele:
     begin end.
     while Antwort <> '' do;
     repeat until KeyPressed; {Wartet bis Taste gedrueckt wurde}



7.2 Strukturierte Anweisungen

Strukturierte  Anweisungen sind aus anderen Anweisungen zusammen-
gesetzte Konstruktionen,  die entweder nacheinander  auszufuehren 
sind  (Verbundanweisungen),  bedingt auszufuehren sind  (Bedingte 
Anweisungen)  oder zu wiederholen sind  (Zyklusanweisungen).  Die 
Besprechung der WITH-Anweisung erfolgt in 11.2.


7.2.1 Verbundanweisung

Eine  Verbundanweisung wird verwendet,  wenn mehr als eine Anwei-
sung an einer Stelle auszufuehren sind,  an der die Pascal-Syntax 
die  Spezifikation von nur einer Anweisung erlaubt.  Sie  besteht 
aus einer beliebigen Anzahl von Anweisungen,  die durch Semikolon 
voneinander getrennt und in die reservierten Worte begin und  end 
eingeschlossen werden.  Die einzelnen Anweisungen in der Verbund-
anweisung werden nacheinander in der Reihenfolge ausgefuehrt,  in 
der sie aufgeschrieben wurden.

Beispiel:
     if Small > Big than
          begin
               Tmp   :=   Small;
               Small :=   Big;
               Big   :=   Tmp;
          end;
.pa

7.2.2 Bedingte Anweisungen

Eine bedingte Anweisung waehlt eine einzelne ihrer Komponentenan-
weisungen zur Ausfuehrung aus.


7.2.2.1 IF-Anweisung

Die  IF-Anweisung  waehlt  die nach dem  reservierten  Wort  then 
stehende  Anweisung nur dann zur Ausfuehrung aus,  wenn eine  be-
stimmte Bedingung (Boolescher Ausdruck) wahr ist. Ist sie falsch, 
dann  wird  entweder  keine Anweisung oder die  Anweisung  ausge-
fuehrt, die dem wahlweise stehenden reservierten Wort else folgt.
Da  die  bedingten IF-Anweisungen  geschachtelt  werden  koennen, 
entstehen zweideutige Konstruktionen. Die Konstruktion :

     if  expr1  then
         if  expr2  then
         stmt1
         else
         stmt2

wird wie folgt ausgefuehrt:

     if  expr1  then
         begin
          if  expr2  then
          stmt1
          else
          stmt2
         end;

Damit  ist klar:  Die ELSE-Klausel gehoert stets zur letzten  IF-
Anweisung, die keine ELSE-Klausel hat.

Beispiele:
     if Interest > 25 then
          Usury := True
     else
          TakeLoan := OK;

     if (Entry < 0) or (Entry > 100) then
          begin
               Write('Bereich ist 1 bis 100, bitte eingeben:';
               Read(Entry);
          end;


7.2.2.2 CASE-Anweisung

Die CASE-Anweisung besteht aus einem Ausdruck (dem Selektor), der 
in  die  reservierten Worte case und of eingeschlossen  ist,  und 
einer Liste von Anweisungen,  von denen jede durch eine Konstante 
vom  Typ  des Selektors markiert ist.  Die Liste wird  durch  das 
reservierte Wort end abgeschlossen. Die CASE-Anweisung legt fest, 
dass die eine Anweisung auszufuehren ist, deren CASE-Marke gleich 
dem vorliegenden Wert des Selektors ist. Enthaelt keine der CASE-
Marken den vorliegenden Wert,  dann wird entweder keine Anweisung 
ausgefuehrt,  oder wahlweise die Anweisung,  die dem reservierten 
Wort else folgt. Die ELSE-Klausel ist eine Erweiterung gegenueber 
Standard-Pascal.
Eine  CASE-Marke kann aus einer beliebigen Anzahl von  Konstanten 
oder  Teilbereichen bestehen,  die durch Komma getrennt sind  und 
durch  einen Doppelpunkt abgeschlossen  werden.  Ein  Teilbereich 
wird  dargestellt  durch zwei Konstanten,  die durch den  Teilbe-
reichsbegrenzer '..' getrennt sind.  Der Typ der Konstanten  muss 
der  gleiche wie der des Selektors sein.  Die Anweisung,  die der 

CASE-Marke folgt,  wird ausgefuehrt,  wenn der Wert des Selektors 
gleich  einer der Konstanten ist oder in einem  der  Teilbereiche 
liegt.
Gueltige Selektortypen sind alle einfachen Typen,  d.h. alle Ska-
lartypen ausser Real.

Beispiele:
     case Operator of
          '+': Result := Input + Result;
          '-': Result := Innput * Result;
          '/': Result := Input / Result;
          end;

     case Year of
          Min..1939: begin
                         Time := PreWordWar2;
                         write('The world at peace...');
                     end;
          1946..Max: begin
                         Time := PostWorldWar2;
                         write('Building a new world');
                     end;
          else
               Time := WorldWar2;
               writeln('We are at war');
          end;


7.2.3 Zyklusanweisungen

Zyklusanweisungen legen fest, dass gewisse Anweisungen wiederholt 
ausgefuehrt  werden sollen.  Wenn die Anzahl  der  Wiederholungen 
vorher bekannt ist, d.h. bevor der Zyklus gestartet wird, ist die 
FOR-Anweisung die angemessene Konstruktion.  Andernfalls  sollte 
die WHILE-Anweisung oder die REPEAT-Anweisung verwendet werden.


7.2.3.1 WHILE-Anweisung

Die WHILE-Anweisung hat die Form:

     while  expr  do  stmt;

Der  Ausdruck,  der  die  Wiederholungen steuert,  muss  vom  Typ 
Boolean  sein.  Die Anweisung wird solange ausgefuehrt,  wie  der 
Ausdruck wahr ist.  Ist der Ausdruck zu Beginn schon falsch, wird 
gar keine Anweisung ausgefuehrt.


7.2.3.2 REPEAT-Anweisung

Die Wiederholanweisung REPEAT hat die Form:

     repeat  stmt1;stmt2;...;stmtN  until expr;

Der  die  Wiederholung steuernde Ausdruck muss vom  Type  Boolean 
sein.  Die  Folge der Anweisungen zwischen repeat und until  wird 
wiederholt (mindestens jedoch einmal) ausgefuehrt,  bis der  Aus-
druck den Wert True erhaelt.

Beispiele:
     repeat
          write(^M,'Delete this item? (Y/N)');
          read(Answer)
     until  UpCase(Answer) in ['Y','N'];


7.2.3.3 FOR-Anweisung

Die FOR-Anweisung gibt an,  dass eine Anweisung wiederholt ausge-
fuehrt werden soll,  waehrend einer Variablen (der Laufvariablen) 
eine  Folge von Werten zugewiesen wird.  Die Folge kann auf- oder 
absteigend sein bis zum Endwert.  Die Laufvariable,  der Anfangs-
wert und der Endwert muessen alle vom gleichen Typ sein.  Gueltig 
sind alle einfachen Typen, d.h. alle Skalartypen ausser Real.
Die Laufanweisung hat die Form:

     for var := Anfwert to Endwert do stmt;
oder
     for var := Anfwert downto Endwert do stmt;

Dabei  darf die Laufvariable nicht durch die Anweisung  geaendert 
werden. 
Falls Anfangswert > Endwert bei einer TO-Klausel oder Angangswert 
<  Endwert  bei einer DOWNTO-Klausel ist,  wird  keine  Anweisung 
ausgefuehrt.

Beispiele:
     for i := 2 to 100 do if A[i] > Max then Max := A[i];

     for i := 1 to NoOflines do
          begin
           readln(Line);
           if Length(Line)<Limit then ShortLines := ShortLines+1;
           else 
              LongLines := LongLines+1;
          end;

Falls  die Wiederholung beendet werden soll,  bevor  der  Endwert 
erreicht ist,  muss eine GOTO-Anweisung benutzt werden. In diesen 
Faellen  ist es besser eine WHILE- oder REPEAT-Anweisung zu  ver-
wenden.
Wenn die FOR-Anweisung verlassen wird,  hat die Laufvariable  den 
Endwert,  ausser  wenn  die Schleife nie  durchlaufen  wurde.  In 
diesem Falle wird der Laufvariablen kein Wert zugewiesen.






.pa



8. Skalar- und Teilbereichstypen

Die fundamentalen Datentypen in Pascal sind die Skalartypen.  Sie 
definieren  jeweils eine endliche und lineargeordnete  Menge  von 
Werten. Obgleich der Standardtyp Real zu den Skalartypen gehoert, 
stimmt  er  nicht  voellig mit dieser  Definition  ueberein.  Aus 
diesem Grunde duerfen auch Realtypen nicht ueberall dort im  Text 
verwendet werden, wo Skalartypen eingesetzt werden koennen.


8.1 Skalartypen

Abgesehen von den Standard-Skalartypen (Integer,  Real,  Boolean, 
Char  und Byte) unterstuetzt TURBO-Pascal vom  Nutzer  definierte 
Skalartypen,  sogenannte  erklaerte oder definierte  Skalartypen. 
Die Definition eines solchen Skalartypes gibt die einzelnen moeg-
lichen  Werte  in  geordneter Folge an.  Die Werte  dieses  Types 
werden durch die Bezeichner dargestellt,  die die Konstanten  des 
neuen Types sein werden.

Beispiele:
     type
          Karte = (Karo,Herz,Pik,Kreuz);
          Tag   = (Mo,Di,Mi,Do,Fr,Sa,So);
          Monat = (Jan,Feb,Mrz,Apr,Mai,Jun,Jul,Aug,Sep,Nov,Dez);
          Operator = (Plus,Minus,Mult,Div);

Variable vom Typ Karte koennen also die vier Werte:  Karo,  Herz, 
Pik und Kreuz annehmen. 
Bereits  bekannt ist der Standard-Skalartyp Boolean.  Mit  diesem 
Definitionsverfahren kann man ihn definieren als:

     type
          Boolean = (False,True)

Die  Vergleichsoperatoren  =,<,>,<>,>=,<=  kann man auf alle Ska-
lartypen anwenden,  solange beide Operanden vom gleichen Typ sind 
(Real und Integer duerfen gemischt auftreten). Die in der Defini-
tion festgelegte Ordnung wird fuer den Vergleich verwendet,  d.h. 
links stehende Werte sind kleiner als rechts stehende.  Fuer  den 
Typ Karte gilt also:

          Karo < Herz < Pik < Kreuz

Bei folgenden Funktionen duerfen die Argumente Skalartypen sein:

     Succ(Pik)      Der Nachfolger von Pik ist Kreuz.
     Pred(Pik)      Der Vorgaenger von Pik ist Herz.
     Ord(Pik)       Der Ordnungswert von Pik ist 2.

Der  Typ des Ergebnisses von Succ und Pred ist der  gleiche,  wie 
der Typ des Argumentes. Das Ergebnis von Ord ist vom Integertyp.

.pa


8.2 Teilbereichstypen

Ein  Typ  kann als Teilbereich eines bereits definierten  Skalar-
types  definiert werden und zwar durch Angabe des  kleinsten  und 
des groessten Wertes des Teilbereiches.  Die erste Konstante darf 
dabei nicht groesser als die zweite sein. Ein Teilbereich vom Typ 
Real ist nicht erlaubt.

Beispiele:
     type
          HemiSphere = (North,South,East,West);
          World      = (East,West);
          CompassRange = 0..360;
          Gross      = 'A'..'Z';
          Klein      = 'a'..'z';
          Grad       = (Celc,Fahr,Ream,Kelv);
          Wein       = (Rot,Weiss,Rose,Schaum);

Hierbei  ist  World ein Teilbereich  des  Skalartyps  HemiSphere. 
Letzterer  heisst  der assoziative Skalartyp  des  ersteren.  Der 
assoziative  Skalartyp  von CompassRange ist Integer und der  von 
Gross und Klein ist Char.
Der  bereits  genannte Standard-Skalartyp Byte  kann  mit  dieser 
Konstruktion definiert werden als:

     type
          Byte = 0..255

Ein Teilbereichstyp behaelt alle Eigenschaften seines  assoziati-
ven  Skalartyps  und ist nur durch den Bereich seiner  Werte  be-
schraenkt.
Die  Verwendung  definierter Skalar- und  Teilbereichstypen  wird 
dringend  empfohlen,  da sie die Lesbarkeit von  Programmen  sehr 
verbessern.  Ausserdem  koenne leicht Pruefungen in den Programm-
text eingefuegt werden (siehe 8.4),  die waehrend der Ausfuehrung 
des Programmes die den Skalar- und Teilbereichsvariablen zugeord-
neten  Werte ueberwachen.  Ein weiterer Vorteil ist,  dass  diese 
Typen Speicherbereich sparen. TURBO-Pascal ordnet einer Variablen 
eines  Skalar- oder Teilbereichstyps nur ein Byte zu,  falls  die 
Anzahl der Elemente des Typs kleiner als 256 ist. Analog benoeti-
gen Integer Teilbereichsvariable,  deren untere und obere  Grenze 
innerhalb von 0 bis 255 liegen, ebenfalls nur einen Speicherplatz 
von einem Byte.


8.3 Typumwandlung

Die Funktion Ord kann man verwenden,  um Skalartypen in Werte vom 
Integertyp  umzuwandeln.  Standard-Pascal enthaelt  jedoch  keine 
Moeglichkeit  der Umwandlung in der anderen  Richtung,  d.h.  der 
Umwandlung  eines  Integerwertes  in  einen  anderen  Skalarwert. 
TURBO-Pascal enthaelt jedoch die Moeglichkeit des "retyping": Man 
kann  den Wert eines Skalartyps in den Wert eines anderen Skalar-
typs umwandeln,  der die gleiche Ordnungszahl besitzt.  Diese Um-
wandlung erreicht man,  indem man den Typbezeichner des  entspre-
chenden  Typs  als Funktionsbezeichner verwendet und in  Klammern 
einen Parameter folgen laesst.  Als Parameter setzt man den  Wert 
des anderen Skalartyps ein.  Als Wert wird der entsprechende Wert 
des ersten Skalartyps zurueckgegeben.  Retyping kann man auf alle 
Skalartypen ausser Real anwenden. 

.pa


Unter  Verwendung  obiger Definitionsbeispiele gilt dann folgendes:

     Integer(Herz)  = 2   
     Monat(10)      = Nov
     HemiSphere(2)  = East
     Gross(14)      = 'N'
     Grad(3)        = Kelv
     Char(78)       = 'N'
     Integer('7')   = 55



8.4 Bereichspruefung

Das  Einfuegen  von Bereichspruefungen fuer  Skalar- und  Teilbe-
reichsvariable in den Programmtext wird durch die Compiler-Direk-
tive  {$R+}  erzeugt.  Der Standardwert fuer diese Direktive  ist 
{$R-},  d.h. im Normalfall wird keine Bereichspruefung eingebaut. 
Wenn  diese Direktive aktiv ist,  wird bei jeder Zuweisung  eines 
Wertes zu einer Skalar- oder Teilbereichsvariablen  geprueft,  ob 
dieser  Wert auch in dem Bereich der betreffenden Variable liegt. 
Es wird empfohlen,  diese Pruefungen solange in neuen  Programmen 
zu belassen, bis sie voellig ausgetestet sind.

Beispiele:
     program RangeCheck;
          type
               Digit = 0..9;
          var
               Digit1,Digit2,Digit3: Digit;
          begin
               Dig1 := 5;       {gueltig} 
               Dig2 := Dig1 + 3;{gueltig}
               Dig3 := 47       {ungueltig, keine Fehlermeldung}
         {$R+} Dig3 := 55       {ungueltig, Fehlermeldung}
         {$R-} Dig3 := 167      {ungueltig, keine Fehlermeldung}

.pa


9. Zeichenkettentypen (Strings)

TURBO-Pascal  gestattet den Gebrauch von  Stringtypen,  d.h.  die 
Verarbeitung  von Zeichenketten.  Stringtypen sind  strukturierte 
Typen,  die  in vielerlei Weise den Feldtypen (siehe  10:  array) 
aehneln.  Es gibt jedoch einen Hauptunterschied zwischen  beiden. 
Die  Anzahl der Zeichen in einer Zeichenkette (ihre Laenge)  kann 
sehr  stark  dynamisch zwischen 0 und einer  festgelegten  oberen 
Grenze waehrend der Verarbeitung schwanken, im Gegensatz dazu ist 
die Anzahl der Elemente eines Feldes immer fest.


9.1 Stringtyp-Definition

Die Definition eines Stringtyp erfolgt durch Angabe der maximalen 
Anzahl der Zeichen,  die er enthalten kann,  durch seine maximale 
Laenge:
     
     type      name = string[n];

Die Definition besteht also aus dem reservierten Wort string, dem 
die  Laenge  n in eckigen Klammern folgt.  Die Laenge n ist  eine 
Integerkonstante  im Bereich 1 bis 255.  Es gibt  keine  Standard 
Laenge, sie muss immer definiert werden.

Beispiele:
     type
          FileName   = string[14];
          ScreenLine = string[80];

Eine Stringvariable der Laenge n belegt im Speicher n+1 Byte. Das 
zusaetzliche Byte enthaelt die aktuelle Laenge der Variablen. Die 
einzelnen Zeichen im String sind indiziert von 1 bis n.


9.2 STRING-Ausdruecke

Zeichenketten  koennen durch Bildung von STRING-Ausdruecken mani-
puliert werden. STRING-Ausdruecke bestehen aus STRING-Konstanten, 
STRING-Variablen, Funktionsaufrufen und Operatoren.
Das Pluszeichen kann man als STRING-Operator verwenden,  um  zwei 
Zeichenketten  miteinander  zu verknuepfen.  Die  CONCAT-Funktion 
(siehe 9.5) vermag das gleiche, aber der + Operator wird vorangig 
verwendet.  Das Ergebnis ist die Verkettung beider Operanden. Ist 
die  Laenge  des Ergebnis-String laenger als  255,  entsteht  ein 
Laufzeitfehler.

Beispiele:
     'TURBO-' + 'Pascal'       = 'TURBO-Pascal'
     '123'    + '456'          = '123456'
     'A' + 'B' + 'C' + 'D   '  = 'ABCD   '

Die Vergleichsoperatoren haben eine niedrigere Rangfolge, als der 
Kettungs-Operator  +.  Wenn sie auf  STRING-Operanden  angewendet 
werden,  ist  das Ergebnis ein Boolescher Wert (True oder False). 
Werden zwei Strings miteinander verglichen, erfolgt der Vergleich 
von   links nach rechts.  Sind die Strings von  unterschiedlicher 
Laenge,  aber gleich bis einschliesslich zum letzten Zeichen  des 
kuerzeren  Strings,  dann ist der kuerzere kleiner.  Strings sind 
nur  dann  gleich,  wenn sie gleiche Laenge und  gleichen  Inhalt 
haben.

.pa


Beispiele:
     'A' < 'B'                                =  richtig
     'A' > 'b'                                =  falsch
     '2' < '12'                               =  falsch
     'TURBO'   =   'TURBO'                    =  richtig
     'TURBO '  =   'TURBO'                    =  falsch
     'Pascal Compiler ' < 'Pascal compiler '  =  richtig           


9.3 STRING-Ergibtanweisung

Der  Ergibtoperator wird verwendet, um das Ergebnis eines STRING-
Ausdruckes einer STRING-Variablen zuzuweisen. 

Beispiele:
     Alter  :=  'fuenfzehnten';
     Zeile  :=  'Herzlichen Glueckwunsch zu Deinem ' + Alter + 
                'Geburtstag';

Wird  die  maximale Laenge einer STRING-Variablen  ueberschritten 
(durch  Zuweisung  zuvieler Zeichen),  so werden  die  restlichen 
Zeichen  abgeschnitten.  Wurde beispielsweise die Variable  Alter 
mit       type  Alter = string[5];
definiert, dann ist ihr Wert nach obiger Zuweisung 'fuenf'.


9.4 STRING-Prozeduren

In  TURBO-Pascal koennen die folgenden Standard-STRING-Prozeduren 
verwendet werden:


9.4.1 DELETE-Prozedur

Syntax:   Delete(str,pos,num);

Die Parameter sind:
          str       STRING Variable,
          pos       Integer Ausdruck,
          num       Integer Ausdruck.

Delete  erzeugt  aus str einen Teilstring durch Loeschen von  num 
Zeichen  beginnend  ab Position pos.  Wenn pos  groesse  als  die 
Laenge  von str ist,  wird kein Zeichen geloescht.  Wenn  pos+num 
ausserhalb  der  Zeichenkette  liegt,   werden  nur  die  Zeichen 
geloescht,  die  ab  pos  innerhalb liegen.  Liegt pos  nicht  in 
1..255, wird ein Laufzeitfehler erzeugt.

Beispiele:
     type  str = string[10];
     str :=  'ABCDEFG';
     Delete(str,2,4);  ergibt 'AFG'.
     Delete(str,2,10); ergibt 'A'.


9.4.2 INSERT-Prozedur

Syntax:   Insert(obj,target,pos);

Die Parameter sind:
          obj       STRING Ausdruck,
          target    STRING Variable,
          pos       Integer Ausdruck.

Insert fuegt den String obj in den String target ab Position  pos 
ein.  Ist  pos  groesser als die Laenge von target,  wird obj  an 
target  angefuegt.  Wenn  das Ergebnis laenger als  die  maximale 
Laenge  von  target  ist,   werden  die  ueberstehenden   Zeichen 
abgeschnitten  und target erhaelt nur die links  stehenden.  Wenn 
pos ausserhalb von 1..255 liegt, entsteht ein Laufzeitfehler. Mit 
dem oben definierten String str='ABCDEFG' ergeben sich folgende

Beispiele:
     Insert('XX',str,3);     ergibt  'ABXXEFG'
     Insert('UVWXYZ',str,4); ergibt  'ABCUVWX'



9.4.3 STR-Prozedur

Syntax:   Str(value,str-var);

Die Paramter sind:
          value     WRITE-Prozedur-Parameter vom INTEGER/REAL-Typ 
          str-var   STRING-Variable.

Die  STR-Prozedur  konvertiert den numerischen Wert von value  in 
eine Zeichenkette und speichert sie in str-var ab.

Beispiele:
     Wenn      I = 1234
     ergibt    Str(I:5,str1);    in str1 = ' 1234'
     Wenn      X = 2.5E4
     ergibt    Str(x:10:0,str2); in str2 = ' 25000'


9.4.4 VAL-Prozedur

Syntax:   Val(str,var,code);

Die Parameter sind:
          str       STRING-Ausdruck,
          var       INTEGER/REAL-Variable,
          Code      INTEGER-Variable.

Der  STRING-Ausdruck  str muss den Regeln einer numerischen  Kon-
stanten (siehe 4.2) genuegen.  Weder fuehrende noch  nachfolgende 
Leerzeichen sind erlaubt.  Val konvertiert die Konstante zu einem 
Wert  vom  gleichen Typ wie var und speichert diesen Wert in  var 
ab.  Wird  kein Fehler festgestellt,  ist der Wert der  Variablen 
code=0. Andernfalls erhaelt code den Wert der Position des ersten 
fehlerhaften  Zeichens  in str und der Wert von var  ist  undefi-
niert.

Beispiele:
     Wenn      str1 = '234'   ergibt
     Val(str1,I,Result);      I = 234        Result = 0
     
     Wenn      str2 = ' 234'  ergibt
     Val(str2,I,Result);      I = undef.     Result = 1

     Wenn      str3 = '2.5E4' ergibt
     Val(str3,X,Result);      X = 25000      Result = 0

.pa


9.5 STRING-Funktionen

In  TURBO-Pascal stehen die folgenden   Sandard-STRING-Funktionen 
zur Verfuegung:


9.5.5 COPY-Funktion

Syntax    Copy(str,pos,num);

Die Parameter sind:
          str       STRING-Ausdruck,
          pos       INTEGER-Ausdruck,
          num       INTEGER-Ausdruck.

Copy  gibt  einen String zurueck,  der aus num Zeichen  von  str, 
beginnend  ab Position pos,  besteht. Wenn pos > Laenge(str) ist, 
besteht das Ergebnis aus der leeren Zeichenkette ''. Wenn pos+num 
ausserhalb  von str liegt,  werden nur die innerhalb von str lie-
genden  Zeichen zurueckgegeben.  Liegt pos nicht  in  1..255,  so 
entsteht ein Laufzeitfehler.

Beispiele:
     Wenn str1 := 'ABCDEFG' , dann ist
     str2 := Copy(str1,3,2);   gleich    'CD'
     str2 := Copy(str1,4,10);  gleich    'DEFG'
     str2 := Copy(str1,4,2);   gleich    'DE'



9.5.2 CONCAT-Funktion

Syntax:   Concat(str1,str2{,strN});

Die Parameter sind:
          str1      STRING-Ausdruck,
          str2      STRING-Ausdruck,
          ....      ...............
          strN      STRING-Ausdruck.

Die Anzahl N der STRING-Ausduecke ist beliebig.  Das Ergebnis der 
CONCAT-Funktion  ist  eine Zeichenkette,  die aus  den  einzelnen 
Zeichenketten  durch  Kettung entsteht und zwar in  der  gleichen 
Reichenfolge,  wie die STRING-Parameter in der Liste stehen. Wird 
die  Laenge groesser als 255,  entsteht ein  Laufzeitfehler.  Man 
kann, wie bereits in 9.3 erwaehnt, mit dem +-Operator das gleiche 
erhalten.  CONCAT  sichert  nur die Kompatibilitaet  mit  anderen 
Compilern.

Beispiel:
     str1 := 'TURBO ';
     str2 := 'ist am schnellsten';
     str3 := Concat(str1,'-Pascal ',str2); ergibt
     str3 gleich 'TURBO-Pascal ist am schnellsten'

.pa

9.5.3 LENGTH-Funktion

Syntax:   Length(str);

Der Parameter ist:
          str       STRING-Ausdruck.

Diese Funktion gibt die Laenge des STRING-Ausdruckes str zurueck, 
d.h.  die Anzahl der Zeichen von str. Der Typ des Ergebnisses ist 
Integer.

Beispiel:
     str := '123456789';
     Length(str) ist gleich 9.


9.5.4 POS-Funktion

Syntax:   Pos(obj,target);

Die Parameter sind:
          obj       STRING-Ausdruck,
          target    STRING-Ausdruck.

Der  Ergebnistyp  ist Integer.  Die POS-Funktion  durchsucht  den 
String target nach dem String obj.  Das Ergebnis ist die Position 
in target, an der das erste Zeichen von obj steht. Wenn obj nicht 
in target gefunden wurde, gibt POS den Wert 0 zurueck.

Beispiele:          
     str := 'ABCDEFG';
     Pos('BC',str)  ergibt  2,
     Pos('H',str)   ergibt  0.



9.6 STRINGS und CHARACTER

STRING-Typen  und  Standard-Skalar-Typen  CHAR  sind  kompatibel. 
Deshalb  kann man ueberall dort,  wo STRING-Werte  erlaubt  sind, 
CHAR-Werte  einsetzen und  umgekehrt.  Weiterhin kann man STRINGS 
und  CHARACTER in Ausdruecken mischen.  Wenn einem CHARACTER  ein 
STRING-Wert zugewiesen wird,  muss die Laenge des STRING genau  1 
sein,  sonst  wird  ein Laufzeitfehler angezeigt.  Man  kann  die 
einzelnen Zeichen einer STRING-Variablen durch Indizierung errei-
chen.  Dies  geschieht  durch Anfuegen eines Indexausdruckes  vom 
INTEGER-Typ,  eingeschlossen in eckigen Klammern, an den Bezeich-
ner der STRING-Variablen.

Beispiele:
     Buffers[5]
     Line[Length(Line)-1]
     Ord(Line[0])

Das  erste Zeichen eines STRING (mit Index 0) enhaelt die STRING-
Laenge. Dies ist genau der Wert von Ord(Line[0]). Wenn jedoch vom 
Programmierer der Laengenindikator selbst geaendert wird, muss er 
auch selbst sichern,  dass dieser die maximale Laenge der STRING-
Variablen nicht uebersteigt.  Wenn die Compiler-Direktive R aktiv 
ist {$R+},  wird ein Code generiert,  der sichert,  dass der Wert 
des  STRING-Index-Ausdruckes  die  maximale  Laenge  der  STRING-
Variablen nicht uebersteigt.  Es ist jedoch auch moeglich,  einen 
String ueber seine aktuelle dynamische Laenge hinaus zu  indizie-
ren.  Die  dann  gelesenen Zeichen haben jedoch  rein  zufaellige 
Werte  und  haben  keinerlei Bezug zu den wirklichen  Werten  der 
STRING-Variablen.
.pa