III. REXX változók és állandók

Karakterláncok (Strings)

A karakterlánc tulajdonképpen bármilyen szöveg lehet, amelyet idézôjelek közé zártunk. Az idézôjel lehet " vagy ' is, azonban egy adott karakterlánchoz vagy az egyik, vagy a másik fajtát kell használni. Ha a karakterlánc már tartalmaz idézôjelet, akkor a kezdéshez és záráshoz a másik fajtát kell alkalmazni, vagy a láncban szereplô idézôjelet meg kell duplázni. A REXX pontosan úgy tárolja el a karakterláncokat, ahogyan azok az idézôjelek között szerepelnek, így pl. megtartja a kis és nagybetûket is. Lehetséges üres karakterlánc megadása is. A karakterláncok az állandók körébe tartoznak, mivel a program nem változtatja meg értéküket. Az alábbiakban néhány példát láthatunk:

Karakterlánc:A REXX által eltárolt érték:
"Ez az elsô karakterlánc!"Ez az elsô karakterlánc!
'Ez a második karakterlánc!?'Ez a második karakterlánc!?
'A következô egy üres string:'A következô egy üres string:
""
"Ezért az eltárolt érték is üres."Ezért az eltárolt érték is üres.
'Let''s see something more difficult!'Let's see something more difficult!
"""Igyon má' valamit Józsi bá'"" mondta Pista.""Igyon má' valamit Józsi bá'" mondta Pista.

Számok

A számok speciális karakterláncok a REXX-ben. Ugyanúgy használhatjuk ôket, mint a többi karakterláncot, ugyanakkor matematikai mûveletekben is részt vehetnek. A számok köré nem kötelezô idézôjeleket sem tenni. Kezdôdhetnek és végzôdhetnek szóközkarakterekkel is, ám ekkor az idézôjel már nem maradhat el. A REXX-ben három fajta számot különböztetünk meg:

Egész számok/integer (nincs törtrész), pl. -1, 34, 0, -834434, ' + 567'

Lebegôpontos számok/float (van törtrész), pl. 3.1415, -76.87, +0.4567, .678

Exponenciális számok, pl. 1.034e4, 3.67E6, -1.56e23

Változók

A programok sokszor dolgoznak olyan adatokkal, amelyek a futás alatt folyamatosan változnak, vagy amely adatok értéke a program írásakor még nem is ismert. A változók megadásakor azt közöljük a programmal, hogy foglaljon le helyet a számítógép memóriájában a késôbb feldolgozásra kerülô adatoknak. A változókra a nevük megadásával lehet hivatkozni, amely (a tárolt adattól eltérôen) sohasem változik. A REXX-ben a változókat nem kell elôre definiálni, ugyanis ez automatikusan megtörténik az elsô értékadáskor:

példaváltozó = 1.71

A példában szereplô változó értéke tehát jelen pillanatban 1.71. Amikor új értéket rendelünk a példaváltozóhoz, akkor az elôzô érték elveszik.

Változónevek

A változók neve nem lehet akármi. REXX-ben a következô szabályokat kell betartanunk a név kiválasztásakor:

- A név elsô karaktere betû, aláhúzás (underscore), felkiáltójel, vagy pedig kérdôjel kell, hogy legyen.

- A név többi karaktere tartalmazhat számokat, betûket, aláhúzást, kérdô-, vagy felkiáltójelet.

- A kis és nagybetûk alapján a REXX nem tesz különbséget, ezért pl. a Pista változó az ugyanaz, mint a pista, vagy a pistA.

- Elvileg a REXX utasítások neveit is használhatjuk változónévként, ezt a lehetôséget azonban inkább ne használjuk ki.

Néhány helyes és helytelen változónév:

test1 		/* helyes 			*/
AzEnValtozom	/* helyes 			*/
1valtozo	/* helytelen, számmal kezdôdik  */
if 		/* helyes, bár nem ajánlott 	*/
gyerunk!	/* helyes 			*/
most_mi_van?	/* helyes 			*/
test#1		/* helytelen, # nem szerepelhet */

Amíg egy változónak nem adunk értéket, addig a REXX a változó nevét tárolja el, csupa nagybetûvel. Ha elfelejtünk egy karakterlánc köré idézôjeleket tenni, akkor a REXX a karakterláncot változónak fogja tekinteni:

/* Példa nem inicializált változók használatára */
SAY "Hello World!"
SAY Hello World!
Hello = 'Goodbye'
SAY Hello World!
EXIT 

A futtatáskor a Hello World! üzenetet látjuk viszont elôször, ami a karakterlánc korrekt definiálása miatt pontosan úgy jelenik meg, mint ahogy azt begépeltük. A következô sorban a két (Hello és World!), nem inicializált változó jelenik meg, csupa nagybetûvel: HELLO WORLD! A harmadik SAY utasítás végrehajtásakor a Hello változónak már van értéke (Goodbye). A World!-nek viszont még mindig nincs, így a kimenet ebben az esetben a Goodbye WORLD! lesz.

Bár nem kötelezô, azért mégis törekedjünk olyan változónevek használatára, amelyek a változó szerepére utaló jelentéssel bírnak. (A késôbbiekben ez ugyanis nagyon megkönnyíti majd programunk újbóli megértését.) Két fajta gyakran használt névadási konvenció ismert. Az egyik aláhúzás-karakterekkel választja el a névben a szavakat (pl. kis_pista_autoinak_szama), a másik ugyanakkor nagy betûkkel kezdi a szavakat (KisPistaAutoinakSzama). Az utóbbi rendszert teverendszernek is hívják, mivel a nagy betûk a teve púpjaihoz hasonlóan emelkednek ki a kis betûk közül.

Adattípusok

Más programozási nyelvektôl eltérôen a REXX-ben egyetlen változótípus létezik, a karakter (karakterlánc). Ez a megközelítés általában megkönnyíti a programozást, ugyanakkor egy külön függvény végrehajtására van szükség, ha meg akarjuk tudni, hogy milyen fajta adat van egy adott változóban eltárolva. Az erre a feladatra létrehozott (beépített) REXX függvény a Datatype:

Datatype( karakterlánc, [típus] )

Ha a típus megadása nélkül hívjuk meg a függvényt, akkor eredményként NUM-ot (numeric) kapunk, ha a karakterlánc számot tartalmaz, minden ellenkezô esetben CHAR-t. A típus megadásával a karakterlánc egyéb tulajdonságait is tesztelhetjük:

Típus:Rövid forma1-et ad vissza, ha a karakterlánc tartalmaz (ellenkezô esetben 0-át)
AlphanumericACsak betûket és számokat
BitsBCsak 0-át vagy 1-et
CCSBCS (Single Byte Character Set) és DBCS (Double Byte Character Set) karaktereket
DbcsDCsak DBCS karaktereket
LowercaseLCsak kisbetûket
Mixed caseMCsak betûket
NumberNCsak számokat
SymbolSCsak REXX-ben használható karaktereket
UppercaseUCsak nagybetûket
Whole numberWEgész számokat
HexadecimalXCsak hexadecimális számokat vagy üres stringet

Datatype példák:

Datatype('25')			/* válasz: NUM  	*/
Datatype('pista')		/* válasz: CHAR 	*/
Datatype('testing','L')		/* válasz: 1 		*/
Datatype('Testing','Lowercase') /* válasz: 0 		*/

A következô példaprogram bekér egy adatot és teszteli annak típusát a Datatype függvénnyel. A programban használt Word utasítás az elsô paraméterként kapott karakterláncból (szoveg = isn't is) kiválasztja a második paraméterben megadott sorszámú szót és azt adja vissza. A második paraméter esetünkben a Datatype 0 vagy 1 értékétôl függôen 1 vagy 2 lehet, tehát a Say utasítás Datatype = 0 esetén a szövegben tárolt string elsô szavát (isn't - itt nem igaz), Datatype = 1 esetén pedig a másodikat (is - itt igaz) nyomtatja ki.

/* Teszteljük az adatot */

szoveg = "isn't is"

SAY "Kérem az adatot!"
PARSE PULL adat

SAY adat WORD(szoveg, Datatype(adat, 'A') + 1) 'Alphanumeric'
SAY adat WORD(szoveg, Datatype(adat, 'B') + 1) 'Bits'
SAY adat WORD(szoveg, Datatype(adat, 'C') + 1) 'Mixed SBCS/DBCS'
SAY adat WORD(szoveg, Datatype(adat, 'D') + 1) 'DBCS'
SAY adat WORD(szoveg, Datatype(adat, 'L') + 1) 'Lowercase'
SAY adat WORD(szoveg, Datatype(adat, 'M') + 1) 'Mixed case'
SAY adat WORD(szoveg, Datatype(adat, 'N') + 1) 'Number'
SAY adat WORD(szoveg, Datatype(adat, 'S') + 1) 'Symbol'
SAY adat WORD(szoveg, Datatype(adat, 'U') + 1) 'Uppercase'
SAY adat WORD(szoveg, Datatype(adat, 'W') + 1) 'Whole number'
SAY adat WORD(szoveg, Datatype(adat, 'X') + 1) 'Hexadecimal'

EXIT


REXX GYÍK:

K1. Miért nem történik semmi, amikor egy változónak értéket adok?
V1. Amikor egy változónak értéket adunk, akkor a számítógép adatot mozgat a memóriában. Értékadáskor tehát igenis történik "valami", bár ez közvetlenül nem látható.

K2. Miért jó, ha csak karakter típusú változó létezik?
V2. Ez a megközelítés nagyon megkönnyíti a programozást, ha kis programok gyors megírása a célunk. A változók precíz elôredefiniálásának viszont megvan az az elônye, hogy a fordító nagyon sok hibát még a program futtatása elôtt ki tud szûrni. Ez a megközelítés tehát akkor elônyös, ha komolyabb programokat fejlesztünk.


Gyakorlatok:

1. Mely változónevek jók? x123, ???, @OS2Times, kis_pista_autoja, !OK!, Mr&Mrs, 23eszkimo, i

2. Készítsünk egy programot, amely megállapítja, hogy a TEST változó számot tartalmaz-e!

3. Készítsünk egy programot, amely megállapítja, hogy a TEST változó nagy betût tartalmaz-e!

4. Mely számok helyesek? ' - 1.23', 7.73e-4, ' 0 ', '1 2', .e4

5. Mely karakterláncok helyesek? '', 'Hi', "Pista Pista", "!@3(&'""(^$"

Kádár Zsolt
1997. 09. 17.
[ Elôzô lecke | Következô lecke | Tartalom ]