|  | allegro-C BlueChyp V27.2 |  | 
| 
Neuer- und Verbesserungen 7. Mai 2007 | 
| Mehr zu den Themen: | In a99 eingeben:  h xeval Das Rechnen in der FLEX-Sprache  (ab
V27.2) Rechenbefehle mit arithmetischen
Ausdrücken eval rechenbefehl       avanti    Z=rechenbefehl       avanti   Der rechenbefehl wird als arithmetischer Ausdruck interpretiert und das Ergebnis im ersten Fall in die "interne Variable" kopiert, im zweiten Fall in die "interne Zahl". (Mit dem kleinen z, dem "internen Zähler", geht es nicht!) Das Ergebnis
ist immer eine Zahl mit Dezimalpunkt, Nullen am Ende werden entfernt.  Wenn hinter dem
Punkt nur Nullen stehen, wird der Punkt auch entfernt - eine Zahl mit Punkt am
Ende sähe nicht gut aus.  Wenn rechenbefehl
 fehlt, wird der Inhalt der iV
genommen. Man kann also auch zuerst mittels 
var  in der 
iV einen beliebigen Rechenbefehl zusammensetzen und diesen dann auswerten
lassen.  Gleich ein Beispiel zum Ausprobieren: In #upr steht ein Betrag, es soll dazu die Mehrwehrtsteuer ausgerechnet
werden. Z=0.19 * #upr  var "19% von
" #upr " sind " Z " EUR"  mes Das einfachste Rezept zum Rechnen ist also: 
 
 Regeln Ein rechenbefehl
ist eine Folge von Elementen mit Operatoren dazwischen:        
elem op elem op ... elem Jedes 
op  ist einer der Operatoren   + 
-  *  / ^   für Addition, Subtraktion, Multiplikation
Division und Potenzierung.  Leerzeichen links und rechts davon sind nicht nötig,
desgl. bei dem = im Z-Befehl.  Ein elem kann sein:  ·       eine Zahl. Negative Zahlen beginnen mit -, positive aber nicht mit +       Sehr große und sehr kleine Zahlen kann man
in Exponentialdarstellung schreiben: z.B.        1E15  bzw.  1E-20. Auch e statt E möglich.        Weitere Beispiele: 5e+3 = 5000, 75E-4 = 0.0075, 4.81E6 =
4810000  ·       eine Feldangabe #nnn oder #nnn$x, wobei #nnn
auch eine #u-Variable sein
kann. Es ist nicht notwendig, daß ein solches Feld nur eine Zahl enthält,
sondern das Programm wird sich die Zahl selbst heraussuchen, wenn z.B.
Buchstaben davor oder Klammern darum herum stehen. Stehen allerdings zwei
Zahlen drin, wird nur die erste genommen. (Die Manipulationsbefehle, die es bei
var gibt, sind hier nicht anwendbar, siehe
aber Beispiel 3.)        Beispiel: 19 vom Betrag in
#9DB$p:  Z=#9DB$p * 0.19 ·       Eine  freie Variable  $Abc, auch hier bei Bedarf mit Unterfeld-Code:  $Abc$d  (freie Var. nicht
bei avanti )  ·       einer der  internen Zahlenwerte  z oder Z. [Bis V27.1 waren dies die
einzigen Rechenvariablen]  Zu beachten: ·       Wenn ein Element nicht existiert
oder keine Zahl enthält, wird als Wert 0 angenommen. Keine Fehlermeldung!  ·       Wenn am Ende noch ein op steht, hat das keine Wirkung.  ·       Dezimalzahlen können mit Komma oder
Punkt angegeben werden, das Ergebnis hat immer einen Punkt (falls es nicht
eine Ganzzahl ist).  ·       Das Ergebnis ist immer eine Zahl
ohne E-Darstellung.  ·       Bei Zahlen mit mehr als 14 Stellen
wird das Ergebnis hinter der 14. Stelle ungenau. Jedoch ist beim Rechen mit
realen Zahlen eine Genauigkeit von mehr als 14 Stellen ohne praktischen Belang.
 ·       Wenn man Division durch 0 verlangt,
