Programujeme pro Psiony aneb OPL pro začátečníky (4)

Čtvrté pokračování našeho prázdninového rychlokurzu programování v jazyce OPL.

Návěští a skoky

Uváděné klasické řídící struktury nám budou zcela stačit pro většinu programů. I v jazyce OPL je však možné používat návěští (značky v kódu programu) a skoky na ně příkazem GOTO. Používání příkazu GOTO je pohodlné, může ale výrazně snížit srozumitelnost programu. Návěští jsou ukončena dvěma dvojtečkami; za příkazem GOTO můžeme uvést jméno návěští i bez ukončujících dvojteček. V následujícím příkladu jsou návěští vytištěna tučně:

PROC skoky:
  GOTO skok::
zpatky::
  PRINT "Druhy"
  GOTO konec::
skok::
  PRINT "Prvni"
  GOTO zpatky::
konec::
  PRINT "Treti"
  GET
ENDP

Příkaz GOTO je možné použít k opuštění všech úrovní vnořených cyklů. Návěští, na které pomocí GOTO skáčeme, musí být však umístěno v té samé proceduře jako příkaz GOTO.

Poslední řídící strukturou, kterou si popíšeme, je tabulka odskoků, která slouží k větvení programu podle hodnoty řídící proměnné (podobně jako příkaz switch v jazyce C). Tabulka odskoků je uvozena klíčovým slovem VECTOR, za kterým následuje řídící proměnná. Mezi klíčovými slovy VECTOR a ENDV je seznam návěští oddělených čárkami nebo odřádkováním. Podobně jako za GOTO mohou, ale nemusí být návěští v seznamu zakončena dvojtečkami.

Podle hodnoty řídící proměnné pak příkaz VECTOR skočí na příslušné návěští. Bude-li mít řídící proměnná hodnotu jedna, skočí na první návěští; bude-li mít hodnotu dva, skočí na druhé návěští a tak dále. Pokud bude mít řídící proměnná hodnotu menší než jedna nebo větší, než je počet návěští v seznamu mezi VECTOR a ENDV, tak se v provádění programu pokračuje prvním příkazem za ENDV. Všechna návěští musí být (podobně jako u příkazu GOTO) v té samé proceduře, jako je příkaz VECTOR.

PROC vektor:
  LOCAL i%
  INPUT i%
  VECTOR i%
    jedna, dva, tri
  ENDV
  PRINT "Mensi nez jedna nebo vetsi nez tri" : GOTO dale
jedna::
  PRINT "Jedna" : GOTO dale
dva::
  PRINT "Dva" : GOTO dale
tri::
  PRINT "Tri"
  REM -- tady program pokračuje --
dale:
  PRINT "Konec."
  GET
ENDP

Posledním klíčovým slovem, které řídí běh programu, je příkaz STOP. Můžeme jej uvést kdekoliv v programu, chceme-li okamžitě ukončit běžící program a vrátit se zpět do operačního systému.

Volání procedur

Zatím jsme si ukazovali jen programy, ve kterých jsme používali jednu proceduru. Většinou je ale výhodné rozčlenit provádění programu do více procedur. Důvody pro toto rozdělění jsou dva: pokud některé příkazy voláme opakovaně a nechce se nám je psát pokaždé zvlášť, je výhodné je umístit do procedury a opakovaně volat tuto proceduru; druhým důvodem pro použití procedur je zvýšení čitelnosti programu.

Už jsme si uvedli, že procedury jsou uvozené klíčovým slovem PROC a ukončené klíčovým slovem ENDP. Při spuštění programu se vykoná pouze první procedura, která je v něm definovaná. Definice procedur nemohou být vnořené. Voláme-li proceduru, uvedeme její jméno s dvojtečkou na konci.

PROC hlavni:
  prvni:
  treti:
  GET : REM -- počká na klávesu --
ENDP

PROC prvni:
  PRINT "Toto je ";
  ctvrta:
ENDP

PROC druha:
  PRINT "zbytečný ";
  REM -- tato procedura ale nebude nikdy spuštěna --
ENDP

PROC treti:
  PRINT "text."
ENDP

PROC ctvrta:
  PRINT "vnořený "
ENDP

V každé proceduře mohou být deklarovány lokální (příkazem LOCAL) i globální (příkazem GLOBAL) proměnné. Lokální proměnné platí pouze v té proceduře, ve které byly definovány; globální proměnné je možné používat ve kterékoliv proceduře nezávisle na místu deklarace. Deklarace proměnných musí následovat hned za klíčovým slovem PROC.

Pomocí spodního tlačítka na nástrojové liště vpravo (označeného Go to) můžeme rychle vyhledat kteroukoliv proceduru v programu a přesunout se na začátek jejího zdrojového kódu.

Procedury s parametry

Aby byla lépe zajištěna vzájemná komunikace procedur, je možné předávat procedurám parametry. Parametry uvádíme v závorce za dvojtečkou ukončující jméno procedury. Tímto zápisem je již určen typ parametrů (p& je 32bitové celé číslo, p% je 16bitové celé číslo, p$ je řetězec a p je reálné číslo). Při volání procedury musíme uvést stejné parametry jako při její deklaraci, jinak překladač ohlásí chybu.

PROC vypocet:
  LOCAL cena
  PRINT "Zadej cenu ";
  INPUT cena
  vypis_splatky:(cena, 6)
  vypis_splatky:(cena, 12)
  GET
ENDP

PROC vypis_splatky:(cena, pocet%)
  PRINT "Cena "; cena; " rozdelena do "; 
  PRINT pocet%; " splatek bude splacena ";
  PRINT "jako "; pocet%; " x "; INT(cena/pocet%+0.5)
ENDP

Ve výše uvedeném příkladu vidíme opakované použití procedury, které předáváme dva parametry: cenu, která může být reálné číslo, a počet splátek (celé číslo). Proceduru voláme opakovaně s odlišnými parametry.