`Register`

Das Rechnen in der FLEX-Sprache, Teil 1       acon

Die FLEX-Sprache ist nicht geschaffen und daher nicht geeignet für wissenschaftliches Rechnen. Zuerst wurden lediglich Hilfsfunktionen für die Grundrechenarten geschaffen. Diese Hilfsfunktionen sollten dazu dienen, Summen, Produkte und Durchschnittswerte auszurechnen, Währungsbeträge umzurechnen sowie einen Zähler für Schleifen zu ermöglichen. 
 
Hinweis auf  Teil 2: Mit V27.2 kam der bequeme Befehl `eval` zum Auswerten arithmetischer Ausdrücke, mit dem man jeden Feld- und Unterfeldinhalt in Rechenbefehle einbauen und diese dann ausführen lassen kann. Damit sind die in diesem Kapitel beschriebenen Befehle nicht mehr besonders wichtig, bleiben aber gültig und sind sogar mit den neuen Möglichkeiten kombinierbar. Viele der StandardFLEXe benutzen diese Variablen sehr ausgiebig! Mindestens als Schleifenzähler sind die Variablen z und Z immer noch sehr brauchar (s. Beisp. 5). 

Sonderfall: Funktionen zur `Datumsberechnung.`

Interne Zahl und interner Zähler

Es gibt zwei besondere Variablen für das Rechnen: die "interne Zahl" und den "internen Zähler". Ansonsten lassen sich Zahlenwerte in den #u-Variablen und in den $-Variablen speichern. Dann sind es ganz normale Zeichenfolgen, die nur beim Rechnen automatisch als Zahlen interpretiert werden. 
Wir verwenden für die Beschreibungen folgende Abkürzungen: 

iZ = interne Zahlenvariable / iz = interner Zähler

Mit beiden Werten kann man auf gleiche Weise umgehen, der Unterschied ist nur, daß iZ als Dezimalzahl, iz aber als ganze Zahl behandelt wird. 
Achtung: in den Befehlen ist immer nur  Z bzw. z  zu schreiben, nicht  iZ bzw.  iz ! 

Nach jedem Rechenbefehl ist das Ergebnis dann wieder in der internen Zahlenvariablen bzw. im Zähler - nicht in der iV!  Um z oder Z in die iV zu kriegen, muß man  var z  bzw.  var Z  sagen. Erst dann kann man die Zahl mit  ins   in ein Datenfeld oder eine #u-Variable kopieren. 
Wichtig: Das Ende des FLEXes überleben beide Zahlen nicht. Zu Beginn eines neuen FLEX sind sie stets 0.

Nochmals zur Verwertung der Zahlenvariablen: 
Mit  `var Z` bzw. var z  kann man die Zahl bzw. den Zähler in die `iV` kopieren und dann für alle denkbaren Zwecke verwenden. Z und z können in jedem "`cstring`" an jeder beliebigen Stelle vorkommen, d.h. man könnte z.B. auch schreiben 
wri "Ergebnis: " Z 

Und so sehen die Rechenbefehle aus (jeweils auf eigener Zeile):

Z = N   N  bzw. iV in Zahl umwandeln (andere Zeichen fallen dabei weg) und in iZ speichern. 
		N  kann eine Dezimalzahl mit Punkt oder Komma sein, auch Exponentialschreibweise ist möglich: 1E3 = 1000
Z + N   N  bzw. iV in Zahl umwandeln und zu iZ addieren, bzw.   
Z - N   iZ-N  bzw. iZ - iV bilden, bzw. 

Z * N   iZ*N  bzw. iZ * iV das Produkt aus beiden, bzw.
Z / N   iZ/N  bzw. iZ / iV  ausrechnen (wenn N=0, dann n=1E-22), bzw. 

z %% N   iz%%N  bzw. iz %% iV  (Divisionsrest) ausrechnen  (s. `Beisp. 7`)

Wenn N fehlt, wird jeweils der Wert der iV genommen: 
d.h. es wird dann iZ bzw. iz  mit dem Inhalt der iV verrechnet, wobei diese zuerst in eine Zahl verwandelt wird. 
Wenn in der iV vor der Zahl noch andere Zeichen stehen, macht das nichts aus, es wird die reine Zahl daraus extrahiert! 