erhält man ein Ergebnis mit ca. 300 Stellen, das für alle praktischen Belange
so gut wie unendlich groß ist. Auch hier keine Fehlermeldung oder gar Absturz!  ·       Die Abarbeitung erfolgt von links nach
rechts, also ohne Priorität der Operatoren!  ·       Klammerung ist nicht möglich. Stets kann man statt dessen zuerst zwei oder
mehr Zwischenergebnisse bilden und in Variablen lagern, die man am Ende in
geeigneter Weise miteinander verrechnet. Am bequemsten ist Z: statt (a+b)*(c+d)
könnte man z.B. schreiben:         Z=a+b\eval c+d*Z   
// a+b ausrechnen, dann mit c+d malnehmen  ·       Maximale Länge des Befehls? 250 Zeichen. Das wäre aber
recht unübersichtlich, man teilt dann die Rechnung besser auf zwei oder mehr
Zeilen auf.  · Potenzen: Z.B. 2^8 für 2 hoch 8, #uxa^2 erhebt die Zahl in #uxa zum Quadrat. 
 · Wurzeln: Z.B. 2^0.5 bzw. 2^0.3333333 für Quadrat- bzw. Kubikwurzel aus 2 (2 hoch 1/2 bzw. 1/3). ·       Den Divisionsrest beim Dividieren
ganzer Zahlen kann man mit dem "internen Zähler" z ausrechnen. Das
Rezept dafür steht in der betr.  Dokumentation  zum internen Zähler.  ·       Rundung? Wer z.B. nur  2
Nachkommastellen braucht, verfährt so, wobei die letzte Stelle dann gerundet
ist:    eval ...
    Z=     var Z2     Das ist gerade dann hilfreich, wenn das
Ergebnis ein Geldbetrag sein soll. Es fallen dann auch keine Nullen am Ende
weg, sondern .00 bleibt stehen.  Hinweis: Rechenbefehle kann man nur mit den Befehlen eval ...  und  Z=... auswerten, nicht innerhalb von var- oder write-Befehlen o.a. Das Ergebnis einer Rechnung muß also zuerst in eine
Variable oder Z, diese kann
anschließend angezeigt oder ausgegeben werden.  Hinweis:   Fertige Anwendung:  Umrechnen verschiedener Einheiten: X umrech eingeben. Der FLEX umrech.flx führt die Sache aus, die Auswahlliste umrech.vw (auf HELP) kann leicht erweitert werden um
weitere Umrechnungen.  Beispiel 1:  Wenn man in #uzy einen Zähler hat und diesen um 1 erhöhen und dann prüfen
will, ob die Zahl 100 erreicht ist, macht man dies so:  eval #uzy+1  ins #uzy  if =100 jump xyz  Beispiel 2:  Aufgabe: Betrag im Teilfeld $p von #9DG  in Euro umrechnen eval
#9DG$p/1.95583  Damit wird der Zahlenwert im Unterfeld p von #9DG  genommen und durch  1.95583  dividiert.  Beispiel 3:  Aufgabe:  In  #95 sei am Ende, immer hinter einem Semikolon, eine Preisangabe.
Diese soll man auf die Variable #upr
aufaddieren.  Hier muß man den arithmetischen Ausdruck
zuerst per var
zusammenstellen, weil man mit eval
nicht die Manipulationsbefehle zur Verfügung hat, um z.B. hinten am Ende den
Teil hinter dem Semikolon herauszugreifen.  var
#95(T";") " + " #upr  eval  ins #upr  Beispiel 4:  Aufgabe:  Dasselbe, aber die
gesamte aktuelle Ergebnismenge durcharbeiten und dann die Gesamtsumme anzeigen.
 Dazu erweitern wir die Sache um eine
Schleife:  #upr 0  first  :loop  var #95(T";") " + " #upr  eval  ins #upr  next  if yes jump loop  var
"Gesamtsumme: " #upr  mes  Beispiel 5:  Aufgabe:  Celsius in
Fahrenheit umrechnen und umgekehrt. Dies ist eingebaut in den Beispiel-FLEX
umrech.flx :beginn ask Temperatur? if "" end ins #ute z=   Celsius -> Fahrenheit Z=z*1.8+32   mit 1 Nachkommastelle var Z1 ins #utf   Fahrenheit -> Celsius Z=z-32*5/9 var Z1 ins #utc   Zeile aufbereiten var #ute(0,r3) "C = " #utf(0,r5) "F" n #ute(0,r3)
"F = " #utc(0,r5) "C" n mes jump beginn |