Programmeren in REXX/Functies deel 2: verschil tussen versies
Verwijderde inhoud Toegevoegde inhoud
Eerste draft |
Deel toegevoegd |
||
Regel 1:
{{Programmeren in REXX}}
In dit hoofdstuk behandelen we een tweede reeks
Het gaat om functies die toelaten getallen te formatteren of om te zetten, en functies die met datum en tijd werken.
Zoals steeds zullen resultaten tussen « en » worden getoond. Als er sprake is van een '''pad''' karakter, dan dient dit karakter om de (kortste) string op te vullen. Standaard wordt daar de spatie voor gebruikt.
=NUMERIC - nauwkeurigheid van bewerkingen bepalen=
Alvorens dieper in te gaan op de functies die met getallen werken moeten we het bevel '''numeric''' nog onder de loep nemen.
'''numeric digits''' [uitdrukking]
of
'''numeric fuzz''' [uitdrukking]
of
'''numeric form''' [formaat]
In de eerste vorm bepaalt het numeriek resultaat van de uitdrukking met hoeveel cijfers getallen intern moeten worden opgeslagen. Standaard worden getallen met 9 significante cijfers opgeslagen.
Standaard zijn dus enkel getallen tussen 0,00000001 en 999.999.999 bruikbaar. Wil men met grotere getallen kunnen werken dan moet uitdrukking leiden tot een groter getal dan 9.
Noteer dat met de functie '''digits()''' de actuele cijfergrootte kan worden opgevraagd.
Met '''numeric fuzz''' kunnen we opgeven tot hoeveel decimalen significant zijn bij berekeningen. De rest van de decimalen worden dus geïgnoreerd. We bepalen hiermee m.a.w. de nauwkeurigheid van de berekeningen. De actuele decimale nauwkeurigheid kan worden opgevraagd met de functie '''fuzz'''. De fuzz kan lokaal voor een subroutine worden veranderd.
De fuzz-waarde zal dus ook invloed hebben op eventuele afrondingen van getallen.
Met '''numeric form''' tenslotte controleert de vorm van de exponentiële notatie van getallen. We kunnen kiezen voor een ''formaat'':
*'''scientific''', waarbij slechts één significant cijfer voor de komma geplaatst wordt. Dit is standaard;
*'''engeneering''', waarbij in het exponentieel deel de macht steeds een veelvoud van 3 is.
De actuele exponentvorm kan men opvragen met de functie '''form()'''.
=Manipulatie van getallen=
Daarom is deze
▲Vele van de functies die we hier beschrijven (en ook van numerische bewerkingen) zullen tot fouten leiden als de tokens geen geldig getal voorstellen.
▲Daarom is deze eerste functie dikwijls heel nuttig om na te gaan of latere bewerkingen wel mogelijk zullen zijn.
<!------------------------------------------------->
==DATATYPE - controle op
'''datatype'''(''string''[,''type''])
Als we geen ''type'' opgeven, dan geeft deze functie
* '''A'''lphanumeric (enkel A-Z, a-z en/of 0-9 karakters),
* '''B'''inary (enkel 1 en 0 karakters),
Regel 31 ⟶ 47:
Dit zijn voorbeelden:
say datatype("Abc") datatype("12")
say datatype("Abc","N") datatype("Abc","M")
say datatype('11101110','Binary')
say datatype('01000001'b,'B')
say datatype('3','Logical') datatype(12,'O')
In het laatste geval is de ''string'' gelijk aan '41'x, of letter
Met de gelijkwaardige types '''V'''ariable en '''S'''ymbol wordt getest of de string een syntactisch geldige naam is voor een REXX variabele, dus of hij kan gebruikt worden als linker lid van een assignatie.
say datatype("AB%","Symbol")
Er is nog een andere functie die ons soms kan helpen, namelijk '''symbol'''.
==SYMBOL - geldigheid tokens==
'''symbol'''(''"token"'')
Deze functie antwoord:
*'''«BAD»''' als het token geen geldige naam is om als variabele gebruikt te worden;
*'''«LIT«''' als het wel een geldige naam is, doch nog niet is geïnitialiseerd;
*'''«VAR»''' als het een geldige naam is en ook is geïnitialiseerd.
Hier is het belangrijk te begrijpen dat we het te onderzoeken token als een constante moeten schrijven, anders onderzoeken we de '''inhoud''' van het token op geldigheid.
<!------------------------------------>
==ABS - Absolute waarde van een getal==
'''abs'''(''getal'')
Deze functie geeft de absolute waarde (positieve waarde) van het getal terug. Het getal als parameter kan natuurlijk een uitdrukking zijn die
eerst moet worden geïnterpreteerd. Het resultaat moet een getal worden, anders is er een uitvoeringsfout (93: Target must be a number).
say abs(24-12)
say abs(12-24)
<!------------------------------------>
==MAX en MIN - maximum en minimum zoeken==
'''max'''(''getal''[,''getal''][,''getal'']...)
'''min'''(''getal''[,''getal''][,''getal'']...)
Deze functies antwoorden met het grootste, respectievelijk kleinste van een reeks getallen (of variabelen die getallen bevatten).
a=12 ; b=14
say max(a,b,24) min(4,-1*b,24) «24 -14»
<!------------------------------------>
==RANDOM - willekeurig getal genereren==
'''random'''([''maximum''])
of
'''random'''([''minimum,maximum''['',zaadje''])
Deze functie geeft een willekeurig (positief geheel) getal, standaard gelegen tussen 0 en 999. Maar er kan een ''minimum'' en/of ''maximum'' worden meegegeven waartussen het getal moet liggen (het bereik is beperkt tot 100000).
Indien men een herhaling van dezelfde willekeurige reeks getallen wil bekomen, dan kan men een ''zaadje'' (een getal) meegeven bij de eerste oproep. De van dan af gegenereerde getallen zullen steeds in dezelfde volgorde worden gegenereerd.
<!------------------------------------>
==SIGN - wat is het teken van een getal?==
'''sign'''(''getal'')
Het antwoord is «-1» voor een negatief ''getal'', «0» indien het ''getal'' nul is en «1» voor een positief getal.
say sign(-12 * -4) «1»
<!------------------------------------>
==TRUNC - decimalen laten vallen==
'''trunc'''(''getal''[,''decimalen''])
Kapt het ''getal'', '''zonder afronding''', af bij het aantal opgegeven ''decimalen''. Standaard worden alle decimalen weggelaten en houdt men een geheel getal over.
Wil men een afgerond getal bekomen, dan moet men gebruik maken van de '''format''' functie die we nu beschrijven.
<!------------------------------------>
==FORMAT - een getal formatteren voor uitvoer==
'''format'''(''getal''[,vóór][,na])
Het ''getal'' wordt eerst afgerond volgens de geldende afrondingsregels. Het resultaat is exact gelijk aan wat "getal+0" zou geven.
Men kan echter ook bepalen hoeveel cijfers er in het resultaat ''vóór'' en/of ''na'' de komma moeten komen. Geeft men een aantal ''vóór'' de komma die te klein is om het getal te kunnen bevatten, dan treedt er een fout op. Hou daarbij ook rekening met een eventueel minteken.
say trunc(10.676,2) «10.67»
say format(10.676,,2) «10.68»
numeric fuzz 4
say format(12.342233332,4,3) « 12.342»
say format(12.343392211,4,3) « 12.343»
say format(12.343792211,4,3) « 12.344»
Merk het verschil tussen '''trunc''' en '''format''' wat de afronding betreft.
<!---------------------------------------------------------------------------->
==Vertalen tussen karakter, decimaal, hexadecimaal of binair==
Regel 70 ⟶ 121:
Dit zijn voorbeelden op een PC
(met ASCII karaktertabel):
say c2d('A')
say c2d('a')
say c2d(' ',5)
say c2d('AB')
say c2d('FF'x)
say c2d('FF'x,1)
say c2d('FF'x,2)
In het laatste 2 gevallen hebben we een lengte meegegeven. Met een lengte 1 hebben we binair "11111111", en dus een negatief
(complementair) getal -1. Met de lengte 2 hebben we binair "0000000011111111" dan het positief getal 255 voorstelt.
Regel 83 ⟶ 134:
'''c2x(string)
Onze string wordt nu omgezet in zijn hexadecimale notatie.
say c2x("A")
say c2x(' A')
say c2x('11111111'b)
===D2C - decimaal naar karakter vertalen===
<!------------------------------------->
|