Das Rechnen in der FLEX-Sprache, Teil 1 avanti

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.

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