Makrá v OpenOffice.org VI. – pokračujeme v príkazoch

Július Pastierik  /  24. 11. 2005, 00:00

Minule sme si predstavili vetviaci príkaz IF. Dnes budeme pokračovať a predstavíme si ďalšie príkazy programovacieho jazyka StarOffice Basic na príklade ďalších verzií makra pre odstraňovanie viacnásobných medzier.

Príkaz SELECT

Niekedy sa pri programovaní stretneme s tým problémom, že potrebujeme naprogramovať celú kaskádu príkazov IF pre určitý rozsah jednej a tej istej premennej, napríklad vtedy, ak potrebujeme vetvenie podľa jednotlivých mesiacov:

IF mesiac="Január" THEN
 ' ... príkazy, ak je mesiac január
ELSEIF mesiac="Február" THEN
 ' ... príkazy, ak je mesiac február
ELSEIF mesiac="Marec" THEN
 ' ... príkazy, ak je mesiac marec
ELSEIF mesiac="Apríl" THEN
 ' ... príkazy, ak je mesiac apríl
ELSEIF mesiac="Máj" THEN
 ' ... príkazy, ak je mesiac máj
ELSEIF mesiac="Jún" THEN
 ' ... príkazy, ak je mesiac jún
ELSEIF mesiac="Júl" THEN
 ' ... príkazy, ak je mesiac júl
ELSEIF mesiac="August" THEN
 ' ... príkazy, ak je mesiac august
ELSEIF mesiac="September" THEN
 ' ... príkazy, ak je mesiac september
ELSEIF mesiac="Október" THEN
 ' ... príkazy, ak je mesiac október
ELSEIF mesiac="November" THEN
 ' ... príkazy, ak je mesiac november
ELSEIF mesiac="December" THEN
 ' ... príkazy, ak je mesiac december
ELSE
 ' ... príkazy, ak je nesprávna hodnota premennej mesiac
ENDIF

Ako vidíme, takáto postupnosť je už dosť neprehľadná. V takýchto prípadoch môžeme použiť príkaz SELECT, ktorý vlastne nahradí uvedenú postupnosť príkazov a má nasledovný formát (počet vetiev CASE nie je obmedzený):

SELECT CASE premenná
 CASE hodnota 1:
  ' ... príkazy, ak sa premenná rovná tejto hodnote
 CASE hodnota 2:
  ' ... príkazy, ak sa premenná rovná tejto hodnote
 CASE rozsah hodnôt 1
  ' ... príkazy, ak sa premenná rovná niektorej z uvedených hodnôt
 CASE rozsah hodnôt 2
  ' ... príkazy, ak sa premenná rovná niektorej z uvedených hodnôt
 CASE ELSE
  ' ... príkazy pri ostatných prípadoch
END SELECT

Vetva CASE ELSE môže, pravdaže, podobne ako vetva ELSE v príkaze IF úplne chýbať. Náš príklad s mesiacmi by sme mohli naprogramovať takto:

SELECT CASE mesiac
 CASE "Január":
  ' ... príkazy, ak je mesiac január
 CASE "Február"
  ' ... príkazy, ak je mesiac február
 CASE "Marec"
  ' ... príkazy, ak je mesiac marec
 CASE "Apríl"
  ' ... príkazy, ak je mesiac apríl
 CASE "Máj"
  ' ... príkazy, ak je mesiac máj
 CASE "Jún"
  ' ... príkazy, ak je mesiac jún
 CASE "Júl"
  ' ... príkazy, ak je mesiac júl
 CASE "August"
  ' ... príkazy, ak je mesiac august
 CASE "September"
  ' ... príkazy, ak je mesiac september
 CASE "Október"
  ' ... príkazy, ak je mesiac október
 CASE "November"
  ' ... príkazy, ak je mesiac november
 CASE "December"
  ' ... príkazy, ak je mesiac december
 CASE ELSE
  ' ... príkazy, ak je nesprávna hodnota premennej mesiac
END SELECT

Ako ste si mohli všimnúť, v popise príkazu SELECT sme spomínali aj rozsah hodnôt. Pre predstavu uveďme vetvenie po štvrťrokoch:

