Tvorba webových stránok – Manuál k redakčnému systému Rheia 1.0, Roman Horváth, © 2015, powered by Rheia

Obsah stránky sa číta, prosím čakajte…

 TWS – Manuál k RS Rheia 1.0 – Obsah | Výpočty a iné úpravy obsahu  « Výpočty a iné úpravy obsahu  |  Jednoduchý operatívny výpočet » 

Funkcie modulu jednoduchého tabuľkového kalkulátora, calc, umožňujú jednoduché spracovanie číselných údajov v tabuľkách. Môže ísť napríklad o súčet hodnôt v stĺpci tabuľky, podmienený súčet hodnôt v stĺpci tabuľky, sčítanie viacerých hodnôt v aktuálnom riadku tabuľky a podobne.

Rozdiel oproti jednoduchému operatívnemu výpočtu je taký, že spracovanie údajov pomocou modulu calc prebieha v čase spracovania zdrojového textu stránky, takže počas opakovaného zobrazovania spracovanej informácie nie je stroj systému Rheia výpočtovo zaťažovaný. Naproti tomu výpočty nemôžu byť aktualizované, napríklad podľa dátumu a času, ako to je pri jednoduchom operatívnom výpočte.

 

V ďalšom texte budeme rozlišovať medzi zachytenímvyhodnotením údajov modulom calc. Zachytenie údajov znamená vloženie nových údajov do tabuľky údajov modulu a vyhodnotenie údajov znamená vypočítanie hodnôt vzorcov modulu s prípadným využitím zachytených údajov. Akcie zachytenia a vyhodnotenia vyžadujú, aby bol modul aktívny, ale nemusia byť na sebe bezprostredne závislé.

Pod termínom spracovanie údajov modulom sa ukrývajú viaceré akcie. Modul prednostne vyhľadá a vyhodnotí všetky vzorce v riadku. Potom môže (podľa stavu) zjednodušiť tvar údajov pre svoje potreby a zachytiť (uložiť) ich do svojej internej tabuľky údajov.

Modul calc reaguje na každý riadok, ktorý sa začína prefixom #calc:. Za týmto prefixom nasleduje inštrukcia modulu calc, za ktorou môžu nasledovať údaje, ktoré sú spracúvané dvojako – jednak modulom calc a jednak jadrom RS Rheia, ktoré z nich generuje HTML otvárané v novom okne
(obvykle ide o externý odkaz) kód stránky. (Ak je potrebné, aby boli údaje spracované len modulom calc, dajú sa s výhodou využiť komentáre. Modul berie do úvahy aj riadky komentárov, pričom prípadne inštrukcie upravujúce správanie modulu musia byť uvedené pred znakom komentára.)

Po aktivácii modulu direktívou #calc:start (prípadne #calc:resume) sa systém začne správať tak, ako keby sa každý riadok začínal prefixom #calc:. To znamená, že riadky obsahujúce samostatné inštrukcie modulu sa do jadra systému Rheia nedostanú vôbec a prefixy reprezentujúce ďalšie inštrukcie modulu budú tiež odstránené ešte pred spracovaním jadrom RS Rheia.

Direktívy (s inštrukciami modulu calc) #calc:start alebo #calc:resume je vhodné umiestniť pred prvým riadkom zo skupiny riadkov tabuľky, ktoré majú vstúpiť do spracovania. V nasledujúcej tabuľke sú uvedené všetky inštrukcie modulu. Keď nie je aktívny cyklus spracúvania, tak je pred nimi (samozrejme) nevyhnutné uviesť prefix #calc:.

