Programmeren in REXX/Functies deel 2: verschil tussen versies

Verwijderde inhoud Toegevoegde inhoud
GuyDC (overleg | bijdragen)
Eerste draft
 
GuyDC (overleg | bijdragen)
Deel toegevoegd
Regel 1:
{{Programmeren in REXX}}
In dit hoofdstuk behandelen we een tweede reeks standaard functies van REXX die standaard aanwezig zijn.
 
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=
VeleDe vanmeeste functies en de functiesbewerkingen die we hier beschrijven (en ook van numerische bewerkingen) zullen tot fouten leiden alsindien de tokens geen geldig getal voorstellen.
{{Bericht
Daarom is deze eersteallereerste functie dikwijls heel nuttig om na te gaan of latere bewerkingen wel mogelijk zullen zijn.
|titel=pad-karakter
|bericht=In alle functies waar een optioneel pad-karakter kan worden opgegeven zal dit de (kortste) string opvullen met het karakter. Als het karakter niet is
opgegeven, dan wordt daarvoor de spatie gebruikt.
|type=info}}
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 numerischtype gegeven==
'''datatype'''(''string''[,''type''])
Als we geen ''type'' opgeven, dan geeft deze functie het woord '''&#171;NUM&#187;''' terugals antwoord als we''string'' een geldig getal in string hebbenis. In het ander geval geeftis dehet antwoord '''&#171;CHAR&#187;'''.
functie het woord '''CHAR''' terug.
 
IndienMet wede wel één vannu volgende ''types opgeven dan'' is het antwoord '''&#171;1&#187;''' als de string aan het type voldoet. en andersAnders krijgen we '''&#171;0&#187;'''. DeHet typesvetjes zijngedrukte (enkelkarakter hetis vetvoldoende karakterbij isde daarbijopgave voldoende)van het type controle:
* '''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") /*&#171;CHAR NUM*/&#187;
say datatype("Abc","N") datatype("Abc","M") /*&#171;0 1*/&#187;
say datatype('11101110','Binary') /*&#171;1*/&#187;
say datatype('01000001'b,'B') /*&#171;0*/&#187;
say datatype('3','Logical') datatype(12,'O') /*&#171;0 0*/&#187;
In het laatste geval is de ''string'' gelijk aan '41'x, of letter "&#171;A"&#187; (in ASCII), en dat is geen combinatie van 1- en 0-karakters.
 
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") /*&#171;0*/&#187;
 
Er is nog een andere functie die ons soms kan helpen, namelijk '''symbol'''.
Er bestaat ook een functie '''SYMBOL(string)''' die '''''BAD''''' als antwoord geeft als de string geen geldige naam voor een variabele is. Doch, als het wél een geldige naam is, dan is het antwoord
==SYMBOL - geldigheid tokens==
'''''VAR''''' als het symbool al als variabele is gebruikt (dus een waarde heeft), of '''''LIT''''' als het symbool nog geen waarde kreeg.
'''symbol'''(''"token"'')
Deze functie antwoord:
*'''&#171;BAD&#187;''' als het token geen geldige naam is om als variabele gebruikt te worden;
*'''&#171;LIT&#171;''' als het wel een geldige naam is, doch nog niet is geïnitialiseerd;
*'''&#171;VAR&#187;''' 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) /*&#171;12*/&#187;
say abs(12-24) /*&#171;12*/&#187;
<!------------------------------------>
==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) &#171;24 -14&#187;
<!------------------------------------>
==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 &#171;-1&#187; voor een negatief ''getal'', &#171;0&#187; indien het ''getal'' nul is en &#171;1&#187; voor een positief getal.
say sign(-12 * -4) &#171;1&#187;
<!------------------------------------>
==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) &#171;10.67&#187;
say format(10.676,,2) &#171;10.68&#187;
numeric fuzz 4
say format(12.342233332,4,3) &#171; 12.342&#187;
say format(12.343392211,4,3) &#171; 12.343&#187;
say format(12.343792211,4,3) &#171; 12.344&#187;
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') /*&#171;65*/&#187;
say c2d('a') /*&#171;97*/&#187;
say c2d(' ',5) /*&#171;32*/&#187;
say c2d('AB') /*&#171;16706*/&#187;
say c2d('FF'x) /*&#171;255*/&#187;
say c2d('FF'x,1) /*&#171;-1*/&#187;
say c2d('FF'x,2) /*&#171;255*/&#187;
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") /*&#171;41*/&#187;
say c2x(' A') /*&#171;2041*/&#187;
say c2x('11111111'b) /*&#171;FF*/&#187;
===D2C - decimaal naar karakter vertalen===
<!------------------------------------->
Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.