SELECT CASE cislo_mesiaca
 CASE 1, 2, 3
  ' ... príkazy pre prvý štvrťrok
 CASE 4 TO 6
  ' ... príkazy pre druhý štvrťrok
 CASE 7, 8, 9
  ' ... príkazy pre tretí štvrťrok
 CASE 10 TO 12
  ' ... príkazy pre štvrtý štvrťrok
END SELECT

Cyklus

Cyklus je druhý (a posledný) typ príkazov programovacieho jazyka StarOffice Basic - ale nielen jeho, ale aj napr. jazyka Pascal, C a pod. Je to vlastne opakované vykonávanie jednej a tej istej časti programu. S cyklom sa stretávame úplne stále - napokon úplne každý deň robíme opakovane to isté - vstaneme, umyjeme sa, naraňajkujeme sa, ...

Príkaz DO

Príkaz cyklu DO môžeme v jazyku StarOffice Basic naprogramovať v štyroch tvaroch:

Variant 1

DO WHILE podmienka
 '... opakované príkazy
LOOP

Cyklus sa opakuje dovtedy, pokiaľ je splnená zadaná podmienka. V krajnom prípade - ak podmienka nie je nikdy splnená - sa príkazy vo vnútri cyklu nevykonajú ani raz. Tento príkaz môžeme použiť na náš príklad s vymazávaním viacnásobných medzier, kde ich potrebujeme opakovať dovtedy, pokiaľ vôbec nejaká zámena bola vykonaná. Na indikáciu stavu, že bola nejaká výmena bola vôbec vykonaná využijeme ich počet, ktorý v prípade vykonanej zámeny je nenulový.

SUB dvojita_medzera
 DIM Dokument, Vymena AS object
 DIM kolko, teraz AS Long
 REM premenná kolko obsahuje celkový počet zámen
 REM premenná teraz počet zámen v jednom cykle

 Dokument=ThisComponent
 Vymena=Dokument.createReplaceDescriptor()
 Vymena.SearchString="  "
 Vymena.ReplaceString=" "

 teraz=Dokument.replaceAll(Vymena) ' prevedieme základnú výmenu
 kolko=teraz

 ' Opakujeme pokiaľ bola urobená nejaká výmena
 DO WHILE teraz<>0

  ' aktuálny počet zámien uložíme do premennej teraz
  teraz=Dokument.replaceAll(Vymena) ' prevedieme opakovanú výmenu
  REM spočítame úplne všetky zámeny
  kolko=kolko+teraz
 LOOP
 msgbox("Nahradených "+kolko+" dvojnasobnych medzier.",0,"Viacnasobne medzery")
END SUB

Variant 2

DO UNTIL podmienka
 ... opakované príkazy
LOOP

Cyklus sa ukončí vtedy, ak bude splnená zadaná podmienka. V krajnom prípade - ak podmienka je splnená úplne na začiatku - príkazy vo vnútri cyklu sa nevykonajú ani raz. Opakované vymazávanie medzier môžeme pomocou tohto príkazu naprogramovať napríklad takto:

SUB dvojita_medzera
 DIM Dokument, Vymena AS object
 DIM kolko, teraz AS Long
 REM premenná kolko obsahuje celkový počet zámen
 REM premenná teraz počet zámen v jednom cykle

 Dokument=ThisComponent
 Vymena=Dokument.createReplaceDescriptor()
 Vymena.SearchString="  "
 Vymena.ReplaceString=" "

 teraz=Dokument.replaceAll(Vymena) ' prevedieme základnú výmenu
 kolko=teraz

 DO UNTIL teraz=0 ' Skončíme ak nebola urobená žiadna výmena

  ' aktuálny počet zámien uložíme do premennej teraz
  teraz=Dokument.replaceAll(Vymena) ' prevedieme opakovanú výmenu
  REM spočítame úplne všetky zámeny
  kolko=kolko+teraz
 LOOP
 msgbox("Nahradených "+kolko+" dvojnasobnych medzier.",0,"Viacnasobne medzery")
END SUB

Na budúce: Posledné príkazy jazyka StarOffice Basic, alebo cyklus cyklov končí.

Neprehliadnite: