|
Karaktermanipulatie
Kleine en grote letters
Bestudeer het programma OMWISSEL.rex voor een voorbeeld van een programma
dat enkele karakter manipulaties doet. Het programma wisselt kleine
letters om in grote en grote letters in kleine. Het laat zien hoe een
viertal functies, die karakters manipuleren, werken. Het zal niet al te
moeilijk zijn dit programma te begrijpen. De functies worden alle
aangeroepen in de functie WisselLettersOm. Het hoofdprogramma
kennen we uit eerdere voorbeelden en wordt niet verder toegelicht.
/* REXX */
Say 'Tik de naam van een bestand in:'
Pull BESTNAAM
Do While Lines(BESTNAAM)
REGEL = LineIn(BESTNAAM)
Call WisselLettersOm
Say REGEL
End
Exit 0
WisselLettersOm:
SAVEREG = REGEL
REGEL = ''
Do While (SAVEREG <> '')
Parse Var SAVEREG 1 LETTER 2 SAVEREG
Select
When DataType(LETTER,'U') Then
LETTER = Translate(LETTER,Xrange('a','z'),Xrange('A','Z'))
When DataType(LETTER,'L') Then
LETTER = Translate(LETTER,Xrange('A','Z'),Xrange('a','z'))
Otherwise
Nop
End
REGEL = REGEL||LETTER
End
Return 0
Compileer en test dit programma. Neem een willekeurig bestand als
invoer.
De vier bedoelde functies zijn:
| DataType(LETTER,'L') |
Is de letter een kleine letter? |
| DataType(LETTER,'U') |
Is de letter een grote letter? |
| Translate(LETTER,Xrange('a','z'),Xrange('A','Z')) |
Maak van de letter een kleine letter. |
| Translate(LETTER,Xrange('A','Z'),Xrange('a','z')) |
Maak van de letter een grote letter.
|
Klassificatie van tekens
Bestudeer het programma SOORT.rex met een voorbeeld hoe je tekens kunt
tellen. We hebben tot nu toe steeds het NewLine karakter (\n) gebruikt.
Er zijn echter nog meer bijzondere tekens. We zullen er een aantal tellen.
/* REXX */
Say 'Tik de naam van een bestand in:'
Pull BESTNAAM
Do REGELTELLER=1 While Lines(BESTNAAM)
REGEL = LineIn(BESTNAAM)
Call TelSoorten
End
Exit 0
TelSoorten:
LETTERS = 0
CIJFERS = 0
SPATIES = 0
Do While (REGEL <> '')
Parse Var REGEL 1 TEKEN 2 REGEL
Select
When DataType(TEKEN,'M') Then
LETTERS = LETTERS + 1
When DataType(TEKEN,'W') Then
CIJFERS = CIJFERS + 1
When TEKEN = ' ' Then
SPATIES = SPATIES + 1
Otherwise
Nop
End
End
Say ' # 'Right(REGELTELLER,4,'0')' ---',
' Lt:'Right(LETTERS,3),
' Cf:'Right(CIJFERS,3),
' Sp:'Right(SPATIES,3)' ---'
Return 0
Het programma maakt gebruik van functies die het soort teken kan
bepalen, met andere woorden tot welke klasse een teken behoort. De
tekens worden door dit programma per regel gelezen en per regel
een voor een beoordeeld.
De letters, cijfers en de spaties worden geteld.
Behoort een teken niet tot een van deze drie klassen dan wordt hij
overgeslagen. Per regel wordt de telling afgedrukt, na de regel zelf.
De bedoelde functies zijn:
| DataType(TEKEN,'M') | Is het teken een letter (a-z, A-Z) |
| DataType(TEKEN,'W') | Is het teken een cijfer (0-9) |
Compileer en test dit programma.
Logische functies
Bestudeer het programma BITS.rex. In dit programma wordt op bit niveau
met de gegevens gewerkt. Het is mogelijk in REXX de bits individueel te
benaderen. Een bit kan dus van waarde worden veranderd, maar ook alle
bits in een byte en alle bits van een integer kunnen in een keer een
andere waarde krijgen.
De functies waarmee dit worden uitgevoerd zijn:
| BitAnd | Logische AND, als beide bits 1 zijn, is het resultaat 1 |
| BitOr | Logische OR, als een of beide bits 1 zijn, is het resultaat 1 |
| BitXor | Logische XOR, als een en slechts een van de bits 1 is, is het resultaat 1 |
/* REXX */
NUMMER.1 = '00'x
NUMMER.2 = '11'x
NUMMER.3 = '22'x
NUMMER.4 = '44'x
NUMMER.5 = '88'x
NUMMER.6 = 'FF'x
Say ' Num Msk And Or Xor'
Say ' --- --- --- --- ---'
MASKER = '0F'x
Do INDEX=1 To 6
AND = BitAnd(MASKER,NUMMER.INDEX)
OR = BitOr(MASKER,NUMMER.INDEX)
XOR = BitXor(MASKER,NUMMER.INDEX)
Say ' 'C2X(NUMMER.INDEX)' 'C2X(MASKER),
' 'C2X(AND)' 'C2X(OR)' 'C2X(XOR)
End /* Do */
Say
MASKER = '22'x
Do INDEX=1 To 6
AND = BitAnd(MASKER,NUMMER.INDEX)
OR = BitOr(MASKER,NUMMER.INDEX)
XOR = BitXor(MASKER,NUMMER.INDEX)
Say ' 'C2X(NUMMER.INDEX)' 'C2X(MASKER),
' 'C2X(AND)' 'C2X(OR)' 'C2X(XOR)
End /* Do */
Exit 0
Het voorbeeld programma gebruikt enkele velden in combinatie met de
bovengenoemde functies. De gegevens zijn in het hexadecimale formaat.
Aangenomen wordt dat je vertrouwd bent met het lezen van hexadecimale
getallen. Zo niet dan zul je dat eerst moeten leren, het wordt hier niet
verder behandeld. Het leren omgaan met hexadecimale getallen is geen
leerstof voor deze cursus en wordt bekend verondersteld.
Compileer en test dit programma.
|