Leerzeichen vor und hinter dem Operatorzeichen werden ab V27.2 nicht mehr gebraucht.

Für den Zähler gilt dasselbe, nur mit z statt Z. Den Divisionsrest gibt es jedoch nur bei z. 
Für den Zähler, weil ganzzahlig, wird bei  / das Ergebnis ganzzahlig abgerundet, d.h. am Komma abgeschnitten. 
Beide internen Variablen können in  Bedingungsprüfungen  verwendet werden, und zwar so: 

if z>n  command
if z=n  command
if z<n  command

und dasselbe gilt für Z. Beim Vergleichen werden alle Zahlen als Dezimalzahlen behandelt. 
Tip: Statt   if z>=n   (was nicht funktioniert!) kann man schreiben   if not z<n. 

Für Programmierer: die möglichen Werte für Ganzzahlen liegen zwischen -2,147,483,648 und 2,147,483,647 ("long integers")
Die Werte für Dezimalzahlen zwischen   +/-1.7E+/-308  (sog. "double"-Werte)
Man kann also z.B. schreiben:  Z = 2E-4 (für 2/10000). 

Hinweis: Eine Besonderheit sind die Funktionen für `Datumsberechnungen`. 

Beispiel 1: Der im Teilfeld a von  #123  stehende Wert soll um 1 erhöht werden: 
var #123$a 
z= 
z+1 
var z 
ins $a-#123 

Beispiel 2: In #udm steht ein DM-Betrag, der durch 1.95583 geteilt und dann in #ueu gespeichert werden soll, gerundet auf 2 Kommastellen (Umrechnung DM ->Euro), das Ergebnis soll auch angezeigt werden. Das geht so: 

  DM-Betrag steht in #udm, iZ auf diesen Wert setzen: 
var #udm 
Z= 
  Dann multiplizieren (Ergebnis steht dann wieder in iZ) 
  Für das Umgekehrte: statt / ein * einsetzen (Multiplikation) 
Z/ 1.95583 
var #udm " DM sind umgerechnet: " Z2 " Euro" 
mes 
var Z2 
ins #ueu 

Beispiel 3: `EURO.FLX`  `ausführen` 

Beispiel 4: `SUMME.FLX` Summieren einer Kategorie über die Ergebnismenge oder die gesamte Datenbank. (Siehe `Komfortmenü` für Export)

Beispiel 5: Schleifenzähler. Wenn man eine Schleife 100mal abarbeiten will, geht man so vor: 
z=0 
:loop 
...   Befehle
z+1 
if z<100 jump loop 
... 
Dasselbe funktioniert mit Z statt z, d.h. man kann auch zwei Schleifen ineinander verschachteln. 

Beispiel 6: Man will prüfen, ob der Wert in Feld #77 größer als der in #uwx ist. Wenn ja, soll "Stimmt" ausgegeben werden. 
Das geht so:   (denn dann ist #77 - #uwx > 0 ) 
 
var #77 
Z= 
var #uwx 
Z- 
   in der iZ steht jetzt die Differenz #77 - #uwx 
if Z>0 mes Stimmt 

Beispiel 7: Divisionsrest. In #77 steht eine ganze Zahl, in #uxy eine andere.  Was ist der Divisionsrest von #77 / #uxy?
var #77 
z = 
var #uxy 
z %% 
var "Der Div.Rest ist " z

?var Z=h xvar 
?iV=h xiV 
?Register=h xa 
?EURO.FLX=h euro.flx 
?ausführen=x help euro\exec X euro 
?SUMME.FLX=h summe.flx 
?Sonderfunktion.=h xsonder 
?Bedingungsprüfungen=h xif=if z>n 
?cstring=h xcstring 
?Datumsberechnungen=h xdate 
?eval=h xeval 
?Beisp. 7=h =Beispiel 7 
?Datumsberechnung.=h xdate 
?Komfortmenü=h exprt