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čí.
Copyright © 2002 - 2013 inet.sk, s. r. o. | Všetky práva vyhradené | Neprešlo jazykovou úpravou | ISSN 1336-1899
Využívame kvalitný webhosting za rozumnú cenu od Inet.sk