Inštrukcia Opis
start začne nový cyklus spracúvania a zachytávania údajov modulom calc (vyprázdni pri tom prípadné dovtedy zachytené údaje z tabuľky údajov modulu)
pause pozastaví zachytávanie údajov modulom calc (vyhľadávanie a vyhodnocovanie vzorcov v texte bude pokračovať)
resume obnoví zachytávanie údajov a prípadne aj vyhodnocovanie vzorcov modulom calc (to znamená, že keď nie je aktívny cyklus spracúvania, tak ho táto inštrukcia opätovne spustí, ale na rozdiel od inštrukcie start nevymaže dovtedy zachytené údaje)
stop zastaví spracúvanie údajov modulom calc
dump na účely ladenia vygeneruje tabuľku údajov, ktoré boli dovtedy zachytené modulom calc; tabuľka má očíslované riadky a stĺpce poradovými číslami a nastavené triedy štýlov podľa direktívy #tables: (pozri kapitolu Štýly tabuliek; inštrukcia dump berie do úvahy len direktívu #tables:, ostatné direktívy slúžiace na úpravu vzhľadu tabuliek sú touto inštrukciou ignorované)
empty:«text» nastaví nový text, ktorý bude zobrazený namiesto prázdneho (prípadne chybného) výsledku
skip:«riadok» nespracuje riadok modulom calc (preskočí ho) a posunie ho na spracovanie zvyšku stroja systému Rheia (dá sa využiť aj na ignorovanie komentárov)
calc:«riadok» vyhodnotí vzorce modulu calc v riadku a bez ohľadu na aktuálny stav spracovania nezaradí tento riadok medzi zachytené údaje
capt:«riadok» vyhodnotí vzorce modulu calc v riadku a bez ohľadu na aktuálny stav spracovania zaradí tento riadok medzi zachytené údaje

Na lepšie pochopenie toho ako modul calc pracuje s údajmi zobrazíme inštrukciou dump v nasledujúcom príklade výsledok tabuľky zachytených údajov.

Zdrojový text tabuľky doplnený o inštrukcie modulu calc:

*# → # → ||Hlavička*
#calc:start
O → 5 → 6
M1 → /8/ → 9
V → 1 → code()−8
L → 4 → 2
*R → 7 → code()*10*
3D → 1,7 → 6
A2,4 → 1 → 6
O → 9 → 6,8
0,5J → 1 → 1
; Komentár → s tabulátormi → 10
E → 1 → 10
skip:; úplne ignorovaný komentár
E*L*M → 2 → 9
*/MEL/* → 3 → 8
stop

#calc:dump

Výsledok (prvú tabuľku vytvorila Rheia podľa klasických pravidiel tvorby tabuliek, druhú vytvorila inštrukcia dump modulu calc):

Hlavička
O 5 6
M1 8 9
V 1 −8
L 4 2
R 7 10
3D 1,7 6
A2,4 1 6
O 9 6,8
0,5J 1 1
E 1 10
ELM 2 9
MEL 3 8

 
1.2.3.
1."O"(5)(6)
2."M1"(8)(9)
3."V"(1)(−8)
4."L"(4)(2)
5."R"(7)(10)
6."3D"(1,70)(6)
7."A2,4"(1)(6)
8."O"(9)(6,80)
9."0,5J"(1)(1)
10."Komentár""s tabulátormi"(10)
11.(0,00)(1)(10)
12."E*L*M"(2)(9)
13."MEL"(3)(8)

Druhá tabuľka ukazuje zoznam údajov, ktoré modul calc rozpoznáva, a naznačuje ako s nimi pracuje. Inštrukcia dump označuje aj typ údajov v bunkách – textové hodnoty sú uzavreté v strojopisných úvodzovkách " a číselné v oblých zátvorkách ().

Modul calc pri spracovaní odfiltruje krajné formátovacie značky buniek a rozpozná číselné údaje, pričom číslo môže pozostávať z ľubovoľnej kombinácie znakov:

  • znamienok +, - (modul hľadá aj rôzne kombinácie iných znakov pripomínajúcich znamienko mínus, napríklad pomlčku a pod.),
  • číslic 09,
  • písmen e alebo E (pre exponent)
  • a znakov ,. (pre desatinnú čiarku, resp. „bodku“).

Pri syntaktickej chybe je výsledná hodnota rovná nule (všimnite si, že modul rozpoznal ako číslo aj samostatný text E v prvom stĺpci na riadku s poradovým číslom 11 – syntax takého „čísla“ je chybná, preto je výsledná hodnota v bunke rovná nule). Textové údaje v bunkách sú použiteľné na podmienené výpočtové operácie, ktoré sú vysvetľované nižšie.

 

Keď je v spracúvanom riadku nájdený vzorec (reprezentujúci funkciu alebo operáciu) v tvare calc(«kľúčové slovo»; «argumenty»), modul ho vyhodnotí podľa opisu v nasledujúcej tabuľke. Tabuľka obsahuje zoznam funkcií, ktoré pracujú s celými stĺpcami zachytených hodnôt (ide o funkcie avgmaxThis) a zoznam binárnych operácií (addpow), ktoré sú vyhodnotené úplne na záver celého procesu vyhodnotenia a ktoré pracujú priamo s číselnými hodnotami prijatých argumentov. Ďalšie podrobnosti o spôsobe vyhodnotenia údajov sú pod tabuľkou funkcií.

Kľúčové slovo Význam Zoznam a význam argumentov
avg priemer
«číslo» poradové číslo stĺpca, ktorého hodnoty majú vstúpiť do výpočtu podľa typu funkcie
cnt počet
pdt súčin (produkt)
sum súčet (suma)
min minimum
max maximum
aif podmienený priemer

«číslo 1»; «číslo 2»; "«reťazec»"

«číslo 1» poradové číslo stĺp­ca, kto­rého hod­noty majú vstúpiť do vý­počtu podľa typu funkcie
«číslo 2» poradové číslo stĺp­ca, kto­rého hod­noty majú byť po­rov­na­né s re­ťaz­com
«reťazec» hodnota reťazca (zapísaná v strojopisných úvo­dzov­kách "), kto­rá má byť po­rov­na­ná s hodnotou určenou pred­chá­dza­jú­cim argumentom

Ak sú hod­noty určené druhým a tretím argumentom zhodné, tak je hodnota určená prvým argumentom zarátaná do výpočtu, inak bude vynechaná. Čísla sú provnávané ako reťazce.

cif podmienený počet
pif podmienený súčin
sif podmienený súčet
mif podmienené minimum
xif podmienené maximum
avgThis priemer v riadku
«zoznam» zoznam pozostávajúci z poradových čísiel alebo číselných rozsahov, ktorými sú určené tie stĺpce, v ktorých hodnoty má určená funkcia spracovať v rámci aktuálneho (This) riadka

Zoznam je oddelený bodkočiarkami, rozsahy sú vymedzené pomlčkou (–) alebo spojovníkom (­‑). Príklad: 1; 3; 5 – 7; 9

cntThis počet v riadku
pdtThis súčin v riadku
sumThis súčet v riadku
minThis minimum v riadku
maxThis maximum v riadku
add súčet dvoch hodnôt

«číslo 1»; «číslo 2»

«číslo 1» prvý operand (sčítanec, menšenec, činiteľ, delenec alebo mocnenec)
«číslo 2» druhý operand (sčítanec, menšiteľ, činiteľ, deliteľ alebo mocniteľ)
sub rozdiel dvoch hodnôt
mul súčin dvoch hodnôt
div podiel dvoch hodnôt
mod zvyšok po delení
pow n­‑tá mocnina
get vypísať hodnotu
pre inštrukciu get: «riadok»; «stĺpec» 
pre inštrukcie setput: «riadok»; «stĺpec»; «hodnota»
«riadok» poradové číslo riadka v tabuľke hodnôt modulu calc
«stĺpec» poradové číslo stĺpca v tabuľke hodnôt modulu calc
«hodnota» hodnota na spracovanie

Tieto inštrukcie pracujú s konkrétnymi bunkami vnútornej tabuľky hodnôt modulu calc.

set vložiť hodnotu
put vložiť a vypísať hodnotu

Vzorce (funkcie/operácie) sú vyhodnocované v skupinách. Spracovanie každého riadka prebieha v troch cykloch, v prvom sú vyhodnocované prvé dve skupiny funkcií (avgxif), v druhom tretia skupina funkcií (avgThismaxThis) a v poslednom sú vyhodnotené všetky binárne operácie (addpow). Inštrukcie getput sú spracúvané vo všetkých cykloch.

Každý cyklus vyhodnotenia je vykonávaný dovtedy, kým sú (v rámci ním spracúvaných skupín) nachádzané syntakticky platné vzorce modulu calc. (Pre úplnosť – všetky cykly majú limit sto opakovaní, ale nie je pravdepodobné, že by jeden riadok obsahoval toľko vzorcov.)

Dôsledkom vyššie uvedených princípov je, že argumentom operácí (addpow) môžu byť všetky funkcie a operácie uvedené v tabuľke. Opakované vyhodnotenie spôsobí, že nakoniec vstúpi do operácie číselná hodnota, ktorá bude modulom akceptovaná.

Inštrukcie getput slúžia na manipuláciu s tabuľkou hodnôt modulu calc. Inštrukcia get sa pokúsi prečítať hodnotu z bunky určenej poradovým číslom riadka a stĺpca. Ak hodnota jestvuje, vloží sa do zdrojového textu. Inštrukcia set zapíše hodnotu do určenej bunky a inštrukcia put vykoná obidva úkony, pričom hodnotu najprv zapíše a do textu vloží výsledok.

Modul calc je prednostne určený na prácu s číslami a na vykonávanie výpočtov. Do buniek tabuľky údajov modulu je možné vložiť aj reťazec, ale len v rámci pravidiel spracovania údajov modulom, ktoré prinášajú určité obmedzenia. Okrem iného sú všetky znaky pripomínajúce mínus pri kažom ukladaní údajov prevedené na znak spojovníka (­‑), ktorý je z technického pohľadu vo všetkých bežných programovacích jazykoch chápaný ako záporné znamienko a pri vyberaní údajov z tabuľky sú spojovníky prevedené na znak mínus (−).

Pri práci s číslami sú navyše spracúvané aj dvojice znakov čiarka (,) a bodka (.), pri ktorých ide o prevod medzi slovenským zápisom, ktorý používa Rheia a anglickým zápisom, ktorý je používaný v programovacom jazyku PHP otvárané v novom okne
(obvykle ide o externý odkaz), v ktorom je Rheia naprogramovaná.

Upozornenie: Keďže niektoré výpočty sú vykonávané cez zobrazenie v zdrojovom texte, môže počas procesu vyhodnocovania pri práci s reálnymi hodnotami dochádzať k zaokrúhleniu na dve desatinné miesta.

 

Príklad – majme vzorec zložený výhradne z binárnych operácií:

#calc:calc(add; calc(div; 4; 2); calc(sub; calc(mod; 15; calc(pow; 2; 3)); 1))

Čo bude výsledkom? Priebeh vyhodnotenia ukazuje nasledujúca tabuľka (pre lepšiu prehľadnosť boli operácie prepísané do čitateľného tvaru):

(4 : 2) + (15 mod 23 − 1)
4 : 2 = 2 2 + (15 mod 23 − 1)
23 = 8 2 + (15 mod 8 − 1)
15 mod 8 = 7 2 + (7 − 1)
7 − 1 = 6 2 + 6
2 + 6 = 8 8

 

Ako bolo povedané, ostatné funkcie prijímajú poradové čísla stĺpcov – ide o poradové čísla stĺpcov v tabuľke údajov zachytených modulom calc, z ktorej sú potrebné hodnoty čerpané.

Nasledujúci príklad ukazuje zápis výpočtu podmieneného súčinu a súčtu, pričom údaje sú čerpané z tabuľky hodnôt uvedenej vyššie v rámci tejto kapitoly:

Požadované hodnoty sú:
#calc:calc(pif; 2; 1; "O"),
#calc:calc(sif; 3; 1; "E*L*M").

Výsledok:

Požadované hodnoty sú: 45, 9.

 

Ak výpočet niektorej z funkcií alebo operácií zlyhá, výsledkom je buď prázdny reťazec, alebo text nastavený inštrukciou empty. Modul calc je aktivovaný ešte pred spracovaním riadka systémom Rheia, takže text môže obsahovať aj formátovacie značky RS Rheia.

Príklad (opäť využíva tabuľku údajov vytvorenú v rámci tejto kapitoly vyššie):

#calc:empty:||–
* → 2. stĺpec pre 2D → 2. stĺpec pre 3D → 3. stĺpec pre 2D → 3. stĺpec pre 3D*
#calc:*Počet: → calc(cif; 2; 1; "2D") → calc(cif; 2; 1; "3D")
 → calc(cif; 3; 1; "2D") → calc(cif; 3; 1; "3D")
#calc:*Súčet: → calc(sif; 2; 1; "2D") → calc(sif; 2; 1; "3D")
 → calc(sif; 3; 1; "2D") → calc(sif; 3; 1; "3D")

Výsledok (hodnota 2D sa v prvom stĺpci nevyskytuje vôbec, preto je výsledkom vzorcov, ktoré s ňou súvisia vystredená pomlčka definovaná inštrukciou empty vyššie):

2. stĺpec pre 2D 2. stĺpec pre 3D 3. stĺpec pre 2D 3. stĺpec pre 3D
Počet: 1 1
Súčet: 1,70 6

 

Príklad použitia modulu calc

Nasledujúca tabuľka je tabuľkou údajov o fiktívnych predmetoch. V prvom stĺpci je záväznosť (Z) – povinné predmety sú označené skratkou P, povinne voliteľné PV a výberové V. V druhom stĺpci je počet kreditov (K) a v treťom stĺpci týždenná hodinová dotácia predmetu (H).

Z K H
P 4 4
PV 2 3
P 3 4
PV 2 3
PV 1 2
V 1 1
V 1 1

Do zdrojového textu stránky vložíme inštrukcie startstop modulu calc presne tak, aby ohraničovali len riadky s údajmi. V skrátenej podobe by zdrojový text vyzeral takto:

*Z → K → H*
#calc:start
P → 4 → 4
…
V → 1 → 1
#calc:stop

Výstupom inštrukcie dump modulu calc je nasledujúce zobrazenie ním zachytených údajov:

 
1.2.3.
1."P"(4)(4)
2."PV"(2)(3)
3."P"(3)(4)
4."PV"(2)(3)
5."PV"(1)(2)
6."V"(1)(1)
7."V"(1)(1)

Predpokladajme, že chceme zo zachytených údajov vypočítať súčet kreditov a hodinových dotácií všetkých povinných, povinne voliteľných a výberových predmetov. Na vykonanie podmieneného súčtu slúži funkcia sif, ktorej prvým argumentom je poradové číslo stĺpca, ktorého údaje majú byť sčítané (v našom prípade to bude najprv 2 a potom 3), druhým argumentom poradové číslo stĺpca, ktorého hodnoty majú byť porovnávané (v našich prípadoch je to vždy 1) a tretím argumentom je porovnávaný reťazec (v našom prípade sú to reťazce P, PV alebo V). Zdrojový text tabuľky s výpočtami môže vyzerať napríklad takto:

#calc:resume
pause

*∑KP: → calc(sif; 2; 1; "P") → @ → *∑HP: → calc(sif; 3; 1; "P")
*∑KPV: → calc(sif; 2; 1; "PV") → @ → *∑HPV: → calc(sif; 3; 1; "PV")
*∑KV: → calc(sif; 2; 1; "V") →  → *∑HV: → calc(sif; 3; 1; "V")

stop

Výsledná tabuľka bude vyzerať takto:

∑KP: 7   ∑HP: 8
∑KPV: 5 ∑HPV: 8
∑KV: 2 ∑HV: 2

 

Súvisiace kapitoly:

 


Otázky a úlohy:

  1. Na čo sa dá použiť modul jednoduchého tabuľkového kalkulátora Rheia calc?
  2. S akými typmi údajov pracuje modul jednoduchého tabuľkového kalkulátora Rheia calc?
  3. Stručne opíšte ako fungujú nasledujúce inštrukcie modulu calc RS Rheia: get, setput.
  4. Aký je význam (ako fungujú) tie funkcie modulu calc RS Rheia, ktoré sa končia slovom This (napríklad avgThis, maxThis a pod.)