4.5.3. Klauzule PICTURE Formát: { PICTURE | PIC } IS vzor Pravidla: 1) Klauzule PICTURE je povinná pro každou elementární položku kromě položek s USAGE COMP-1, COMP-2 nebo INDEX, u nichž je naopak zakázána. (Výjimka: Má-li elementární položka bez klauzule PICTURE uvedenu klauzuli VALUE s alfanumerickým literálem bez ALL, přičemž nemá klauzuli USAGE resp. má USAGE DISPLAY, považuje se tato položka za alfanumerickou položku o délce rovné délce alfanumerického literálu uvedeného v klauzuli VALUE.) Dále je klauzule PICTURE zakázána u skupinových položek, u položek s číslem úrovně 66 a u podmínkových jmen s číslem úrovně 88. Pro použití klauzule PICTURE v REPORT SECTION platí zvláštní pravidla. 2) Slova PICTURE a PIC jsou ekvivalentní, slovo IS je bezvýznamné. 3) Vzor je tvořen posloupností znaků zapisovaných bezprostředně za sebe bez mezer. 4) Vzor musí být ukončen mezerou, před níž smí ještě stát oddělovač tečka, čárka nebo středník. (Přesněji: Při zpracovávání vzoru čte překladač znaky až po první mezeru, tabelátor, znak & nebo konec pole B tohoto zdrojového řádku. Je-li bezprostředně před touto mezerou (tabelátorem, znakem & nebo koncem pole B) tečka nebo čárka nebo středník, nepočítají se ke vzoru a slouží jako oddělovač. Tak např. při "02 A PIC 999.." má vzor tvar "999.", při "03 B PIC --9,; OCCURS 5." má vzor tvar "--9,".) 5) Má-li se některý znak vyskytnout ve vzoru několikrát bezprostředně za sebou, je přípustné místo všech těchto znaků zapsat zmíněný znak pouze jednou a za ním v kulatých závorkách uvést počet opakování (tzv. opakovač), vyjádřený kladným celým číslem bez znaménka (nejvýše 2147483647). Jsou tedy ekvivalentní např. tyto vzory: S9(5) a S99999 X(7) a XXXXXXX X(2)XX(1)X(2) a XXXXXX +(3)9(4).9(2) a +++9999.99 Je přípustný (i když prakticky bezvýznamný) i opakovač 1; nesmí však být použit u druhého znaku ve dvojznacích CR a DB a dále u obou znamének ve vzoru exponenciální znakové položky. 6) Ve vzoru lze používat velká i malá písmena, přičemž malé písmeno je ekvivalentní odpovídajícímu velkému písmenu a převádí se na ně (výjimku tvoří malé písmeno uvedené ve vzoru bezprostředně za písmenem Y nebo y a dále malé písmeno definované jako měnový symbol pomocí klauzule CURRENCY SIGN). Jsou tedy ekvivalentní vzory s999v99 a S999V99, 99ppp a 99PPP, xxx a XXX, xbxbx a XBXBX, +9.999e+99 a +9.999E+99, bbzzz9v99cr a BBZZZ9V99CR atd. V této příručce mluvíme pro určitost pouze o velkých písmenech ve vzoru, vždy je tím však třeba rozumět i odpovídající malá písmena. 7) Vzor se musí celý vejít na jeden řádek zdrojového programu, smí mít tedy nejvýše 65 resp. 255 znaků. Pomocí opakovačů lze ovšem zapsat i vzory, které by se bez použití opakovačů na řádek nevešly, jako např. X(1000000) nebo B(120)-(6)9 apod. 8) Tvar vzoru v klauzuli PICTURE je nejdůležitějším ukazatelem pro určení typu elementární položky; navíc určuje i některé další charakteristiky položky (délku, strukturu apod.). Přípustné vzory lze rozdělit do těchto pěti skupin (srovnej rozdělení položek v 4.5.): - vzory pro alfanumerické položky (viz A); - vzory pro alfanumerické editované položky (viz B); - vzory pro numerické položky s pevnou řádovou tečkou (viz C1); při uvedení klauzule BLANK nebo klauzule SIGN formátu 1 nebo 3 se však jedná o numerickou editovanou položku; - vzory pro exponenciální znakové položky (viz C2); - vzory pro numerické editované položky (viz C3). Vzor, který nevyhovuje pravidlům pro žádnou z těchto pěti skupin, je nepřípustný. A) Alfanumerická položka Elementární položka se nazývá alfanumerická, pokud má klauzuli PICTURE, přičemž vzor obsahuje pouze znaky X,A,9 a není složen pouze ze znaků 9 (tj. obsahuje alespoň jeden znak X nebo A.) Za alfanumerickou se považuje též elementární položka bez klauzule PICTURE, která má uvedenu klauzuli VALUE s alfanumerickým literálem bez ALL, přičemž klauzule USAGE je vynechána nebo je uvedena s volbou DISPLAY; délka takovéto alfanumerické položky je pak rovna délce alfanumerického literálu z klauzule VALUE. Pravidla: 1) Znaky X, A i 9 jsou ve vzoru alfanumerické položky ekvivalentní. Bývá proto zvykem používat výhradně znaky X. 2) Délka alfanumerické položky (tj. počet bytů paměti přidělených položce) je rovna počtu znaků X,A,9 ve vzoru (s přihlédnutím k opakovačům). Tato délka smí být nejvýše 2147483647 bytů. 3) Alfanumerická položka smí v každém svém bytu obsahovat libovolný znak vnitřního kódu počítače (tj. všech 256 možných bitových kombinací). Její obsah je tedy vždy považován za přípustný. 4) Alfanumerická položka, jejíž vzor obsahuje pouze znaky A, se v některých starších implementacích COBOLu nazývá alfabetická položka. V našem COBOLu se tyto položky považují za plnoprávné alfanumerické položky a povoluje resp. provádí se pro ně přesně totéž jako pro obecné alfanumerické položky. 5) V popisu alfanumerické položky jsou klauzule BLANK a SIGN zakázány, klauzule USAGE musí být vynechána nebo uvedena s volbou DISPLAY. Příklad: PICTURE ekvivalentní s délka položky --------------------------------------------------------- XXXX X(4) 4 99999A X(6) 6 A(500)X(1000000)9(150) X(1000650) 1000650 A(1000) X(1000) 1000 B) Alfanumerická editovaná položka Elementární položka se nazývá alfanumerická editovaná, pokud má klauzuli PICTURE, přičemž vzor - obsahuje pouze znaky X,A,9,B,0,/ a dvojznaky Yx; - obsahuje alespoň jeden znak X nebo A; - obsahuje alespoň jeden znak B, 0 nebo / nebo dvojznak Yx. Pravidla: 1) Znaky X, A i 9 jsou ve vzoru alfanumerické editované položky ekvivalentní. Bývá proto zvykem znaky A a 9 vůbec nepoužívat a používat místo nich znaky X. 2) "Dvojznakem Yx" rozumíme toto: Ve vzoru smí být uveden znak Y (nebo y) jako neposlední znak vzoru, přičemž znak "x" za ním následující nesmí být velké písmeno X, mezera ani binární nula. Za znakem "x" smí být uveden opakovač, tedy např. YT, Y#, Ya(10), YY atd. Znak Y se nepočítá do délky položky a není mu přidělen byte paměti, je to pouze příznak, že za ním následující znak "x" má být chápán jako výplňkový znak (obdobně jako B, 0 a /), přičemž při edici bude na byty odpovídající tomuto znaku "x" dosazen právě tento znak "x". (Tedy YT nebo i YY odpovídá jednomu bytu položky, Y*(5) odpovídá pěti bytům položky; položka s PIC XY=XY?(3)X má 1+1+1+3+1 = 7 bytů.) 3) Délka alfanumerické editované položky (tj. počet bytů paměti přidělených položce) je rovna počtu znaků X,A,9,B,0,/ a dvojznaků Yx ve vzoru (s přihlédnutím k opakovačům). Tato délka smí být nejvýše 2147483647 bytů. (V našem COBOLu však platí přísnější omezení: Vzor alfanumerické editované položky smí mít nejvýše 125 "úseků", kde "úsekem" rozumíme nepřerušenou posloupnost téhož znaku ve vzoru včetně opakovačů. Při opakovači větším než 255 (např. 255*k+q) však taková posloupnost znamená k+1 "úseků", čímž je délka alfanumerické editované položky omezena na nejvýše 125*255 bytů.) 4) Alfanumerická editovaná položka smí v každém svém bytu obsahovat libovolný znak vnitřního kódu počítače (tj. všech 256 možných bitových kombinací). Její obsah je tedy vždy považován za přípustný (nemusí odpovídat vzoru!). 5) Alfanumerická editovaná položka se zpracovává jinak než alfanumerická položka o téže délce pouze tehdy, je-li použita jako příjmová položka při přesunu, v němž vysílající údaj není skupinovou položkou. Pak se na místa, na nichž je ve vzoru znak B resp. 0 resp. / resp. dvojznak Yx, vloží mezera resp. nula resp. lomítko resp. "x" (podrobněji viz 6.1.). 6) V popisu alfanumerické editované položky jsou klauzule BLANK a SIGN zakázány, klauzule USAGE musí být vynechána nebo uvedena s volbou DISPLAY. Příklad: PICTURE délka položky --------------------------------------------------- XXBBXX00XX//XX 14 A/9X0AB9X 9 X(100000)0(200)X(50000)B(60)X(4) 150264 C1 Numerická položka s pevnou řádovou tečkou Elementární položka se nazývá numerická položka s pevnou řádovou tečkou, pokud má klauzuli PICTURE, přičemž vzor obsahuje pouze znaky 9,S,V,P v přípustné kombinaci (viz dále) a není uvedena ani klauzule BLANK ani klauzule SIGN formátu 1 nebo 3 (při uvedení některé z těchto klauzulí by se totiž jednalo o numerickou editovanou položku, ovšem i v těchto případech musí být dodržena dále uvedená pravidla). Kombinace znaků 9,S,V,P vytváří přípustný vzor, jsou-li splněna tato pravidla: 1) Vzor musí obsahovat alespoň jeden znak 9. 2) Znak S se smí ve vzoru vyskytnout nejvýše jednou, a to výhradně jako levý krajní znak ve vzoru. 3) Znak V se smí ve vzoru vyskytnout nejvýše jednou. 4) Jsou-li ve vzoru obsaženy znaky P, musí všechny následovat bezprostředně za sebou. Přitom musí nastat jeden z těchto dvou případů: a) Všechny znaky 9 leží vpravo od posloupnosti znaků P. Je-li uveden znak V, musí stát bezprostředně vlevo před posloupností znaků P. (Např. VPP999, SVP(6)9, P(10)9(4), SP9(6).) b) Všechny znaky 9 leží vlevo od posloupnosti znaků P. Je-li uveden znak V, musí být pravým krajním znakem vzoru. (Např. S9(4)PV, 99P(12)V, S9(10)PPP, 9P.) 5) Součet počtu znaků 9 a počtu znaků P ve vzoru smí být nejvýše 30. Při USAGE COMP musí být navíc počet znaků 9 ve vzoru nejvýše 18. Numerická položka s pevnou řádovou tečkou je určena k uchovávání proměnných numerických hodnot s pevnou řádovou tečkou. Vzor z klauzule PICTURE určuje, v jakém rozmezí se mohou tyto hodnoty pohybovat, neboli které dekadické řády mohou být v položce uchovávány. Dále vzor určuje, zda lze v položce uchovávat pouze nezáporná anebo i záporná čísla. Způsob uložení hodnoty položky v paměti (a tedy i délka položky) jsou pak určeny pomocí klauzule USAGE (viz 4.5.5.). Nejdůležitějším typem je rozpakovaná numerická položka (USAGE DISPLAY nebo vynecháno); oba další typy z ní dostaneme převodem do binárního resp. do pakovaného tvaru. Jednotlivé znaky vzoru mají tyto významy: 9 = dekadický řád obsažený v položce Znaku 9 odpovídá vždy určitý dekadický řád, který závisí na poloze tohoto znaku 9 ve vzoru. Znak 9 pak znamená, že položka tento řád obsahuje, tzn. že její hodnota může mít 0 až 9 jednotek odpovídajících tomuto dekadickému řádu. Ostatní dekadické řády, jímž ve vzoru neodpovídá znak 9, v položce obsaženy nejsou, tzn. hodnota položky nemůže mít žádnou jednotku odpovídající těmto dekadickým řádům. (U rozpakované položky odpovídá každému dekadickému řádu vyjádřenému ve vzoru položky znakem 9 - a žádnému jinému dekadickému řádu - jeden byte paměti.) S = příznak znaménka Znak S udává, že položka smí nabývat i záporných hodnot. Je to pouze příznak - znaku S nepřísluší žádný dekadický řád ani místo v paměti. Nemá-li položka ve vzoru znak S, pak je-li do ní posílána záporná hodnota, dojde ke změně znaménka a do naší příjmové položky se uloží nezáporná absolutní hodnota vysílajícího údaje. (Je-li tímto vysílajícím údajem položka, pak nezbytnou podmínkou pro tuto změnu znaménka je, aby popis této vysílající položky povoloval záporné hodnoty, tzn. v případě, že vysílajícím údajem je položka s pevnou řádovou tečkou, musí mít ve svém vzoru znak S. Jinak by totiž obsah vysílající položky neodpovídal jejímu popisu a změna znaménka by se nemusela provést.) U rozpakovaných a u pakovaných numerických položek má přítomnost znaku S ve vzoru vliv na obsazování znaménkového půlbytu (viz 4.5.5.). V = výpočtová (myšlená) desetinná tečka Znak V určuje, na kterém místě (tj. mezi kterými dvěma dekadickými řády) se při práci s položkou předpokládá výpočtová (myšlená) desetinná tečka. Je to pouze příznak - znaku V nepřísluší žádný dekadický řád ani místo v paměti. Poloha výpočtové desetinné tečky se v úseku paměti přiděleném položce nijak nezakódovává; je to pouze informace pro překladač, jak má být obsah tohoto úseku paměti interpretován přeloženým programem. Tato poloha je pak respektována ve všech instrukcích přeloženého programu, které s položkou pracují. Hodnota položky se v paměti ukládá vždy jako celé číslo vzniklé z původní hodnoty vypuštěním desetinné tečky (např. je-li PIC 99V9999 a hodnota položky má být 12.34, uloží se v paměti vlastně celé číslo 123400). P = dekadický řád neobsažený v položce Znaku P odpovídá podle polohy tohoto znaku ve vzoru určitý dekadický řád, a to právě týž dekadický řád, jako kdybychom všechny znaky P ve vzoru změnili na 9 a zařadili znak V (není-li ve vzoru explicitně uveden) na to jediné místo, na němž smí stát. Znak P však na rozdíl od znaku 9 znamená, že položka tento řád neobsahuje: řády odpovídající znakům P se neuchovávají v paměti a při výpočtu se hodnota položky zpracovává tak, jakoby na těchto řádech byly nuly. Znaky P se používají výhradně k určení polohy výpočtové desetinné tečky, pokud tato neleží mezi znaky 9 ani bezprostředně před nimi nebo za nimi. To má rozumný smysl v těchto dvou případech: a) Položka nabývá tak malých hodnot, že několik řádů za desetinnou tečkou je vždy nulových. Je-li např. absolutní hodnota položky vždy menší než 0.0001, lze v jejím popisu uvést např. PIC SP(4)9(5). b) Položka nabývá tak velkých hodnot, že několik nižších řádů je vždy nulových anebo zanedbatelných. Pokud např. v astronomii chceme počítat jen v miliónech, můžeme v popisu položky uvést např. PIC 9(6)P(6). Užitím znaků P se šetří kapacita vnitřní paměti (zvláště opakuje-li se položka v paměti mnohokrát) a případně i kapacita vnějšího média (je-li položka částí logické věty nějakého souboru nebo třídicího souboru). Navíc se užitím znaků P urychluje výpočet. Příklad: Kromě výše zmíněného šetření paměti a času lze znaky P využít i pro provádění výběrů cifer z hodnoty: 02 CISLO PIC 9999V9999 VALUE 1234.5678. 02 C1 PIC 99PP. 02 C2 PIC 9P. 02 C3 PIC 9V9. 02 C4 PIC P99. Pak příkaz "MOVE CISLO C1 C2 C3 C4" přidělí položce C1 hodnotu 1200, položce C2 hodnotu 30, položce C3 hodnotu 4.5 a položce C4 hodnotu 0.067. Týchž hodnot bychom ovšem u rozpakovaných položek (nikoliv však u pakovaných nebo u binárních položek!) mohli dosáhnout i bez přesunů pomocí redefinice: 02 CISLO PIC 9999V9999 VALUE 1234.5678. 02 REDEFINES. 03 C1 PIC 99PP. 03 C2 PIC 9P. 03 C3 PIC 9V9. 03 C4 PIC P99. Poznámka: Není-li ve vzoru uveden znak V, určí se poloha výpočtové desetinné tečky takto: a) Pokud ve vzoru nejsou žádné znaky P, předpokládá se výpočtová desetinná tečka bezprostředně za posledním znakem 9 (takže položka bude obsahovat pouze celá čísla). b) Pokud ve vzoru jsou znaky P, předpokládá se výpočtová desetinná tečka na tom jediném místě ve vzoru, na něž by mohl být znak V vložen (tj. bezprostředně přede všemi resp. za všemi znaky P - na opačné straně, než na které leží znaky 9). Příklad: Následující dvojice vzorů jsou ekvivalentní: 999 a 999V S9(7) a S9(7)V 999P(4) a 999P(4)V P(3)9(6) a VP(3)9(6) SPP999 a SVPP999 Příklad: Má-li položka PICTURE 999V99, pak obsahuje a může uchovat tyto dekadické řády: stovky, desítky, jednotky, desetiny a setiny. Může tedy přesně uchovat např. číslo 358.29, ale nikoliv číslo 1000 nebo .0099 nebo 1234.567 (a rovněž ne číslo -5, protože vzor neobsahuje znak S). Má-li položka PICTURE SVPP999, pak obsahuje tyto dekadické řády: tisíciny, desetitisíciny a stotisíciny. Může tedy přesně uchovat např. číslo 0.00584 nebo -0.0007, ale nikoliv číslo 5 nebo -0.01 nebo 0.000842. Má-li položka PICTURE 999PP, pak obsahuje tyto dekadické řády: desetitisíce, tisíce a stovky. Může tedy přesně uchovat např. číslo 71900, ale nikoliv číslo 100000 nebo 1230 nebo 53. Poznámka: U numerické položky s pevnou řádovou tečkou vzor z klauzule PICTURE určuje: - počet dekadických řádů (cifer) před desetinnou tečkou, - počet dekadických řádů (cifer) za desetinnou tečkou. Obsahuje-li vzor znaky P, pak bude jedno z těchto dvou čísel záporné (záporně vzatý počet znaků P ve vzoru) a druhé bude rovno součtu počtu znaků 9 a počtu znaků P ve vzoru. U všech numerických položek s pevnou řádovou tečkou musí být obě tato čísla nejvýše rovna 30. Jejich součet je pak celkový počet dekadických řádů (cifer) a je vždy roven počtu znaků 9 ve vzoru. Tento celkový počet dekadických řádů smí být u rozpakované a u pakované položky nejvýše 30, u binární položky nejvýše 18. Příklad: | počet dekadických řádů (cifer) | povoleny PICTURE |----------------------------------| záporné | celkem | před tečkou | za tečkou | hodnoty? -------------|--------|-------------|-----------|---------- S999 | 3 | 3 | 0 | ano 99V9(6) | 8 | 2 | 6 | ne S9(20)V9(10) | 30 | 20 | 10 | ano SV9(4) | 4 | 0 | 4 | ano 999PPV | 3 | 5 | -2 | ne S9(8)P(16) | 8 | 24 | -16 | ano SVP9 | 1 | -1 | 2 | ano P(28)99 | 2 | -28 | 30 | ne Definice: Celočíselnou položkou (též celočíselnou numerickou položkou) nazýváme takovou numerickou položku s pevnou řádovou tečkou (tj. rozpakovanou, pakovanou nebo binární), která má počet dekadických řádů za tečkou roven nule a není to binární položka (USAGE COMP) o délce 8 bytů (tj. s více než devíti znaky 9 v PICTURE). Bude-li takováto položka použita tam, kde formát připouští pouze celočíselnou položku a nikoliv obecnou numerickou položku, pak bude-li hodnota této položky větší než 2147483647 anebo menší než -2147483648 (což je možné pouze u rozpakovaných a pakovaných položek s více než devíti znaky 9 v PICTURE), dojde k chybnému výpočtu anebo dokonce k havárii výpočtu. Příklad: Následující položky patří mezi celočíselné: 02 A PIC 9. 02 B PIC S9(4) COMP. 02 C PIC 9(9) COMP. 02 D PIC S9(9) COMP-3. 02 E PIC 9(10). 02 F PIC S9(30). 02 G PIC 9(30) COMP-3. U položek E, F a G však musí uživatel zajistit, aby jejich hodnota v okamžiku jejich použití v roli celočíselné položky byla mezi -2147483648 a 2147483647 (obojí včetně). Následující položky nepatří mezi celočíselné (a to i kdyby jejich okamžitá hodnota byla celočíselná): 02 H PIC S9(10) COMP. 02 I PIC 9(18) COMP. 02 J PIC XXX. 02 K COMP-1. 02 L PIC ZZ9. 02 M PIC 999 BLANK WHEN ZERO. 02 N PIC S999 SIGN LEADING. 02 O PIC S999 SIGN LEADING SEPARATE. 02 P PIC S999 SIGN TRAILING SEPARATE. 02 Q PIC S999V9. 02 R PIC 999P. 02 S PIC B999.